iOS 整合apple Pay 接入詳細教程
Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。
環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡人,方便除錯,支付也不會發生真實的付款,真的很方便。
準備工作
在接入Apple Pay之前,首先要申請MerchantID及對應證書。
工程設定
-
bundleID設定
Capability中啟用Apple Pay許可權,並選擇merchantID。
之後專案會多一個Applepay的配置檔案ApplePayYasin.entitlements
-
需要引用的庫
Xcode7.0以上不需要再手動新增需要引用的庫了,只需要匯入標頭檔案就可以了
1 2 3 |
#import <passkit passkit.h=""> //使用者繫結的銀行卡資訊
#import <passkit pkpaymentauthorizationviewcontroller.h=""> //Apple pay的展示控制元件
#import <addressbook addressbook.h=""> //使用者聯絡資訊相關</addressbook></passkit></passkit> |
-
裝置Applepay許可權檢測
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
if (![PKPaymentAuthorizationViewController class]) {
//PKPaymentAuthorizationViewController需iOS8.0以上支援
NSLog(@ "作業系統不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援" );
return ;
}
//檢查當前裝置是否可以支付
if (![PKPaymentAuthorizationViewController canMakePayments]) { //支付需iOS9.0以上支援
NSLog(@ "裝置不支援ApplePay,請升級至9.0以上版本,且iPhone6以上裝置才支援" );
return ;
}
//檢查使用者是否可進行某種卡的支付,是否支援Amex、MasterCard、Visa與銀聯四種卡,根據自己專案的需要進行檢測
NSArray *supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];
if (![PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:supportedNetworks]) {
NSLog(@ "沒有繫結支付卡" );
return ;
}
|
建立支付請求PKPaymentRequest
-
初始化PKPaymentRequest
這裡需要注意RMB的幣種程式碼是CNY
1 2 3 4 5 6 7 |
//設定幣種、國家碼及merchant識別符號等基本資訊
PKPaymentRequest *payRequest = [[PKPaymentRequest alloc]init];
payRequest.countryCode = @ "CN" ; //國家程式碼
payRequest.currencyCode = @ "CNY" ; //RMB的幣種程式碼
payRequest.merchantIdentifier = @ "merchant.ApplePayDemoYasin" ; //申請的merchantID
payRequest.supportedNetworks = supportedNetworks; //使用者可進行支付的銀行卡
payRequest.merchantCapabilities = PKMerchantCapability3DS|PKMerchantCapabilityEMV; //設定支援的交易處理協議,3DS必須支援,EMV為可選,目前國內的話還是使用兩者吧
|
-
設定發票配送資訊和貨物配送地址資訊,使用者設定後可以通過代理回撥代理獲取資訊的更新
1 2 3 4 5 |
// payRequest.requiredBillingAddressFields = PKAddressFieldEmail;
//如果需要郵寄賬單可以選擇進行設定,預設PKAddressFieldNone(不郵寄賬單)
//樓主感覺賬單郵寄地址可以事先讓使用者選擇是否需要,否則會增加客戶的輸入麻煩度,體驗不好,
payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;
//送貨地址資訊,這裡設定需要地址和聯絡方式和姓名,如果需要進行設定,預設PKAddressFieldNone(沒有送貨地址)
|
送貨資訊頁面展示
設定貨物的配送方式,不需要不配置
1 2 3 4 5 6 7 8 9 10 |
//設定兩種配送方式
PKShippingMethod *freeShipping = [PKShippingMethod summaryItemWithLabel:@ "包郵" amount:[NSDecimalNumber zero]];
freeShipping.identifier = @ "freeshipping" ;
freeShipping.detail = @ "6-8 天 送達" ;
PKShippingMethod *expressShipping = [PKShippingMethod summaryItemWithLabel:@ "極速送達" amount:[NSDecimalNumber decimalNumberWithString:@ "10.00" ]];
expressShipping.identifier = @ "expressshipping" ;
expressShipping.detail = @ "2-3 小時 送達" ;
payRequest.shippingMethods = @[freeShipping, expressShipping];
|
-
賬單資訊的設定
每條賬單的設定
賬單列表使用PKPaymentSummaryItem新增描述和價格,價格使用NSDecimalNumber。
PKPaymentSummaryItem初始化:
label為商品名字或者是描述,amount為商品價格,折扣為負數,type為該條賬單為最終價格還是估算價格(比如計程車價格預估)
1 2 |
+ (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount;
+ (instancetype)summaryItemWithLabel:(NSString *)label amount:(NSDecimalNumber *)amount type:(PKPaymentSummaryItemType)type NS_AVAILABLE(NA, 9_0);
|
NSDecimalNumber初始化:
NSDecimalNumber可以使用數字初始化,也可以使用字串。
新增賬單列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275 exponent:-2 isNegative:NO]; //12.75
PKPaymentSummaryItem *subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@ "商品價格" amount:subtotalAmount];
NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithString:@ "-12.74" ]; //-12.74
PKPaymentSummaryItem *discount = [PKPaymentSummaryItem summaryItemWithLabel:@ "優惠折扣" amount:discountAmount];
NSDecimalNumber *methodsAmount = [NSDecimalNumber zero];
PKPaymentSummaryItem *methods = [PKPaymentSummaryItem summaryItemWithLabel:@ "包郵" amount:methodsAmount];
NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
totalAmount = [totalAmount decimalNumberByAdding:discountAmount];
totalAmount = [totalAmount decimalNumberByAdding:methodsAmount];
PKPaymentSummaryItem *total = [PKPaymentSummaryItem summaryItemWithLabel:@ "Yasin" amount:totalAmount]; //最後這個是支付給誰。哈哈,快支付給我
summaryItems = [NSMutableArray arrayWithArray:@[subtotal, discount, methods, total]];
//summaryItems為賬單列表,型別是 NSMutableArray,這裡設定成成員變數,在後續的代理回撥中可以進行支付金額的調整。
payRequest.paymentSummaryItems = summaryItems;
|
顯示購物資訊並進行支付
1 2 3 4 |
//ApplePay控制元件
PKPaymentAuthorizationViewController *view = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:payRequest];
view.delegate = self;
[self presentViewController:view animated:YES completion:nil];
|
PKPaymentAuthorizationViewControllerDelegate代理
-
這裡還有兩個類要介紹
PKPayment 支付成功資訊
1 2 3 4 5 |
PKPaymentToken *payToken = payment.token;
//支付憑據,發給服務端進行驗證支付是否真實有效
PKContact *billingContact = payment.billingContact; //賬單資訊
PKContact *shippingContact = payment.shippingContact; //送貨資訊
PKContact *shippingMethod = payment.shippingMethod; //送貨方式
|
PKContact 聯絡人資訊
1 2 3 4 5 |
NSPersonNameComponents *name = contact.name; //聯絡人姓名
CNPostalAddress *postalAddress = contact.postalAddress; //聯絡人地址
NSString *emailAddress = contact.emailAddress; //聯絡人郵箱
CNPhoneNumber *phoneNumber = contact.phoneNumber; //聯絡人手機
NSString *supplementarySubLocality = contact.supplementarySubLocality; //補充資訊,地址詳細描述,其他備註等等,iOS9.2及以上才有
|
-
代理說明
送貨地址回撥
1 2 3 4 5 6 7 |
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingContact:(PKContact *)contact
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkshippingmethod *> * _Nonnull, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//contact送貨地址資訊,PKContact型別
//送貨資訊選擇回撥,如果需要根據送貨地址調整送貨方式,比如普通地區包郵+極速配送,偏遠地區只有付費普通配送,進行支付金額重新計算,可以實現該代理,返回給系統:shippingMethods配送方式,summaryItems賬單列表,如果不支援該送貨資訊返回想要的PKPaymentAuthorizationStatus
completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, summaryItems);
}</pkpaymentsummaryitem *></pkshippingmethod *>
|
送貨方式回撥
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingMethod:(PKShippingMethod *)shippingMethod
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//配送方式回撥,如果需要根據不同的送貨方式進行支付金額的調整,比如包郵和付費加速配送,可以實現該代理
PKShippingMethod *oldShippingMethod = [summaryItems objectAtIndex:2];
PKPaymentSummaryItem *total = [summaryItems lastObject];
total.amount = [total.amount decimalNumberBySubtracting:oldShippingMethod.amount];
total.amount = [total.amount decimalNumberByAdding:shippingMethod.amount];
[summaryItems replaceObjectAtIndex:2 withObject:shippingMethod];
[summaryItems replaceObjectAtIndex:3 withObject:total];
completion(PKPaymentAuthorizationStatusSuccess, summaryItems);
}</pkpaymentsummaryitem *>
|
支付卡選擇回撥
1 2 3 4 |
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectPaymentMethod:(PKPaymentMethod *)paymentMethod completion:(void (^)(NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//支付銀行卡回撥,如果需要根據不同的銀行調整付費金額,可以實現該代理
completion(summaryItems);
}</pkpaymentsummaryitem *>
|
送貨地址回撥,已棄用
1 2 3 |
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didSelectShippingAddress:(ABRecordRef)address completion:(void (^)(PKPaymentAuthorizationStatus, NSArray<pkshippingmethod *> * _Nonnull, NSArray<pkpaymentsummaryitem *> * _Nonnull))completion{
//送貨地址回撥,已棄用
}</pkpaymentsummaryitem *></pkshippingmethod *>
|
付款成功蘋果伺服器返回資訊回撥,做伺服器驗證
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion {
PKPaymentToken *payToken = payment.token;
//支付憑據,發給服務端進行驗證支付是否真實有效
PKContact *billingContact = payment.billingContact; //賬單資訊
PKContact *shippingContact = payment.shippingContact; //送貨資訊
PKContact *shippingMethod = payment.shippingMethod; //送貨方式
//等待伺服器返回結果後再進行系統block呼叫
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//模擬伺服器通訊
completion(PKPaymentAuthorizationStatusSuccess);
});
}
|
支付完成回撥
1 2 3 |
-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}
|
相關推薦
iOS 整合apple Pay 接入詳細教程
Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。 環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡人,
iOS中Apple Pay接入詳細教程
Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。 環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡人,方便除錯,支付也不會發生真實的付款,
Apple Pay接入詳細教程
Apple Pay執行環境:iPhone6以上裝置,作業系統最低iOS9.0以上,部分資訊設定需要iOS9.2以上。目前還不支援企業證書新增。 環境搭建好後可以在模擬器上面執行,xcode7.2.1+iPhone6SP9.2系統下,系統會繫結幾種虛擬的銀行卡,和幾個聯絡
[iOS概念]Apple Pay與IAP的區別
Apple Pay是什麼? 在Apple Pay的釋出會上,Eddy Cue表示,蘋果並沒有興趣建立一個收集使用者資料的業務,蘋果並不知道你購買了什麼,不知道你是從哪裡購買的,為了這個商品花了多少錢。所以這也就是蘋果和支付寶,微信等最大的不同:Apple Pay並不會將資金存放在Apple
spring boot整合activiti rest api詳細教程
1.匯入依賴 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-rest</artifac
SSM框架整合Maven工程整合Spring+Springmvc+Mybatis(詳細教程,附程式碼)
一、基本概念 1、Spring Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分
IOS 公司開發者賬號申請詳細教程
m 談到蘋果開發者賬號,我們需要區分一下個人賬號、公司賬號和企業賬號這三種,還有一種是教育賬號,這個就不多說了。 個人賬號:個人申請用於開發蘋果app所使用的賬號,僅限於個人使用,申請比較容易,$99。 公司賬號:以公司的名義申請的開發者賬號,用於公司內部的
整合騰訊Bugly日誌收集接入詳細步驟和錯誤解決方案-- IOS
一、登入BUGLY官網1、登入BUGLY官網以後,選擇新建產品,選擇IOS或ADNROID平臺,如圖: 完事以後點選儲存,點選當前專案檢視詳細資訊: 主要有:異常上報(異常概覽、崩潰分析、卡頓分析、高階搜尋、異常配置)、運營統計(運營概覽、使用者分析、渠道分析)、應用升級 2
SSM三大框架整合詳細教程(Spring+SpringMVC+MyBatis)
json轉換 需要 acc log4 err ppi junit測試 日誌 enc 使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已經有三個多月了,項目在技術上已經沒有什麽難點了,基於現有的技術就可以實現想要的功能,當然肯定有很多可以改進的地
dede織夢系統接入熊掌號推送api,完整詳細教程
default ppi 模板 alt for fcm body ext plain 第一步: 根據熊掌號要求完成校驗頁面,官方文檔很詳細,照著弄就行了 第二步: 開始後臺改造 1.進入後臺文件夾dede(自己實際的文件夾),然後進入templets目錄,打開bo
dede織夢繫統接入熊掌號推送api,完整詳細教程
第一步: 根據熊掌號要求完成校驗頁面,官方文件很詳細,照著弄就行了 第二步: 開始後臺改造 1.進入後臺資料夾dede(自己實際的資料夾),然後進入templets目錄,開啟body_index.htm 大概104行左右,加入入口連結(c
springboot2.x簡單詳細教程--訊息佇列介紹及整合ActiveMQ (第十三章)
一、JMS介紹和使用場景及基礎程式設計模型 簡介:講解什麼是小寫佇列,JMS的基礎知識和使用場景 1、什麼是JMS: Java訊息服務(Java Message Service),Java平臺中關於面向訊息中介
springboot2.x簡單詳細教程--搜尋框架ElasticSearch介紹和整合(第十二章)
一、搜尋引擎知識和搜尋框架elasticsearch(es)基本介紹 1. 簡介:通過京東電商 介紹什麼是搜尋引擎,和開源搜尋框架ElasticSearch6.x新特性介紹 前言
springboot2.x簡單詳細教程--整合Logback日誌框架(第十一章)
一、新日誌框架LogBack介紹 簡介:日誌介紹和新日誌框架Logback講解 1.常用處理java的日誌元件 slf4j,log4j,logback,common-logging 等 &
springboot2.x簡單詳細教程--整合定時任務和非同步任務處理(第十章)
一、SpringBoot定時任務schedule講解 簡介:講解什麼是定時任務和常見定時任務區別 1、常見定時任務 Java自帶的java.util.Timer類
springboot2.x簡單詳細教程--整合Redis實戰(第 九章)
一、分散式快取Redis介紹 簡介:講解為什麼要用快取和介紹什麼是Redis,新手練習工具 1.什麼是Redis 由c語言編寫的,以鍵值對的形式儲存的非關係資料庫. 快取技術(駐留在記憶體中)
SSM三大框架整合詳細教程
使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已經有三個多月了,專案在技術上已經沒有什麼難點了,基於現有的技術就可以實現想要的功能,當然肯定有很多可以改進的地方。之前沒有記錄 SSM 整合的過程, 這次剛剛好基於自己的一個小專案重新搭建了一次,而且比專案搭建的要更好一些。以前解
springboot2.x簡單詳細教程--常用Starter介紹和整合模板引擎Freemaker、thymeleaf(第七章)
一、SpringBoot Starter講解 簡單說springboot Starter 就是jar包的集合,集合了很多的依賴 簡介:介紹什麼是SpringBoot Starter和主要作用 1、官網地址:https://docs.spring.
Springboot SpringCloud整合OAuth2入門詳細教程
關於OAuth2的解釋,有一篇比較出名的文章——理解OAuth 2.0 - 阮一峰的網路日誌(http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html),可以瞭解一下OAuth2的基礎知識。簡單理解一下OAuth2,你要登入一
iOS中實現IAP和Apple Pay支付的注意點
IAP開發需要的注意點在沙箱環境測試Store Kit在模擬器上無法執行,需要使用真機測試sanbox和app store內容一致,只是不執行真實的支付動作在測試的iphone上面退出itunes賬戶不能在測試的iphone手機上登入測試賬戶登入在程式中購買商品後,store