利用微信支付的订单查询接口可以在APP 中提高支付的可靠性

会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述利用微信支付的订单查询接口可以在APP 中提高支付的可靠性相关的知识,希望能为你提供帮助。
 
最近公司有一个应用,用户可以在微信公众号上面下单,也可以在APP 中下单。
当用户在公共号上面下单时,微信支付成功可以返回微信支付单号,但是在APP 中用户微信支付时,个别时候会出现用户没有付款成功,却在支付后的回调逻辑中执行了订单支付成功的逻辑。
显然在APP中微信支付的这种回调逻辑是不可靠的。
 
(1)首先说明下为什么要拿到微信支付订单号
            微信支付订单号是微信系统在支付成功后返回的订单号,比如这样的订单号:4007322001201705049543255213, 拿到这个订单号可以调用微信查询接口(当然也可以使用自己应用中定义的订单号来调用微信订单查询接口,但是微信推荐优先使用这个微信支付订单号来查询)
,更重要的是,在实际的业务逻辑中,有些用户下单成功后,后来要求退款(比如收到货后用户不满意,要求订单退款),这样在调用微信的退款接口(https://api.mch.weixin.qq.com/secapi/pay/refund)时,必须要提供这个微信支付订单号。
 
(2)APP 中的微信支付如何提高微信支付的可靠性
        这个主要就是用户在APP 中使用微信支付时,每当支付成功后,在执行的回调逻辑(比如是这样的逻辑:往自己的系统里面修改订单状态为已支付,发送支付成功的通知消息等)前,调用微信提供的订单查询接口(https://api.mch.weixin.qq.com/pay/orderquery),仅当这个订单查询接口返回该笔订单已经支付成功(主要是trade_state="SUCESS"),则才执行后面的回调逻辑。
                /// < summary>
                /// 调用微信支付的查询订单接口,以确认是否订单已经支付成功
                /// < /summary>
                /// < param name="entity"> < /param>
                /// < param name="loggingSessionInfo"> < /param>
                /// < param name="OrderID"> < /param>
                /// < param name="ChannelID"> < /param>
                /// < param name="WeixinTransactionID"> < /param>
                /// < returns> < /returns>
    private bool CheckIfOrderPaid(OrderEntity entity, LoggingSessionInfo loggingSessionInfo, string OrderID, string ChannelId, ref string WeixinTransactionID)               {
                      WxPayData inputObj = new WxPayData();
                      // APP 中的微信支付,paymentcenter_id值为空                  
              if (string.IsNullOrEmpty(entity.paymentcenter_id))                       {                  
【利用微信支付的订单查询接口可以在APP 中提高支付的可靠性】                                    var common = new CommonBLL();                          
                                  AccessTokenEntity wxInfo = common.GetAppInfo(loggingSessionInfo);
                                  inputObj.SetValue("out_trade_no", OrderID);                        
                              WxPayData result = WxPayApi.OrderQuery(inputObj, wxInfo.AppID, wxInfo.Partner, wxInfo.Partnerkey);          
                              if (!result.IsSet("trade_state") || result.GetValue("trade_state").ToString() != "SUCCESS")                        
                                    {      
                                          return false;                          
                                      }          
                                        WeixinTransactionID = result.GetValue("transaction_id").ToString();                      
                                          }                      
                        else                    
                                          {                
                                          // 微信公众号支付                        
                                                if (!string.IsNullOrEmpty(WeixinTransactionID))                            
                                                              {            
                                                              inputObj.SetValue("transaction_id", WeixinTransactionID);                          
                                                                }                    
                                                else                  
                                                                  {                                    
                                                                                    inputObj.SetValue("out_trade_no", entity.paymentcenter_id);
                                                                        }
 
                          TPaymentTypeCustomerMappingEntity[] mappings =
                          new TPaymentTypeCustomerMappingBLL(this.CurrentUserInfo).QueryByEntity(new TPaymentTypeCustomerMappingEntity()                                                                  {                               
                                                                    ChannelId = ChannelId,                                       CustomerId = entity.customer_id                          
                                                                                }, null);
 
                              WxPayData result = WxPayApi.OrderQuery(inputObj, mappings[0].APPId, mappings[0].MerchantID, mappings[0].SignKey);      
                                if (!result.IsSet("trade_state") || result.GetValue("trade_state").ToString() != "SUCCESS")                  
                                                                  {    
                                                                                        return false;                          
                                                                      }              
        }                
      return true;
      }
 
 
(3)更多详细的微信订单查询接口,可以参考如下的微信官方链接:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2& index=4
 









    推荐阅读