支付寶支付之從前臺打通到後臺(二)

上一篇我們說到客戶端在支付的時候,首先得拿着自己的支付信息去後臺拿支付簽名,然後通過客戶端的PayTask來完成支付,雖然這些步驟看起來都挺簡單的,然而,這都只是對客戶端而言,對於服務端來說,要做很多很多。

今天我們可能都是在講服務端是怎麼操作的,因爲客戶端就是上一篇說的那些了,你只要獲取簽名和支付,其他的什麼都不要你幹,所以,客戶端開發的就不要罵後端的接口是怎麼回事了,混口飯的都不容易。

從支付寶文檔來看,我們在客戶端發起支付的時候,首先要去服務端拿簽名好的信息,在這個簽名的過程中,我們設置了一個異步回調的地址,如下

$request->setNotifyUrl("商戶外網可以訪問的異步地址");

這個回調也是按照支付寶的文檔請求來的,客戶端支付成功需要通過異步通知來告知服務器結果,而這個回調是支付去請求的,無需用戶去手動求情,這個地址需要是一個外網的地址,以確保支付寶能訪問的到(本地localhost當然是不行的啦,這一步必須在服務端去完成,不然,支付寶找不到你的地址),支付寶只有在支付成功的時候纔會去回調這個地址,然後支付寶會帶着你客戶端支付成功的信息去異步回調地址去驗籤,這個過程就是爲了安全起見,如果驗籤成功,我們可以在成功的時候做一些處理,比如,更改服務端存儲的訂單狀態、獲取支付的用戶等等

我們來看看異步通知的代碼。

$aop = new AopClient;
$aop->alipayrsaPublicKey = '支付寶的公鑰';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");

代碼並不多,但是卻是非常的好用,上面需要填寫支付寶的公鑰,並不是我們用工具生成的那個公鑰哦,我這裏使用的是沙箱的環境,查看紅色箭頭的那個支付寶公鑰,設置到上面的代碼處。

這裏寫圖片描述

這個時候,我們還需要做一些事情,我們在支付成功後,支付寶調用這個地址,可是我們不知道支付寶是什麼時候調用的,我們首先來測試一下,看看支付寶到底返回了些啥,我們把代碼重新增加一點,如下。

$myfile = fopen("testfile.txt", "w");

$aop = new AopClient;
$aop->alipayrsaPublicKey = '支付寶的公鑰';
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");

if($flag){
fwrite($myfile, "true");
}else{
fwrite($myfile, "false");
}

if(!empty($_POST))
fwrite($myfile, json_encode($_POST));
fclose($myfile);

我們在支付成功後,讓後臺把支付寶請求的信息存儲到文件裏面,這時候我們來請求一下看看文件裏面是啥。

true
{
    "total_amount": "10.00",
    "buyer_id": "2088102170452295",
    "trade_no": "2017041521001004290200139873",
    "body": "\u661f\u5e01\u5145\u503c",
    "notify_time": "2017-04-15 21:33:46",
    "subject": "\u661f\u5e01\u5145\u503c",
    "sign_type": "RSA2",
    "buyer_logon_id": "pgp***@sandbox.com",
    "auth_app_id": "2016180300158116",
    "charset": "UTF-8",
    "notify_type": "trade_status_sync",
    "invoice_amount": "10.00",
    "out_trade_no": "G415630134174627",
    "trade_status": "TRADE_SUCCESS",
    "gmt_payment": "2017-04-15 21:33:45",
    "version": "1.0",
    "point_amount": "0.00",
    "sign": "LNKrpemGTJ4Byyk5ZKIFBDms8tnrFzanKVNSSFUMFBNXi8tacKAtb0BdM5L63Fp+YCK9Krz4zeuigG2MVlQufSygemACOx1AJKW8w8NgIy5738NepepheBBItMWJw8rr3mPA3nHqD\/4BEC+0uhTyqENSiBbz2yv7\/5qg6TLFqtWqQFEefgPCDG4wM0\/dh3HA8XGjbau7\/3Q1zePbYU2lbqqcZW9DR7XwmAp3JIufrHKWJ88XRR+YwQX2033sh9bf9WysEq4gOqpMexViHcNcC2LrPWlusbdcaHECnX8T+qIUlPLZaU84ZM6fyqPGfoz5S1\/bupMQfblJgd0YRIJdTQ==",
    "gmt_create": "2017-04-15 21:33:44",
    "buyer_pay_amount": "10.00",
    "receipt_amount": "10.00",
    "fund_bill_list": "[{\"amount\":\"10.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
    "app_id": "2016080300158116",
    "seller_id": "2088102169776678",
    "notify_id": "334bb5366412b8531a69d356d2786fdi8m",
    "seller_email": "[email protected]"
}

可以看到,文件中返回的flag是true,就說明這個請求驗籤是正確的。並且支付寶請求這個異步鏈接的時候是通過post把數據帶過來,然後驗證,這個時候,我們可以在$flag驗證爲true的情況下做一些服務端想存儲的一些信息,如上是所有POST的信息了。

這時候,我們幾乎完成整個流程了,我們再把思路理一理,加上一些數據的存儲操作,我們在獲取簽名的時候,我們可以把用戶支付的信息存儲在數據庫表裏面,比如訂單號,訂單價格,訂單狀態,訂單時間等等,然後再返回給用戶簽名信息,用戶在支付成功的時候,支付寶開始異步回調,我們在異步回調的地址中進行驗籤,如果驗籤成功,我們拿着訂單號去數據庫表裏面去找原來的那條訂單信息,並更新訂單狀態爲已支付。

整體就這麼多了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章