美文网首页IT博客
APP 接入支付宝支付,后端 notify_url 收不到支付宝

APP 接入支付宝支付,后端 notify_url 收不到支付宝

作者: 1c7 | 来源:发表于2016-03-27 21:56 被阅读7072次

    最近在做一个 iOS 应用的后端,做到了支付部分。
    (后端用的是 PHP,如果你对这个感兴趣的话)

    按支付宝文档的业务流程,
    iOS 调支付宝的时候需要传入一个 notify_url
    当交易状态发生变化时,支付宝服务器会主动通知 notify_url,
    POST传递数据,JSON格式。

    </br>

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

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

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

    </br>

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

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

    </br>

    可能的坑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?) 这个问题了

    所以说这个问题只要把 \ 改成 / 就行了 = =

    </br>

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

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

    之前一直都是一行,

    -----BEGIN PUBLIC KEY-----xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbzzzzzzzzzzzzzzzzzzzzzzzz-----END PUBLIC KEY-----
    这里简书的格式好像有点问题,PUBLIC 两边太多空格了。

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

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    zzzzzzzzzzzzzzzzzzzzzzzz
    -----END PUBLIC KEY-----```
    
    真是无力吐槽
    
    

    responseTxt=true
    notify_url_log:isSign=true

    现在两个都是 true。
    问题解决。
    后端现在不但能正常收到请求而且能正常处理了。

    相关文章

      网友评论

        本文标题:APP 接入支付宝支付,后端 notify_url 收不到支付宝

        本文链接:https://www.haomeiwen.com/subject/ndljlttx.html