【轉】iOS開發 -- Apple Pay

来源:http://www.cnblogs.com/gfxxbk/archive/2016/08/04/5736839.html
-Advertisement-
Play Games

技術博客原地址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top 原技術博客中有源碼和視頻,有感興趣的朋友可以研究一下! 一、什麼是Apple Pay? 1. 概念 Apple Pay,簡單來說, 就是一種移動支付方式。通過Touch ID/ P ...


技術博客原地址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top

原技術博客中有源碼和視頻,有感興趣的朋友可以研究一下!

一、什麼是Apple Pay?

  1. 概念

    Apple Pay,簡單來說, 就是一種移動支付方式。通過Touch ID/ Passcode,用戶可使用存儲在iPhone 6, 6p等設備上的信用卡和借記卡支付證書來授權支付; 它是蘋果公司在2014蘋果秋季新品發佈會上發佈的一種基於NFC的手機支付功能,於2014年10月20日在美國正式上線,2016年2月18日凌晨5:00, Apple Pay 業務在中國上線。

  2. 使用前提

    (1). 支持設備

Apple Pay支持的硬體設備 (表1)
線上 線下 線上&線下

iPad Pro

 

Apple Watch

 

iPhone 6

 

iPad Air 2

   

iPhone 6 Plus

 

iPad mini 3

   

 iPhone 6s

 

iPad mini 4

 

iPhone 6s Plus

 

    (2). 系統支持(iOS8.0+版本, 註意:iOS9.2才真正的支持“銀聯支付”, 意味著iOS9.2以後才可以在中國市場使用)

    (3). 銀行支持

        需要將被支持銀行的銀行卡, 添加到手機wallet應用當中

        

二、 應用場景?

  1. 線下支付

    > 除下使用前提之外, 還要求      

    > 商家支持(要求必須有支持NFC的刷卡機)

      如果發現以下標識,就代表該商家支持Apple Pay

      

      蘋果公開的Apple Pay商家有: 

        

  2. 線上支付

    > 除下使用前提之外, 還要求

    > App 支持

      目前支持Apple Pay支付方式的App並不多。很多公司也在集成當中,這也是寫這篇博客的目的。

唯品會   大眾點評  

       目前, 蘋果公開的支持Apple Pay的APP列表

        

 

 三、 與微信支付以及支付寶等第三方支付平臺的區別?

  1. 硬體方面

    Apple Pay:必須是iOS設備, 而且是按照線上支付和線下支付區分不同的真機設備(具體參考表1)

    微信、支付寶: 基本跟硬體設備無關, 支持大多數的只能手機

  2. 網路環境要求

    Apple Pay:線上支付需要聯網, 線下支付無需聯網就可以支付

    微信、支付寶: 無論是線上還是線下支付, 都需要聯網使用

  3. 使用技術

    Apple Pay:線下支付使用的是 基於NFC的近場通訊技術

    微信、支付寶: 線下支付使用的是 掃碼支付(條形碼、二維碼)

  4. 主要功能

    Apple Pay:線上支付、線下支付、部分升級後的ATM機可以取款

    微信、支付寶: 線上支付、線下支付、轉賬、理財等

  5. 安全性能

    Apple Pay:不保留銀行卡信息,並且不會暴漏給外界、不分流銀行存款(不需要從銀行卡轉錢到另外一個平臺)、不能充值  安全性較高

    微信、支付寶: 密碼保護,身份驗證等手段保護賬戶  安全性相對稍差

  6. 支付時長

    Apple Pay:無論是線上支付,還是線下支付, 只需要驗證指紋即可支付。非常迅速

    微信、支付寶: 需要掃碼支付, 流程相對繁瑣,所以時長較長

  7. 各自弊端

    Apple Pay:只適用於蘋果設備, 支付場景單一,無轉賬理財等業務

    微信、支付寶: 安全性較差, 必須聯網操作,需要充值到對應平臺

 

 四、線上支付集成步驟

 1. 配置支付環境

  • 使用XCode創建一個工程, 並設置好對應的BundleID

 

  • 註冊並配置一個商業標示符

 

    • 添加一個App ID

    • 配置Merchant ID

    • 為Merchant ID 配置證書, 並下載證書安裝到鑰匙串

    • 檢查安裝到鑰匙串中的證書是否有效

    • 綁定Merchant ID 到 APP ID

 

 2. 配置Xcode 項目

 

    • 調整系統最低部署版本(iOS8.0)

    • 開啟Apple Pay功能

 3. 代碼實現

  • 判斷當前設備是否可以支付
  • 判斷"Wallet有沒有添加該支付網路的儲蓄卡/信用卡"
  • 創建一個支付請求, 並配置各項信息
  • 彈出授權控制器,讓用戶給支付授權
  • 處理支付憑證

 4. 伺服器處理

 

 

五、 具體步驟實現

   1. 配置支付環境

    • 使用XCode創建一個工程, 並設置好對應的BundleID

       

    • 註冊並配置一個商業標示符

      (1)添加一個App ID, 並勾選Apple Pay功能

           

        

      (2)配置Merchant ID

        

        

      (3)為Merchant ID 配置證書, 並下載證書安裝到鑰匙串

        

        

        

        

      (4)檢查安裝到鑰匙串中的證書是否有效

        問題描述: 有可能會出現提示

        問題原因: 系統根證書/中級證書頒發機構過期

        解決方案:   重新下載證書, 並安裝,具體下載列表看下圖

          

     

      (5)綁定Merchant ID 到 APP ID

        

          

         

         

         

 2. 配置Xcode 項目

 

  • 調整系統最低部署版本(iOS8.0)

 

      

  • 開啟Apple Pay功能

      

     註意: 以上步驟截圖, 只是關鍵處截圖, 如果在具體細節處遇到問題, 歡迎關註公眾號(王順子),共同探討。或者參照具體視頻教程, 鏈接地址, 後續附上。

 

  

  3. 代碼實現    

    (1)判斷當前設備是否可以支付

       

1 2 3 4 5 if(![PKPaymentAuthorizationViewController canMakePayments]) {     NSLog(@"不能支付");     return; }

 

    (2)判斷"Wallet有沒有添加該支付網路的儲蓄卡/信用卡"

       

1 2 3 4 5 6 7 8 9 10 11 12     if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay]]) {         NSLog(@"Wallet沒有添加該支付網路的儲蓄卡/信用卡");           // 創建一個設置按鈕 //        PKPaymentButton *button = [PKPaymentButton buttonWithType:PKPaymentButtonTypeSetUp style:PKPaymentButtonStyleWhiteOutline]; //        [button addTarget:self action:@selector(jump) forControlEvents:UIControlEventTouchUpInside]; //        button.center = self.view.center; //        [self.view addSubview:button];             return;     }

 

    (3)創建一個支付請求, 並配置各項信息

      

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 // 1. 創建一個支付請求     PKPaymentRequest *request = [[PKPaymentRequest alloc] init];         // 2. 參數配置     // 2.1 商店標識     request.merchantIdentifier = @"merchant.520it.com";       // 2.2 貨幣代碼     request.currencyCode = @"CNY";       // 2.3 國家編碼     request.countryCode = @"CN";       // 2.4 支持的支付網路(PKPaymentNetworkChinaUnionPay iOS9.2開始支持)     request.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkChinaUnionPay];       // 2.5 支付請求包含一個支付摘要項目的列表     NSDecimalNumber *price1 = [NSDecimalNumber decimalNumberWithString:@"2"];     PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@"手榴彈" amount:price1];       NSDecimalNumber *price2 = [NSDecimalNumber decimalNumberWithString:@"6"];     PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@"炸彈" amount:price2 type:PKPaymentSummaryItemTypePending];       NSDecimalNumber *totalAmount = [NSDecimalNumber zero];     totalAmount = [totalAmount decimalNumberByAdding:price1];     totalAmount = [totalAmount decimalNumberByAdding:price2];     PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@"小碼哥財務中心" amount:totalAmount type:PKPaymentSummaryItemTypePending];     // 註意: 數組最後一個是總價格     request.paymentSummaryItems = @[item1, item2, total];         // 2.6 運輸方式     NSDecimalNumber *shippingPrice = [NSDecimalNumber decimalNumberWithString:@"18.0"];     PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"順豐快遞" amount:shippingPrice];     method.detail = @"24小時送到!";     method.identifier = @"shunfeng";     request.shippingMethods = @[method];     request.shippingType = PKShippingTypeServicePickup;         // 2.7 通過指定merchantCapabilities屬性來指定你支持的支付處理標準,3DS支付方式是必須支持的,EMV方式是可選的,     request.merchantCapabilities = PKMerchantCapability3DS | PKMerchantCapabilityEMV | PKMerchantCapabilityCredit | PKMerchantCapabilityDebit;           // 2.8 需要的配送信息和賬單信息     request.requiredBillingAddressFields = PKAddressFieldAll;     request.requiredShippingAddressFields = PKAddressFieldAll;       // 2.9 存儲額外信息     // 使用applicationData屬性來存儲一些在你的應用中關於這次支付請求的唯一標識信息,比如一個購物車的標識符。在用戶授權支付之後,這個屬性的哈希值會出現在這次支付的token中。     request.applicationData = [@"購物車ID: 123456" dataUsingEncoding:NSUTF8StringEncoding];

 

    (4)彈出授權控制器,讓用戶給支付授權

       

1 2 3 4 5 6 7 8 // 3. 開始支付     PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];     if (paymentPane == nil) {         NSLog(@"授權控制器創建失敗");         return;     }     paymentPane.delegate = self;     [self presentViewController:paymentPane animated:YES completion:nil];

 

    (5)處理支付憑證(token)

      

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /**  *  當授權成功之後會調用這個代理方法  */ - (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller                        didAuthorizePayment:(PKPayment *)payment                                 completion:(void (^)(PKPaymentAuthorizationStatus status))completion; { //    PKPayment *temp = payment;     NSLog(@"驗證授權---%@", payment.token);     NSLog(@"驗證通過後, 需要開發者繼續完成交易");     // 它需要你連接伺服器並上傳支付令牌和 其他信息,以完成整個支付流程。     BOOL isSuccess = YES;     if (isSuccess) {         completion(PKPaymentAuthorizationStatusSuccess);     }else     {         completion(PKPaymentAuthorizationStatusFailure);     }       }

 

    (6)關閉授權控制器

 

1 2 3 4 5 6 7 8 /**  *  當授權成功之後或者取消授權之後會調用這個代理方法  */ - (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {     NSLog(@"取消或者交易完成");     [self dismissViewControllerAnimated:YES completion:nil]; }

 

     * 支付授權的流程:

    • 框架發送支付請求給安全模塊,只有安全模塊可以訪問存儲在設備上的標記化的卡信息。 

    • 安全模塊把特定的卡和商家等支付數據加密,以保證只有蘋果可以讀取,然後發送給框架。框架會將這些數據發送給蘋果。 

    • 蘋果伺服器再次加密這些支付數據,以保證只有商家可以讀取。然後伺服器對它進行簽名,生成支付token,然後發送給設備。 

    • 框架調用相應的代理方法並傳入這個token,然後你的代理方法傳送token給你的伺服器。

    

 

  4. 伺服器接收到token後的一般處理流程

    • 驗證支付數據的哈希表和簽名 
    • 為加密過的支付數據解碼  
    • 向支付處理系統提交支付數據 
    • 向訂單追蹤系統提交訂單 

   處理支付請求時,你有兩個選擇;你既可以利用支付平臺處理支付請求,也可以自己實現支付請求處理流程。一個常用的支付平臺可以完成上述大部分操作。

   關於支持Apple Pay支付平臺的更多信息,請參考developer.apple.com/apple-pay/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • For迴圈九九乘法表 for迴圈是javascript中一種常用的迴圈語句,可以很好的解決在程式中需要重覆執行某些語句,利用for迴圈實現簡單的“九九乘法表”的效果: 讓迴圈從小到大,依次排序,並計算每次的結果,並用 table 使之排列出來。 代碼很少,相對很簡單,也都是基礎,通過簡單的迴圈實現這 ...
  • jquery學習筆記 1.環境搭建 進入官方網站獲取最新的版本 http://jquery.com/download/ ,這裡需要註意 jQuery 分 2 個系列版本 1.x 與 2.x,主要的區別 在於 2.x 不再相容 IE6、7、8 為移動端而優化,由於減少了一些代碼,使得該版本比 jQue ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h RootViewController.m ...
  • 在上篇 Handler 原理分析和使用(一)中,介紹了一個使用Handler的一個簡單而又常見的例子,這裡還有一個例子,當然和上一篇的例子截然不同,也是比較常見的,實例如下。 實際運行這個例子,點擊Button之後,TextView文字內容會變成“I get Post Message”。為什麼會是這 ...
  • 作為一個完整的應用程式,數據存儲操作是必不可少的。因此,Android系統一共提供了四種數據存儲方式。分別是:SharePreference、文件存儲、SQLite、 Content Provider。對這幾種方式的不同和應用場景整理如下。第一種: 使用SharedPreferences存儲數據 適 ...
  • # 介紹1、官方文檔寫法```objcstatic AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allo... ...
  • Scene Kit 是Apple 向 OS X 開發者們提供的 Cocoa 下的 3D 渲染框架。 Scene Kit 建立在 OpenGL 的基礎上,包含瞭如光照、模型、材質、攝像機等高級引擎特性,這些組件都是面向對象的,你可以用熟悉的 Objective-C 或 Swift 語言來編寫代碼。假如 ...
  • 蘋果手機端應用,如果發佈的到Appstore上,往往比較複雜,周期也比較長,Over-the-Air是Apple在 iOS4 中新加的一項技術,目的是讓開發者能夠脫離Appstore,實現從自己的伺服器下載並安裝iOS應用。簡單地說,就是用戶只需要在Safari中點開一條鏈接,就能直接在主界面中安裝 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...