最近在做一個(gè) iOS 應(yīng)用的后端,做到了支付部分像云。
(后端用的是 PHP锌雀,如果你對(duì)這個(gè)感興趣的話)
按支付寶文檔的業(yè)務(wù)流程,
iOS 調(diào)支付寶的時(shí)候需要傳入一個(gè) notify_url
當(dāng)交易狀態(tài)發(fā)生變化時(shí)迅诬,支付寶服務(wù)器會(huì)主動(dòng)通知 notify_url腋逆,
POST傳遞數(shù)據(jù),JSON格式侈贷。
</br>
可能的坑1:主機(jī)提供商擋住了支付寶發(fā)來(lái)的請(qǐng)求
這里踩到了一個(gè)坑就是支付寶支付成功之后惩歉,notify_url 一直沒(méi)收到支付寶的主動(dòng)通知
后來(lái)發(fā)現(xiàn)是主機(jī)提供商(我們的測(cè)試服務(wù)器是"主機(jī)殼")的管理界面,
有個(gè)過(guò)濾 User-Agent 的設(shè)置俏蛮。
如果 user-agent 是空就攔截什么的撑蚌。不記得了。
把鉤去掉就好了嫁蛇,
調(diào)了半天結(jié)果是因?yàn)榉?wù)商攔下了支付寶的請(qǐng)求锨并,所以到不了我們的程序。
</br>
可能的坑2:notify_url 不要帶參數(shù)
我們之前是 https://xxx/?m=api&c=alipay&a=notify_toho
后來(lái)改成 https://xxx/alipay.php
就好了
</br>
可能的坑3:證書(shū)路徑問(wèn)題
簽名死活不對(duì)睬棚,老是
responseTxt=true
notify_url_log:isSign=false,discount=0.00&payment_type=1&subject=
注意 isSign = false
于是我決定調(diào)試下驗(yàn)證簽名的地方第煮,
function getHttpResponseGET($url,$cacert_url) {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0 ); // 過(guò)濾HTTP頭
curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 顯示輸出結(jié)果
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL證書(shū)認(rèn)證
curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//證書(shū)地址
$responseText = curl_exec($curl);
// var_dump( curl_error($curl) );//如果執(zhí)行curl過(guò)程中出現(xiàn)異常解幼,可打開(kāi)此開(kāi)關(guān),以便查看異常內(nèi)容
logResult(curl_error($curl));
curl_close($curl);
return $responseText;
}
我在這里加了個(gè) logResult(curl_error($curl));
發(fā)現(xiàn)輸出 Problem with the SSL CA cert (path? access rights?)
網(wǎng)上給的解決方法都不管用
(什么重啟服務(wù)器啊, 更新ca-certificates 包啊包警,都不行)
后來(lái)發(fā)現(xiàn)原來(lái)是:
$alipay_config['cacert'] = getcwd().'\\cacert.pem';
如果你在 windows 上測(cè)試撵摆,
echo file_get_contents($alipay_config['cacert']);
是可以的,
但是 linux 就不一樣了害晦。
echo file_get_contents($alipay_config['cacert']); 啥也沒(méi)輸出特铝,說(shuō)明路徑不對(duì)。
改成如下就可以了
$alipay_config['cacert'] = getcwd().'/cacert.pem';
再次輸出就沒(méi)有 Problem with the SSL CA cert (path? access rights?) 這個(gè)問(wèn)題了
所以說(shuō)這個(gè)問(wèn)題只要把 \ 改成 / 就行了 = =
</br>
可能的坑4:支付寶公鑰換行
http://blog.csdn.net/huyiyang2010/article/details/38066273
之前一直都是一行壹瘟,
-----BEGIN PUBLIC KEY-----xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbzzzzzzzzzzzzzzzzzzzzzzzz-----END PUBLIC KEY-----
這里簡(jiǎn)書(shū)的格式好像有點(diǎn)問(wèn)題鲫剿,PUBLIC 兩邊太多空格了。
后來(lái)64個(gè)字符一行稻轨,如上文灵莲,就好了。殴俱。isSign=True
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
zzzzzzzzzzzzzzzzzzzzzzzz
-----END PUBLIC KEY-----```
真是無(wú)力吐槽
responseTxt=true
notify_url_log:isSign=true
現(xiàn)在兩個(gè)都是 true政冻。
問(wèn)題解決。
后端現(xiàn)在不但能正常收到請(qǐng)求而且能正常處理了线欲。