浅析悦乐程微信支付:如何退款?如何编写退款回调接口?

在实际场景中 , 像悦乐程或者是悦程出行 , 出行唯选这种小程序申请退款和退款回调接口是比较常用到的微信支付接口 , 这里我们会讲原路返回方式的退款 , 还有的是使用直接为用户付款到零钱、现金红包等方式来退款 , 此种情况主要会出现在客服退款时 , 不是全部退款的情况 , 也有的会出现在使用了微信代金券-单品券的时候 , 因为单品券不能部分退款 , 所以只能走企业付款用户的方式 , 以下我们主要讲原路返回退款 。
PS:原路返回的意思就是 , 从你支付时的关联支付单中扣款 , 微信会记录相关数据 , 可以在客户端通知中展示 。
浅析悦乐程微信支付:如何退款?如何编写退款回调接口?
文章图片
1、申请退款接口
以下为微信官方的申请退款文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
1.1.应用场景
当交易发生之后一段时间内 , 由于买家或者卖家的原因需要退款时 , 卖家可以通过退款接口将支付款退还给买家 , 微信支付将在收到退款请求并且验证成功之后 , 按照退款规则将支付款按原路退到买家帐号上 。
注意:1、交易时间超过一年的订单无法提交退款2、微信支付退款支持单笔交易分多次退款 , 多次退款需要提交原支付订单的商户订单号和设置不同的退款单号 。 申请退款总金额不能超过订单金额 。 一笔退款失败后重新提交 , 请不要更换退款单号 , 请使用原商户退款单号3、请求频率限制:150qps , 即每秒钟正常的申请退款请求次数不超过150次错误或无效请求频率限制:6qps , 即每秒钟异常或错误的退款申请请求不超过6次4、每个支付订单的部分退款次数不能超过50次
PS:以上限制一般情况下不会出现 , 但我们也必须写入系统异常场景处理中 , 请求频率可以使用队列或增加延迟等方式来处理 , 部分退款此时不要超过微信的限制 。
1.2.接口链接
https://api.mch.weixin.qq.com/secapi/pay/refund
1.3.是否需要证书
请求需要双向证书 。
PS:关于微信证书 , 可以在[商户平台-账户中心-API安全]去下载 , 此证书很多支付接口均需要使用 , 请将证书地址配置为常量 , 具体实现可以参考作者github源码 。
1.4.调用接口
先看源码 , 如下:
以上为sdk退款调用示例代码 , 有几个参数需要我们注意:
浅析悦乐程微信支付:如何退款?如何编写退款回调接口?
文章图片
浅析悦乐程微信支付:如何退款?如何编写退款回调接口?】PS:推荐以上的参数都必填 , notify_url参数可配置为环境常量 , 根据环境的不同配置调用不会的回调地址 。
下面为具体的实际sdkwxPay.refund调用代码:
浅析悦乐程微信支付:如何退款?如何编写退款回调接口?
文章图片
以上已经详细说明的具体的字段含义 , 有不明白的同学可以查看微信的官方文档 , 具体的源码可以查看作者的github 。
这里有一个比较需要注意的点 , 在我们调用退款之后 , 会返回一些异常处理情况 , 官方文档中收录了一系列错误码code , 我们可以在系统中对其进行处理 , 这里就不细说了 。
2、退款回调接口
以下为微信官方的退款结果通知文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10
2.1.应用场景
当商户申请的退款有结果后 , 微信会把相关结果发送给商户 , 商户需要接收处理 , 并返回应答 。
对后台通知交互时 , 如果微信收到商户的应答不是成功或超时 , 微信认为通知失败 , 微信会通过一定的策略定期重新发起通知 , 尽可能提高通知的成功率 , 但微信不保证通知最终能成功 。