目录
- 问题描述
- 解决方案
- 备注
- 总结
问题描述
在小程序支付退款调用api(https://api.mch.weixin.qq.com/secapi/pay/refund)时出现您的请求参数与订单信息不一致
的问题
解决方案
- 常见错误是
total_fee
、refund_fee
金额设定错误,这两个参数单位为分
,并且只能为整数,total_fee
的值需与原始的订单支付的金额相对应,refund_fee
的值不能超过可退款的余额 appid
需与小程序id对应- 退款单
out_refund_no
不能重复 商户号id
与订单生成时的商户号id
不一致- 我们项目的错误出在这种较为少见的情况:
- 我们是通过云开发的CloudPay.unifiedOrder()的api创建的支付单,传入参数列表包含
子商户号id[subMchId]
- 然后在后台调用的时候通过调用退款接口进行退款处理,但是调用的时候传入的商户号是商户号id[mch_id],并且通过微信订单号[transaction_id]查询,就出现了您的请求参数与订单信息不一致的情况,后来想在退款接口传入子商户号,发现并不满足条件,则通过云开发api的CloudPay.refund()解决
备注
- 云开发的退款功能需要授权,在微信开发者工具->云开发->设置->全局设置页的微信支付配置中,即
- 再通过授权网址进行通过授权即可
- 示例代码
const result = await cloud.cloudPay.refund({
nonceStr, // 随机字符串 可通过Math.random().toString(36).substr(2, 13)生成
total_fee, // 订单总额
refund_fee, // 退款金额
sub_mch_id, // 需授权退款且与订单生成时一致的商户号id
out_trade_no, // 与transaction_id二选一
out_refund_no // 商户自建退款订单号,退款单不能重复
})
- 触发云函数
总结
这次错误其实有预兆,因为我们在通过商户订单号[out_trade_no]
查询不到订单,但是通过微信订单号[transaction_id]
能查询到订单时直接忽略了,以为微信支付不能通过商户订单号[out_trade_no]
查询,在接下来的退款操作时就出现了以上参数与订单信息不一致
的错误,纠错了半天,殊不知是子商户号
和商户号
填写错误的问题