我正在为美国境外的美国客户使用Apple Pay开发应用程序。我正在使用Braintree + Apple Pay。我们支持真实的信用卡到Passbook,但我们无法验证它们。
我成功生成了一个客户端令牌self.braintree
,并尝试了BT的两种集成方式。
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
"。跟踪它也不例外。
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
。
纠正我,如果它错了。如何在真实设备上进行测试?
答案 0 :(得分:10)
您应用的Apple Pay权利可能未正确设置。
我注意到canMakePayments
返回YES
而canMakePaymentsUsingNetworks:
在未设置权利时返回NO
。
(我还注意到,当您在YES
上设置的商家ID与Apple Pay权利的商家ID不匹配时,他们都可以返回PKPaymentRequest
。在这种情况下,您的{ {1}}将是非零的,但是它会在控制台中记录一个神秘的错误。
因此,要验证是否为您的应用配置了Apple Pay,请确保目标设置的“功能”部分中的“Apple Pay”为“开启”,并且它具有商家标识符(您需要{{ 3}}如果你还没有)。
然后:
PKPaymentAuthorizationViewController
集成方法,请确保在Braintree控制面板中正确设置了证书和商家标识符。BTPaymentProvider
集成方法,请确保将PassKit
属性设置为权利中匹配的商家标识符。答案 1 :(得分:3)
最有可能发生这种情况,因为没有为任何这些网络配置支付卡。来自文档:
在支持付款但未配置任何支付卡的设备上,
canMakePayments
方法返回YES
,因为硬件和家长控制允许付款,但canMakePaymentsUsingNetworks:
方法无论网络如何,都会返回NO
。
文档还提到了其他原因:
用户可能因各种原因无法付款。例如,他们的硬件可能不支持此功能,也可能受到家长控制的限制。
另外,if(self.braintree!=nil && self.braintree != Nil
是多余的 - 这些是相同的。我只是将其折叠为if (self.braintree) { …
答案 2 :(得分:-1)
在BraintreeSDK的3.9.3版本中,我在BTClientTokenApplePayPaymentNetworksValueTransformer
中发现了一个错误,其中在反序列化BTConfiguration.applePaySupportedNetworks
时没有发现卡的情况。这会导致PKPaymentRequest
的数组在其supportedNetworks中包含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];
}