关于微信支付的坑
#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"给微信,后面使用调度或者相似业务再继续进行更新。