Apple Pay正式在國內(nèi)上線的那天唆香,一起工作的小伙伴就走進(jìn)了Starbucks,7-11等帶有銀聯(lián)閃付的店進(jìn)行了嘗鮮吨艇。不管是否要再次輸入一次密碼躬它,但是它的出現(xiàn)確實給我們帶來了極大的便捷。下面就嘗試在一個Demo中來集成下Apple Pay的功能东涡。
Apple Pay運行環(huán)境:
iPhone 6以上設(shè)備冯吓,當(dāng)然也包括最新出來的iPhone SE。iOS版本在9.2以上疮跑。
Xcode版本號 7.2.1
APP接入ApplePay不需要POS機(jī)组贺,但是還是要和銀行簽約,比如和銀聯(lián)簽約祖娘。
準(zhǔn)備工作
在接入Apple Pay之前失尖,首先要申請MerchantID及對應(yīng)的證書。
需要以merchant開頭的一個字符串
申請App ID,這里和Merchant ID填寫一樣的名字為了辨別
申請好后再權(quán)限里面打開ApplePay功能渐苏,并配置merchant證書
配置成功后你會看到
搭建工程文件
bundleID設(shè)置掀潮,對應(yīng)手動生成的bundleID
Capability中啟用Apple Pay權(quán)限,并選擇merchantID.
設(shè)置需要導(dǎo)入的頭文件琼富、引入的庫
#import <PassKit/PassKit.h>//用戶綁定的銀行卡信息
#import <PassKit/PKPaymentAuthorizationViewController.h>//Apple pay的展示控件
#import <AddressBook/AddressBook.h>//用戶聯(lián)系信息相關(guān)
在開始Apple Pay支付前需要帶代碼中進(jìn)行仪吧,系統(tǒng)版本檢測,設(shè)備是否支持ApplePay檢測以及用戶是否綁定有對應(yīng)的銀行鞠眉,三步操作薯鼠。
if(![PKPaymentAuthorizationViewControllerclass]) {
//PKPaymentAuthorizationViewController需iOS8.0以上支持
NSLog(@"操作系統(tǒng)不支持ApplePay,請升級至9.0以上版本械蹋,且iPhone6以上設(shè)備才支持");
return;
}
//檢查當(dāng)前設(shè)備是否可以支付
if(![PKPaymentAuthorizationViewControllercanMakePayments]) {
//支付需iOS9.0以上支持
NSLog(@"設(shè)備不支持ApplePay出皇,請升級至9.0以上版本,且iPhone6以上設(shè)備才支持");
return;
}
//檢查用戶是否可進(jìn)行某種卡的支付朝蜘,是否支持Amex、MasterCard涩金、Visa與銀聯(lián)四種卡谱醇,根據(jù)自己項目的需要進(jìn)行檢測
NSArray*supportedNetworkCards =@[PKPaymentNetworkAmex,PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];
if(![PKPaymentAuthorizationViewControllercanMakePaymentsUsingNetworks:supportedNetworks]) {
NSLog(@"沒有綁定支付卡");
return;
}
NSLog(@"可以支付暇仲,開始建立支付請求");
//當(dāng)以上三種檢查都通過后我這里以人民幣作為測試
//設(shè)置幣種、國家碼及merchant標(biāo)識符等基本信息
PKPaymentRequest*payRequest = [[PKPaymentRequestalloc]init];
payRequest.countryCode=@"CN";//國家代碼
payRequest.currencyCode=@"CNY";//RMB的幣種代碼
payRequest.merchantIdentifier=@"merchant.com.rm.applepay";//申請的merchantID
payRequest.supportedNetworks= supportedNetworkCards;//用戶可進(jìn)行支付的銀行卡
payRequest.merchantCapabilities=PKMerchantCapability3DS|PKMerchantCapabilityEMV;//設(shè)置支持的交易處理協(xié)議副渴,3DS必須支持奈附,EMV為可選
//payRequest.requiredBillingAddressFields = PKAddressFieldEmail;
//payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;
payRequest.requiredShippingAddressFields=PKAddressFieldNone;
//設(shè)置兩種配送方式,一般都是商戶App,里面一般自帶配送方式e.g.京東配送
payRequest.shippingMethods=@[];
NSDecimalNumber*totalAmount = [NSDecimalNumberdecimalNumberWithString:@"10000000"];
PKPaymentSummaryItem*total = [PKPaymentSummaryItemsummaryItemWithLabel:@"眉州彥祖"amount:totalAmount];
summaryItems= [NSMutableArrayarrayWithArray:@[total]];
//summaryItems為賬單列表,類型是NSMutableArray煮剧,這里設(shè)置成成員變量斥滤,在后續(xù)的代理回調(diào)中可以進(jìn)行支付金額的調(diào)整。
payRequest.paymentSummaryItems=summaryItems;
//ApplePay控件
PKPaymentAuthorizationViewController*view = [[PKPaymentAuthorizationViewControlleralloc]initWithPaymentRequest:payRequest];
view.delegate=self;
[selfpresentViewController:viewanimated:YEScompletion:nil];
接下來假如一切順利就會去調(diào)用服務(wù)端去調(diào)用對應(yīng)的支付網(wǎng)關(guān)完成付款.
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
didAuthorizePayment:(PKPayment*)payment
completion:(void(^)(PKPaymentAuthorizationStatusstatus))completion {
PKPaymentToken*payToken = payment.token;
//支付憑據(jù)勉盅,發(fā)給服務(wù)端進(jìn)行驗證支付是否真實有效
PKContact*billingContact = payment.billingContact;//賬單信息
PKContact*shippingContact = payment.shippingContact;//送貨信息
PKContact*shippingMethod = payment.shippingMethod;//送貨方式
//等待服務(wù)器返回結(jié)果后再進(jìn)行系統(tǒng)block調(diào)用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
//模擬服務(wù)器通信
completion(PKPaymentAuthorizationStatusSuccess);
});
}
后續(xù)工作
上面是模擬支付成功的回調(diào),真實環(huán)境你需要@服務(wù)端開發(fā)人員給你寫好驅(qū)動支付網(wǎng)關(guān)的代碼草娜,可以參考Apple Pay的官方文檔
https://developer.apple.com/library/ios/ApplePay_Guide/ProcessPayment.html#//apple_ref/doc/uid/TP40014764-CH5-SW4
Processing a payment involves several steps:
Sending the payment information to your server, along with other information needed to process the order
Verifying the hashes and signature of the payment data
Decrypting the encrypted payment data
Submitting payment data to the payment processing network
Submitting the order to your order-tracking system
其它選擇
接入Apple Pay還可以使用國內(nèi)使用人數(shù)較多的平臺
https://open.unionpay.com/ajweb/help/file/techFile?productId=80
1-2挑胸、 商戶生成訂單,通過商戶SERVER端將訂單信息發(fā)送給銀聯(lián)支付網(wǎng)關(guān);3-4、銀聯(lián)支付網(wǎng)關(guān)記錄訂單信息,返回用來標(biāo)識訂單的TN號,經(jīng)由商戶SERVER返回至給
商戶APP;
5宰闰、 商戶APP調(diào)用銀聯(lián)SDK,將TN號傳遞給銀聯(lián)SDK
6茬贵、 銀聯(lián)SDK向Apple公司的PASSKIT FRAMEWORK發(fā)起支付請求;
7、 接口返回加密的支付Token信息;
8-9移袍、銀聯(lián)SDK將支付Token傳遞給銀聯(lián)支付網(wǎng)關(guān),完成交易認(rèn)證;10-12解藻、銀聯(lián)將支付結(jié)果返回給商戶APP,商戶SERVER,商戶APP負(fù)責(zé)提示用戶交易結(jié)果。