关于微信支付的坑

 关于微信支付的坑

#region ----微信储值卡充值支付-----

                            TM.SOA.Entity.MembershipCard.WxPaySuccess WxPaySuccessEntity = _otherServices.SearchWxPayParam(out_trade_no);
                            if (WxPaySuccessEntity == null)
                            {
                                entity_log = null;
                                entity_log = new Entity.Trade.Log
                                {
                                    PayType = PayTypePortEnum.WEIXIN_V3.ToString(),
                                    PayBlatform = "移动端",
                                    OperateType = "微信储值卡订单支付",
                                    TradeID = out_trade_no,
                                    PayStatus = 1,
                                    Memo = "储值卡【PayNotifyUrlV3.aspx】储值卡充值订单不存在,返回订单号:" + out_trade_no
                                };

                                bllLogRule.Insert(entity_log);
                                ResponseXML("FAIL", "no found out_trade_no");
                                return;
                            }
                            resHandler.init();
                            resHandler.setKey(WxPaySuccessEntity.PartnerKey, "");//PaySignKey在V3版中无作用,可只设置key(第一个);这句是为了下面的签名验证

                            //签名认证
                            if (resHandler.isWXsign_MD5())
                            {
                                #region----储值卡PayNotifyUrlV3里面的所有执行业务----
                                BaseResponse response = _sendStoredCardInfoProvider.StoredCardAllProvider(WxPaySuccessEntity, out_trade_no, total_fee, transaction_id);
                                if (response.Status == Utility.Enums.BaseResponseStatusEnum.Error)
                                {
                                    ResponseXML("FAIL", return_msg);
                                    return;
                                }
                                #endregion

                                // 回复服务器处理成功:给财付通系统发送成功信息,财付通系统收到此结果后不再进行后续通知
                                //(如果失败,隔一段时间后财付通系统再次发起异步操作,如果失败次数超过指定次数后不再发起异步操作)
                                ResponseXML("SUCCESS", "");
                            }
                            else
                            {//md5签名验证失败                       
                                ResponseXML("FAIL", "md5 failed");   //支付失败,不再操作
                            }
                            #endregion

 

================================================================================================

官方文档:

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

技术人员可登进微信商户后台扫描加入接口报警群。

 

================================================================================================

如果返回"FAIL"给微信,微信会再次发起回调,进入方法执行业务逻辑,直到微信官方规定的回调次数用完了(通知频率为15/15/30/180/1800/1800/1800/1800/3600)。

如果返回"SUCCESS"给微信,微信不会再发起回调了,就此结束。

 

做法一:一般做法,如果业务逻辑处理成功了就返回"SUCCESS"给微信,失败了就返回"FAIL"给微信,如果多次都失败了,使用调度或者相似业务来处理。

做法二:个人其中一个想法,无论业务逻辑是否失败,都返回"SUCCESS"给微信,后面使用调度或者相似业务再继续进行更新。

 

posted on 2022-10-31 17:55  Jankie1122  阅读(102)  评论(0编辑  收藏  举报