我如何在真实设备上testingBraintree + Apple Pay?

我正在使用Apple Pay为美国以外的美国客户开发应用程序。 我正在使用Braintree + Apple Pay。 我们支持真正的信用卡到Passbook,但我们无法validation它们。

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

  1. BTPaymentProvider – 我们对付款方式创build的抽象。

     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

纠正我,如果这是错误的。 我如何在真实设备上testing它?

很可能您的应用程序的Apple Pay授权设置不正确。

我注意到canMakePayments返回YEScanMakePaymentsUsingNetworks:权利没有设置时返回NO

(我也注意到,当您在PKPaymentRequest上设置的商家ID与您的Apple Pay授权的商家ID不匹配时,他们都可以返回YES ,在这种情况下,您的PKPaymentAuthorizationViewController将不为零,但会显示日志在控制台中的神秘错误)。

因此,为了validation您的应用程序是否configuration了Apple Pay,请确保您的目标设置的Capabilities部分中的“Apple Pay”为“On”,并且它具有商家标识符(如果您避难,则需要进行设置已经)。

然后:

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

这很可能是由于没有为任何这些networkingconfiguration支付卡而发生的。 从文档:

在支持付款但未configuration任何付款卡的设备上, canMakePayments方法返回YES因为硬件和家长控制允许进行付款,但canMakePaymentsUsingNetworks:方法不pipenetworking是否返回NO

该文件还提到了其他原因:

用户可能因多种原因无法付款。 例如,该function可能不被其硬件支持,或者可能受到家长控制的限制。


另外, if(self.braintree!=nil && self.braintree != Nil是多余的 – 这些都是一样的,我只是简单地将它折叠成if (self.braintree) { …

在BraintreeSDK的3.9.3版本中,我find了BTClientTokenApplePayPaymentNetworksValueTransformer中的一个错误,在反序列化BTConfiguration.applePaySupportedNetworks时没有发现发现卡的情况。 这将导致PKPaymentRequest包含一个在其supportedNetworks中的NSNull实例的数组。 将该数组传递给PKPaymentAuthorizationViewController.canMakePaymentsUsingNetworksPKPaymentAuthorizationViewController.canMakePaymentsUsingNetworks一个NO。 这个方法包含这个bug:

 - (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]; } 
Interesting Posts