App支付產品介紹更新時間:2020-06-01 11:08:15獲取能力
場景介紹
APP支付適用於商家在 App 應用中集成支付寶支付功能。 商家APP調用支付寶提供的 SDK,SDK 再調用支付寶APP內的支付模塊。如果用戶已安裝支付寶 APP,商家 APP 會跳轉到支付寶中完成支付,支付完后跳回到商家APP內,最后展示支付結果。如果用戶沒有安裝支付寶 APP,商家 APP 內會調起支付寶網頁支付收銀台,用戶登錄支付寶賬戶,支付完后展示支付結果。 目前支持手機系統有:iOS(蘋果)、Android(安卓)。
產品流程
用戶已安裝支付寶支付流程
1.用戶在商家 App 中選擇商品下單、確認購買,進入支付環節,選擇支付寶,用戶點擊確認支付,如圖1;
2.進入到支付寶頁面,調起支付寶支付,出現確認支付界面,如圖2;
3.用戶確認收款方和金額,點擊立即支付后出現輸入密碼界面,如圖3;
4.輸入正確密碼后,支付寶端顯示支付結果,如圖 4; 5.自動回跳到商家 App 中,商家根據付款結果個性化展示訂單處理結果,如圖 5。
用戶未安裝支付寶支付流程
1.用戶在商家 App 中選擇商品下單、確認購買,進入支付環節,選擇支付寶,用戶點擊確認支付,如圖 6;
2.用戶未安裝支付寶客戶端,則調起支付寶網頁支付收銀台,用戶登錄支付寶賬戶,如圖 7;
3.登錄成功后,進入確認付款頁面,如圖 8;
4.用戶點擊確認付款,進入支付密碼頁面,如下圖 9; 5.用戶輸入密碼,完成支付,展示支付結果,如圖 10。
應用案例
目前已上線支付案例,商家可進行實際體驗:餓了么 app、優酷 app、攜程 app。
准入條件
-
申請前必須擁有經過實名認證的支付寶賬戶;
-
企業或個體工商戶可申請;
-
需提供真實有效的營業執照,且支付寶賬戶名稱需與營業執照主體一致;
-
網站能正常訪問且頁面顯示完整,網站需要明確經營內容且有完整的商品信息;
-
網站必須通過ICP備案。如為個體工商戶,網站備案主體需要與支付寶賬戶主體名稱一致;
-
如為個體工商戶,則團購不開放,且古玩、珠寶等奢侈品、投資類行業無法申請本產品。
計費模式
-
費率按單筆計算;
-
一般行業費率:0.6%;自2018年5月9日起,特殊行業新簽約費率從 1.2% 調整為 1%,特殊行業范圍包括:休閑游戲;網絡游戲點卡、渠道代理;游戲系統商;網游周邊服務、交易平台; 網游運營商(含網頁游戲)。
官方入門地址QuickStart: https://opendocs.alipay.com/open/204/105297/
第一步:創建應用並獲取APPID
要在您的應用中接入支付寶 App 支付能力,您需要登錄支付寶開放平台(open.alipay.com),在開發者中心中創建您的應用,應用審核通過后會生成應用唯一標識(APPID),並且可以申請開通開放產品使用權限。通過 APPID 您的應用才能調用開放產品的接口能力。需要詳細了解開放平台創建應用步驟請參考《開放平台應用創建指南》。
第二步:配置應用
添加功能並簽約
應用創建完成后,系統會自動跳轉到應用詳情頁面。開發者可以點擊 添加功能 來 添加 App支付 功能。添加功能后開發者需要在開放平台里進行 簽約,第三方應用開發者可以代替商戶簽約。
配置密鑰
為了保證交易雙方(商戶和支付寶)的身份和數據安全,開發者在調用接口前,需要配置雙方密鑰,對交易數據進行雙方校驗。RSA 密鑰包含應用私鑰(APP_PRIVATE_KEY)、應用公鑰(APP_PUBLIC_KEY)。生成密鑰后,開發者需要在開放平台開發者中心進行密鑰配置,配置完成后可以獲取支付寶公鑰(ALIPAY_PUBLIC_KEY),配置的詳細步驟請參考《配置應用環境》。您還可以通過觀看快速簽名教程學習密鑰的配置。
說明:
支付寶開放平台 SDK 封裝了簽名和驗簽過程,只需配置賬號及密鑰參數,建議開發者使用。開發者還可以通過 自助排查流程 和 驗簽教程 自助排查配置應用過程中遇到的問題。
第三步:集成和開發
接入移動支付需要集成兩個 SDK:客戶端 SDK 需要集成在商戶自己的 APP 中,用於喚起支付寶 APP 並發送交易數據,並在支付寶APP返回商戶APP時獲得支付結果;服務端SDK需要商戶集成在自己的服務端系統中,用於協助解析並驗證客戶端同步返回的支付結果和異步通知。
集成前提
開發者在集成和開發前需要了解一下常用的接入方式和架構建議,如下圖所示:
集成客戶端 SDK
在集成 App 支付能力時,支付寶提供主流移動平台的 App 提供集成方式。點擊下載客戶端SDK。
更多集成說明參見 客戶端 Android 集成說明 和 客戶端 iOS 集成說明。
集成服務端 SDK
為了幫助開發者調用開放接口,我們提供了開放平台服務端 SDK,包含 JAVA, PHP, PYTHON, NodeJS 和 .NET 版本,封裝了簽名&驗簽、HTTP接口請求等基礎功能(下單請求參數 orderStr 在服務端 SDK 封裝,客戶端 SDK 直接使用)。建議開發者先下載對應語言版本的 SDK 並引入您的開發工程進行快速接入。
SDK 調用前需要進行初始化,代碼示例如下:
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
關鍵參數說明:
配置參數 |
示例值解釋 |
獲取方式/示例值 |
|
URL |
支付寶網關(固定) |
||
APP_ID |
APPID 即創建應用后生成 |
獲取見 第一步:創建應用並獲取 APPID |
|
APP_PRIVATE_KEY |
開發者應用私鑰,由開發者自己生成 |
獲取見 第二步:配置應用 > 配置密鑰 |
|
FORMAT |
參數返回格式,只支持 json |
json(固定) |
|
CHARSET |
請求和簽名使用的字符編碼格式,支持 GBK 和 UTF-8 |
開發者根據實際工程編碼配置 |
|
ALIPAY_PUBLIC_KEY |
支付寶公鑰,由支付寶生成 |
獲取詳見 第二步:配置應用 > 配置密鑰 |
|
SIGN_TYPE |
商戶生成簽名字符串所使用的簽名算法類型,目前支持 RSA2 和 RSA,推薦使用 RSA2 |
RSA2 |
接下來,就可以用 alipayClient 來調用具體的 API 了。alipayClient 只需要初始化一次,后續調用不同的API都可以使用同一個 alipayClient 對象。
第四步:調用接口
為了避免在線上生產環境聯調過程中遇到問題,建議在沙箱環境中聯調通過后再在線上生產環境進行聯調,具體操作步驟見 沙箱聯調指南。如果需要在線上調用接口,需要參考下面步驟:應用上線后再進行接口調用,不然會出現“無權限錯誤”的報錯信息。
系統交互流程如下圖所示:
以 Android 平台為例: 圖中虛線標識商戶鏈路,實線標識支付寶鏈路。
-
第4步調用支付接口:此消息就是本接口所描述的支付寶客戶端SDK提供的支付對象 PayTask,將商戶簽名后的訂單信息傳進 payv2 方法喚起支付寶收銀台,交易數據格式具體參見請求參數說明。
-
第5步支付請求:支付寶客戶端 SDK 將會按照商戶客戶端提供的請求參數發送支付請求。
-
第8步接口返回支付結果:商戶客戶端在第4步中調用的支付接口,會返回最終的支付結果(即同步通知),參見客戶端同步返回。
-
第13步用戶在支付寶 APP 或 H5 收銀台完成支付后,會根據商戶在手機網站支付 API 中傳入的前台回跳地址 return_url 自動跳轉回商戶頁面,同時在 URL 請求中附帶上支付結果參數。同時,支付寶還會根據原始支付 API 中傳入的異步通知地址 notify_url,通過 POST 請求的形式將支付結果作為參數通知到商戶系統,詳情見支付結果異步通知。
除了正向支付流程外,支付寶也提供交易查詢、關閉、退款、退款查詢以及對賬等配套 API。
特別注意:
-
構造交易數據並簽名必須在商戶服務端完成,商戶的應用私鑰絕對不能保存在商戶 APP 客戶端中,也不能從服務端下發。
-
同步返回的數據,只是一個簡單的結果通知,商戶確定該筆交易付款是否成功需要依賴服務端收到支付寶異步通知的結果進行判斷。
-
商戶系統接收到通知以后,必須通過驗簽(驗證通知中的 sign 參數)來確保支付通知是由支付寶發送的。建議使用支付寶提供的 SDK 來完成,詳細驗簽規則參考異步通知驗簽。
使用SDK快速接入
App支付 API 必須通過支付寶提供的移動端 SDK 來調用。
交易操作
外部商戶APP喚起快捷 SDK 創建訂單並支付,具體的接口參數和示例代碼可詳見 alipay.trade.app.pay (app支付接口2.0) 請求參數說明 。
1.交易查詢接口 alipay.trade.query:
AlipayClient alipayClient = new DefaultAlipayClient ( "https://openapi.alipay.com/gateway.do" , APP_ID , APP_PRIVATE_KEY , "json" , CHARSET , ALIPAY_PUBLIC_KEY , "RSA2" ); //獲得初始化的AlipayClient AlipayTradeQueryRequest request = new AlipayTradeQueryRequest (); //創建API對應的request類 request . setBizContent ( "{" + " \"out_trade_no\":\"20150320010101001\"," + " \"trade_no\":\"2014112611001004680073956707\"" + " }" ); //設置業務參數 AlipayTradeQueryResponse response = alipayClient . execute ( request ); //通過alipayClient調用API,獲得對應的response類 System . out . print ( response . getBody ()); //根據response中的結果繼續業務邏輯處理
關鍵入參:
參數名稱 |
參數說明 |
out_trade_no |
支付時傳入的商戶訂單號,與 trade_no 必填一個 |
trade_no |
支付時返回的支付寶交易號,與 out_trade_no 必填一個 |
關鍵出參:
參數名稱 |
參數說明 |
trade_no |
支付寶28位交易號 |
out_trade_no |
支付時傳入的商戶訂單號 |
trade_status |
交易當前狀態 |
2.交易退款接口 alipay.trade.refund: 商戶由於業務原因如金額錯誤、用戶退貨、對賬不平等情況可能需要退款,退款的途徑按照支付途徑原路返回。支付渠道為花唄、余額等退款即時到賬。銀行卡的退款時間以銀行退款時間為准,一般情況下2小時內可到賬。可在商戶門戶(b.alipay.com)中退款;也可使用交易成功的商戶訂單號或支付寶交易號進行退款 , 支持全額和部分退款,其過程如下圖所示: 退款接口調用示例如下:
AlipayClient alipayClient = new DefaultAlipayClient ( "https://openapi.alipay.com/gateway.do" , APP_ID , APP_PRIVATE_KEY , "json" , CHARSET , ALIPAY_PUBLIC_KEY , "RSA2" ); //獲得初始化的AlipayClient AlipayTradeRefundRequest request = new AlipayTradeRefundRequest (); //創建API對應的request類 request . setBizContent ( "{" + " \"out_trade_no\":\"20150320010101001\"," + " \"trade_no\":\"2014112611001004680073956707\"," + " \"out_request_no\":\"1000001\"," + " \"refund_amount\":\"1\"" + " }" ); //設置業務參數 AlipayTradeRefundResponse response = alipayClient . execute ( request ); //通過alipayClient調用API,獲得對應的response類 System . out . print ( response . getBody ()); // 根據response中的結果繼續業務邏輯處理
關鍵入參:
參數名稱 |
參數說明 |
out_trade_no |
支付時傳入的商戶訂單號,與 trade_no 必填一個 |
trade_no |
支付時返回的支付寶交易號,與 out_trade_no 必填一個 |
out_request_no |
本次退款請求流水號,部分退款時必傳 |
refund_amount |
本次退款金額 |
關鍵出參:
參數名稱 |
參數說明 |
refund_fee |
該筆交易已退款的總金額 |
3.查詢對賬單下載地址接口alipay.data.dataservice.bill.downloadurl.query: 為了保障交易的正確性,支付寶提供了交易賬單數據提供給商戶對賬,對賬說明。
AlipayClient alipayClient = new DefaultAlipayClient ( "https://openapi.alipay.com/gateway.do" , APP_ID , APP_PRIVATE_KEY , "json" , CHARSET , ALIPAY_PUBLIC_KEY , "RSA2" ); //獲得初始化的AlipayClient AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest (); //創建API對應的request類 request . setBizContent ( "{" + " \"bill_type\":\"trade\"," + " \"bill_date\":\"2016-04-05\"" + " }" ); //設置業務參數 AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient . execute ( request ); System . out . print ( response . getBody ()); //根據response中的結果繼續業務邏輯處理
關鍵入參:
參數名稱 |
參數說明 |
bill_type |
固定傳入 trade |
bill_date |
需要下載的賬單日期,最晚是當期日期的前一天 |
關鍵出參:
參數名稱 |
參數說明 |
bill_download_url |
賬單文件下載地址,30秒有效 |
下載賬單文件:
//將接口返回的對賬單下載地址傳入urlStr String urlStr = "http://dwbillcenter.alipay.com/downloadBillFile.resource?bizType=X&userId=X&fileType=X&bizDates=X&downloadFileName=X&fileId=X" ; //指定希望保存的文件路徑 String filePath = "/Users/fund_bill_20160405.csv" ; URL url = null ; HttpURLConnection httpUrlConnection = null ; InputStream fis = null ; FileOutputStream fos = null ; try { url = new URL ( urlStr ); httpUrlConnection = ( HttpURLConnection ) url . openConnection (); httpUrlConnection . setConnectTimeout ( 5 * 1000 ); httpUrlConnection . setDoInput ( true ); httpUrlConnection . setDoOutput ( true ); httpUrlConnection . setUseCaches ( false ); httpUrlConnection . setRequestMethod ( "GET" ); httpUrlConnection . setRequestProperty ( "Charsert" , "UTF-8" ); httpUrlConnection . connect (); fis = httpUrlConnection . getInputStream (); byte [] temp = new byte [ 1024 ]; int b ; fos = new FileOutputStream ( new File ( filePath )); while (( b = fis . read ( temp )) != - 1 ) { fos . write ( temp , 0 , b ); fos . flush (); } } catch ( MalformedURLException e ) { e . printStackTrace (); } catch ( IOException e ) { e . printStackTrace (); } finally { try { fis . close (); fos . close (); httpUrlConnection . disconnect (); } catch ( NullPointerException e ) { e . printStackTrace (); } catch ( IOException e ) { e . printStackTrace (); } }
第五步:調試應用
支付能力直接涉及到交易與資金,為了方便開放者調試支付能力,我們已經准備好沙箱環境,包括沙箱環境賬號和沙箱版支付寶錢包,這樣就可以在沙箱環境調試了。具體操作步驟見沙箱聯調指南。
目前 Android 的 APP 支付開發支持沙箱環境而 iOS 版的 APP 支付開發暫不支持沙箱環境。
第六步:上線應用
商戶本身應用上線時候,也要把支付寶開放平台的應用上線。 應用開發完成后,請開發者自行進行驗收和安全性檢查(安全性檢查可參考《開放平台第三方應用安全開發指南》),驗收檢查完成后可申請上線。應用申請上線后,會同時申請此列表的功能,接口即生效,這個狀態下的應用能夠調用生產環境的接口。
API 列表更新時間:2020-05-13 10:14:39
此列表包含該產品所涉及的所有接口,點擊 查看文檔 可查看接口的公共請求參數,業務請求參數,返回參數,其他語言請求示例以及錯誤碼等。
maven
<!--支付寶sdk-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.11.ALL</version>
</dependency>
<!--application.yml 配置-->
alipay:
url: https://openapi.alipaydev.com/gateway.do # 支付寶網關地址
appId: 2016******* #應用appId
appPrivateKey: #應用私鑰
format: json
charset: UTF-8
publicKey: #公鑰
signType: RSA2
callbackUrl: http://10.10.10.10:30000/pay/ali/callback #支付寶回調通知接口,必須對外網可見
1.app支付接口 https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); setSubjectByOrderType(order.getOrderType(), model); model.setStoreId(order.getBusinessId()); model.setOutTradeNo(tradeNo); // 最晚付款時間 model.setTimeoutExpress("90m"); model.setTotalAmount(totalPayAmount.toString()); model.setProductCode("QUICK_MSECURITY_PAY"); request.setBizModel(model); //商戶外網可以訪問的異步地址 request.setNotifyUrl(aliPayProperties.getCallbackUrl()); try { AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); //就是orderString 可以直接給客戶端請求,無需再做處理 return response.getBody(); } catch (AlipayApiException e) { log.error("get AliPay orderString fail: {}", e.getMessage()); return ""; }
客戶端根據后端返回的支付字符串,喚起第三方支付,用戶付款。
2. 支付通知接口 https://opendocs.alipay.com/open/204/105301
觸發條件名 | 觸發條件描述 | 觸發條件默認值 |
TRADE_FINISHED | 交易完成 | true(觸發通知) |
TRADE_SUCCESS | 支付成功 | true(觸發通知) |
WAIT_BUYER_PAY | 交易創建 | false(不觸發通知) |
TRADE_CLOSED | 交易關閉 | true(觸發通知) |
實測部分退款也會觸發通知,需要特殊處理,接收通知后服務端應該記錄交易信息和退款信息
Map<String, String> paramsMap = ... //將異步通知中收到的待驗證所有參數都存放到map中 boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET) //調用SDK驗證簽名 if (signVerified){ // TODO 驗簽成功后 //按照支付結果異步通知中的描述,對支付結果中的業務內容進行1\2\3\4二次校驗,校驗成功后在response中返回success,校驗失敗返回failure } else { // TODO 驗簽失敗則記錄異常日志,並在response中返回failure. }