知識體系
1. 什麼是 Apple Pay?
Apple Pay,是蘋果公司在2014蘋果秋季新品發佈會上發佈的一種基於NFC的手機支付功能,於2014年10月20日在美國正式上線。2016年2月18日凌晨5:00, Apple Pay 業務在中國上線.
2. 應用場景
線下:要求商家擁有支持NFC功能的刷卡機
線上:要求App的支持。目前美團、大衆、京東等網站均支持。這也是爲什麼我們現在需要學習Apple Pay集成的原因
3. 與傳統第三方支付的區別
硬件要求:Apple Pay要求手機在iPhone6以上設備,iOS8以上的系統。
網絡要求:線下支付可以沒有網絡支持
安全: 更加安全,無需第三方賬號
效率: 支付時間短,不需要掃描二維碼等操作
使用功能:功能較單一、升級的ATM機可以取款。但不能進行轉賬理財
4. 線上集成的步驟
1.環境配置
首先創建一個Xcode工廠
登陸開發者賬號,證書中心
添加一個AppID,並勾選Apple Pay功能
配置MerchantID,並創建相應的證書,下載並安裝到鑰匙串中
綁定AppID 與 MerchantID
在Xcode中調到iOS8以上(在中國iOS9.2以後才支持銀聯)
在Xcode中打開Apple Pay功能,出現三個對勾說明配置完成
2.代碼實現:
Apple Pay支付原理圖:
支付請求原理圖
具體處理步驟如下:
框架發送支付請求給安全模塊,只有安全模塊可以訪問存儲在設備上的標記化的卡信息。
安全模塊把特定的卡和商家等支付數據加密,以保證只有蘋果可以讀取,然後發送給框架。框架會將這些數據發送給蘋果。
蘋果服務器再次加密這些支付數據,以保證只有商家可以讀取。然後服務器對它進行簽名,生成支付token,然後發送給設備
框架調用相應的代理方法並傳入這個token,然後你的代理方法傳送token給你的服務器
步驟:
//判斷設備是否支持
[PKPaymentAuthorizationViewControllercanMakePayments];
判斷wallet卡包是否綁定銀行卡
[PKPaymentAuthorizationViewControllercanMakePaymentsUsingNetworks:@[PKPaymentNetworkMasterCard,PKPaymentNetworkChinaUnionPay,PKPaymentNetworkVisa]];
//創建支付請求
PKPaymentRequest *requst = [[PKPaymentRequestalloc]init];
// 配置商家ID
requst.merchantIdentifier =@"merchant.appyPayDemo1";
//配置貨幣代碼及國家代碼
requst.countryCode =@"CN";
requst.currencyCode =@"CNY";
//配置請求支持的支付網絡
requst.supportedNetworks =@[PKPaymentNetworkVisa,PKPaymentNetworkMasterCard,PKPaymentNetworkChinaUnionPay];
//配置商戶的處理方式
requst.merchantCapabilities =PKMerchantCapability3DS;
//配置購買的商品列表,如果有多項 商品 列表信息 最後一項爲彙總信息
NSDecimalNumber *price = [NSDecimalNumberdecimalNumberWithString:@"0.01"];
PKPaymentSummaryItem *item = [PKPaymentSummaryItemsummaryItemWithLabel:@"蘋果6s"amount:price];
requst.paymentSummaryItems =@[item];
//配置請求的附加項
//2.1 是否顯示發票收穫地址
requst.requiredBillingAddressFields =PKAddressFieldAll;
//2.2 是否顯示快遞收貨地址
requst.requiredShippingAddressFields =PKAddressFieldAll;
//2.3 配置快遞方式
NSDecimalNumber *price1 = [NSDecimalNumberdecimalNumberWithString:@"0.01"];
PKShippingMethod *method1 = [PKShippingMethodsummaryItemWithLabel:@"順豐快遞"amount:price1];
method1.identifier =@"順豐";
requst.shippingMethods =@[method1];
requst.shippingType =PKShippingTypeShipping;
//添加附件數據
requst.applicationData = [@"buyID = 1234567"dataUsingEncoding:NSUTF8StringEncoding];
給支付授權
//驗證用戶的支付授權
PKPaymentAuthorizationViewController *avc = [[PKPaymentAuthorizationViewControlleralloc]initWithPaymentRequest:requst];
avc.delegate =self;
[selfpresentViewController:avcanimated:YEScompletion:nil];
處理支付憑證
PKPaymentAuthorizationViewControllerDelegate 的方法中處理
// 如果用戶授權成功就會調用方法
//參數一、授權控制器
//參數二、支付對象
//參數三、系統給定一個回調代碼塊,我們需要執行這個代碼塊,來告訴系統當前的支付狀態十分成功
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion
{
//這裏拿到支付信息,發送給服務器處理,處理完畢服務器會返回一個狀態,告訴客戶端,是否支付成功,然後由客戶端處理
BOOL success =YES;
if (success) {
completion(PKPaymentAuthorizationStatusSuccess);
}else
{
completion(PKPaymentAuthorizationStatusFailure);
}
}
//執行這裏的方法代表支付授權結束或者取消。也是返回上一個界面的時機
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
NSLog(@"授權結束");
[selfdismissViewControllerAnimated:YEScompletion:nil];
}
—————–陳洪鑫——————-