Apple pay测试相关

测试卡号地址:https://developer.apple.com/apple-pay/sandbox-testing/
注意事项:American Express测试卡必须将手机地区设为美国!
步骤:

  1. app store connect 添加沙盒测试员,appstore地区选美国

  2. 去测试员新邮箱认证邮件(这一步非常重要)

  3. 将手机地区设置为美国,退出现有账号,用认证过的appleid登录测试手机

  4. 添加测试卡,注意添加后的正确显示为“沙盒”

    IMG_2195.PNG

    当显示为“付款卡”说明这个测试账号废了,需要重新申请沙盒账号。

5.创建Merchant IDs


image.png

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


image.png

6.为app绑定Merchant IDs,可以去xcode设置添加applepay功能也可以去网页appid管理设置

7.必须使用苹果提供的PKPaymentButton组件,type和style如下

image.png

要检测一下功能才能显示对应的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
    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];
            }];
        }
    }];
}

你可能感兴趣的:(Apple pay测试相关)