介紹
公司接入的是國(guó)際Apple Pay支付,支付扣款這一步是由國(guó)外第三方支付公司Adyen完成的,App開發(fā)使用第三方提供的CSR文件生成Apple pay證書并綁定,所以下面介紹主要是關(guān)于接入國(guó)外Apple Pay開發(fā)一些基礎(chǔ)流程
Apple Pay主要支付流程:
1.客戶端通過蘋果提供的api顯示支付控件
2.用戶點(diǎn)擊支付通過輸入一些驗(yàn)證信息發(fā)送給蘋果服務(wù)端,蘋果驗(yàn)證通過后,會(huì)選擇對(duì)應(yīng)的證書生成一個(gè)用戶選中的銀行卡相關(guān)的PKPaymentToken加密數(shù)據(jù),返回給客戶端
3.客戶端將加密PKPaymentToken等其他數(shù)據(jù)發(fā)送給App服務(wù)端,服務(wù)端把數(shù)據(jù)發(fā)送給第三方,第三方解密數(shù)據(jù),發(fā)起扣款,再通知服務(wù)端
4.服務(wù)端通知客戶端支付結(jié)果
APP開發(fā)流程
證書準(zhǔn)備
1.創(chuàng)建一個(gè)merchant ID,將merchant ID發(fā)送給第三方,第三方會(huì)生成對(duì)應(yīng)的csr文件
2.創(chuàng)建一個(gè)支付證書,綁定csr
3.在xcode設(shè)置開啟Apple pay權(quán)限
開發(fā)部分代碼
需要導(dǎo)入相關(guān)庫(kù)
#import <PassKit/PassKit.h>
檢查設(shè)備Apple Pay權(quán)限
if (! [PKPaymentAuthorizationViewController canMakePayments]) {
// 提示用戶該設(shè)備不支持Apple Pay
return ;
}
創(chuàng)建支付請(qǐng)求
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
// 設(shè)置國(guó)家代碼
request.countryCode = @"US";
//設(shè)置商戶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];
}
// 商品價(jià)格等信息
- (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) {
// 提示錯(cuò)誤
return;
}
[self.navigationController presentViewController:vc
animated:YES
completion:nil];
遵循協(xié)議,實(shí)現(xiàn)代理
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus status))completion {
//這里可以校驗(yàn)用戶輸入的賬單地址和收貨地址填的規(guī)格對(duì)不對(duì),如果表單顯示了用戶賬單地址和收貨地址的話,用戶是可以修改的
//PKContact *billing = payment.billingContact;
//PKContact *shipping = payment.shippingContact;
//校驗(yàn)通后將payment.token相關(guān)支付信息發(fā)送給服務(wù)器,根據(jù)服務(wù)器返回的支付成功和失敗做相應(yīng)處理
NSString *data = [[NSString alloc] initWithData:payment.token.paymentData
encoding:NSUTF8StringEncoding];
//解析json
//拿到header,signature,data等相關(guān)字段傳給App服務(wù)器
}
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
[controller dismissViewControllerAnimated:YES completion:nil];
}
開發(fā)中注意事項(xiàng):
1.如果你的app有多個(gè)支付方式,必須要把Apple Pay同其他支付方式一樣突出,Apple Pay的logo不能小于其他支付方式logo,不然有可能會(huì)審核不過
2.如果你使用Apple Pay按鈕觸發(fā)了Apple Pay支付,你必須使用Apple 提供的api展示按鈕
3.可能需要在支付表單頁(yè)面顯示聯(lián)系人信息和物流信息,不然也有可能審核不過,這個(gè)看運(yùn)氣滴,起初我們是沒有顯示一直都是審核通過的,后面有一次可能換了個(gè)審核員,被拒了,下面是被拒時(shí)的蘋果給的說明
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