如何驗證伺服器建立的支付寶訂單格式正確

來源:酷知科普網 1.74W

APP支付介面:
伺服器端使用框架:Thinkphp5
登入螞蟻金服開放平臺 --> 建立應用 --> 新增App支付功能。具體檢視官方文件
下載官方 SDK (PHP版本資源)——當前SDK版本:106  生成時間:2017-07-25 11:46:10
將SDK原碼放置在TP5的vendor目錄下的alipay資料夾(可根據實際使用框架技術進行實際調整)。

操作方法

(01)支付介面呼叫原理1、APP支付系統架構APP支付系統架構圖

(02)2、資料校驗原理應用公鑰(商戶自身的RSA公鑰):支付寶使用該公鑰驗證該交易是商戶發起。支付寶公鑰(支付寶的RSA公鑰):商戶使用該公鑰驗證該結果是支付寶返回的。

如何驗證伺服器建立的支付寶訂單格式正確

(03)3、系統互動流程系統互動流程圖

如何驗證伺服器建立的支付寶訂單格式正確 第2張

(04)4、支付場景具體實現流程(最詳細圖解)在整合App支付能力時,建議實現如下支付流程,建立訂單並支付,根據返回的結果確定支付狀態,並進行相應的異常處理,其過程如圖所示.支付場景具體實現流程商家APP在建立訂單並且喚起支付寶APP支付,流程如圖所示,根據第2.2,3步返回的支付結果,確定支付狀態,並且做相應的異常處理(必要時關閉訂單)

如何驗證伺服器建立的支付寶訂單格式正確 第3張

程式碼實現

(01)步驟1:商戶APP端請求商戶伺服器介面,提交訂單資料。

(02)步驟2:商戶伺服器端接收資料,然後對資料進行簽名,返回請求引數到商戶APP端。官方介面文件:https://docs.open.alipay.com/204/105465/——程式碼如下://vendor();為TP5框架的方法,作用:匯入第三方框架類庫vendor('alipay.aop.AopClient');vendor('alipay.aop.request.AlipayTradeAppPayRequest');//例項化支付介面$aop = new AopClient();$aop->gatewayUrl = ""; //支付寶閘道器$aop->appId = “應用ID,填寫你的APPID”;$aop->rsaPrivateKey = "商戶私鑰,您的原始格式RSA私鑰()";$aop->alipayrsaPublicKey = "支付寶公鑰";$aop->apiVersion = '1.0';$aop->signType = "簽名方式,如 RSA2 ";$aop->postCharset = 'UTF-8';$aop->format = "json";//例項化具體API對應的request類,類名稱和介面名稱對應,當前呼叫介面名稱:$appRequest = new AlipayTradeAppPayRequest();//SDK已經封裝掉了公共引數,這裡只需要傳入業務引數$bizcontent = json_encode(['body' => '餘額充值',  //訂單描述'subject' => '充值',   //訂單標題'timeout_express' => '30m','out_trade_no' => ‘20170125test01’, //商戶網站唯一訂單號'total_amount' => '0.01', //訂單總金額'product_code' => 'QUICK_MSECURITY_PAY', //固定值]);$appRequest->setNotifyUrl($url);  //設定非同步通知地址$appRequest->setBizContent($bizcontent);//這裡和普通的介面呼叫不同,使用的是sdkExecute$response = $aop->sdkExecute($appRequest);//htmlspecialchars是為了輸出到頁面時防止被瀏覽器將關鍵引數html轉義,實際列印到日誌以及http傳輸不會有這個問題echo htmlspecialchars($response);//就是orderString 可以直接給客戶端請求,無需再做處理。// 如果最後有問題可以嘗試把htmlspecialchars方法去掉,直接返回$response

(03)步驟3:商戶APP接收從商戶伺服器端返回的請求引數,然後調起支付寶支付面板。若使用者支付成功,支付寶會同步給商戶APP端返回一個支付結果。相應地,支付寶也會通過非同步通知給商戶伺服器端返回一個支付結果。注意:由於同步通知和非同步通知都可以作為支付完成的憑證,且非同步通知支付寶一定會確保傳送給商戶服務端。為了簡化整合流程,商戶可以將同步結果僅僅作為一個支付結束的通知(忽略執行校驗),實際支付是否成功,完全依賴服務端非同步通知。

(04)步驟4:服務端非同步通知處理機制(支付寶主動發起通知,該方式才會被啟用)官方介面文件:注意點:1)必須保證伺服器非同步通知頁面(notify_url)上無任何字元,如空格、HTML標籤、開發系統自帶丟擲的異常提示資訊等;2)支付寶是用POST方式傳送通知資訊,因此該頁面中獲取引數的方式,如:$_POST[‘out_trade_no’];3)程式執行完後必須列印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);4)當商戶收到伺服器非同步通知並打印出success時,伺服器非同步通知引數notify_id才會失效。——程式碼如下:$aop = new AopClient;$aop->alipayrsaPublicKey = '請填寫支付寶公鑰,一行字串';$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");  //驗證簽名if($flag)exit('fail');}echo"fail"; //驗證簽名失敗

(05)步驟5:當商戶APP端接收到支付寶的同步返回結果為成功時,商戶APP端再請求商戶伺服器端API,判斷訂單最終支付結果,並做出最終響應。

特別提示

在除錯過程中要對程式碼的安全細節做完善,以免資料被洩露

熱門標籤