支付寶支付(三)—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)

  注意:APP支付中同步回調不再需要服務端設置了,為什么不需要你自己好好想想就知道了,我服務端怎么可能能決定你的手機APP跳轉的頁面,這個需要客戶端自己處理,安卓和ios的客戶端人員他們自己的sdk可以接收到支付寶的同步通知,他們自己處理就ok了,不需要我們操心,我們只需要處理好異步通知結果就行了,最終的支付結果以支付寶異步通知和服務端主動查詢支付寶訂單結果為准。

 

五、demo示例下載

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

  最后附上官方提供的常見問題參考答案:https://opensupport.alipay.com/support/helpcenter/89


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM