快捷搜索: 王者荣耀 脱发

微信小程序开发实战11_4 微信支付退款流程

13.1退款申请

参数名 变量 描述 子商户号 sub_mchid 子商户的商户号(服务商模式下) 商户订单号 out_trade_no 原支付交易对应的商户订单号 商户退款单号 out_refund_no 商户系统内部的退款单号 退款原因 reason 若商户传入,会在下发给用户的退款消息中体现退款原因 金额信息 amoun t 订单金额信息 退款商品 goods_detail 指定商品退款需要传此参数,其他场景无需传递

接下来分别给出直连商户与服务商两种模式下的支付退款申请接口的相关数据结构以及函数。

13.2处理退款通知

参数名 变量 描述 通知ID id 通知的唯一ID 通知创建时间 create_time 通知创建的时间 通知类型 event_type 通知的类型:REFUND.SUCCESS:退款成功通知REFUND.ABNORMAL:退款异常通知REFUND.CLOSED:退款关闭通知 通知简要说明 summary 通知简要说明 通知数据类型 resource_type 通知的资源数据类型,支付成功通知为encrypt-resource 通知数据 resource 通知资源数据JSON格式

退款结果对重要的数据进行了加密,商户需要用商户密钥进行解密后才能获得结果通知的内容。商户对resource对象进行解密后,得到的通知参数,具体字段含义如下:

参数名 变量 描述 直连商户号 mchid 直连商户的商户号(直连模式下)。 服务商户号 sp_mchid 服务商户号(服务商模式下)。 子商户号 sub_mchid 子商户的商户号(服务商模式下)。 商户订单号 out_trade_no 返回的商户订单号 商户退款单号 out_refund_no 商户退款单号 退款状态 refund_status 退款状态,枚举值:SUCCESS:退款成功CLOSE:退款关闭ABNORMAL:退款异常 退款成功时间 success_time 退款成功时间 退款入账账户 user_received_account 取当前退款单的退款入账方。 金额信息 amount 金额信息

退款通知相关的数据结构定义如下:

接下来看看一个退款通知处理的示例代码:

func HandlerRefundCB(w http.ResponseWriter, r *http.Request) {
          
   
var ret_info RefundOrderInfoCB
body, err := ioutil.ReadAll(r.Body)
if err != nil {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
if len(body) < 1 {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
//读取签名验证所需的参数
var sing_param WxSignParam
err = sing_param.InitFromRequest(r, string(body))
if err != nil {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
//获取平台证书,并进行签名验证
plat_certificate := GetPlatCertificate(ent, sing_param.CertSerial)
err = ResponseValidate(&sing_param, plat_certificate);
if err != nil {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
//body数据解析
var ent_cb WeixinPayNotice
if err = json.Unmarshal(body, &ent_cb); err != nil {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
//数据解密
decryptBytes, err := DecryptAES256GCM(
   ent.MchAPIKey,
   ent_cb.Resource.AssociatedData,
   ent_cb.Resource.Nonce,
   ent_cb.Resource.Ciphertext)
if err != nil {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
//订单数据解析
err = json.Unmarshal([]byte(decryptBytes), &ret_info)
if err != nil {
          
   
   wxpay4go.HttpCallBackReturn(w, 500,"FAIL", "FAIL")
   return
}
//其他业务逻辑开始
//..........................
//其他业务逻辑结束
wxpay4go.HttpCallBackReturn(w, 200, "SUCCESS", "SUCCESS")
}

13.3退款查询

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

参数名 变量 描述 商户退款单号 out_refund_no 商户系统内部的退款单号 商户订单号 out_trade_no 原支付交易对应的商户订单号 退款渠道 channel 枚举值:ORIGINAL:原路退款BALANCE:退回到余额OTHER_BALANCE:原账户异常退到其他余额账户OTHER_BANKCARD:原银行卡异常退到其他银行卡 退款入账账户 user_received_account 取当前退款单的退款入账方 退款成功时间 success_time 退款成功时间,当退款状态为退款成功时有返回。 退款创建时间 create_time 退款受理时间 退款状态 status 枚举值:SUCCESS:退款成功CLOSED:退款关闭PROCESSING:退款处理中ABNORMAL:退款异常 资金账户 funds_account 退款所使用资金对应的资金账户类型 金额信息 amount 金额详细信息 优惠退款信息 promotion_detail 优惠退款信息

以下是退款查询的服务商模式的代码以及直连商户模式的代码:

经验分享 程序员 微信小程序 职场和发展