记录个前段时间调试出BUG的情况 关于微信支付的 前段时间按照V3版本的支付开发文档给客户调试订单退款 退钱各方面都顺顺当当 钱款也能正常按照客户支付的渠道退回 就是回调通知...调得一言难尽 队伍里做这块的同事手上有其他项目 好了 '重任'就落到了我的头上
调试下来的话 问题就出在退款回调上 因为程序这边当时设计的时候 是支付回调之后 数据库 缓存上有一些相应的操作[类似订单状态修改 库存扣减 积分积累这些] 按照正常流程走 退款回调后 也是这些相应流程 BUG后来解决了 今天弄退款的时候突然想起这个 特别记录下 防止之后又遇到一脸懵 服务端的开发语言是PHP 支付这边调用的是JSAPI 如果是其他语言 或者支付调用的是其他接口 还有微信支付文档不是V3的版本 就可以不用参考了
先看下回调时候微信支付的数据格式 官方文档是
https://pay.weixin.qq.com/doc/v3/merchant/4012791865
{ "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", "create_time":"2025-10-10T10:50:01+08:00", "resource_type":"encrypt-resource", "event_type":"REFUND.SUCCESS", "summary":"退款成功", "resource":{ "original_type":"refund", "algorithm":"AEAD_AES_256_GCM", "ciphertext":"xxxxxxxxxxxxxx", "associated_data":"refund", "nonce":"xxxxxxxxxx" }}
按照官方文档的字段说明 最关键的是"create_time"和"resource"数组里的"ciphertext"字段 这个字段解密后的内容是
1{2 "mchid": "1900000100",3 "transaction_id": "1008450740201411110005820873",4 "out_trade_no": "20150806125346",5 "refund_id": "50200207182018070300011301001",6 "out_refund_no": "7752501201407033233368018",7 "refund_status": "SUCCESS",8 "success_time": "2018-06-08T10:34:56+08:00",9 "user_received_account": "招商银行信用卡0403",10 "amount" : {11 "total": 999,12 "refund": 999,13 "payer_total": 999,14 "payer_refund": 99915 }16}
好吧 其实问题就是出现在回调时候的这2个json串 不知道其他开发者有没遇到这个情况哈 我这边在获取回到数据的时候 单独给json串做了首尾的空白字符及指定字符的去除后 解析就正常了 之前直接给返回的json串做json_decode转数组会报错 返回的json串类似会这样
'{"id":"xxx"}'
如果没有做收尾空白字符的去除 就不能正常获取到resource数组里的待解密字段[数据解密就不单独做记录了 如果有需要步骤的可以私信]
算是自己粗心造成的BUG 记录下 也算是调整好了退款流程 并且正常回调后 服务端那边能获取到加密数据里的订单号和退款相关信息在数据库里进行相应操作 下次写服务端的代码还是需要细心一些 就这样~
保持好奇 不断进步 下期见~