我使用php主要是為客戶端做後台使用,並不會做前端網頁。
這兩天因為公司專案需要,必須接入支付功能,而支付寶當然首當其衝,考慮迭代版本的需要,首先接入支付寶功能,其他的支付功能以後迭代版本的時候加入。
但是就是這麼乙個支付功能幾乎把我整的欲仙欲死~
首先理一下邏輯
1.服務端生成訂單簽名;
2.客戶端(ios/android)根據訂單簽名,呼叫支付寶支付;
3.支付寶**我們的後台,支付完成;
4.後台收到支付寶的通知,驗證這個通知;
5.驗證通過,更新資料庫訂單資訊;
最後是【放棄】了的,這裡只是想吐槽一下~
在網上查閱了些資料後,發現個似乎不錯的東西:ping++的支付sdk,感覺似乎還不錯~
【註冊】->【新增應用】->【上傳各種key】->【php端整合sdk】
似乎一切都在預想中進行,其實在剛開始的時候心裡就有些牴觸:支付這個東西跟錢有關,要是做的不安全可能就......這些key都給了ping++,他們拿到了公司的支付寶的各種key各種公鑰私鑰.......
根據ping++的文件,完成第一步生成簽名資訊後,返回給客戶端,客戶端根據簽名資訊完成支付;但是後面的步驟就沒有了~
在ping++中,生成簽名資訊的時候並沒有設定通知url的地方,也有可能是我沒有細心的看文件吧~諮詢ping++的客服後,告訴我是由客戶端通知我們自己的伺服器~
當此為止,我也就只能放棄掉ping++了,因為在金錢上面安全才是第一位,由客戶端通知伺服器這個邏輯在一下情況下是不可行的:
1.在支付成功後,客戶端突然退出程式(宕機、斷電、程式崩潰等等);再加上ping++處理工單的時間太慢,客服回覆也慢,以後要是出了大問題需要及時處理,找不到人就麻煩了,也就只能將其拋棄了~2.請求被人劫持,篡改資訊(金額、數量、或者壓根沒有支付);
從頭說起吧:
//↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓4.生成支付order簽名(這裡以md5為例);//合作身份者id,以2088開頭的16位純數字
$alipay_config['partner'] = '';
//收款支付寶賬號,一般情況下收款賬號就是簽約賬號
$alipay_config['seller_email'] = '';
//安全檢驗碼,以數字和字母組成的32位字元
$alipay_config['key'] = '';
$alipay_config['success_url'] = "";
//↑↑↑↑↑↑↑↑↑↑請在這裡配置您的基本資訊↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
require_once("lib/alipay_core.function.php");方法中$amount為支付總額,$orderno為商戶平台訂單號,然後將簽名結果返回給客戶端。require_once("lib/alipay_md5.function.php");
function alipaysign($amount,$orderno)
5.客戶端得到支付簽名資訊後,呼叫支付寶的sdk直接進行支付,這裡就不再細說,畢竟本文主要點不在這裡;
然後客戶端並沒有支付成功,錯誤碼是輸入引數錯誤。
查閱了支付寶的文件之後,發現傳入的引數並沒有什麼遺漏,問題很有可能是sign的加密上出現了錯誤。
各種蛋疼之後,發現createlinkstring方法錯在一定的問題,這個方法返回的字串格式是:
key1=value1&key2=value2......
但是客戶端傳給支付寶後,支付寶通過相同的方法生成sign進行驗證,驗證不通過導致的。
修改了createlinkstring方法,使得每個value用引號包起來:
key1="value1"&key2="value2"......
這樣客戶端就可以完成支付了。
function createlinkstring($para) else6.通過生成支付簽名的時候設定的notify_url,再支付成功後,支付寶會**到這個url並將支付結果資訊通過post方法傳遞進來,值得注意的是notify_url中不能包含任何get方式傳遞的引數。}if(get_magic_quotes_gpc())
return $arg;
}
//正確7.服務端驗證**是否合法,這一步相當重要。//錯誤
1.驗證簽名;
2.驗證此次通知知否是支付寶發起的;
function verifyresult()else然後又發現了,從支付寶通過notify_id能夠獲取到這次通知的資訊,但是sign簽名資訊就是驗證不通過。}
function getsignveryfy($para_temp, $sign, $sign_type)貌似又是createlinkstring的問題,驗證的時候value值不加引號,就能夠驗證通過了,通過md5加密結果和支付寶傳回來的一毛一樣。return $issgin;
}
修改createlinkstring方法:
function createlinkstring($para,$showquotes = false)在生成支付簽名資訊的時候,$showquotes傳入為true就可以了。foreach ($para as $key => $val) else
}if(get_magic_quotes_gpc())
return $arg;
}
function alipaysign($amount,$orderno)8.然後在驗證通過後,就可以修改自己資料庫了;
支付寶接入
三 將上面的資料夾拖入工程,並新增相應的依賴庫 進行編譯,會出現以下問題 1 unknown type name nsstring 或者 unknown type name nsdata 等不識別常見類的問題。這是因為缺少foundation類庫和uikit類庫,支付寶demo中之所以沒有出現此錯誤...
PHP接入支付寶的流程
php接入支付寶的流程寫在這裡供像我一樣的小白參考。1.首先要有乙個建立乙個應用 選好自己想要的功能,關於支付的功能,貌似都需要簽約 我選擇的是md5簽名方式,下面紅框內就是做好的php demo lib檔案很重要,是整個介面的核心類檔案 alipay.config.php是相關引數的配置檔案 al...
APP接入支付寶支付
1.把支付寶的.aar檔案匯入到應用工程的libs目錄下 2.在工程主專案的build.gradle中,新增下面的內容,將libs目錄作為依賴倉庫 dependencies資源匯入就完成了 然後在清單檔案新增如下許可權 android.permission.internet android.perm...