测试卡号地址:https://developer.apple.com/apple-pay/sandbox-testing/
注意事项:American Express测试卡必须将手机地区设为美国!
步骤:
-
app store connect 添加沙盒测试员,appstore地区选美国
-
去测试员新邮箱认证邮件(这一步非常重要)
-
将手机地区设置为美国,退出现有账号,用认证过的appleid登录测试手机
-
添加测试卡,注意添加后的正确显示为“沙盒”
IMG_2195.PNG
当显示为“付款卡”说明这个测试账号废了,需要重新申请沙盒账号。
5.创建Merchant IDs

6.编辑Merchant IDs,为其创建证书Apple Pay Payment Processing Certificate

6.为app绑定Merchant IDs,可以去xcode设置添加applepay功能也可以去网页appid管理设置
7.必须使用苹果提供的PKPaymentButton组件,type和style如下

要检测一下功能才能显示对应的UI
-(AP_RESULT)checkApplePayFunctionWithSupportNetworks:(NSArray *)supportNetworks{
//系统提供了API来判断当前设备是否支持Apple Pay支付的功能。
if([PKPaymentAuthorizationController canMakePayments]){
if(![PKPaymentAuthorizationController canMakePaymentsUsingNetworks:supportNetworks]){
NSLog(@"没有绑卡");
return AP_RESULT_UNBIND_CARD;
}else{
return AP_RESULT_CAN_PAY;
}
}else{
return AP_RESULT_UNSUPPORT;
}
}
8.PKPaymentRequest创建
PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
// 配置商家ID
request.merchantIdentifier = @"merchant.mailegouapplepay.com";
// 配置货币代码, 以及国家代码
request.countryCode = @"CN";
request.currencyCode = @"CNY";
// 配置请求支持的支付网络 银联
request.supportedNetworks = @[PKPaymentNetworkChinaUnionPay];
// 配置商户的处理方式 3DS必须支持
request.merchantCapabilities = PKMerchantCapabilityEMV|PKMerchantCapability3DS;
// 配置购买的商品列表
PKPaymentSummaryItem *orderAmout = [PKPaymentSummaryItem summaryItemWithLabel:@"订单金额" amount:[NSDecimalNumber decimalNumberWithString:self.payModel.orderSum]];
PKPaymentSummaryItem *totalAmount = [PKPaymentSummaryItem summaryItemWithLabel:@"麦乐购" amount:[NSDecimalNumber decimalNumberWithString:self.payModel.orderSum]];
// 注意: 支付列表最后一个, 代表汇总
request.paymentSummaryItems = @[orderAmout,totalAmount];
/// 以上这些配置是必须的,当然还有一些可选的,比如物流信息、发票地址等等,像下面这样:
// 是否显示发票收货地址, 显示哪些选项
request.requiredBillingAddressFields = PKAddressFieldAll;
// 是否显示快递地址, 显示哪些选项
request.requiredShippingAddressFields = PKAddressFieldAll;
// 配置快递方式NSArray<PKShippingMethod *>
NSDecimalNumber *price2 = [NSDecimalNumber decimalNumberWithString:@"18.0"]; // 邮费
PKShippingMethod *method = [PKShippingMethod summaryItemWithLabel:@"顺丰快递" amount:price2];
method.detail = @"24小时内送到";
method.identifier = @"shunfeng";
NSDecimalNumber *price3 = [NSDecimalNumber decimalNumberWithString:@"0.1"];
PKShippingMethod *method2 = [PKShippingMethod summaryItemWithLabel:@"韵达快递" amount:price3];
method2.identifier = @"yunda";
method2.detail = @"送货上门";
request.shippingMethods = @[method, method2];
// 配置快递的类型
request.shippingType = PKShippingTypeStorePickup;
// 添加一些附加数据
request.applicationData = [@"buyID=12345" dataUsingEncoding:NSUTF8StringEncoding];
9.PKPaymentAuthorizationController弹出
//显示认证视图
PKPaymentAuthorizationController * payment = [[PKPaymentAuthorizationController alloc] initWithPaymentRequest:request];
payment.delegate = self;
[payment presentWithCompletion:^(BOOL success) {
if (success == NO) {
[self endWithResult:NO Message:@"UI未弹出,请检查apple pay相关配置,如merchantId、国家代码、货币代码等" completion:nil];
}
}];
10.代理方法
// 当授权成功之后或者取消授权之后会调用这个代理方法
- (void)paymentAuthorizationControllerDidFinish:(PKPaymentAuthorizationController *)controller{
if (self.payResultBlock && self.userCancled == YES) {
self.payResultBlock(NO, @"用户取消支付");
self.payResultBlock = nil;
NSLog(@"用户取消了");
}
[controller dismissWithCompletion:nil];
}
//这个代理方法指的是支付过程中会进行调用
- (void)paymentAuthorizationController:(PKPaymentAuthorizationController *)controller
didAuthorizePayment:(PKPayment *)payment
handler:(void (^)(PKPaymentAuthorizationResult *result))completion API_AVAILABLE(macos(11.0), ios(11.0), watchos(4.0)){
// //支付所需要的token
// NSData *data = payment.token.paymentData;
// NSString *paymentDataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
// //收货人地址
// NSString *street = payment.shippingContact.postalAddress.street;
// //收货人电话
// NSString *phone = payment.shippingContact.phoneNumber.stringValue;
// //收货人邮编
// NSString *post = payment.shippingContact.postalAddress.postalCode;
// //收货人姓名
// NSString *familyName = payment.shippingContact.name.familyName;
// NSString *givenName = payment.shippingContact.name.givenName;
PKPaymentToken * token = payment.token;
NSLog(@"1111获取token---%@", token);
//获取订单地址
NSString * address = payment.billingContact.postalAddress.city;
NSLog(@"1111获取到地址: %@", address);
NSLog(@"1111验证通过后, 需要开发者继续完成交易");
// 在这个位置, 我们开发人员需要把token值和商品的其他信息如:地址 id 这些 , 上传到自己公司的服务器。然后公司的服务器和银行的商家接口进行接口的调用,并将接口调用返回的支付结果信息返回到这里。
//根据不同的支付结果状态,让block调用不同的交易状态;
[self serverCheckPayment:payment handler:completion];
}
11.服务器校验
-(void)serverCheckPayment:(PKPayment *)payment handler:(void (^)(PKPaymentAuthorizationResult *result))completion{
__block typeof(self) wkself = self;
///转为stripe的token,传给后台结算
[[STPAPIClient sharedClient] createTokenWithPayment:payment completion:^(STPToken * _Nullable token, NSError * _Nullable err) {
if (err) {
[wkself endWithResult:NO Message:@"生成stripe Token失败" completion:completion];
}else{
NSLog(@"stripeToken :%@",token);
//将token告知后台,请求扣款
[NetTool requestType:RequestType_Post url:K_serviceChargeurl params:@{@"stripeToken":token.tokenId} header:@{} isJsonType:YES Success:^(NSDictionary * _Nonnull response) {
if ([response[@"code"] intValue] == 200) {
[wkself endWithResult:YES Message:@"支付成功" completion:completion];
}else{
NSString *msg = response[@"message"];
[wkself endWithResult:NO Message:msg completion:completion];
}
} Fail:^(XHError * _Nonnull error) {
[wkself endWithResult:NO Message:error.errorMsg completion:completion];
}];
}
}];
}
网友评论