今天看到屏幕被 Apple Pay刷屏了,就觉得研究一下,特以此文记录。本文主要讲解应用内支付。
首先,Apple Pay的支付流程(摘自 https://www.sdk.cn/news/2198)
- App 根据使用场景显示 Payment Sheet。
2.用户选择需要进行支付的卡以及支付需要的个人信息后,进行指纹验证,之后根据情 况,有些银行卡还需要输入卡对应的密码(PIN 码)
3.iOS 将支付相关信息发送到 Apple 的服务器,进行加密。然后通过回调函数将加密后的支付信息返回给对应 App。
4.App 在收到回调之后,将对应信息发送到自己的服务器。
5.服务器在收到 App 发送来的支付信息后,对数据进行解密操作,提取其中需要的信 息,组织银联接口报文,调用银联的接口,完成扣款。
也就是apple只是一个信息传输的工具,扣款是发生在我们将信息发送给自己的服务器后,服务器去调用银联接口进行扣款。(注意不是我们填完密码Apple就把钱扣了,扣钱还是要我们服务器去做的)
流程明白了,接下来进行实践。
1.创建一个新工程
2.创建一个Merchant ID
3.在工程的Capabilities中打开Apple Pay的开关,勾选上Merchant ID
4.接下来开始编码。
#import <PassKit/PassKit.h>
@interface VC ()<PKPaymentAuthorizationViewControllerDelegate>
导入库头文件,遵守PKPaymentAuthorizationViewControllerDelegate,我们要用到Apple自带的支付VC。
/**
组装参数 返回用于支付的Request对象
*/
- (PKPaymentRequest *)makeRequset{
PKPaymentRequest *payMentRequest = [[PKPaymentRequest alloc] init];
payMentRequest.countryCode = @"CN";//中国
payMentRequest.currencyCode= @"CNY";//人民币
payMentRequest.supportedNetworks = @[PKPaymentNetworkVisa,PKPaymentNetworkMasterCard,PKPaymentNetworkChinaUnionPay];//PKPaymentNetworkChinaUnionPay 国内用这个
payMentRequest.merchantCapabilities = PKMerchantCapabilityEMV;
payMentRequest.merchantIdentifier = @"merchant.com.1ydtest.merchantname";//和merchant ID一样
PKPaymentSummaryItem *widget = [PKPaymentSummaryItem summaryItemWithLabel:@"水果" amount:[NSDecimalNumber decimalNumberWithString:@"0.01"]];
PKPaymentSummaryItem *widget1 = [PKPaymentSummaryItem summaryItemWithLabel:@"蛋糕" amount:[NSDecimalNumber decimalNumberWithString:@"0.02"]];
//最后一项显示
PKPaymentSummaryItem *widget2 = [PKPaymentSummaryItem summaryItemWithLabel:@"YM" amount:[NSDecimalNumber decimalNumberWithString:@"0.03"] type:(PKPaymentSummaryItemTypeFinal)];
payMentRequest.paymentSummaryItems = @[widget,widget1,widget2];
return payMentRequest;
}
/**
显示支付的界面
*/
- (void)presentPayMentVC{
if([PKPaymentAuthorizationViewController canMakePayments]) {
if([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkChinaUnionPay]]){
PKPaymentAuthorizationViewController *payVC = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:[self makeRequset]];
payVC.delegate = self;
[self presentViewController:payVC animated:YES completion:nil];
}else{
NSLog(@"请先去设置界面进行绑卡操作");
}
}else{
NSLog(@"该设备暂不支持Apple Pay");
}
}
PKPaymentAuthorizationViewController的代理
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
//只做简单处理后续逻辑自行添加 支付界面消失
[controller dismissViewControllerAnimated:YES completion:nil];
}
OK 以上就简单的搭建完毕。后续接入项目时个人觉得用第三方的比较方便,毕竟这是APP与服务端的交互,后台麻烦一点。建议使用Ping++