最近在做一个 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。
问题解决。
后端现在不但能正常收到请求而且能正常处理了。
网友评论