Интеграция Apple Pay с Stripe (STPTestPaymentAuthorizationViewController в отладке)

Я пытаюсь интегрировать Apple Pay с полосой в свое приложение для iOS. Использование ApplePayStub обеспечивает полосой проверки Apple Pay в режиме DEBUG.

Я использую код последней полосы и ApplePayStub из git.

Пытаюсь запустить на симуляторе iPhone 6 и использую следующий код:

paymentController = [[STPTestPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
((STPTestPaymentAuthorizationViewController*) paymentController).delegate = self;

Получение ошибки:

Error Domain=com.stripe.lib Code=50 "Your payment information is formatted improperly. Please make sure you're correctly using the latest version of our iOS library. For more information see https://stripe.com/docs/mobile/ios ." UserInfo=0xxxxxxxxxxx {com.stripe.lib:ErrorMessageKey=Your payment information is formatted improperly. Please make sure you're correctly using the latest version of our iOS library. For more information see https://stripe.com/docs/mobile/ios ., NSLocalizedDescription=Your payment information is formatted improperly. Please make sure you're correctly using the latest version of our iOS library. For more information see https://stripe.com/docs/mobile/ios .},

Любая помощь приветствуется.


person wizyashas    schedule 17.03.2015    source источник
comment
Я получаю ту же ошибку на устройстве, которое не поддерживает Apple Pay. Похоже, что PKPayment.token равно нулю, когда возвращается в didAuthorizePayment   -  person Sam    schedule 31.03.2015


Ответы (2)


@Wizyashas, ​​ваша настройка STPTestPaymentAuthorizationViewController в порядке. Проблема возникает, когда вы пытаетесь сгенерировать токен через STPAPIClient. Там все становится грязным.

Этот небольшой RnD помог мне. Изучаем CustomSampleProject, предоставленный Само чередование, ApplePayStubs работает очень хорошо, когда STPCard распознается, когда делегат

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                   didAuthorizePayment:(PKPayment *)payment
                            completion:(void (^)(PKPaymentAuthorizationStatus))completion

Вызывается PKPaymentAuthorizationViewControllerDelegate. Пример кода здесь проверяется, если код был запущен в режиме отладки, то есть для ApplePayStubs, (PKPayment *)платеж в делегате преобразуется в STPCard. strong> и запускается в STPAPIClient для генерации STPToken. Ниже приводится тело вышеупомянутого делегата:

#if DEBUG // This is to handle a test result from ApplePayStubs
if (payment.stp_testCardNumber)
{
    STPCard *card = [STPCard new];
    card.number = payment.stp_testCardNumber;
    card.expMonth = 12;
    card.expYear = 2020;
    card.cvc = @"123";
    [[STPAPIClient sharedClient] createTokenWithCard:card
                                          completion:^(STPToken *token, NSError *error)
    {
        if (error)
        {
            completion(PKPaymentAuthorizationStatusFailure);
            [[[UIAlertView alloc] initWithTitle:@"Error"
                                        message:@"Payment Unsuccessful! \n Please Try Again"
                                       delegate:self
                              cancelButtonTitle:@"OK"
                              otherButtonTitles:nil] show];
            return;
        }
    /*
     Handle Token here
     */
                                            }];
}
#else
[[STPAPIClient sharedClient] createTokenWithPayment:payment
                                         completion:^(STPToken *token, NSError *error)
{
    if (error)
    {
        completion(PKPaymentAuthorizationStatusFailure);
        [[[UIAlertView alloc] initWithTitle:@"Error"
                                    message:@"Payment Unsuccessful!"
                                   delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil] show];
        return;
    }
    /*
     Handle Token here
     */
}];
#endif

Это сработало для меня. С ApplePayStubs (в Симуляторе) и без них (на Устройстве).

Надеюсь это поможет :)

person Mohsin Khubaib Ahmed    schedule 01.04.2015
comment
Спасибо, чувак, твой подход решил проблему. теперь я также могу проверить в симуляторе. idk как использовать payment.stp_testCardNumber..? - person wizyashas; 21.04.2015
comment
Как вы хотите его использовать? Можете ли вы уточнить немного. В основном это номер кредитной карты, который вы вводите в текстовое поле, где это необходимо. Вы можете жестко запрограммировать его на кредитную карту по умолчанию/тест, предоставленную Stripe, т.е. 4242 4242 4242 4242? - person Mohsin Khubaib Ahmed; 21.04.2015
comment
Да, я просто жестко запрограммировал данные карты на 4242 4242 4242 4242, так как пользователь не может добавить данные карты за пределы контроллера Apple Pay. - person wizyashas; 22.04.2015
comment
Wizyashas, ​​да, для реализации ApplePay в ее истинном смысле пользователю необходимо настроить Passbook на своих телефонах с данными своей кредитной карты, чтобы взаимодействовать между Passbook и Passkit вместе. Но поскольку ApplePayStubs принимает только 4242... в качестве номера кредитной карты, его можно жестко закодировать, но чтобы принять его от себя, вам нужно сделать PTKView в Stripe. Вы также можете самостоятельно создать PTKView, используя компоненты, предоставляемые Stripe, такие как PTKCard, PTKCardCVC и т. д. - person Mohsin Khubaib Ahmed; 22.04.2015

Попробуйте сделать запрос с помощью PaymentKit

@IBAction func payTapped(AnyObject) {
    // Valiate that this device can take payments
    if (PKPaymentAuthorizationViewController.canMakePayments()) {
        // Construct the basic payment request
        var paymentRequest = PKPaymentRequest()
        paymentRequest.merchantIdentifier = "merchant.com.example";
        paymentRequest.supportedNetworks = [PKPaymentNetworkVisa, PKPaymentNetworkMasterCard, PKPaymentNetworkAmex]
        paymentRequest.merchantCapabilities = PKMerchantCapability.Capability3DS | PKMerchantCapability.CapabilityEMV
        paymentRequest.countryCode = "US"
        paymentRequest.currencyCode = "USD"
        paymentRequest.requiredShippingAddressFields = PKAddressField.All;

        // Add a line item
        var totalItem = PKPaymentSummaryItem(label:"Foo", amount:NSDecimalNumber(string:"0.05"))
        paymentRequest.paymentSummaryItems = [totalItem];

        // Show the Apple Pay controller
        var payAuth = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
        payAuth.delegate = self
        self.presentViewController(payAuth, animated:true, completion: nil)
    }
}
person iAnurag    schedule 17.03.2015
comment
Я использую симулятор iphone 6, и я получаю false для PKPaymentAuthorizationViewController.canMakePayments() - person wizyashas; 17.03.2015
comment
Служба платежей в приложениях не поддерживается на этом устройстве. - person wizyashas; 17.03.2015
comment
я думаю, что это поддерживает только на устройствах. - person iAnurag; 17.03.2015
comment
Я хотел протестировать в эмуляторе с помощью ApplePayStub, учитывая мою полосу - person wizyashas; 17.03.2015