如何在真实设备上测试 Braintree + Apple Pay?

How do I test Braintree + Apple Pay on a real device?

我正在为来自美国以外的美国客户开发一个使用 Apple Pay 的应用程序。我正在使用 Braintree + Apple Pay。存折支持真实信用卡,但无法验证。

我成功生成了客户端令牌,self.braintree并尝试了BT的两种集成方式。

  1. BTPaymentProvider - 我们对创建支付方式的抽象。

    if(self.braintree && ![self.braintree isKindOfClass:[NSNull class]])
    {
        self.provider = [braintree paymentProviderWithDelegate:self];
        if ([self.provider canCreatePaymentMethodWithProviderType:BTPaymentProviderTypeApplePay])
        {
            self.provider.paymentSummaryItems = @[[PKPaymentSummaryItem summaryItemWithLabel:@"XXXX" amount:[NSDecimalNumber decimalNumberWithString:@"1"]]];
        }
        [self.provider createPaymentMethod:BTPaymentProviderTypeApplePay];
    }
    

    但它没有推送“PKPaymentAuthorizationViewController”。也不例外去追查。

  2. PassKit - Apple 的 ApplePay API。

    if([PKPaymentAuthorizationViewController canMakePayments]) // It returns TRUE
    {
        PKPaymentRequest *paymentRequest = [[PKPaymentRequest alloc] init];
        paymentRequest.countryCode = @"US";
        paymentRequest.currencyCode = @"USD";
        paymentRequest.merchantCapabilities = PKMerchantCapabilityEMV | PKMerchantCapability3DS;
        paymentRequest.merchantIdentifier = MERCHANTID;
        paymentRequest.supportedNetworks = @[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa];
        paymentRequest.paymentSummaryItems = @[ [PKPaymentSummaryItem summaryItemWithLabel:@"TEST" amount:[NSDecimalNumber decimalNumberWithString:@"1"]] ];
    
        if([PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa]]) // Returns FALSE
        {
            PKPaymentAuthorizationViewController *vc = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest];
            vc.delegate = self;
            [self presentViewController:vc animated:YES completion:nil];
        }
    }
    

    这给出 "vc" 是 nil

如有不妥请指正。如何在真实设备上进行测试?

发生这种情况很可能是因为没有为任何这些网络配置支付卡。来自文档:

On devices that support making payments but don’t have any payment cards configured, the canMakePayments method returns YES because the hardware and parental controls allow making payments, but the canMakePaymentsUsingNetworks: method returns NO regardless of network.

文档中还提到了其他原因:

User may not be able to make payments for a variety of reasons. For example, this functionality may not be supported by their hardware, or it may be restricted by parental controls.


单独说明,if(self.braintree!=nil && self.braintree != Nil 是多余的 - 它们是相同的。我会简单地将其折叠成 if (self.braintree) { …

可能是您的应用的 Apple Pay 权利设置不正确。

我注意到 canMakePayments returns YEScanMakePaymentsUsingNetworks: returns NO 没有设置授权。

(我还注意到,当您在 PKPaymentRequest 上设置的商家 ID 与您的 Apple Pay 权利的商家 ID 不匹配时,它们都可以 return YES。在这种情况下,您的 PKPaymentAuthorizationViewController 将是非零的,但显示它会在控制台中记录一个神秘的错误。

因此,要验证是否为您的应用配置了 Apple Pay,请确保 "Apple Pay" 在您的目标设置的功能部分中是 "On",并且它有一个商家标识符(您如果您还没有的话,我将需要 set up)。

然后:

  • 如果使用您的 BTPaymentProvider 集成方法,请确保在 Braintree 控制面板中正确设置了证书和商家标识符。
  • 如果使用直接 PassKit 集成方法,请确保将 merchantIdentifier 属性 设置为权利中匹配的商家标识符。

在 BraintreeSDK 3.9.3 版本中,我在 BTClientTokenApplePayPaymentNetworksValueTransformer 中发现了一个错误,其中在反序列化 BTConfiguration.applePaySupportedNetworks 时没有 Discover Card 的情况.这导致 PKPaymentRequest 的数组在其支持的网络中包含 NSNull 的实例。将该数组传递给 PKPaymentAuthorizationViewController.canMakePaymentsUsingNetworks 结果为 NO。此方法包含错误:

- (id)transformedValue:(id)value {
    if ([PKPaymentRequest class]) {
        if ([value isEqualToString:@"amex"]) {
            return PKPaymentNetworkAmex;
        } else if ([value isEqualToString:@"visa"]) {
            return PKPaymentNetworkVisa;
        } else if ([value isEqualToString:@"mastercard"]) {
            return PKPaymentNetworkMasterCard;
        }
    }

    return [NSNull null];
}