手機(jī)頁面如何接入支付寶

之前由于項(xiàng)目需要,我所負(fù)責(zé)的產(chǎn)品有接入支付寶,今天抽出時間整理了出了與支付寶對接的流程。文章大部分內(nèi)容都是直接引用的螞蟻金服開放平臺上的開發(fā)文檔,我只是做了一些整理。如果有興趣,可以點(diǎn)擊下面的網(wǎng)址閱讀詳細(xì)的開發(fā)文檔。

(內(nèi)容來源:https://openhome.alipay.com/developmentDocument.htm

1、想要接入支付寶,首先你必須滿足以下準(zhǔn)入條件:

1.1、必需是實(shí)名認(rèn)證用戶;

1.2、企業(yè)或個體商戶申請;

1.3、需提供真實(shí)有效的營業(yè)執(zhí)照,且支付寶賬戶名稱需與營業(yè)執(zhí)照主體一致;

1.4、網(wǎng)站必須通過ICP備案;

2、計(jì)費(fèi)模式:

2.1、費(fèi)率按單筆計(jì)算;一般行業(yè)費(fèi)率:0.6%;

2.2、特殊行業(yè)費(fèi)率:1.2%,特殊行業(yè)范圍包括:手機(jī)、通訊設(shè)備銷售;家用電器;數(shù)碼產(chǎn)品及配件;休閑游戲;網(wǎng)絡(luò)游戲點(diǎn)卡、渠道代理;游戲系統(tǒng)商;網(wǎng)游周邊服務(wù)、交易平臺;網(wǎng)游運(yùn)營商(含網(wǎng)頁游戲)。

3、使用螞蟻金服開放平臺服務(wù)端SDK快速接入手機(jī)網(wǎng)站支付產(chǎn)品,完成與支付寶對接:

3.1、創(chuàng)建應(yīng)用并獲取APPID

登錄螞蟻金服開放平臺(open.alipay.com),登記個人應(yīng)用后,審核通過將會得到應(yīng)用的唯一標(biāo)識(APPID)。

3.2、配置密鑰

開發(fā)者調(diào)用接口前需要先生成RSA密鑰,RSA密鑰包含應(yīng)用私鑰(APP_PRIVATE_KEY)、應(yīng)用公鑰(APP_PUBLIC_KEY)。

詳情見:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1

3.3、搭建和配置開發(fā)環(huán)境

3.3.1、下載服務(wù)器端SDK

下載地址:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

3.3.2、接口調(diào)用配置

在使用SDK調(diào)用具體API前,進(jìn)行初始化,代碼如下:

3.4、調(diào)用接口

3.4.1、手機(jī)網(wǎng)站支付產(chǎn)品包含兩類API:

頁面跳轉(zhuǎn)類:需要從前端頁面以Form表單的形式發(fā)起請求,瀏覽器會自動跳轉(zhuǎn)至支付寶的相關(guān)頁面(一般是收銀臺或簽約頁面),用戶在該頁面完成相關(guān)業(yè)務(wù)操作后再回跳到商戶指定頁面。例如本產(chǎn)品中的手機(jī)網(wǎng)站支付接口alipay.trade.wap.pay

系統(tǒng)調(diào)用類:直接從服務(wù)端發(fā)起HTTP請求,支付寶會同步返回請求結(jié)果。例如本產(chǎn)品中的交易查詢等配套API。

3.4.2、接口調(diào)用流程:

如上圖所示:

第一步:用戶在商戶的H5網(wǎng)站下單支付后,商戶系統(tǒng)按照手機(jī)網(wǎng)站支付接口alipay.trade.wap.payAPI的參數(shù)規(guī)范生成訂單數(shù)據(jù)。

第二步:然后在前端頁面通過Form表單的形式請求到支付寶。此時支付寶會自動將頁面跳轉(zhuǎn)至支付寶H5收銀臺頁面,如果用戶手機(jī)上安裝了支付寶APP,則自動喚起支付寶APP。

第三步:

用戶在支付寶APP或H5收銀臺完成支付后,會根據(jù)商戶在手機(jī)網(wǎng)站支付API中傳入的前臺回跳地址return_url自動跳轉(zhuǎn)回商戶頁面,同時在URL請求中以Query String的形式附帶上支付結(jié)果參數(shù),詳細(xì)回跳參數(shù)見“手機(jī)網(wǎng)站支付接口alipay.trade.wap.pay”前臺回跳參數(shù)

支付寶還會根據(jù)原始支付API中傳入的異步通知地址notify_url,通過POST請求的形式將支付結(jié)果作為參數(shù)通知到商戶系統(tǒng),詳情見支付結(jié)果異步通知

除了正向支付流程外,支付寶也提供交易查詢、關(guān)閉、退款、退款查詢以及對賬等配套API。

特別注意:

由于前臺回跳的不可靠性,前臺回跳只能作為商戶支付結(jié)果頁的入口,最終支付結(jié)果必須以異步通知或查詢接口返回為準(zhǔn),不能依賴前臺回跳。商戶系統(tǒng)接收到異步通知以后,必須通過驗(yàn)簽(驗(yàn)證通知中的sign參數(shù))來確保支付通知是由支付寶發(fā)送的。

4、請求支付接口說明

詳情請看:《手機(jī)網(wǎng)站支付API列表》

5、手機(jī)網(wǎng)站支付結(jié)果異步通知:

5.1、服務(wù)器異步通知頁面特性

必須保證服務(wù)器異步通知頁面(notify_url)上無任何字符,如空格、HTML標(biāo)簽、開發(fā)系統(tǒng)自帶拋出的異常提示信息等;

支付寶是用POST方式發(fā)送通知信息,因此該頁面中獲取參數(shù)的方式,如:request.Form(“out_trade_no”)、$_POST[‘out_trade_no’];

支付寶主動發(fā)起通知,該方式才會被啟用;

只有在支付寶的交易管理中存在該筆交易,且發(fā)生了交易狀態(tài)的改變,支付寶才會通過該方式發(fā)起服務(wù)器通知(即時到賬交易狀態(tài)為“等待買家付款”的狀態(tài)默認(rèn)是不會發(fā)送通知的);

服務(wù)器間的交互,不像頁面跳轉(zhuǎn)同步通知可以在頁面上顯示出來,這種交互方式是不可見的;

第一次交易狀態(tài)改變(即時到賬中此時交易狀態(tài)是交易完成)時,不僅會返回同步處理結(jié)果,而且服務(wù)器異步通知頁面也會收到支付寶發(fā)來的處理結(jié)果通知;

程序執(zhí)行完后必須打印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字符不是success這7個字符,支付寶服務(wù)器會不斷重發(fā)通知,直到超過24小時22分鐘。一般情況下,25小時以內(nèi)完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);

程序執(zhí)行完成后,該頁面不能執(zhí)行頁面跳轉(zhuǎn)。如果執(zhí)行頁面跳轉(zhuǎn),支付寶會收不到success字符,會被支付寶服務(wù)器判定為該頁面程序運(yùn)行出現(xiàn)異常,而重發(fā)處理結(jié)果通知;cookies、session等在此頁面會失效,即無法獲取這些數(shù)據(jù);

該方式的調(diào)試與運(yùn)行必須在服務(wù)器上,即互聯(lián)網(wǎng)上能訪問;

該方式的作用主要防止訂單丟失,即頁面跳轉(zhuǎn)同步通知沒有處理訂單更新,它則去處理;

當(dāng)商戶收到服務(wù)器異步通知并打印出success時,服務(wù)器異步通知參數(shù)notify_id才會失效。也就是說在支付寶發(fā)送同一條異步通知時(包含商戶并未成功打印出success導(dǎo)致支付寶重發(fā)數(shù)次通知),服務(wù)器異步通知參數(shù)notify_id是不變的。

5.2、服務(wù)器異步通知頁面特性

某商戶設(shè)置的通知地址為https://api.xx.com/receive_notify.htm,對應(yīng)接收到通知的示例如下:

https://api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大樂透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00?ify_time=2016-07-1914:10:49&subject=大樂透2.1&sign_type=RSA2&charset=utf-8?ify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838?ify_id=4a91b7a78a503640467525113fb7d8bg8e

第一步:在通知返回參數(shù)列表中,除去sign、sign_type兩個參數(shù)外,凡是通知返回回來的參數(shù)皆是待驗(yàn)簽的參數(shù)。

第二步:將剩下參數(shù)進(jìn)行url_decode, 然后進(jìn)行字典排序,組成字符串,得到待簽名字符串:

body=大樂透2.1&buyer_id=2088102116773037&charset=utf-8&gmt_close=2016-07-1914:10:46&gmt_payment=2016-07-1914:10:47?ify_time=2016-07-1914:10:49?ify_type=trade_status_sync&out_trade_no=0719141034-6418&refund_fee=0.00&subject=大樂透2.1&total_amount=2.00&trade_no=2016071921001003030200089909&trade_status=TRADE_SUCCESS&version=1.0

第三步:將簽名參數(shù)(sign)使用base64解碼為字節(jié)碼串。

第四步:使用RSA的驗(yàn)簽方法,通過簽名字符串、簽名參數(shù)(經(jīng)過base64解碼)及支付寶公鑰驗(yàn)證簽名。

第五步:需要嚴(yán)格按照如下描述校驗(yàn)通知數(shù)據(jù)的正確性。

1、商戶需要驗(yàn)證該通知數(shù)據(jù)中的out_trade_no是否為商戶系統(tǒng)中創(chuàng)建的訂單號,2、判斷total_amount是否確實(shí)為該訂單的實(shí)際金額(即商戶訂單創(chuàng)建時的金額),3、校驗(yàn)通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據(jù)的對應(yīng)的操作方(有的時候,一個商戶可能有多個seller_id/seller_email),4、驗(yàn)證app_id是否為該商戶本身。上述1、2、3、4有任何一個驗(yàn)證不通過,則表明本次通知是異常通知,務(wù)必忽略。在上述驗(yàn)證通過后商戶必須根據(jù)支付寶不同類型的業(yè)務(wù)通知,正確的進(jìn)行不同的業(yè)務(wù)處理,并且過濾重復(fù)的通知結(jié)果數(shù)據(jù)。在支付寶的業(yè)務(wù)通知中,只有交易通知狀態(tài)為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認(rèn)定為買家付款成功。

以上就是關(guān)于手機(jī)頁面接入支付寶的流程總結(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容