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

时间:2015-01-22 13:32:50

标签: ios objective-c google-app-engine braintree applepay

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

我成功生成了一个客户端令牌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

  3. 纠正我,如果它错了。如何在真实设备上进行测试?

3 个答案:

答案 0 :(得分:10)

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

我注意到canMakePayments返回YEScanMakePaymentsUsingNetworks:在未设置权利时返回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];
}