1. 程式人生 > 實用技巧 >支付寶支付(三)—APP支付(alipay.trade.app.pay)

支付寶支付(三)—APP支付(alipay.trade.app.pay)

  首先,鄭重的說明一下,本人是純服務端開發人員,不懂安卓和ios開發,在實際開發配合中,也只負責給安卓和ios的同事提供服務端調取的介面以及處理支付寶的同步和非同步回撥。所以這篇文章只是介紹服務端的開發過程,不會涉及到安卓和ios客戶端的處理過程,如果你只想瞭解客戶端處理過程,可以不用往下看了,goodbye!!!

  在看這篇文章之前,希望你先看上一篇文章支付寶支付(一)—H5手機網站支付2.0(alipay.trade.wap.pay),涉及到的部分準備工作這裡就不再重複了,有疑問的看上一篇文章或者查閱官方文件。

一、APP支付產品介紹

  APP支付適用於商家在 App 應用中整合支付寶支付功能。 商家APP呼叫支付寶提供的 SDK,SDK 再呼叫支付寶APP內的支付模組。

  注意:如果使用者已安裝支付寶 APP,商家 APP 會跳轉到支付寶中完成支付,支付完後跳回到商家APP內,最後展示支付結果。如果使用者沒有安裝支付寶 APP,商家 APP 內會調起支付寶網頁支付收銀臺,使用者登入支付寶賬戶,支付完後展示支付結果。 目前支援手機系統有:iOS(蘋果)、Android(安卓)。

1、應用場景

(1)使用者已安裝支付寶支付流程

  步驟1:使用者在商家 App 中選擇商品下單、確認購買,進入支付環節,選擇支付寶,使用者點選確認支付,如圖1;

  步驟2:進入到支付寶頁面,調起支付寶支付,出現確認支付介面,如圖2;

  步驟3:使用者確認收款方和金額,點選立即支付後出現輸入密碼介面,如圖3;

  步驟4:輸入正確密碼後,支付寶端顯示支付結果,如圖 4; 5.自動回跳到商家 App 中,商家根據付款結果個性化展示訂單處理結果,如圖 5。

(2)使用者未安裝支付寶支付流程

  步驟1:使用者在商家 App 中選擇商品下單、確認購買,進入支付環節,選擇支付寶,使用者點選確認支付,如圖 6;

  步驟2:使用者未安裝支付寶客戶端,則調起支付寶網頁支付收銀臺,使用者登入支付寶賬戶,如圖 7;

  步驟3:登入成功後,進入確認付款頁面,如圖 8;

  步驟4:使用者點選確認付款,進入支付密碼頁面,如下圖 9; 5.使用者輸入密碼,完成支付,展示支付結果,如圖 10。

  例如我們常用的餓了麼 app、優酷 app、攜程 app。

2、准入條件

  • 申請前必須擁有經過實名認證的支付寶賬戶;

  • 企業或個體工商戶可申請;

  • 需提供真實有效的營業執照,且支付寶賬戶名稱需與營業執照主體一致;

  • 網站能正常訪問且頁面顯示完整,網站需要明確經營內容且有完整的商品資訊;

  • 網站必須通過ICP備案。如為個體工商戶,網站備案主體需要與支付寶賬戶主體名稱一致;

  • 如為個體工商戶,則團購不開放,且古玩、珠寶等奢侈品、投資類行業無法申請本產品。

3、計費模式

  • 費率按單筆計算;

  • 一般行業費率:0.6%;自2018年5月9日起,特殊行業新簽約費率從 1.2% 調整為 1%,特殊行業範圍包括:休閒遊戲;網路遊戲點卡、渠道代理;遊戲系統商;網遊周邊服務、交易平臺; 網遊運營商(含網頁遊戲)。

4、使用說明

  APP支付產品包含的介面和描述如下:

API英文名 API中文名 完整文件
alipay.trade.query 交易查詢介面 檢視文件
alipay.trade.close 交易關閉介面 檢視文件
alipay.trade.refund 交易退款介面 檢視文件
alipay.trade.fastpay.refund.query 交易退款查詢介面 檢視文件
alipay.trade.app.pay app 支付介面 2.0 檢視文件
alipay.data.dataservice.bill.downloadurl.query 查詢賬單下載地址介面 檢視文件

二、準備工作

  還是先上官方文件入口

 【官方APP支付快速接入文件】

  前四個步驟這裡就不再重複了,有興趣有疑問的檢視上一篇文章支付寶支付(一)—H5手機網站支付2.0(alipay.trade.wap.pay)

1、建立應用並獲取APPID

2、配置應用環境

3、配置沙箱環境

4、服務端實現(整合並且配置SDK)

5、呼叫介面

  為了避免在線上生產環境聯調過程中遇到問題,建議在沙箱環境中聯調通過後再在線上生產環境進行聯調,具體操作步驟見沙箱聯調指南。如果需要在線上呼叫介面,需要參考下面步驟:應用上線後再進行介面呼叫,不然會出現“無許可權錯誤”的報錯資訊。

  系統互動流程如下圖所示:

以 Android 平臺為例: 圖中虛線標識商戶鏈路,實線標識支付寶鏈路。

  • 第4步呼叫支付介面:此訊息就是本介面所描述的支付寶客戶端SDK提供的支付物件 PayTask,將商戶簽名後的訂單資訊傳進 payv2 方法喚起支付寶收銀臺,交易資料格式具體參見請求引數說明

  • 第5步支付請求:支付寶客戶端 SDK 將會按照商戶客戶端提供的請求引數傳送支付請求。

  • 第8步介面返回支付結果:商戶客戶端在第4步中呼叫的支付介面,會返回最終的支付結果(即同步通知),參見客戶端同步返回

  • 第13步使用者在支付寶 APP 或 H5 收銀臺完成支付後,會根據商戶在手機網站支付 API 中傳入的前臺回跳地址 return_url 自動跳轉回商戶頁面,同時在 URL 請求中附帶上支付結果引數。同時,支付寶還會根據原始支付 API 中傳入的非同步通知地址 notify_url,通過 POST 請求的形式將支付結果作為引數通知到商戶系統,詳情見支付結果非同步通知

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

特別注意:

  • 構造交易資料並簽名必須在商戶服務端完成,商戶的應用私鑰絕對不能儲存在商戶 APP 客戶端中,也不能從服務端下發。

  • 同步返回的資料,只是一個簡單的結果通知,商戶確定該筆交易付款是否成功需要依賴服務端收到支付寶非同步通知的結果進行判斷。

  • 商戶系統接收到通知以後,必須通過驗籤(驗證通知中的 sign 引數)來確保支付通知是由支付寶傳送的。建議使用支付寶提供的 SDK 來完成,詳細驗籤規則參考非同步通知驗籤

三、服務端具體封裝和操作過程

  前三個步驟這裡就不再重複了,有興趣有疑問的檢視上一篇文章支付寶支付(一)—H5手機網站支付2.0(alipay.trade.wap.pay)

1、將支付寶通用引數獨立配置在一個屬性檔案中方便管理

2、讀取配置檔案資訊

3、載入接入引數並初始化AlipayClient

4、利用sdk封裝app支付程式碼

  通用模組,就在demo裡面的AliPayUtil.java 裡面

  /**
     * alipay.trade.app.pay:原生手機APP支付測試(外部商戶APP喚起快捷SDK建立訂單並支付)
     * @param alipayInfo
     * @return
     */
    public static String alipayTradeAppPay(String out_trade_no, String total_amount){
        try {
            //(1)封裝bizmodel資訊
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            model.setOutTradeNo(out_trade_no);
            model.setSubject("支付寶APP支付");
            model.setBody("支付寶APP支付");
            model.setProductCode("QUICK_MSECURITY_PAY");
            model.setTotalAmount(total_amount);
            model.setTimeoutExpress(staticAliPayProperties.getAli_timeout_express());
            //(2)設定請求引數
            //例項化具體API對應的request類,類名稱和介面名稱對應,當前呼叫介面名稱:alipay.trade.app.pay
            AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest();
            alipayRequest.setNotifyUrl(staticAliPayProperties.getAli_notify_url());
            alipayRequest.setBizModel(model);                                                                                                                                                               
            //(3)請求
            //這裡和普通的介面呼叫不同,使用的是sdkExecute
            String form = alipayClient.sdkExecute(alipayRequest).getBody();
            System.out.println("*********************\n返回結果為:"+form);
            return form;
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return null;
        }
    }

  APP支付、PC電腦網站支付和H5手機網站支付的區別重點看我標黃部分

5、模擬支付請求

  步驟1:控制層 AliPayController.java 寫請求方法alipayTradeAppPay

  步驟2:調取的介面和實現類

注意:

  (1)這裡我隨機生成了商戶訂單號out_trade_no,交易金額total_amount 寫死了,正常業務處理中,我們是根據你的業務實際情況處理

  (2)裡面涉及到的其他的工具類,最後的demo裡面會提供。當然,你也可以自己隨機商城,保持不重複的原則即可

  (3)實際操作中,在調取之前,我們需要處理具體的業務邏輯,因為本文只總結支付寶相關的,就不補充了。例如:訂單金額計算處理;商戶訂單和支付寶訂單的關聯和儲存,商戶訂單和支付寶訂單可能是多對一的關係;支付寶訂單需要儲存,因為在回撥的時候你需要根據支付寶訂單的out_trade_no 識別支付寶通知的訂單結果;你可以把它儲存在redis或者持久化到資料庫中。

  步驟3:模擬支付請求

  這裡,我是寫了一個html頁面,通過前端請求到後臺調取控制層方法模擬實際支付請求的

  注意:因為本人只是服務端開發人員,並不懂安卓和ios原生開發,所以這裡我只是模擬告訴你了服務端的調取過程。在實際開發過程中,我提供了該服務端的介面給了安卓和ios開發的同事,他們拿到我返回的支付寶調取結果之後直接調取原生的sdk就ok了。也就是說針對我們服務端人員來說,我們只需要給他們提供一個調取介面,返回支付寶的服務端調取結果給他們,然後處理好支付的同步和非同步回撥通知就完全ok了。

6、執行檢視測試結果

點選“原生手機APP支付”按鈕,其他按鈕功能開發後面有時間會發博文介紹,不過demo裡面已經有了,你也可以自己先測試,請求後控制檯日誌顯示

  詳細調取內容如下:

alipay_sdk=alipay-sdk-java-3.3.87.ALL&app_id=2021000116673834&biz_content=%7B%22body%22%3A%22%E6%94%AF%E4%BB%98%E5%AE%9DAPP%E6%94%AF%E4%BB%98%22%2C%22out_trade_no%22%3A%2220200810180747519478446%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%22%E6%94%AF%E4%BB%98%E5%AE%9DAPP%E6%94%AF%E4%BB%98%22%2C%22timeout_express%22%3A%2230m%22%2C%22total_amount%22%3A%220.01%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Ftrt.wgzvip.com%2Fapi%2FaliReturnPay%2FreturnPayAsynchronous&sign=F1BTreBDeHs%2FYtrmh9FfjzOloaSGxy0lkolmCyXWr6HxJRBELjcoBe6l3zbwsEkDTfCeHYnd9G%2Bll0PFrefwy0OIiAmJQLja6tQznBsmX2CgMgIPlFUYnZaY1MluBjeeux%2BTwV16UUQX%2BTavKexwwOSXHxYNq49Jh18WPa1%2FicqlkcSe2VAI%2FI30Oe0r4z2yE067NonwyUOmvq8KljpFGveqXAtVH0akYmYvdq6oGJdIVM1sA2NXZKtPl9q7ZHjhGouOLzuoqRg2ttIjanv3rpw7WZxn7bbTfjwxE1gBfWhUWI87H3GvlIVFSYpDmeRNYYyTxqLhXeg89m449fVG4A%3D%3D&sign_type=RSA2&timestamp=2020-08-10+18%3A07%3A47&version=1.0

  我們可以很清楚的看到,支付寶返回的不再是一個form表單的內容,我們只需要將該結果返給原生APP開發的同事就ok了。

  我們看一下我們之前在js裡面模擬調取介面的返回結果,如下:

{
    "msg": "操作成功",
    "code": "code_999999",
    "data": "alipay_sdk=alipay-sdk-java-3.3.87.ALL&app_id=2021000116673834&biz_content=%7B%22body%22%3A%22%E6%94%AF%E4%BB%98%E5%AE%9DAPP%E6%94%AF%E4%BB%98%22%2C%22out_trade_no%22%3A%2220200810180747519478446%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%22%E6%94%AF%E4%BB%98%E5%AE%9DAPP%E6%94%AF%E4%BB%98%22%2C%22timeout_express%22%3A%2230m%22%2C%22total_amount%22%3A%220.01%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Ftrt.wgzvip.com%2Fapi%2FaliReturnPay%2FreturnPayAsynchronous&sign=F1BTreBDeHs%2FYtrmh9FfjzOloaSGxy0lkolmCyXWr6HxJRBELjcoBe6l3zbwsEkDTfCeHYnd9G%2Bll0PFrefwy0OIiAmJQLja6tQznBsmX2CgMgIPlFUYnZaY1MluBjeeux%2BTwV16UUQX%2BTavKexwwOSXHxYNq49Jh18WPa1%2FicqlkcSe2VAI%2FI30Oe0r4z2yE067NonwyUOmvq8KljpFGveqXAtVH0akYmYvdq6oGJdIVM1sA2NXZKtPl9q7ZHjhGouOLzuoqRg2ttIjanv3rpw7WZxn7bbTfjwxE1gBfWhUWI87H3GvlIVFSYpDmeRNYYyTxqLhXeg89m449fVG4A%3D%3D&sign_type=RSA2&timestamp=2020-08-10+18%3A07%3A47&version=1.0",
    "success": true
}

  也就是說原生的同事調取該介面後,只要把data的結果拿去調取他們自己的sdk就行了

 

四、同異步結果處理

  這部分處理與H5手機網站支付一樣,不再重複囉嗦了,有疑問的檢視上一篇文章支付寶支付(一)—H5手機網站支付2.0(alipay.trade.wap.pay)

五、demo示例下載

  檢視上一篇文章支付寶支付(一)—H5手機網站支付2.0(alipay.trade.wap.pay)