iOS開發ApplePay的介紹與實現

1、Apple Pay的介紹

  • Apple Pay官方
  • 1.1 Apple Pay概念

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

    • 設備支持
      • iPhone
        • 配備面容 ID 的 iPhone 機型
        • 配備觸控 ID 的 iPhone 機型(iPhone 5s 除外)
        • 識別您的 iPhone 機型
      • iPad
        • 配備觸控 ID 或面容 ID 的 iPad Pro、iPad Air、iPad 和 iPad mini 機型
      • Apple Watch
        • Apple Watch Series 1 和 2 及更新機型
        • Apple Watch(第 1 代)7
      • Mac
        • 配備觸控 ID 功能的 Mac 機型
        • 2012 年或之后推出的 Mac 機型,與支持 Apple Pay 的 iPhone 或 Apple Watch 搭配使用
    • 系統支持
      • iOS8.0以上版本, 注意:iOS9.2才真正的支持“銀聯支付”, 意味著iOS9.2以后才可以在中國市場使用。
    • 銀行支持
      • 想要使用Apple Pay,對應的銀行還要加入Apple Pay才行。
  • 1.3 應用場景?

    • 線下支付
      • 除去使用前提之外,還要商家支持(要求必須有支持NFC的刷卡機)
      • 如果發現以下標識,就代表該商家支持Apple Pay
        1213778-20190430170749655-1479402136.png
    • 線上支付
      • 除去使用前提之外, 還要求App內部集成支持
      • 目前支持Apple Pay支付方式的App并不多。很多公司也在集成當中,這也是寫這篇博客的目的。
      • 目前,蘋果公開的支持Apple Pay的APP列表
  • 1.4 與微信支付以及支付寶等第三方支付平臺的區別?

    • 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:只適用于蘋果設備, 支付場景單一,無轉賬理財等業務
      • 微信、支付寶:安全性較差, 必須聯網操作, 需要充值到對應平臺

2、線上支付集成步驟

  • 2.1 配置支付環境

    • 配置Merchant ID(商業ID)
    • 配置Xcode 項目
  • 2.2 代碼實現

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

3、線上支付集成具體實現過程

  • 3.1 配置支付環境

    • 配置Merchant ID(商業ID)
      1213778-20190430181005764-521662691.png
      • 需要以merchant開頭的一個字符串
        1213778-20190430183158745-773489252.png
      • 僅在中國使用
        1213778-20190430183254887-598995412.png
      • 申請App ID,這里和Merchant ID填寫一樣的名字為了辨別
      • 申請好后在權限對應的App ID里面打開ApplePay功能,并配置merchant證書
        1213778-20190430183319918-1535397837.png
      • 選擇Edit進行相應配置, 配置成功后你會看到
        1213778-20190430183354663-1363313171.png
      • 配置APP ID和Merchant ID關聯成功
    • 配置Xcode 項目
      • 調整系統最低部署版本(iOS8.0)
        1213778-20190430192933182-1296873353.png
      • 使用XCode創建一個工程, 并設置好對應的BundleID
        • bundleID設置,對應手動生成的bundleID
          1213778-20190430191457689-92074946.png
        • 開啟Apple Pay功能:Bundle Id設置 Capability中啟用Apple Pay權限,并選擇merchantID.
          1213778-20190430191503230-1743841729.png
      • 下載證書安裝到鑰匙串
      • 檢查安裝到鑰匙串中的證書是否有效
  • 3.2 代碼實現

    • 1) 框架導入
    // 用戶綁定的銀行卡信息
    #import <PassKit/PassKit.h>
    // Apple pay的展示控件
    #import <PassKit/PKPaymentAuthorizationViewController.h>
    // 用戶聯系信息相關
    #import <AddressBook/AddressBook.h>
    • 2)判斷當前設備是否可以支付
    if(![PKPaymentAuthorizationViewController canMakePayments]) {NSLog(@"不能支付");return;
    }
    • 3) 判斷"Wallet有沒有添加該支付網絡的儲蓄卡/信用卡"
    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;
    }
    • 4) 創建一個支付請求, 并配置各項信息
    // 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];
    • 5) 彈出授權控制器,讓用戶給支付授權
    // 3. 開始支付
    PKPaymentAuthorizationViewController *paymentPane = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
    if (paymentPane == nil) {NSLog(@"授權控制器創建失敗");return;
    }
    paymentPane.delegate = self;
    [self presentViewController:paymentPane animated:YES completion:nil];
    • 6) 處理支付憑證
    /**
    *  當授權成功之后會調用這個代理方法
    */
    - (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controllerdidAuthorizePayment:(PKPayment *)paymentcompletion:(void (^)(PKPaymentAuthorizationStatus status))completion {// PKPayment *temp = payment;NSLog(@"驗證授權---%@", payment.token);NSLog(@"驗證通過后, 需要開發者繼續完成交易");// 它需要你連接服務器并上傳支付令牌和 其他信息,以完成整個支付流程。BOOL isSuccess = YES;if (isSuccess) {completion(PKPaymentAuthorizationStatusSuccess);}else {completion(PKPaymentAuthorizationStatusFailure);}
    }
    • 7)關閉授權控制器
    /**
    *  當授權成功之后或者取消授權之后會調用這個代理方法
    */
    - (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {NSLog(@"取消或者交易完成");[self dismissViewControllerAnimated:YES completion:nil];
    }
    • 8) 支付授權的流程:
      • 框架發送支付請求給安全模塊,只有安全模塊可以訪問存儲在設備上的標記化的卡信息。
      • 安全模塊把特定的卡和商家等支付數據加密,以保證只有蘋果可以讀取,然后發送給框架。框架會將這些數據發送給蘋果。
      • 蘋果服務器再次加密這些支付數據,以保證只有商家可以讀取。然后服務器對它進行簽名,生成支付token,然后發送給設備。
      • 框架調用相應的代理方法并傳入這個token,然后你的代理方法傳送token給你的服務器。
        1213778-20190430201524294-354998119.png
  • 3.3 服務器處理

    • 驗證支付數據的哈希表和簽名
    • 為加密過的支付數據解碼  
    • 向支付處理系統提交支付數據
    • 向訂單追蹤系統提交訂單
  • 處理支付請求時,你有兩個選擇;你既可以利用支付平臺處理支付請求,也可以自己實現支付請求處理流程。一個常用的支付平臺可以完成上述大部分操作。

轉載于:https://www.cnblogs.com/CH520/p/10796501.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mes建設指南_給予和接受建設性批評的設計師指南

mes建設指南Constructive criticism, or more plainly, feedback, plays a crucial role in a designer’s job. Design is an iterative process, so we are often either asking for feedback on our own work or dishing it out to a fellow designer.建設性的批評&#xff…

面試官:請實現一個通用函數把 callback 轉成 promise

1. 前言大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;或者在公眾號&#xff1a;若川視野&#xff0c;回復"源碼"參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行…

java中filter的用法

filter過濾器主要使用于前臺向后臺傳遞數據是的過濾操作。程度很簡單就不說明了&#xff0c;直接給幾個已經寫好的代碼&#xff1a; 一、使瀏覽器不緩存頁面的過濾器 Java代碼 import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IOExcept…

我很喜歡玩游戲,那么我就適合做游戲程序員嗎?

作者&#xff1a;黃小斜文章來源&#xff1a;【程序員江湖】游戲在今天的普及度已經不是端游時代可以比肩的了。如今人手一臺手機、平板就可以吃雞、打農藥&#xff0c;不僅是男生&#xff0c;也有很多女生加入了游戲圈。相信現在在看文章的你也玩游戲&#xff0c;雖然愛玩的程…

open-falcon_NASA在Falcon 9上帶回了蠕蟲-其背后的故事是什么?

open-falconYes, that’s right. The classic NASA “worm” logo is back! An image of the revived NASA worm logo was released on Twitter by NASA Administrator Jim Bridenstine as well as press release on the NASA.gov website. NASA explained that original NASA …

聽說你對 ES6 class 類還不是很了解

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與。前言在ES5中是原型函數&#xff0c;到了ES6中出現了"類"的概念。等同于是ES5的語法糖&#xff0c;大大提升了編寫代碼的速度&#xff0c;本文只講一些常用的&…

《CSS揭秘》讀書筆記

摘要 《CSS揭秘》主要是介紹了使用CSS的技巧&#xff0c;通過47個案例來靈活的使用CSS進行實現&#xff0c;同時在實現過程中注重CSS代碼的靈活性與健壯性。通過閱讀這本書有利于我們編寫高質量的CSS代碼以及打破使用CSS時的固定思維&#xff0c;能夠更加靈活的使用CSS。 《CSS…

一篇文章帶你搞懂前端面試技巧及進階路線

大家好&#xff0c;我是若川。最近有很多朋友給我后臺留言&#xff1a;自己投了不少簡歷&#xff0c;但是收到的面試邀請卻特別少&#xff1b;好不容易收到了大廠的面試邀請&#xff0c;但由于對面試流程不清楚&#xff0c;準備的特別不充分&#xff0c;結果也掛了&#xff1b;…

小屏幕 ui設計_UI設計基礎:屏幕

小屏幕 ui設計重點 (Top highlight)第4部分 (Part 4) Welcome to the fourth part of the UI Design basics. This time we’ll cover the screens you’ll likely design for. This is also a part of the free chapters from Designing User Interfaces.歡迎使用UI設計基礎知…

RabbitMQ指南之四:路由(Routing)和直連交換機(Direct Exchange)

在上一章中&#xff0c;我們構建了一個簡單的日志系統&#xff0c;我們可以把消息廣播給很多的消費者。在本章中我們將增加一個特性&#xff1a;我們可以訂閱這些信息中的一些信息。例如&#xff0c;我們希望只將error級別的錯誤存儲到硬盤中&#xff0c;同時可以將所有級別&am…

不用任何插件實現 WordPress 的彩色標簽云

側邊欄的標簽云&#xff08;Tag Cloud&#xff09;一直是 WordPress 2.3 以后的內置功能&#xff0c;一般直接調用函數wp_tag_cloud 或者在 Widgets 里開啟即可&#xff0c;但是默認的全部是一個顏色&#xff0c;只是大小不一樣&#xff0c;很是不順眼&#xff0c;雖然可以用 S…

隨時隨地能寫代碼, vscode.dev 出手了

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與。今天偶然看到了 VSCode 官方發布了一條激動人心的 Twitter&#xff0c;vscode.dev[1] 域名上線了&#xff01;image-20211021211915942新的域名 vscode.dev[2] 它是一個…

七種主流設計風格_您是哪種設計風格?

七種主流設計風格重點 (Top highlight)I had an idea for another mindblowing test, so here it is. Since you guys liked the first one so much, and I got so many nice, funny responses and private messages on how accurate it actually was, I thought you will prob…

算法精講:分享一道值得分享的算法題

分享一道leetcode上的題&#xff0c;當然&#xff0c;居然不是放在刷題貼里來講&#xff0c;意味著分享的這道題不僅僅是教你怎么來解決&#xff0c;更重要的是這道題引發出來的一些解題技巧或許可以用在其他地方&#xff0c;下面我們來看看這道題的描述。 問題描述 給定一個未…

正幾邊形可以實現無縫拼接?

正n邊形內角為 (n-2)*180/n &#xff0c;要保證可以無縫拼接&#xff0c;就是一個圓可以被整數個n邊形內角拼接&#xff0c;即 360k*(n-2)*180/n > 2nk(n-2)。&#xff08;摘自http://blog.csdn.net/ray58750034/article/details/1365813&#xff09; 以下代碼表明&#xff…

React 18 Beta 來了

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;目前近3000人參與。經過「React18工作組」幾個月工作&#xff0c;11月16日v18終于從Alpha版本更新到Beta版本。本文會解釋&#xff1a;這次更新帶來的變化對開…

osg著色語言著色_探索數字著色

osg著色語言著色Learn how to colorize icons with your NounPro subscription and Adobe Illustrator.了解如何使用NounPro訂閱和Adobe Illustrator為圖標著色。 For those who want to level up their black and white Noun Project icons with a splash of color, unlockin…

upc組隊賽15 Supreme Number【打表】

Supreme Number題目鏈接 題目描述 A prime number (or a prime) is a natural number greater than 1 that cannot be formed by multiplying two smaller natural numbers. Now lets define a number N as the supreme number if and only if each number made up of an non-e…

CSS3實踐之路(一):CSS3之我觀

CSS 的英文全稱Cascading Style Sheets&#xff0c;中文意思是級聯樣式表,通過設立樣式表&#xff0c;可以統一地控制HMTL中各DOM元素的顯示屬性。級聯樣式表可以使人更能有效地控制網頁外觀。使用級聯樣式表&#xff0c;可以擴充精確指定網頁元素位置&#xff0c;外觀以及創建…

18個項目必備的JavaScript代碼片段——數組篇

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;目前近3000人參與&#xff0c;0-5年工作經驗的都可以參與學習。1.chunk轉換二維數組將數組&#xff08;array&#xff09;拆分成多個數組&#xff0c;并將這些…