标签 支付宝接口 下的文章

支付宝手机网站支付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

支付宝手机网站支付notify异步返回验签失败

采用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&timestamp=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&notify_id=62fec6aebe29efc9de91810311654b1huq&notify_time=2016-12-09 15:40:53&notify_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']);