1c7 / VideoList

:us: -> :cn: @糖醋陈皮 翻译的视频列表
https://weibo.com/2004104451
57 stars 11 forks source link

APP 接入支付宝支付,notify_url 收不到支付宝主动通知的解决方法 #88

Open 1c7 opened 8 years ago

1c7 commented 8 years ago

最近在做一个 iOS 应用的后端,做到了支付部分。 按支付宝官方文档的业务流程, iOS 调用支付宝的时候需要传入一个 notify_url 当交易状态发生变化时,支付宝服务器会主动通知 notify_url,POST传递数据,JSON格式。


可能的坑1:主机提供商挡住了支付宝发来的请求

这里踩到了一个坑就是支付宝支付成功之后,notify_url 一直没收到支付宝的主动通知

后来发现是主机提供商(主机壳)的管理界面,有个过滤 User-Agent 的设置。 如果 user-agent 是空就拦截什么的。不记得了。 把钩去掉就好了, 调了半天结果是因为服务商拦下了支付宝的请求,所以到不了我们的程序。


可能的坑2:notify_url 不要带参数

我们之前是 https://xxx/?m=api&c=alipay&a=notify_toho 后来改成 https://xxx/alipay.php 就好了


可能的坑3:证书路径问题

签名死活不对,老是

responseTxt=true
 notify_url_log:isSign=false,discount=0.00&payment_type=1&subject=

注意 isSign = false

于是我决定调试下验证签名的地方,

function getHttpResponseGET($url,$cacert_url) {
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
    curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
    curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
    $responseText = curl_exec($curl);
    // var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
    logResult(curl_error($curl));

    curl_close($curl);

    return $responseText;
}

我在这里加了个 logResult(curl_error($curl)); 发现输出 Problem with the SSL CA cert (path? access rights?) 网上给的解决方法都不管用 (什么重启服务器啊, 更新ca-certificates 包啊,都不行)

后来发现原来是: $alipay_config['cacert'] = getcwd().'\\cacert.pem'; 如果你在 windows 上测试, echo file_get_contents($alipay_config['cacert']); 是可以的,

但是 linux 就不一样了。 echo file_get_contents($alipay_config['cacert']); 啥也没输出,说明路径不对。 改成如下就可以了 $alipay_config['cacert'] = getcwd().'/cacert.pem';

再次输出就没有 Problem with the SSL CA cert (path? access rights?) 这个问题了


可能的坑4:支付宝公钥换行

http://blog.csdn.net/huyiyang2010/article/details/38066273

之前一直都是一行,

-----BEGIN PUBLIC KEY-----xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbzzzzzzzzzzzzzzzzzzzzzzzz-----END PUBLIC KEY-----

后来64个字符一行,如上文,就好了。。isSign=True

-----BEGIN PUBLIC KEY----- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb zzzzzzzzzzzzzzzzzzzzzzzz -----END PUBLIC KEY-----

真是无力吐槽

responseTxt=true
notify_url_log:isSign=true