當前位置:編程學習大全網 - 編程語言 - php開發中如何連接app和支付寶?

php開發中如何連接app和支付寶?

準備工作/即將開始工作

APP支付界面:alipay.trade.app.pay

服務器端使用框架:TP5

登錄螞蟻金服開放平臺-& gt;創建應用程序-& gt;增加App支付功能。詳見官方文件。

下載官方SDK (PHP版本資源)-當前SDK版本:106生成時間:2017-07-25 11:46:10。

將SDK源代碼放在TP5的廠商目錄下的支付寶文件夾中(可以根據實際使用框架技術進行調整)。

支付接口調用原理

1,APP支付系統架構

APP支付系統架構圖

2.數據驗證原則

數據檢查原則

應用公鑰(商家本身的RSA公鑰):支付寶用這個公鑰來驗證交易是商家發起的。

支付寶公鑰(支付寶的RSA公鑰):商家用這個公鑰驗證結果是支付寶返回的。

3、系統交互過程

系統交互流程圖

4.支付場景的具體實現過程(最詳細的說明)

在整合App的支付能力時,建議實現以下支付流程,創建訂單並支付,根據返回的結果確定支付狀態,並處理相應的異常。該過程如下圖所示。

支付場景的具體實現過程

商家APP正在創建訂單,並調用支付寶APP支付。流程如上圖所示。根據步驟2.2和3返回的支付結果,確定支付狀態,並做出相應的異常處理(必要時關閉訂單)。

代碼實現

步驟1:商家APP端請求商家服務器接口,提交訂單數據。

第二步:商家服務器接收數據,然後對數據進行簽名,並將請求參數返回給商家APP。

官方接口文件:/204/105465/

-代碼如下:

//vendor()。它是TP5框架的壹個方法,作用是導入第三方框架類庫。

廠商('支付寶. AOP . AOP客戶端');

供應商(' AliPay . AOP . request . alipaytradeapppayrequest ');

//實例化支付接口

$ AOP = new \ AOP client();

$ AOP-& gt;gateway URL = "/gateway . do ";//支付寶網關

$ AOP-& gt;AppId = "應用Id,填寫妳的AppId ";

$ AOP-& gt;RsaPrivateKey = "商家私鑰,妳原來的RSA私鑰()";

$ AOP-& gt;AlipayrsaPublicKey = "支付寶公鑰";

$ AOP-& gt;API version = ' 1.0 ';

$ AOP-& gt;SignType = "簽名方法,如RSA 2 ";

$ AOP-& gt;post charset = ' UTF-8 ';

$ AOP-& gt;format = " json

//實例化具體API對應的請求類,類名對應接口名。當前調用接口名稱為alipay.trade.app.pay

$ appRequest = new \ AlipayTradeAppPayRequest();

//SDK已經封裝了公共* * *參數,這裏只需要傳入業務參數。

$bizcontent = json_encode([

body ' = & gt'余額充值',//訂單描述

subject ' = & gt'充值',//訂單標題

timeout _ express ' = & gt30米',

out _ trade _ no ' = & gt20170125 test 01 ',//商家網站唯壹訂單號。

total _ amount ' = & gt0.01 ',//訂單總金額

product _ code ' = & gt' QUICK_MSECURITY_PAY ',//固定值

]);

$ appRequest-& gt;setNotifyUrl($ URL);//設置異步通知地址

$ appRequest-& gt;setBizContent($ biz content);

//這裏和普通的接口調用不同,使用的是sdkExecute。

$ response = $ AOP-& gt;SDK execute($ appRequest);

//htmlspecialchars是為了防止瀏覽器在輸出到頁面時對關鍵參數html進行轉義,實際打印到日誌和/payment _ notify &;sign _ type = RSA 2×tamp = 2016-08-25 20:26:31 & amp;版本=1.0

2)然後在原字符串上簽名。

app _ id = 2015052600090779 & amp;biz _ content = { " time out _ express ":" 30m "," product _ code ":" quick _ m security _ pay "," total _ amount": "0.01 "," subject": "1 "," body ":。charset = utf-8 & amp;格式= json & ampmethod=alipay.trade.app.pay?ify_url=/payment_notify。sign _ type = RSA 2×tamp = 2016-08-25 20:26:31 & amp;版本= 1.0 & amp;sign = cymuunki 5 qdbsosozaebmxvmmrwjsuuj+y 48 a2 dvwavvbukibj 13 cfhu 2 vzqvmof kje 0 yqcuqe 04 QM 9 XG 3 tix 8 tpeigiftsiyp/m45w 1 zsdidubbdugfro 1x rsvayvav 2 hcrbllrdi 5 VI 7 uzz 77 lo 5j 0 ppuuwwyqgt 0 4c j8 g =

3)最後對請求字符串的所有壹級值進行編碼(biz _ content為壹個值),編碼格式以請求字符串中的charset為準。如果字符集沒有被傳輸,它將被視為UTF-8以獲得最終的請求字符串:

app _ id = 2015052600090779 & amp;biz _ content = % 7B % 22 time out _ express % 22% 3A % 2230m % 22% 2C % 22 product _ code % 22% 3A % 22 quick _ m security _ PAY % 22% 2C % 22 total _ amount % 22% 3A % 220.01% 22% 2C % 22 subject % 22% 3A % 221% 22% 2C % 22 body % 22% 3A % 22% E6 %charset = utf-8 & amp;格式= json & ampmethod=alipay.trade.app.pay?ify _ url = %支付_通知& ampsign _ type = RSA 2×tamp = 2016-08-25% 2020% 3a 26% 3a 31 & amp;版本= 1.0 & amp;sign = cymuunki 5 qdbsosozaebmxvmmrwjsuuj % 2 by 48 a 2 dvwavvbuykibj 13 cfhu 2 vzqvmof kje 0 yqcuqe 04 QM 9 XG 3 tix 8 tpeigiftsiyp % 2fm 45 w 1 zsdidubbdugfro 1 xrs vay VAV 2 hcrbllrdi 5 VI 7 uzz 7l 05j 0 ppuuwwyqgt 0 M4 gj 8g % 3D

第三步:商家APP接收商家服務器返回的請求參數,然後調整支付寶支付面板。

如果用戶支付成功,支付寶會同步返回壹個支付結果給商家APP。相應的,支付寶也會通過異步通知的方式向商家服務器返回壹個支付結果。

註意:由於同步通知和異步通知都可以作為支付完成的證明,而異步通知支付寶肯定會發送到商家服務器。為了簡化整合過程,商家只能將同步結果視為支付結束的通知(忽略驗證的執行),實際支付是否成功完全取決於服務器的異步通知。

第四步:服務器的異步通知處理機制(支付寶主動發起通知,此方法將被啟用)

官方接口文件:/204/105301/

註意:

1)妳必須保證服務器的異步通知頁面(notify_url)上沒有空格、HTML標簽、開發系統拋出的異常提示信息等字符。

2)支付寶通過POST發送通知信息,所以這個頁面中獲取參數的方式,比如:$ _ POST[' out _ trade _ no '];

3)程序執行後,必須打印出“成功”(不含引號)。如果商家反饋給支付寶的字符不是成功的七個字符,支付寶服務器會連續重發通知,直到超過24小時22分鐘。壹般情況下,25小時內會完成8次通知(通知頻率壹般為4m、10m、10m、1h、2h、6h、15h);

4)當商戶收到服務器的異步通知並打印出成功時,服務器的異步通知參數notify_id將失效。

-代碼如下:

$aop =新AopClient

$ AOP-& gt;AlipayrsaPublicKey = '請填寫支付寶公鑰,壹個字符串';

$ flag = $ AOP-& gt;rsaCheckV1($_POST,NULL,“RSA 2”);//驗證簽名

if($flag){

//檢查通知數據的正確性

$ out _ trade _ no = $ _ POST[' out _ trade _ no '];//商家訂單號

$ trade _ no = $ _ POST[' trade _ no '];//支付寶交易號

$ trade _ status = $ _ POST[' trade _ status '];//交易狀態trade_status

$ total _ amount = POST[' ' total _ amount '];//訂單的實際金額

$ app _ id = $ _ POST[' app _ id '];

if($app_id!= $ this-& gt;config['app_id'])退出(' fail ');//驗證app_id是否是商家本身。

//只有當交易通知狀態為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認為買家支付成功。

if($trade_status!= ' TRADE _ FINISHED ' & amp& amp$trade_status!= 'TRADE_SUCCESS ')

退出(' fail ');

//驗證訂單的正確性。

如果(!empty($out_trade_no)){

//1.商戶需要驗證通知數據中的out_trade_no是否是商戶系統中創建的訂單號;

//2.判斷total_amount是否真的是訂單的實際金額(即創建商家訂單時的金額);

//3.檢查通知中的seller_id(或seller_email)是否是單據out_trade_no對應的操作員(有時,壹個商家可能有多個seller_id/seller_email)。

//如果上述1,2,3中有任何壹個驗證失敗,說明這個通知是異常通知,必須忽略。上述驗證通過後,商家必須根據不同類型的支付寶業務通知正確處理不同的業務,並過濾重復的通知結果數據。

//驗證成功後返回響應成功,驗證失敗返回失敗。

}

退出(' fail ');

}

回聲“失敗”;//簽名驗證失敗。

第五步:當商家APP收到支付寶的同步返回結果為成功時,商家APP再次請求商家服務器API判斷訂單的最終支付結果,並做出最終響應。

  • 上一篇:噴塗機器人的分類有哪些?
  • 下一篇:怎樣提升自己單片機C語言編程能力啊?求高手指點迷津!我硬件也懂壹點 但我想朝編程方面發展 跪求高手指教
  • copyright 2024編程學習大全網