最近苹果推出了一种新的支付方式–ApplePay支付,虽然毁誉参半,但是不得不承认国内很多的公司还有商家已经开通了ApplePay,可能最先锋的莫过于肯德基和招商银行了。抛开优劣与否不说,作为一个开发者自然要第一时间把ApplePay搞懂搞通,用不用再另说。
ApplePay的支付流程
在具体去进行每一步操作的时候一定要先了解一下ApplePay的具体的操作流程。这里是官方给出的开发者文档。所有的流程步骤还有逻辑流程都可以在这里找到答案。
开发者传送门
使用ApplePay开发同样的需要一个商户ID,开通权限,然后根据需求拼接支付请求。Apple Pay会对支付信息进行加密处理,以防止未获授权的第三方获取用户的支付信息。剩下的就是在自己的服务器上进行支付流程和处理了。
ApplePay的开发流程
1 获取证书
详细的官方指导可以参考这里苹果证书帮助习惯了苹果开发的人一定会料到,新的苹果支付一定是需要一个新的证书的,没错,需要创建一个新的商业证书。
2 工程配置
创建一个新工程,需要注意两点:1 在BuildIdentifier中设置的必须和描述文件一样。
2 在Capability标签中把ApplePay选项打开,并且将MerchantIDs选中,如下图
3 代码编写
1导入头文件并遵循代理
#import <PassKit/PassKit.h>
#import <AddressBook/AddressBook.h>
@interface ViewController ()<PKPaymentAuthorizationViewControllerDelegate>
2 处理支付页面
支付界面都是采用的PKPaymentAuthorizationViewController,每一条支付信息可以采用PKPaymentSummaryItem来进行编辑,最后调用苹果支付的时候就是调用的这个页面。
//点击支付的相应事件
- (IBAction)payAction:(UIButton *)sender {
// 订单请求对象
PKPaymentRequest *request = [[PKPaymentRequest alloc]init];
//商品订单信息对象
PKPaymentSummaryItem *item1 = [PKPaymentSummaryItem summaryItemWithLabel:@"宝马车一辆" amount:[NSDecimalNumber decimalNumberWithString:@"100"]];
PKPaymentSummaryItem *item2 = [PKPaymentSummaryItem summaryItemWithLabel:@"真皮座椅一个" amount:[NSDecimalNumber decimalNumberWithString:@"200"]];
PKPaymentSummaryItem *item3 = [PKPaymentSummaryItem summaryItemWithLabel:@"自动雨刷两只" amount:[NSDecimalNumber decimalNumberWithString:@"50"]];
request.paymentSummaryItems = @[item1,item2,item3];
//指定国家地区编码
request.countryCode = @"CN";
//指定国家货币种类--人民币
request.currencyCode = @"CNY";
//指定支持的网上银行支付方式
request.supportedNetworks = @[PKPaymentNetworkVisa,PKPaymentNetworkChinaUnionPay,PKPaymentNetworkMasterCard];
//指定APP需要的商业ID
request.merchantIdentifier = @"merchant.com.coderqi.pay.test";
//指定支付的范围限制
request.merchantCapabilities = PKMerchantCapabilityEMV;
//指定订单接受的地址是哪里
request.requiredBillingAddressFields = PKAddressFieldEmail | PKAddressFieldPostalAddress;
//支付界面显示对象
PKPaymentAuthorizationViewController *pvc = [[PKPaymentAuthorizationViewController alloc]initWithPaymentRequest:request];
pvc.delegate = self;
if (!pvc) {
NSLog(@"出问题了,请注意检查");
@throw [NSException exceptionWithName:@"CQ_Error" reason:@"创建支付显示界面不成功" userInfo:nil];
}else{
[self presentViewController:pvc animated:YES completion:nil];
}
}
3 编写代理回调
接下来就是代理回调的处理,服务器接收到了我们的请求之后收到返回信息会调用对应的方法。
//在支付的过程中进行调用,这个方法直接影响支付结果在界面上的显示
//payment 是代表的支付对象,支付相关的所有信息都存在于这个对象,1 token 2 address
//comletion 是一个回调Block块,block块传递的参数直接影响界面结果的显示。
-(void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller didAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion{
/*
NSError *error;
ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress ,kABPersonAddressProperty);
NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
//这里模拟取出地址里的每一个信息。
NSLog(@"%@",addressDictionary[@"State"]);
NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
// 这里需要将Token和地址信息发送到自己的服务器上,进行订单处理,处理之后,根据自己的服务器返回的结果调用completion()代码块,根据传进去的参数界面的显示结果会不同
PKPaymentAuthorizationStatus status; // From your server
completion(status);
*/
//拿到token,
PKPaymentToken *token = payment.token;
//拿到订单地址
NSString *city = payment.billingContact.postalAddress.city;
NSLog(@"city:%@",city);
///在这里将token和地址发送到自己的服务器,有自己的服务器与银行和商家进行接口调用和支付将结果返回到这里
//我们根据结果生成对应的状态对象,根据状态对象显示不同的支付结构
//状态对象
PKPaymentAuthorizationStatus status = PKPaymentAuthorizationStatusFailure;
completion(status);
}
//当支付过程完成的时候进行调用
-(void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller{
[controller dismissViewControllerAnimated:YES completion:nil];
}
到此就结束了,这只是一个初步的研究,并没有深入,比如指纹付啊,还有很多功能可以添加.