App接入支付寶支付

1、App支付簡介

買家在手機、掌上電腦等無線設備的應用程序內,可通過支付寶進行付款購買特定服務或商品,資金即時到賬。

2、App支付申請條件

1.申請前必須擁有經過實名認證的支付寶賬戶;
2.企業或個體工商戶可申請;
3.需提供真實有效的營業執照,且支付寶賬戶名稱需與營業執照主體一致;
4.如應用開發者與支付寶賬戶名稱不一致需提供開發合作協議;
5.如應用已上架,需提供應用名稱和下載鏈接;若應用未上架,需提供demo或產品說明文檔;
6.古玩、珠寶等奢侈品、投資類行業無法申請本產品;

3、簽約費率說明

費率按單筆計算;
一般行業費率:一般行業新簽手續費率將優惠至0.55%(優惠日至2017年6月30日)
特殊行業費率:1.2%,行業范圍包括:手機、通訊設備銷售;家用電器;數碼產品及配件;休閑游戲;網絡游戲點卡、渠道代理;游戲系統商;網游周邊服務、交易平臺;網游運營商(含網頁游戲)。
非營利性機構:需要提交資料進行審核,以支付寶官方審核通過為準。

4、提現收費標準和限額

當日到賬 單筆金額
0-10萬元(含10萬元):0.2% (最低2元,最高25元)
10萬元-500萬元(不含10萬元):0.025% (無上、下限)
次日到賬 0元(無上、下限)
限額 單筆:500萬元
當日:500萬元

5、場景介紹

適用于商家在App應用中集成支付寶支付功能。
商家APP調用支付寶提供的SDK調用支付寶客戶端內的支付模塊,商家APP會跳轉到支付寶中完成支付,支付完后跳回到商家APP內,最后展示支付結果。
目前支持手機系統有:iOS(蘋果)、Android(安卓)。
5.1用戶已安裝支付寶支付流程
步驟1:用戶在商家App中選擇商品下單、確認購買,進入支付環節,選擇支付寶,用戶點擊確認支付,如圖5.1.1;
步驟2:進入到支付寶頁面,調起支付寶支付,出現確認支付界面,如圖5.1.2;
步驟3:用戶確認收款方和金額,點擊立即支付后出現輸入密碼界面,如圖5.1.3;
步驟4:輸入正確密碼后,支付寶端顯示支付結果,如圖5.1.4;
步驟5:自動回跳到商家App中,商家根據付款結果個性化展示訂單處理結果,如圖5.1.5。

5.2用戶未安裝支付寶支付流程,跳轉到H5支付
步驟1:用戶在商家App中選擇商品下單、確認購買,進入支付環節,選擇支付寶,用戶點擊確認支付,如圖5.2.1;
步驟2:用戶未安裝支付寶客戶端,則調起支付寶網頁支付收銀臺,用戶登錄支付寶賬戶,如圖5.2.2和圖5.2.3;
步驟3:登錄成功后,進入付款確認頁面,如圖5.2.4;
步驟4:用戶點擊確認付款,進入支付密碼頁面,如下圖5.2.5;用戶輸入密碼,完成支付,展示支付結果,如圖5.2.6。

6、案例及規范

  1. 目前已上線支付案例,商家可進行實際體驗。
    餓了么app、優酷app、攜程app。
  2. 支付寶收銀臺界面規范
    列表首位+默認勾選+Logo+推薦標簽+標語,最低標準為“Logo+支付寶”,并將作為審核依據。
  3. 支付寶Logo收銀臺素材下載

7、App支付接入

7.1創建應用
接入App支付能力,需要在開放平臺創建一個應用,通過該應用來接入各種能力。
7.1.1成為開放平臺的入駐服務商或者商戶
入駐前準備
1、公司聯系方式:包含聯系人姓名、聯系手機、聯系郵箱。
2、未注冊企業支付寶賬號的企業,請提前準備:法定代表人信息、身份證照片、實際控制人信息、常用聯系手機號碼;企業證照(營業執照、組織機構代碼證)照片;企業銀行賬號信息。
支付寶賬戶注冊及認證
個人用戶可注冊個人賬號,企業用戶請注冊企業類型賬號。推薦服務商注冊企業類型支付寶賬戶,部分功能僅針對企業開放。
企業賬號注冊及認證流程請見:
1):打開www.alipay.com,點擊【免費注冊】,選擇【企業賬戶】,輸入對應郵箱及驗證碼,點擊【下一步】
2)驗證手機號碼,點擊【下一步】,點擊【立即查收郵件】
3)打開郵箱接收支付寶激活郵件,點擊【繼續注冊】
4)填寫賬戶相關信息,點擊【確定】
5)點擊【企業實名信息填寫】,填寫企業相關信息,上傳對應證件及對公銀行信息
6)證件審核通過以后,按照認證頁面的提示向支付寶收款賬戶打款,打款金額為頁面提示的金額。認證結果會短信及郵箱的方式通知。(認證成功后款項會退回匯款)

使用支付寶賬號登錄
企業請使用企業支付寶賬號登錄,個人可使用個人支付寶賬號登錄。
填寫公司聯系人信息
請提供公司常用聯系人的姓名、電子郵箱及手機號碼,及時掌握開放平臺最新動態。

查閱并一鍵簽署開放平臺主要協議,完成后即成為螞蟻金服服務商
7.1.2創建應用
應用基礎信息在開發應用過程中可以無需審核隨時完善。
需要完善的內容 作用
應用名稱 應用名稱和應用圖標會在授權、分享的場景中露
出,請準確填寫相關信息

注意:應用名稱和應用圖標會在應用申請上線時進行審核,所以在配置時,建議先了解相關審核規則,點此了解。
7.2配置應用
7.2.1添加應用功能
開發者在開發過程中,可以添加自己需要的功能到“功能列表”。
不同的功能會有不同的使用條件,如果某個功能的使用條件為簽約,則使用者在使用此功能前,需要簽約對應的產品,具體簽約方式,可參考“如何使用應用”。

7.2.2配置應用環境
開發者所需配置內容請參考:
字段名稱 字段描述
應用網關 用于接收支付寶異步通知,例如口碑開店中,需要配置此網關來接收開發者門店被動通知。
授權回調地址 第三方授權或用戶信息授權后回調地址。授權鏈接中配置的redirect_uri的值必須與此值保持一致。(如:https://www.alipay.com) 注:當填入該地址時,系統會自動進行安全檢測,詳情請參考安全檢測。
RSA(SHA256)密鑰 開發者要保證接口中使用的私鑰與此處的公鑰匹配,否則無法調用接口。可參考密鑰的生成與配置,且接口參數sign_type=RSA2。
RSA(SHA1)密鑰 同上,且接口參數sign_type=RSA。
7.2.3應用申請上線
應用開發完成后,請開發者自行進行驗收并完成安全性檢查(安全性檢查可參考《開放平臺第三方應用安全開發指南》),驗收檢查完成后,可“提交審核”。應用上線成功后,狀態變為已上線,該狀態下的應用能夠調用生產環境的接口。
開發者點擊“提交審核”后,預計會有1個工作日的審核時間,請耐心等待。如需更快收到通知,請使用支付寶客戶端掃碼接收審核結果。
應用上線后可新增功能、刪除功能,操作后實時生效。刪除功能時請謹慎操作,如果線上已經有用戶使用此功能,刪除功能后會導致無法使用。
7.2.4簽約
應用上線后,開發者可以點擊“概覽”頁簽中“功能選項”右側的“立即簽約”按鈕,如下圖。

7.2.5生成RSA秘鑰
支付寶提供一鍵生成工具便于開發者生成一對RSA密鑰,可通過下方鏈接下載密鑰生成工具:
下載該工具后,解壓打開文件夾,運行“RSA簽名驗簽工具.bat”(WINDOWS)或“RSA簽名驗簽工具.command”(MAC_OSX)。

詳細步驟:
1.根據開發語言選擇密鑰格式。
2.選擇密鑰長度,建議使用2048位。
3.點擊 “生成密鑰”,會自動生成商戶應用公鑰和應用私鑰。
4.點擊“打開密鑰文件路徑”,即可找到生成的公私鑰。如圖:

生成的私鑰需妥善保管,避免遺失,不要泄露。應用私鑰需填寫到代碼中供簽名時使用。應用公鑰需提供給支付寶賬號管理者上傳到支付寶開放平臺。
7.2.6配置秘鑰
為了保證交易雙方的身份和數據安全,需要配置雙方密鑰。
在“我的應用”中,選擇要配置密鑰的應用,點擊“查看”。記錄對應的APPID(下圖紅框處),在代碼中使用。

在“應用環境”-“接口加簽方式”下方點擊“設置應用公鑰”。
注:接口中的sign_type參數應與上傳密鑰的加簽方式一致。例如接口參數中sign_type=RSA2,請求時就會使用此處設置的RSA2(SHA256)公鑰驗簽。
建議使用RSA2加簽方式。

根據開發者的條件設置應用公鑰或上傳公鑰證書,常規請點擊設置應用公鑰。

把簽名驗簽工具里“公鑰”的內容復制到此處,點擊“保存”完成密鑰設置。

保存成功后,在同一頁面查看或修改應用公鑰或上傳應用公鑰證書。

保存支付寶公鑰內容,在代碼中驗簽使用。

7.3開發
App支付為開發者提供了Android和iOS的客戶端SDK, 為了驗證交易數據的來源,開發者需要在商家后臺對交易數據進行加簽, 驗簽,那么就需要集成開放平臺服務端SDK
下載客戶端SDK | 下載服務端SDK

7.3.1集成客戶端SDK
在集成App支付能力時,為主流移動平臺的App提供集成方式
了解更多Android平臺集成 | 了解更多iOS平臺集成
此處以iOS為例:
步驟1:啟動IDE(如Xcode),把iOS包中的壓縮文件中以下文件拷貝到項目文件夾下,并導入到項目工程中。
AlipaySDK.bundle
AlipaySDK.framework
在Build Phases選項卡的Link Binary With Libraries中,增加以下依賴:

步驟2:封裝方法,用于商戶客戶端與商戶服務端通信:發生支付時客戶端上送訂單詳細信息給服務器,服務器簽名后返回給客戶端。

/*
     *生成訂單信息
     */
    //將商品信息賦予AlixPayOrder的成員變量
    Order* order = [Order new];
    
    // NOTE: app_id設置
    order.app_id = appID;
    
    // NOTE: 支付接口名稱
    order.method = @"alipay.trade.app.pay";
    
    // NOTE: 參數編碼格式
    order.charset = @"utf-8";
    
    // NOTE: 當前時間點
    NSDateFormatter* formatter = [NSDateFormatter new];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    order.timestamp = [formatter stringFromDate:[NSDate date]];
    
    // NOTE: 支付版本
    order.version = @"1.0";
    
    // NOTE: sign_type 根據商戶設置的私鑰來決定
    order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
    
    // NOTE: 商品數據
    order.biz_content = [BizContent new];
    order.biz_content.body = @"我是測試數據";
    order.biz_content.subject = @"1";
    order.biz_content.out_trade_no = [self generateTradeNO]; //訂單ID(由商家自行制定)
    order.biz_content.timeout_express = @"30m"; //超時時間設置
    order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品價格

步驟3:訂單支付調用方法
方法原型:-(void)payOrder:(NSString )orderStr fromScheme:(NSString )schemeStr callback:(CompletionBlock)completionBlock;
參數名稱 參數描述
NSString
scheme 商戶程序注冊的URL protocol,供支付完成后回調商戶程序使用。
(CompletionBlock)completionBlock 快捷支付開發包回調函數,返回免登、支付結果。本地未安裝支付寶客戶端,或未成功調用支付寶客戶端進行支付的情況下(走H5收銀臺),會通過該completionBlock返回支付結果。相應的結果參考"客戶端同步返回"。
NSString
orderString app支付請求參數字符串,主要包含商戶的訂單信息,key=value形式,以&連接。

步驟4:處理客戶端返回URL
方法原型:-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock;
參數名稱 參數描述
NSURL *resultUrl 支付寶客戶端回傳的url
(CompletionBlock)completionBlock 本地安裝了支付寶客戶端,且成功調用支付寶客戶端進行支付的情況下,會通過該completionBlock返回支付結果
備注:請在APPDelegate的- (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中調用該方法。
在支付過程結束后,會通過callbackBlock同步返回支付結果(callbackBlock是調用支付同步的回調)。支付結果中參數的提取,必須通過CompletionBlock獲取,禁止開發者私自解析支付結果返回的URL,參數說明見"客戶端同步返回"。

7.3.2集成服務端SDK
JAVA服務端SDK生成APP支付訂單信息示例

//實例化客戶端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是測試數據");
model.setSubject("App支付測試Java");
model.setOutTradeNo(outtradeno);
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("商戶外網可以訪問的異步地址");
try {
        //這里和普通的接口調用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        System.out.println(response.getBody());//就是orderString 可以直接給客戶端請求,無需再做處理。
    } catch (AlipayApiException e) {
        e.printStackTrace();
}

JAVA服務端驗證異步通知信息參數示例

//獲取支付寶POST過來反饋信息
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
    String name = (String) iter.next();
    String[] values = (String[]) requestParams.get(name);
    String valueStr = "";
    for (int i = 0; i < values.length; i++) {
        valueStr = (i == values.length - 1) ? valueStr + values[i]
                    : valueStr + values[i] + ",";
  }
  //亂碼解決,這段代碼在出現亂碼時使用。
  //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  params.put(name, valueStr);
 }
//切記alipaypublickey是支付寶的公鑰,請去open.alipay.com對應應用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean flag = AlipaySignature.rsaCheckV1(params, alipaypublicKey, charset, "RSA2")

8、系統交互流程

系統交互流程

如圖,以Android平臺為例:
第2步:請求商戶服務端,獲取簽名后的訂單信息。使用簽名是為了在商戶與支付寶之間的數據傳輸時,防止數據內容被篡改。開放平臺下載的sdk已將RSA(SHA1)簽名驗簽方法封裝,開發者只需要調用sdk配置業務入參即可,用sdk封裝的方法發送請求到開放平臺時,sdk會自動簽名。如開發者不用sdk,可根據SHA1規則自己拼寫簽名方法。
第4步:調用支付接口:此消息就是本接口所描述的支付寶客戶端SDK提供的支付對象PayTask,將商戶簽名后的訂單信息傳進payv2方法喚起支付寶收銀臺,交易數據格式具體參見請求參數說明
第5步:支付請求:支付寶客戶端SDK將會按照商戶客戶端提供的請求參數發送支付請求。
第8步:接口返回支付結果:商戶客戶端在第4步中調用的支付接口,會返回最終的支付結果(即同步通知),參見客戶端同步返回
第13步:用戶在支付寶APP或H5收銀臺完成支付后,會根據商戶在手機網站支付API中傳入的前臺回跳地址return_url自動跳轉回商戶頁面,同時在URL請求中附帶上支付結果參數。同時,支付寶還會根據原始支付API中傳入的異步通知地址notify_url,通過POST請求的形式將支付結果作為參數通知到商戶系統,詳情見支付結果異步通知

9.交易輔助接口:

API英文名 API中文名 完整文檔
alipay.trade.query 交易查詢接口 查看文檔
alipay.trade.close 交易關閉接口 查看文檔
alipay.trade.refund 交易退款接口 查看文檔
alipay.trade.fastpay.refund.query 交易退款查詢接口 查看文檔
alipay.data.dataservice.bill.downloadurl.query 查詢賬單下載地址接口 查看文檔

10、接口對賬功能

賬單生成時間:每日賬單一般會在次日10點或之前生成。每月賬單一般會在次月4日或之前生成。

10.1對賬場景介紹

商戶/系統商可通過接口下載指定日期(當天除外)的業務明細賬單文件,并結合自身業務系統實現自動對賬。

10.2調用流程

商戶系統調用查詢對賬單下載地址接口alipay.data.dataservice.bill.downloadurl.query,傳入指定日期,獲得該日期賬單文件的下載地址。查看接口詳情
商戶系統通過HTTP方式后臺訪問賬單下載鏈接,將賬單csv文件下載到本地后自行處理。注意該下載鏈接僅30秒,在得到鏈接后系統需要立刻請求下載賬單文件。

10.3使用SDK快速接入

查詢對賬單下載地址接口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();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容