如何在真实设备上测试 Braintree + Apple Pay?
How do I test Braintree + Apple Pay on a real device?
我正在为来自美国以外的美国客户开发一个使用 Apple Pay 的应用程序。我正在使用 Braintree + Apple Pay。存折支持真实信用卡,但无法验证。
我成功生成了客户端令牌,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
。
如有不妥请指正。如何在真实设备上进行测试?
发生这种情况很可能是因为没有为任何这些网络配置支付卡。来自文档:
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 YES
和 canMakePaymentsUsingNetworks:
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];
}
我正在为来自美国以外的美国客户开发一个使用 Apple Pay 的应用程序。我正在使用 Braintree + Apple Pay。存折支持真实信用卡,但无法验证。
我成功生成了客户端令牌,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
。
如有不妥请指正。如何在真实设备上进行测试?
发生这种情况很可能是因为没有为任何这些网络配置支付卡。来自文档:
On devices that support making payments but don’t have any payment cards configured, the
canMakePayments
method returnsYES
because the hardware and parental controls allow making payments, but thecanMakePaymentsUsingNetworks:
method returnsNO
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 YES
和 canMakePaymentsUsingNetworks:
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];
}