微信小程序开发实战11_3 支付订单的查询

12.4查询支付订单

商户可以通过查询订单接口主动查询订单状态,并根据支付的结果来执行下一步的业务逻辑。查询订单状态可通过微信支付订单号或商户订单号两种方式进行查询,两种查询方式返回结果相同。需要调用查询接口的情况有:

  • 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知。
  • 调用支付接口后,返回系统错误或未知交易状态情况。
  • 调用付款码支付API,返回USERPAYING的状态。
  • 调用关单接口API之前,需确认支付状态。
    与支付下单接口类似,微信支付为直连商户与服务商提供了不同的查询接口(接口的地址与参数都不相同)。接下来分别介绍两种模式下的支付订单查询接口的使用方式。

12.4.1服务商模式

支付订单查询接口通过HTTP的GET方法调用,并提供了通过微信订单号以及商户订单号两种方式来查询支付订单。
1)通过服务商微信订单号查询支付订单
接口的格式为:
https://api.mch.weixin.qq.com/v3/pay/partner/transactions/id/{transaction_id}?sp_mchid={sp_mchid}&sub_mchid={sub_mchid}
接口中的请求参数说明如下:

  • transaction_id:微信订单号
  • sp_mchid:服务商商户号
  • sub_mchid:子商户商户号

2)通过服务商商户订单号查询支付订单
接口的格式为:
https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/{out-trade-no}?sp_mchid={sp_mchid}&sub_mchid={sub_mchid}
接口中的请求参数说明如下:

  • out-trade-no:商户订单号
  • sp_mchid:服务商商户号
  • sub_mchid:子商户商户号

两种查询方式返回结果相同,返回结果的数据结构如下所示:

参数名 变量 描述
服务商应用ID sp_appid 服务商申请的公众号或移动应用appid。
服务商户号 sp_mchid 服务商户号,由微信支付生成并下发
子商户应用ID sub_appid 子商户申请的公众号或移动应用appid。
子商户号 sub_mchid 子商户的商户号,由微信支付生成并下发。
商户订单号 out_trade_no 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
微信支付订单号 transaction_id 微信支付系统生成的订单号。
交易类型 trade_type 交易类型,枚举值:
交易状态 trade_state 交易状态,枚举值:
交易状态描述 trade_state_desc 交易状态描述
付款银行 bank_type 银行类型,采用字符串类型的银行标识。
附加数据 attach 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
支付完成时间 success_time 支付完成时间。
+支付者 payer 支付者信息
+订单金额 amount 订单金额信息,当支付成功时返回该字段。
+场景信息 scene_info 支付场景描述
+优惠功能 promotion_detail 优惠功能,享受优惠时返回该字段。

通过商户订单号以及微信订单号查询支付订单的相关代码如下:

//支付订单查询
//transaction_id:微信支付订单号
//mchid:子商户号
func queryByTransactionIdX(ent *MchParam, transaction_id string, mchid string) (WxPayInfo, error) {
    
    
   var par_info WxPayInfo
   url := fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/partner/transactions/id/%s?sp_mchid=%s&sub_mchid=%s",
      transaction_id, ent.Mchid, mchid)
   result, err := WxPayGetV3(ent, url)
   if err != nil {
    
    
      fmt.Println(err)
      return par_info, err
   }
   err = json.Unmarshal([]byte(result), &par_info)
   if err != nil {
    
    
      fmt.Println(err)
      return par_info, err
   }

   return par_info, nil
}

//支付订单查询
//out_trade_no:业务订单号
//mchid:子商户号
func queryByOutTradeNoX(ent *MchParam, out_trade_no string, mchid string) (WxPayInfo, error) {
    
    
   var par_info WxPayInfo
   url := fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/%s?sp_mchid=%s&sub_mchid=%s",
      out_trade_no, ent.Mchid, mchid)
   result, err := WxPayGetV3(ent, url)
   if err != nil {
    
    
      fmt.Println(err)
      return par_info, err
   }
   err = json.Unmarshal([]byte(result), &par_info)
   if err != nil {
    
    
      fmt.Println(err)
      return par_info, err
   }

   return par_info, nil
}

12.4.2直连商户模式

直连商户订单查询与服务商订单查询基本一致,也可以通过微信支付订单号或商户订单号两种方式查询订单:
1)通过直连商户微信订单号查询支付订单
接口的格式为:
https://api.mch.weixin.qq.com/v3/pay/transactions/id/{transaction_id}?mchid={mchid}
接口中的请求参数说明如下:

  • transaction_id:微信订单号
  • mchid: 直连商户号

2)通过直连商户微信订单号查询支付订单
接口的格式为:
https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out-trade-no}?mchid={mchid}
接口中的请求参数说明如下:

  • out-trade-no:商户订单号
  • mchid: 直连商户号

通过商户订单号以及微信订单号查询支付订单的相关代码如下:

//支付订单查询
//transaction_id:微信支付订单号
//mchid:商户号
func queryByTransactionId(ent *MchParam, transaction_id string, mchid string) (WxPayInfo, error) {
    
    
   var par_info WxPayInfo
   url := fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/id/%s?mchid=%s", transaction_id, mchid)
   result, err := WxPayGetV3(ent, url)
   if err != nil {
    
    
      fmt.Println(err)
      return par_info, err
   }
   err = json.Unmarshal([]byte(result), &par_info)
   if err != nil {
    
    
      fmt.Println(err)
      return par_info, err
   }

   return par_info, nil
}

//支付订单查询
//out_trade_no:业务订单号
//mchid:商户号
func queryByOutTradeNo(ent *MchParam, out_trade_no string, mchid string) (WxPayInfo, error) {
    
    
   var par_info WxPayInfo
   url := fmt.Sprintf("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/%s?mchid=%s", out_trade_no, mchid)
   result, err := WxPayGetV3(ent, url)
   if err != nil {
    
    
      return par_info, err
   }
   err = json.Unmarshal([]byte(result), &par_info)
   if err != nil {
    
    
      return par_info, err
   }

   return par_info, nil
}

猜你喜欢

转载自blog.csdn.net/gz_hm/article/details/128517907
今日推荐