我如何在真实设备上testingBraintree + Apple Pay?
我正在使用Apple Pay为美国以外的美国客户开发应用程序。 我正在使用Braintree + Apple Pay。 我们支持真正的信用卡到Passbook,但我们无法validation它们。
我成功地生成了一个客户端令牌, self.braintree
并尝试了BT的两种集成方式。
-
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
”。 也没有例外,以追查下来。 -
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
返回YES
和canMakePaymentsUsingNetworks:
权利没有设置时返回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.canMakePaymentsUsingNetworks
将PKPaymentAuthorizationViewController.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]; }