iOS - AliPay 支付寶支付


1、支付寶支付申請

1.1 支付寶 APP 支付申請步驟

  • APP 支付:APP 支付是商戶通過在移動端應用 APP 中集成開放 SDK 調起支付寶支付模塊完成支付的模式。買家在手機、掌上電腦等無線設備的應用程序內,可通過支付寶進行付款購買特定服務或商品,資金即時到賬。舊的接口叫 移動支付

  • 申請條件:

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

    • 助力中小商戶,從簽約日至 2017.6.30 日優惠費率為 0.55%(不包含特殊行業)
    • 特殊行業費率:1.2%,行業范圍包括:手機、通訊設備銷售;家用電器;數碼產品及配件;休閑游戲;網絡游戲點卡、游戲渠道代理;游戲系統商;網游周邊服務、交易平台;網游運營商(含網頁游戲)

1.1.1 創建應用並獲取 APPID

  • 要在您的應用中使用支付寶開放產品的接口能力,您需要先去螞蟻金服開放平台,在管理中心中創建登記您的應用,並提交審核,審核通過后會為您生成應用唯一標識 APPID,並且可以申請開通開放產品使用權限,通過 APPID 您的應用才能調用開放產品的接口能力。需要詳細了解開放平台創建應用步驟請參考《開放平台應用創建指南》

  • 1、開發者使用支付寶賬號登錄開放平台(需實名認證的支付寶賬號),並創建應用。

    alipay1

    • 創建應用時只需填寫應用名稱,此時的應用狀態為開發中,無法在線上正式調用接口。
  • 2、創建應用后,點擊 “修改” 可跳轉到完善應用信息頁面。

    alipay2

    • 應用信息在開發應用過程中可以無需審核隨時完善。應用名稱和應用圖標會在應用申請上線時進行審核,所以在配置時,建議先了解相關審核規則

      的內容 作用
      應用名稱和應用圖標會在授權、分享的場景中露出,請准確填寫相關信息
      文檔 用於審核人員了解應用覆蓋場景和應用實現的功能,請准確填寫

      alipay3

  • 3、配置應用環境,開發者所需配置內容請參考:

    段名稱 字段描述
    用網關(對應下圖1) 用於接收支付寶異步通知,例如口碑開店中,需要配置此網關來接收開發者門店被動通知
    權回調地址(對應下圖2) 第三方授權或用戶信息授權后回調地址。授權鏈接中配置的redirect_uri的值必須與此值保持一致。(如:https://www.alipay.com)
    SA(SHA1)密鑰(對應下圖3) 開發者要保證接口中使用的私鑰與此處的公鑰匹配,否則無法調用接口。可參考密鑰的生成與配置

    alipay4

1.1.2 配置密鑰

  • 開發者調用接口前需要先生成 RSA 密鑰,RSA 密鑰包含應用私鑰 (APP_PRIVATE_KEY)、應用公鑰 (APP_PUBLIC_KEY)。生成密鑰后在開放平台管理中心進行密鑰配置,配置完成后可以獲取支付寶公鑰 (ALIPAY_PUBLIC_KEY)。詳細步驟請參考《配置應用環境》

  • 1、生成 RSA 密鑰

    • 生成方式一(推薦):使用支付寶提供的一鍵生成工具(內附使用說明)

      • Windows:下載

      • MAC OSX:下載

      • 解壓打開文件夾,直接運行 “支付寶RAS密鑰生成器SHAwithRSA1024_V1.0.bat”(WINDOWS)或 “SHAwithRSA1024_V1.0.command”(MACOSX),點擊 “生成RSA密鑰”,會自動生成公私鑰,然后點擊 “打開文件位置”,即可找到工具自動生成的密鑰。

        alipay7

      • TIPS:工具不支持含中文或空格的路徑,請下載到英文目錄下使用。

    • 生成方式二:也可以使用 OpenSSL 工具命令生成

      • 首先進入 OpenSSL 工具,再輸入以下命令。

        	OpenSSL> genrsa -out app_private_key.pem   1024  #生成私鑰
        	OpenSSL> pkcs8 -topk8 -inform PEM -in app_private_key.pem -outform PEM -nocrypt -out app_private_key_pkcs8.pem #Java開發者需要將私鑰轉換成PKCS8格式
        	OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem #生成公鑰
        	OpenSSL> exit #退出OpenSSL程序
        
      • 經過以上步驟,開發者可以在當前文件夾中(OpenSSL 運行文件夾),看到app_private_key.pem(開發者 RSA 私鑰)、app_private_key_pkcs8.pem(pkcs8 格式開發者 RSA 私鑰)和 app_public_key.pem(開發者 RSA 公鑰)3 個文件。開發者將私鑰保留,將公鑰提交給支付寶配置到開發平台,用於驗證簽名。以下為私鑰文件和公鑰文件示例。

      • 注意:對於使用 Java 的開發者,將 pkcs8 在 console 中輸出的私鑰去除頭尾、換行和空格,作為開發者私鑰,對於 .NET 和 PHP 的開發者來說,無需進行 pkcs8 命令行操作。

      • 標准的私鑰文件示例(PHP、.NET使用)

        	-----BEGIN RSA PRIVATE KEY-----
        	MIICXQIBAAKBgQC+L0rfjLl3neHleNMOsYTW8r0QXZ5RVb2p/vvY3fJNNugvJ7lo4+fdBz+LN4mDxTz4MTOhi5e2yeAqx+v3nKpNmPzC5LmDjhHZURhwbqFtIpZD51mOfno2c3MDwlrsVi6mTypbNu4uaQzw/TOpwufSLWF7k6p2pLoVmmqJzQiD0QIDAQABAoGAakB1risquv9D4zX7hCv9MTFwGyKSfpJOYhkIjwKAik7wrNeeqFEbisqv35FpjGq3Q1oJpGkem4pxaLVEyZOHONefZ9MGVChT/MNH5b0FJYWl392RZy8KCdq376Vt4gKVlABvaV1DkapL+nLh7LMo/bENudARsxD55IGObMU19lkCQQDwHmzWPMHfc3kdY6AqiLrOss+MVIAhQqZOHhDe0aW2gZtwiWeYK1wB/fRxJ5esk1sScOWgzvCN/oGJLhU3kipHAkEAysNoSdG2oWADxlIt4W9kUiiiqNgimHGMHPwp4JMxupHMTm7D9XtGUIiDijZxunHv3kvktNfWj3Yji0661zHVJwJBAM8TDf077F4NsVc9AXVs8N0sq3xzqwQD/HPFzfq6hdR8tVY5yRMb4X7+SX4EDPORKKsgnYcur5lk8MUi7r072iUCQQC8xQvUne+fcdpRyrR4StJlQvucogwjTKMbYRBDygXkIlTJOIorgudFlrKP/HwJDoY4uQNl8gQJb/1LdrKwIe7FAkBl0TNtfodGrDXBHwBgtN/t3pyi+sz7OpJdUklKE7zMSBuLd1E3O4JMzvWP9wEE7JDb+brjgK4/cxxUHUTkk592
        	-----END RSA PRIVATE KEY-----
        
      • PKCS8處理后的私鑰文件示例(Java 使用)

        	-----BEGIN PRIVATE KEY-----
        	MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN0yqPkLXlnhM+2H/57aHsYHaHXazr9pFQun907TMvmbR04wHChVsKVgGUF1hC0FN9hfeYT5v2SXg1WJSg2tSgk7F29SpsF0I36oSLCIszxdu7ClO7c22mxEVuCjmYpJdqb6XweAZzv4Is661jXP4PdrCTHRdVTU5zR9xUByiLSVAgMBAAECgYEAhznORRonHylm9oKaygEsqQGkYdBXbnsOS6busLi6xA+iovEUdbAVIrTCG9t854z2HAgaISoRUKyztJoOtJfI1wJaQU+XL+U3JIh4jmNx/k5UzJijfvfpT7Cv3ueMtqyAGBJrkLvXjiS7O5ylaCGuB0Qz711bWGkRrVoosPM3N6ECQQD8hVQUgnHEVHZYtvFqfcoq2g/onPbSqyjdrRu35a7PvgDAZx69Mr/XggGNTgT3jJn7+2XmiGkHM1fd1Ob/3uAdAkEA4D7aE3ZgXG/PQqlm3VbE/+4MvNl8xhjqOkByBOY2ZFfWKhlRziLEPSSAh16xEJ79WgY9iti+guLRAMravGrs2QJBAOmKWYeaWKNNxiIoF7/4VDgrcpkcSf3uRB44UjFSn8kLnWBUPo6WV+x1FQBdjqRviZ4NFGIP+KqrJnFHzNgJhVUCQFzCAukMDV4PLfeQJSmna8PFz2UKva8fvTutTryyEYu+PauaX5laDjyQbc4RIEMU0Q29CRX3BA8WDYg7YPGRdTkCQQCG+pjU2FB17ZLuKRlKEdtXNV6zQFTmFc1TKhlsDTtCkWs/xwkoCfZKstuV3Uc5J4BNJDkQOGm38pDRPcUDUh2/
        	-----END PRIVATE KEY-----
        
      • 公鑰文件示例

        	-----BEGIN PUBLIC KEY-----
        	MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
        	-----END PUBLIC KEY-----
        
  • 2、密鑰配置

    • 開發者登錄開放平台后,找到並進入應用。點擊 “RSA(SHA1)密鑰” 處的 “設置應用公鑰”(如已設置則顯示 “查看應用公鑰”,可修改),將公鑰文件去除頭尾、換行和空格,僅需填入字符串。

      alipay4

      • 例如轉換前公鑰 pem 文件格式:

        	-----BEGIN PUBLIC KEY-----
        	MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
        	-----END PUBLIC KEY-----
        
      • 轉換后得到的字符串為:

        	MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
        
  • 3、獲取支付寶公鑰

    • 應用上線后點擊 “查看支付寶公鑰”,即可獲取支付寶公鑰,用於支付寶返回數據的驗簽。

      • 對於支付寶公鑰,看到的是一個字符串,如下:

        	MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
        
      • 如果需要使用文件方式(如使用服務端 SDK 的 PHP/.NET 版本)讀取支付寶公鑰,需要在頭尾加入標示后保存至文件,文件內容如下:

        	-----BEGIN PUBLIC KEY-----
        	MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
        	-----END PUBLIC KEY-----
        

1.1.3 支付寶 APP 支付功能申請簽約

  • 1、准備簽約資料

    • 請提前准備以下資料:1)營業執照 2)APP 說明文檔 3)如開發者與簽約者不一致,需提供開發合作協議。
  • 2、提交簽約信息

    • 填寫商戶經營信息、APP 說明文檔、商戶聯系人信息。
  • 3、應用創建完成后點擊查看我的應用詳情,功能信息中進行 APP 支付功能的簽約。

    alipay8

    alipay9

1.2 支付寶 APP 支付集成並配置 SDK

  • 接入移動支付需要集成兩個 SDK,客戶端 SDK 需要集成在商戶自己的 APP 中,用於喚起支付寶 APP 並發送交易數據,並在支付寶 APP 返回商戶 APP 時獲得支付結果。服務端 SDK 需要商戶集成在自己的服務端系統中,用於協助解析並驗證客戶端同步返回的支付結果和異步通知。

  • 如何集成客戶端 SDK

  • 如何集成服務端 SDK

    • 為了幫助開發者調用開放接口,我們提供了開放平台服務端 SDK,包含 JAVA、PHP 和 .NET 三語言版本,封裝了簽名&驗簽、HTTP 接口請求等基礎功能。請先下載對應語言版本的 SDK 並引入您的開發工程。

1.3 支付寶 APP 支付上線應用

  • 應用開發完成后,請開發者自行進行驗收和安全性檢查(安全性檢查可參考《開放平台第三方應用安全開發指南》),驗收檢查完成后,可申請上線,上線成功后,狀態變為已上線,這個狀態下的應用能夠調用生產環境的接口。

  • 應用申請上線后,預計會有1個工作日的審核時間,請耐心等待。

  • 步驟一:確認功能

    alipay12

  • 步驟二:完善應用信息

    alipay13

  • 步驟三:申請上線

    alipay14

  • 應用上線后可新增功能、刪除功能,操作后實時生效。刪除功能時請謹慎操作,如果線上已經有用戶使用此功能,刪除功能后會導致無法使用。

    alipay15

1.4 支付寶 APP 支付系統交互流程

  • 系統交互流程:

    alipay11

    • 如圖,以 Android 平台為例:

      • 第4步:調用支付接口:此消息就是本接口所描述的支付寶客戶端 SDK 提供的支付對象 PayTask,將商戶簽名后的訂單信息傳進 payv2 方法喚起支付寶收銀台,交易數據格式具體參見請求參數說明

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

      • 第8步:接口返回支付結果:商戶客戶端在第 4 步中調用的支付接口,會返回最終的支付結果(即同步通知),參見客戶端同步返回

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

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

    • 特別注意:

      • 構造交易數據並簽名必須在商戶服務端完成,商戶的應用私鑰絕對不能保存在商戶 APP 客戶端中,也不能從服務端下發。
      • 同步返回的數據,只是一個簡單的結果通知,商戶確定該筆交易付款是否成功需要依賴服務端收到支付寶異步通知的結果進行判斷。
      • 商戶系統接收到通知以后,必須通過驗簽(驗證通知中的 sign 參數)來確保支付通知是由支付寶發送的。建議使用支付寶提供的 SDK 來完成,詳細驗簽規則參考異步通知驗簽。

2、支付寶 APP 支付開發

  • 說明:

    • 商戶服務端:

      • 負責生成訂單及簽名,及接受支付異步通知。
    • APP 客戶端:

      • 負責使用服務端傳來的訂單信息調用支付寶支付接口,及根據 SDK 同步返回的支付結果展示結果頁。
    • 服務端接入:

      • 私鑰必須放在商戶服務端,簽名過程必須放在商戶服務端。

2.1 支付寶 APP 支付集成設置

  • 1、下載 iOS 端開發工具包 AlipaySDK,並添加到創建的工程中。AlipaySDK 中有 2 個文件,分別為:

    	AlipaySDK.bundle
    	AlipaySDK.framework
    
  • 2、添加 SDK 的依賴庫和框架。在 項目設置 => TARGETS => Build Phases => Link Binary With Libraries 中依次添加以下庫或框架:

    	SystemConfiguration.framework
    	CoreTelephony.framework
    	QuartzCore.framework
    	CoreText.framework
    	CoreGraphics.framework
    	CoreMotion.framework
    	CFNetwork.framework
    	AlipaySDK.framework					// 導入 SDK 時已自動添加
    	
    	libz.dylib
    	libc++.tbd
    

    alipay16

    • 其中,需要注意的是:

      • 如果是 Xcode 7.0 之后的版本,需要添加 libc++.tbd、libz.tbd

      • 如果是 Xcode 7.0 之前的版本,需要添加 libc++.dylib、libz.dylib

        alipay17

  • 3、在 項目設置 => TARGETS => Info => URL Types 中點擊加號按鈕添加,在 “URL Schemes” 中輸入 “alisdkdemo”。

    alipay20

    • 注意:“alisdkdemo” 即為調起支付寶開始支付時使用的參數 appScheme。這里的 URL Schemes 中輸入的 alisdkdemo,為測試 demo,實際商戶的 app 中要填寫獨立的 scheme,建議跟商戶的 app 有一定的標示度,要做到和其他的商戶 app 不重復,否則可能會導致支付寶返回的結果無法正確跳回商戶 app。

      	NSString *appScheme = @"alisdkdemo";
      	
      	[[AlipaySDK defaultService] payOrder:orderString 
      	                          fromScheme:appScheme 
      	                            callback:^(NSDictionary *resultDic) {
              
              NSLog(@"reslut = %@", resultDic);
          }];
      
  • 4、iOS 9 + 系統策略更新,限制了 http 協議的訪問,受此影響,當你的應用在 iOS 9 + 中需要使用支付寶 SDK 的相關能力時,需要在 “Info.plist” 里增加如下代碼:

    	<key>NSAppTransportSecurity</key>
    	<dict>
    	<key>NSAllowsArbitraryLoads</key>
    	<true/>
    	</dict>
    

    alipay21

  • 5、若將 openssl 文件夾隨意拉進項目中,即使添加頭文件鏈接,也可能會出現找不到頭文件的問題,在 項目設置 => TARGETS => Build Settings => Search Paths => Header Search Paths 中添加 openssl 文件夾所在的路徑即可解決。

    alipay18

    alipay19

2.2 支付寶 APP 支付集成

  • 詳細代碼見 GitHub

  • Objective-C

    • AppDelegate.m

      	// 支付寶支付回調,當用戶通過其他應用啟動本應用時,會回調這個方法
      	
      	// NS_DEPRECATED_IOS(2_0, 9_0)
      	- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
      	                                       sourceApplication:(NSString *)sourceApplication
      	                                              annotation:(id)annotation {
      	         
      		if ([url.host isEqualToString:@"safepay"]) {
      		
      		// 支付跳轉支付寶錢包進行支付,處理支付結果
      		[[AlipaySDK defaultService] processOrderWithPaymentResult:url 
      		                                          standbyCallback:^(NSDictionary *resultDic) {
      			NSLog(@"result = %@",resultDic);
      		}];
      
      		return YES;
      	}
      
      	// NS_AVAILABLE_IOS(9_0) 9.0 以后使用新 API 接口
      	- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url 
      	                                         options:(NSDictionary<NSString*, id> *)options {
      	
      		if ([url.host isEqualToString:@"safepay"]) {
      
      			// 支付跳轉支付寶錢包進行支付,處理支付結果
      			[[AlipaySDK defaultService] processOrderWithPaymentResult:url 
      			                                          standbyCallback:^(NSDictionary *resultDic) {
          			NSLog(@"result = %@",resultDic);
       		}];
      
      		return YES;
      	}
      
    • ViewController.m

      	NSMutableDictionary *params = [NSMutableDictionary dictionary];
          
      	// 在此設置商戶服務端需要的參數
      	params[@"totalFee"] = @"10";
      	params[@"bodyID"] = @"1";
          
      	// 向商戶支付寶支付服務器端請求組裝和簽名后的請求串 orderString
      	AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
      	
      	[sessionManager POST:@"test 商戶支付寶支付后台接口"
      	          parameters:params
      	            progress:nil
      	             success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
           
          	// 解析商戶支付寶支付服務器端返回的數據,獲得組裝和簽名后的請求串 orderString
          
          	NSLog(@"responseObject = %@", responseObject);
           
          	NSString *orderString = responseObject[@"signedString"];
           
          	if (orderString != nil) {
               
               	// 應用注冊的 scheme,在 Info.plist 定義 URL types
               	NSString *appScheme = @"alisdkdemo";
               	
               	// 調用支付結果開始支付
               	[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme 
               	                                                   callback:^(NSDictionary *resultDic) {
                   
                   	NSLog(@"reslut = %@", resultDic);
               	}];
          	}
           
      	} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
           
           	NSLog(@"向商戶支付寶支付服務器端請求信息失敗:%@", error.localizedDescription);
      	}];
      


免責聲明!

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



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