支付宝手机网站支付notify异步返回验签失败
搞了一个星期后搞定。
过程如下:
首先上传企业的信息,通过审核之后,开始接入。
下载了最新的支付宝手机网址支付SDK PHP版。
http://aopsdkdownload.cn-hangzhou.alipay-pub.aliyun-inc.com/demo/alipay.trade.wap.pay-PHP-UTF-8.zip
配置填写参数:APPID、openssl生成的私钥,公钥要上传到支付宝商家后台。
支付宝网关目前有两个,一个是以前的商家号1.0接口:https://mapi.alipay.com/gateway.do
目前最新2.0采用应用的形式,接口:https://openapi.alipay.com/gateway.do
采用AlipayTradeServcie类请求支付:
$timeout_express="1m";
$payRequestBuilder = new AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setTimeExpress($timeout_express);
$payResponse = new AlipayTradeService($config);
$result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);
异步回调接收$_POST数据:notify_url.php
$arr = $_POST;
$alipaySevice = new AlipayTradeService($config);
$result = $alipaySevice->check($arr);
jqlog("notify data:");
jqlog(print_r($arr, true));
if ($result) { //验证成功
此$result
一直返回false
,进入AlipayTradeService.php
里面调用的openssl_verify
,开日志,看不出来问题, 没有阿里官方的错误码。仅仅是openssl_verify
函数返回失败。
大致就是使用了支付宝官网的php sdk集成到我们的第三方php商城平台。同步返回的验签通过了。但是异步验签失败。
同步返回的数据:
app_id=2016090101835493&auth_app_id=2016090101835493&charset=UTF-8&method=alipay.trade.wap.pay.return&out_trade_no=2016129153945712&seller_id=2088412610646251×tamp=2016-12-09 15:39:54&total_amount=0.01&trade_no=2016120921001004240294983745&version=1.0
验签通过
异步返回的数据:app_id=2016090101835493&auth_app_id=2016090101835493&buyer_id=2088002228430249&buyer_logon_id=tun***@gmail.com&buyer_pay_amount=0.01&charset=UTF-8&fund_bill_list=[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]&gmt_create=2016-12-09 15:34:25&gmt_payment=2016-12-09 15:34:25&invoice_amount=0.01¬ify_id=62fec6aebe29efc9de91810311654b1huq¬ify_time=2016-12-09 15:40:53¬ify_type=trade_status_sync&out_trade_no=2016120979410&point_amount=0.00&receipt_amount=0.01&seller_email=****&seller_id=2088412610646251&subject=order2016120979410&total_amount=0.01&trade_no=2016120921001004240295013034&trade_status=TRADE_SUCCESS&version=1.0
最后别着没办法,咨询支付宝网上客服,发现是机器人,没用!打支付宝售后电话 0571-88158090 ,告诉我技术问题上支付宝网站咨询。在支付宝开放平台论坛提问,没有人回答。论坛也没啥人气。我的帖子还是第462贴。其实最有效和支付宝工作人员沟通的方式是在支持中心页面点击:提问。类似于tickets的方式一对一解答。
最后问题找到,支付宝返回数据有问题,转义字符多了一个反斜杠。
'fund_bill_list' => '[{\\"amount\\":\\"0.01\\",\\"fundChannel\\":\\"ALIPAYACCOUNT\\"}]'
正确的应该是这样的
'fund_bill_list' => '[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]'
很奇怪的是,支付宝直接给我返回的就是两个反斜杠,所以PHP的解决办法就是返回的变量stripslashes
一次就可以了。
$arr['fund_bill_list'] = stripslashes($arr['fund_bill_list']);