介绍
公司接入的是国际Apple Pay支付,支付扣款这一步是由国外第三方支付公司Adyen完成的,App开发使用第三方提供的CSR文件生成Apple pay证书并绑定,所以下面介绍主要是关于接入国外Apple Pay开发一些基础流程
Apple Pay主要支付流程:
1.客户端通过苹果提供的api显示支付控件
2.用户点击支付通过输入一些验证信息发送给苹果服务端,苹果验证通过后,会选择对应的证书生成一个用户选中的银行卡相关的PKPaymentToken加密数据,返回给客户端
3.客户端将加密PKPaymentToken等其他数据发送给App服务端,服务端把数据发送给第三方,第三方解密数据,发起扣款,再通知服务端
4.服务端通知客户端支付结果
APP开发流程
证书准备
1.创建一个merchant ID,将merchant ID发送给第三方,第三方会生成对应的csr文件
2.创建一个支付证书,绑定csr
3.在xcode设置开启Apple pay权限
开发部分代码
需要导入相关库
#import <PassKit/PassKit.h>
检查设备Apple Pay权限
if (! [PKPaymentAuthorizationViewController canMakePayments]) {
// 提示用户该设备不支持Apple Pay
return ;
}
创建支付请求
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
// 设置国家代码
request.countryCode = @"US";
//设置商户ID
request.merchantIdentifier = @"com.****";
// 支付银行卡的范围
request.merchantCapabilities = PKMerchantCapability3DS;
// 支持的币种
request.currencyCode = @"$";
// 支付金额及商户名称
request.paymentSummaryItems = [self paymentSummaryItems];
// 收货地址
request.shippingContact = [self ShippingContact];
// 显示地址信息
request.requiredShippingAddressFields = PKAddressFieldAll;
if (@available(iOS 10.0, *)) {
request.supportedNetworks = [PKPaymentRequest availableNetworks];
}
// 商品价格等信息
- (NSArray<PKPaymentSummaryItem *> *)paymentSummaryItems {
NSMutableArray *items = [NSMutableArray array];
PKPaymentSummaryItem *grandTotalItem = [PKPaymentSummaryItem summaryItemWithLabel:@"商户名称"
amount:@“10.0”
type:PKPaymentSummaryItemTypeFinal];
[items addObject:grandTotalItem];
return items;
}
// 收货地址信息
- (void)shippingContact {
PKContact *contact = [[PKContact alloc]init];
contact.name = ({
NSPersonNameComponents *nameComponents = [[NSPersonNameComponents alloc] init];
nameComponents.familyName = "";
nameComponents.givenName = "";
nameComponents;
});
contact.phoneNumber = [CNPhoneNumber phoneNumberWithStringValue:self.infoModel.orderInfoModel.orderAddressInfo.telephone];
contact.emailAddress = "";
contact.postalAddress = ({
CNMutablePostalAddress *address = [[CNMutablePostalAddress alloc] init];
address.street ="";
address.city = "";
address.state = "";
address.postalCode = "";
address.country = "";
address.ISOCountryCode = "";
address;
});
return contact;
}
显示支付界面
PKPaymentAuthorizationViewController *vc = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
vc.delegate = self;
if (authorizationController == nil) {
// 提示错误
return;
}
[self.navigationController presentViewController:vc
animated:YES
completion:nil];
遵循协议,实现代理
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion {
//这里可以校验用户输入的账单地址和收货地址填的规格对不对,如果表单显示了用户账单地址和收货地址的话,用户是可以修改的
//PKContact *billing = payment.billingContact;
//PKContact *shipping = payment.shippingContact;
//校验通后将payment.token相关支付信息发送给服务器,根据服务器返回的支付成功和失败做相应处理
NSString *data = [[NSString alloc] initWithData:payment.token.paymentData
encoding:NSUTF8StringEncoding];
//解析json
//拿到header,signature,data等相关字段传给App服务器
}
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
[controller dismissViewControllerAnimated:YES completion:nil];
}
开发中注意事项:
1.如果你的app有多个支付方式,必须要把Apple Pay同其他支付方式一样突出,Apple Pay的logo不能小于其他支付方式logo,不然有可能会审核不过
2.如果你使用Apple Pay按钮触发了Apple Pay支付,你必须使用Apple 提供的api展示按钮
3.可能需要在支付表单页面显示联系人信息和物流信息,不然也有可能审核不过,这个看运气滴,起初我们是没有显示一直都是审核通过的,后面有一次可能换了个审核员,被拒了,下面是被拒时的苹果给的说明
Your app uses Apple Pay as a purchasing mechanism but does not provide the necessary material purchase information to the user prior to the sale of goods and services.
Specifically, your payment sheet does not include the following:
-Product description and specifications
-Shipping information
-Contact information