Apple Pay正式在国内上线的那天,一起工作的小伙伴就走进了Starbucks,7-11等带有银联闪付的店进行了尝鲜。不管是否要再次输入一次密码,但是它的出现确实给我们带来了极大的便捷。下面就尝试在一个Demo中来集成下Apple Pay的功能。
Apple Pay运行环境:
iPhone 6以上设备,当然也包括最新出来的iPhone SE。iOS版本在9.2以上。
Xcode版本号 7.2.1
APP接入ApplePay不需要POS机,但是还是要和银行签约,比如和银联签约。
准备工作
在接入Apple Pay之前,首先要申请MerchantID及对应的证书。
需要以merchant开头的一个字符串
申请App ID,这里和Merchant ID填写一样的名字为了辨别
申请好后再权限里面打开ApplePay功能,并配置merchant证书
配置成功后你会看到
搭建工程文件
bundleID设置,对应手动生成的bundleID
Capability中启用Apple Pay权限,并选择merchantID.
设置需要导入的头文件、引入的库
#import <PassKit/PassKit.h>//用户绑定的银行卡信息
#import <PassKit/PKPaymentAuthorizationViewController.h>//Apple pay的展示控件
#import <AddressBook/AddressBook.h>//用户联系信息相关
在开始Apple Pay支付前需要带代码中进行,系统版本检测,设备是否支持ApplePay检测以及用户是否绑定有对应的银行,三步操作。
if(![PKPaymentAuthorizationViewControllerclass]) {
//PKPaymentAuthorizationViewController需iOS8.0以上支持
NSLog(@"操作系统不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");
return;
}
//检查当前设备是否可以支付
if(![PKPaymentAuthorizationViewControllercanMakePayments]) {
//支付需iOS9.0以上支持
NSLog(@"设备不支持ApplePay,请升级至9.0以上版本,且iPhone6以上设备才支持");
return;
}
//检查用户是否可进行某种卡的支付,是否支持Amex、MasterCard、Visa与银联四种卡,根据自己项目的需要进行检测
NSArray*supportedNetworkCards =@[PKPaymentNetworkAmex,PKPaymentNetworkMasterCard,PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay];
if(![PKPaymentAuthorizationViewControllercanMakePaymentsUsingNetworks:supportedNetworks]) {
NSLog(@"没有绑定支付卡");
return;
}
NSLog(@"可以支付,开始建立支付请求");
//当以上三种检查都通过后我这里以人民币作为测试
//设置币种、国家码及merchant标识符等基本信息
PKPaymentRequest*payRequest = [[PKPaymentRequestalloc]init];
payRequest.countryCode=@"CN";//国家代码
payRequest.currencyCode=@"CNY";//RMB的币种代码
payRequest.merchantIdentifier=@"merchant.com.rm.applepay";//申请的merchantID
payRequest.supportedNetworks= supportedNetworkCards;//用户可进行支付的银行卡
payRequest.merchantCapabilities=PKMerchantCapability3DS|PKMerchantCapabilityEMV;//设置支持的交易处理协议,3DS必须支持,EMV为可选
//payRequest.requiredBillingAddressFields = PKAddressFieldEmail;
//payRequest.requiredShippingAddressFields = PKAddressFieldPostalAddress|PKAddressFieldPhone|PKAddressFieldName;
payRequest.requiredShippingAddressFields=PKAddressFieldNone;
//设置两种配送方式,一般都是商户App,里面一般自带配送方式e.g.京东配送
payRequest.shippingMethods=@[];
NSDecimalNumber*totalAmount = [NSDecimalNumberdecimalNumberWithString:@"10000000"];
PKPaymentSummaryItem*total = [PKPaymentSummaryItemsummaryItemWithLabel:@"眉州彦祖"amount:totalAmount];
summaryItems= [NSMutableArrayarrayWithArray:@[total]];
//summaryItems为账单列表,类型是NSMutableArray,这里设置成成员变量,在后续的代理回调中可以进行支付金额的调整。
payRequest.paymentSummaryItems=summaryItems;
//ApplePay控件
PKPaymentAuthorizationViewController*view = [[PKPaymentAuthorizationViewControlleralloc]initWithPaymentRequest:payRequest];
view.delegate=self;
[selfpresentViewController:viewanimated:YEScompletion:nil];
接下来假如一切顺利就会去调用服务端去调用对应的支付网关完成付款.
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController*)controller
didAuthorizePayment:(PKPayment*)payment
completion:(void(^)(PKPaymentAuthorizationStatusstatus))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);
});
}
后续工作
上面是模拟支付成功的回调,真实环境你需要@服务端开发人员给你写好驱动支付网关的代码,可以参考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还可以使用国内使用人数较多的平台
https://open.unionpay.com/ajweb/help/file/techFile?productId=80
1-2、 商户生成订单,通过商户SERVER端将订单信息发送给银联支付网关;3-4、银联支付网关记录订单信息,返回用来标识订单的TN号,经由商户SERVER返回至给
商户APP;
5、 商户APP调用银联SDK,将TN号传递给银联SDK
6、 银联SDK向Apple公司的PASSKIT FRAMEWORK发起支付请求;
7、 接口返回加密的支付Token信息;
8-9、银联SDK将支付Token传递给银联支付网关,完成交易认证;10-12、银联将支付结果返回给商户APP,商户SERVER,商户APP负责提示用户交易结果。