ThinkPHP6+easywechat做微信支付扫码支付遇到的回调问题

代码环境:thinkPHP6 + php7.2 + windows server

框架运行方式:worker (命令行里运行 php think worker)

遇到的问题:

1.支付成功后,微信没有请求(没有进到)配置的回调接口;

2.请求接口后,接口里未获取到相应的xml参数。

问题1详细描述:在统一生成订单接口中配置的回调地址(notify_url),外网可直接访问且能访问成功,服务器也没有做防火墙策略限制。

导致问题的原因:我们项目的所有接口都是走的统一网关,网关那边限制了raw方式的请求(微信请求回调地址是用的POST方式,参数是用的raw方式传输)。

解决方法:公司大佬帮忙更改网关限制问题后,微信可正常访问设置的回调地址。

问题2详细描述:使用easywechat的回调处理方法handlePaidNotify(),一直报"Invalid request XML"错误,测试之后,发现用workerf方式运行框架((命令行里运行 php think worker),handlePaidNotify()会拿不到xml数据,所以easywechat一直拿不到xml数据,但是在$GLOBALS['HTTP_RAW_POST_DATA']中能获取到。(用命令行执行 php think run命令运行框架,或是使用apache访问,handlePaidNotify()可以正常拿到xml数据)

注意:如果在命令行中(cmd)使用的"php think worker"命令来运行框架的话,通过$GLOBALS['HTTP_RAW_POST_DATA']可以拿到xml数据,但如果在命令行中(cmd)使用的"php think run"命令来运行框架的话,只有通过file_get_contents("php://input")来获得xml数据。另外,有网友说php升级到7以后,没有$GLOBALS['HTTP_RAW_POST_DATA']了,但是目前我们使用的7.2版本,暂时还能获取到。

解决方法:放弃使用easywechat提供的handlePaidNotify()方法来处理回调逻辑,直接使用easywechat中的XML::parse()来解析通过$GLOBALS['HTTP_RAW_POST_DATA']变量获取到的数据,根据获取到的微信返回的状态来完成自己的代码逻辑。

    // 从$GLOBALS['HTTP_RAW_POST_DATA']里和file_get_contents("php://input")里都获取一下数据
    $message = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
    if(empty($message)) $message = file_get_contents("php://input");
    if(empty($message))  return false;

    // 将xml数据解析位数组
    $message = XML::parse($message);

    //你自己处理订单的代码逻辑
    ………………
    

by the way:可以使用easywechat中的 XML::build($data)方法来组装你要返给微信的xml数据。

$data= ['return_code' => 'FAIL', 'return_msg' => $res];
echo XML::build($data);
return toJson('');  // toJson是我们自己封装的返回json格式的方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值