yansongda / pay

可能是我用过的最优雅的 Alipay/WeChat/Douyin/Unipay/江苏银行 的支付 SDK 扩展包了
http://pay.yansongda.cn
MIT License
5.02k stars 1.03k forks source link

关于微信退款异步通知验证 #279

Closed FFCZ closed 5 years ago

FFCZ commented 5 years ago

包版本号

v2.8.4

问题描述

响应微信服务端退款通知时,返回以下错误 ERROR_GATEWAY: ERROR_BUSINESS: Wechat Business Error: ORDERPAID - order paid yansongda/pay/src/Gateways/Wechat/Support.php line:418 code:6

你的代码

//引用对象 $Payer = Pay::wechat($config); $result = $Payer->verify(null, true); //记录请求 sys_logs(json_encode($result, JSON_UNESCAPED_UNICODE)); //退款成功 if (isset($result->return_code) && $result->return_code == 'SUCCESS' && isset($result->refund_status) && $result->refund_status == 'SUCCESS') { //业务逻辑 try { sys_logs('执行到这里就出错'); //入库处理,记录退款情况 //code ... } catch (Exception $e) { //code ... } return $Payer->success()->send(); }

报错详情

Gateways/Wechat/Support.php 的418行,是在判断result_code,响应退款根本没有这个变量,只有一个refund_status。sdk的日志是 ORDERPAID ,应该不是这个支付接口返回的内容??? 微信文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10

sdk 日志

ERROR_GATEWAY: ERROR_BUSINESS: Wechat Business Error: ORDERPAID - order paid

nginx/apache 日志

涉及到 异步通知、同步通知 的问题,请贴出来


谢谢作者的劳动,祝工作顺利,家庭幸福,中秋快乐

yansongda commented 5 years ago

https://github.com/yansongda/pay/blob/master/src/Gateways/Wechat.php#L186

退款验证并不会请求微信 API,您确定这个报错是退款引起的?

FFCZ commented 5 years ago

https://github.com/yansongda/pay/blob/master/src/Gateways/Wechat.php#L186

退款并不会请求微信 API,您确定这个报错是退款引起的?

可以在微信商户平台定义一个url,当退款完成的时候,微信服务器会主动请求这个url,通知退款结果。难道 $result = $Payer->verify(null, true); 这个不能用于这个场景??

谢谢回复

yansongda commented 5 years ago

我的意思是,SDK 中的 $wechat->verify(null, true) 并不会主动请求微信的 API,但是您的错误 Wechat Business Error: ORDERPAID - order paid 显然是请求微信 API 后造成的一个错误,所以

您确定这个报错是退款验证引起的?

FFCZ commented 5 years ago

001 这个是我的代码截图,箭头指示的代码还可以捕抓到,但到了后面就返回 ORDERPAID 错误了。 try部分都是DB方面的更新操作,没有再请求微信的api了。

FFCZ commented 5 years ago

问题解决了。原来是我的一个钩子,触发了 sdk 的 close 方法,可能觉得已支付的订单不能关闭,就抛出错误,感觉close这个地方可以再优雅一点处理。 再次谢谢作者的劳动

yansongda commented 5 years ago

好的,感谢支持