• 利用微信支付的订单查询接口可以在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值为空),   根据业务系统中的订单号out_trade_no 来调用微信的订单查询接口,以确认是否该订单已经支付成功       
    
             if (string.IsNullOrEmpty(entity.paymentcenter_id))             {          
    
                        var common = new CommonBLL();              
    
                       
    
                        // APP 中使用微信支付时,微信系统设定的APP 相关账户信息(partner,partnerkey)
    
                        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);
    
                                       }
    
                 
    
                 // 获取微信公众号的相关账户信息(MerchantID,SignKey,APPId等)
    
                 TPaymentTypeCustomerMappingEntity[] mappings = 
    
                  new TPaymentTypeCustomerMappingBLL(this.CurrentUserInfo).QueryByEntity(
    
                      new TPaymentTypeCustomerMappingEntity()             
    
                                   {                
    
                                        ChannelId = ChannelId,                     CustomerId = entity.customer_id              
    
                                  }
    
                              , null );
    
     
    
     
    
                   // 调用微信支付查询接口,这次inputobj 的取值要么是微信系统的transaction_id(微信推荐使用transaction_id 来查询订单),要么是我们自己业务系统的订单号(out_trade_no)。
    
                    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

  • 相关阅读:
    【专项学习】—— TypeScript基础语法入门
    【重点突破】—— React应用中封装axios(转)
    【重点突破】—— vue中Axios的封装和API接口的管理(转)
    【后台管理系统】—— 基础功能模块的开发之登录
    【后台管理系统】—— 通用部分的开发
    【后台管理系统】—— 开发环境的搭建之webpack的配置
    【重点突破】—— 三大框架对比Vue&React&Angular
    【大众点评】—— 首页开发
    【大众点评】—— 前端架构设计
    【重点突破】—— React Router 4:全新的React组件式的动态路由库
  • 原文地址:https://www.cnblogs.com/Fluent-1202/p/6812382.html
Copyright © 2020-2023  润新知