PHP後台 接入支付寶

2022-07-12 12:48:11 字數 3107 閱讀 2214

我使用php主要是為客戶端做後台使用,並不會做前端網頁。  

這兩天因為公司專案需要,必須接入支付功能,而支付寶當然首當其衝,考慮迭代版本的需要,首先接入支付寶功能,其他的支付功能以後迭代版本的時候加入。

但是就是這麼乙個支付功能幾乎把我整的欲仙欲死~

首先理一下邏輯

1.服務端生成訂單簽名;

2.客戶端(ios/android)根據訂單簽名,呼叫支付寶支付;

3.支付寶**我們的後台,支付完成;

4.後台收到支付寶的通知,驗證這個通知;

5.驗證通過,更新資料庫訂單資訊;

最後是【放棄】了的,這裡只是想吐槽一下~

在網上查閱了些資料後,發現個似乎不錯的東西:ping++的支付sdk,感覺似乎還不錯~

【註冊】->【新增應用】->【上傳各種key】->【php端整合sdk】

似乎一切都在預想中進行,其實在剛開始的時候心裡就有些牴觸:支付這個東西跟錢有關,要是做的不安全可能就......這些key都給了ping++,他們拿到了公司的支付寶的各種key各種公鑰私鑰.......

根據ping++的文件,完成第一步生成簽名資訊後,返回給客戶端,客戶端根據簽名資訊完成支付;但是後面的步驟就沒有了~

在ping++中,生成簽名資訊的時候並沒有設定通知url的地方,也有可能是我沒有細心的看文件吧~諮詢ping++的客服後,告訴我是由客戶端通知我們自己的伺服器~

當此為止,我也就只能放棄掉ping++了,因為在金錢上面安全才是第一位,由客戶端通知伺服器這個邏輯在一下情況下是不可行的:

1.在支付成功後,客戶端突然退出程式(宕機、斷電、程式崩潰等等);

2.請求被人劫持,篡改資訊(金額、數量、或者壓根沒有支付);

再加上ping++處理工單的時間太慢,客服回覆也慢,以後要是出了大問題需要及時處理,找不到人就麻煩了,也就只能將其拋棄了~

從頭說起吧:

//↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

//合作身份者id,以2088開頭的16位純數字

$alipay_config['partner'] = '';

//收款支付寶賬號,一般情況下收款賬號就是簽約賬號

$alipay_config['seller_email'] = '';

//安全檢驗碼,以數字和字母組成的32位字元

$alipay_config['key'] = '';

$alipay_config['success_url'] = "";

//↑↑↑↑↑↑↑↑↑↑請在這裡配置您的基本資訊↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

4.生成支付order簽名(這裡以md5為例);

require_once("lib/alipay_core.function.php");

require_once("lib/alipay_md5.function.php");

function alipaysign($amount,$orderno)

方法中$amount為支付總額,$orderno為商戶平台訂單號,然後將簽名結果返回給客戶端。

5.客戶端得到支付簽名資訊後,呼叫支付寶的sdk直接進行支付,這裡就不再細說,畢竟本文主要點不在這裡;

然後客戶端並沒有支付成功,錯誤碼是輸入引數錯誤。

查閱了支付寶的文件之後,發現傳入的引數並沒有什麼遺漏,問題很有可能是sign的加密上出現了錯誤。

各種蛋疼之後,發現createlinkstring方法錯在一定的問題,這個方法返回的字串格式是:

key1=value1&key2=value2......

但是客戶端傳給支付寶後,支付寶通過相同的方法生成sign進行驗證,驗證不通過導致的。

修改了createlinkstring方法,使得每個value用引號包起來:

key1="value1"&key2="value2"......

這樣客戶端就可以完成支付了。

function createlinkstring($para) else

}if(get_magic_quotes_gpc())

return $arg;

}

6.通過生成支付簽名的時候設定的notify_url,再支付成功後,支付寶會**到這個url並將支付結果資訊通過post方法傳遞進來,值得注意的是notify_url中不能包含任何get方式傳遞的引數。

//正確

//錯誤

7.服務端驗證**是否合法,這一步相當重要。

1.驗證簽名;

2.驗證此次通知知否是支付寶發起的;

function verifyresult()else

}

然後又發現了,從支付寶通過notify_id能夠獲取到這次通知的資訊,但是sign簽名資訊就是驗證不通過。

function getsignveryfy($para_temp, $sign, $sign_type) 

return $issgin;

}

貌似又是createlinkstring的問題,驗證的時候value值不加引號,就能夠驗證通過了,通過md5加密結果和支付寶傳回來的一毛一樣。

修改createlinkstring方法:

function createlinkstring($para,$showquotes = false) 

foreach ($para as $key => $val) else

}if(get_magic_quotes_gpc())

return $arg;

}

在生成支付簽名資訊的時候,$showquotes傳入為true就可以了。

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...