Apple Pay без Stripe iOS SDK

#ios #swift #sdk #stripe-payments #applepay

#iOS #swift #sdk #stripe-платежи #applepay

Вопрос:

Я уже некоторое время использую Stripe iOS SDK, и все ясно относительно реализации. Поскольку наше приложение будет поддерживать App Clips на iOS 14, мы уменьшаем размер двоичного файла и поэтому решили также удалить Stripe iOS SDK.

Итак, мой вопрос здесь в том, могу ли я каким-то образом отправлять запросы на оплату через API и полностью исключить Stripe SDK?

p.s.: Похоже, мне нужно реализовать конечную точку / tokens, передающую данные карты. Есть ли какой-либо пример запроса, который нужно сделать?

Комментарии:

1. Это возможно, но для этого нет официальной документации, потому что это очень продвинутая интеграция, которую большинство людей не стали бы делать. Вам нужно было бы самостоятельно реализовать вызовы SDK Apple Pay, а затем сделать запрос к API Stripe с результирующим PKPayment, в /v1 /tokens есть некоторые недокументированные параметры.

2. Да, это именно то, что я имел в виду. Я все еще надеюсь, что есть несколько примеров, в которых объясняются все параметры.

Ответ №1:

Мне удалось решить эту ситуацию, и вот решение, если кому-то интересно. Вот шаги, чтобы это произошло:

  1. Подготовьте модель запроса
 import Foundation
import PassKit

struct StripeTokenRequest: Encodable {
  let pkToken: String
  let card: Card
  let pkTokenInstrumentName: String?
  let pkTokenPaymentNetwork: String?
  let pkTokenTransactionId: String?
  
  init?(payment: PKPayment) {
    guard let paymentString = String(data: payment.token.paymentData, encoding: .utf8) else { return nil }
    pkToken = paymentString
    card = .init(contact: payment.billingContact)
    pkTokenInstrumentName = payment.token.paymentMethod.displayName
    pkTokenPaymentNetwork = payment.token.paymentMethod.network.map { $0.rawValue }
    pkTokenTransactionId = payment.token.transactionIdentifier
  }
}

extension StripeTokenRequest {
  struct Card: Encodable {
    let name: String?
    let addressLine1: String?
    let addressCity: String?
    let addressState: String?
    let addressZip: String?
    let addressCountry: String?
    
    init(contact: PKContact?) {
      name = contact?.name.map { PersonNameComponentsFormatter.localizedString(from: $0, style: .default, options: []) }
      addressLine1 = contact?.postalAddress?.street
      addressCity = contact?.postalAddress?.city
      addressState = contact?.postalAddress?.state
      addressZip = contact?.postalAddress?.postalCode
      addressCountry = contact?.postalAddress?.isoCountryCode.uppercased()
    }
  }
}
  
  1. Используйте JSONEncoder и установите keyEncodingStrategy значение .convertToSnakeCase .

  2. Создайте POST-запрос к https://api.stripe.com/v1/tokens конечной точке, где вам нужно указать параметры кодирования URL. Если вы используете Alamofire, вам необходимо установить кодировку на URLEncoding.default .

  3. Проанализируйте ответ. Я использую JSONDecoder со следующей моделью:

 import Foundation

struct StripeTokenResponse: Decodable {
  let id: String
}
  
  1. Создайте платеж
    StripeTokenResponse.id это то, что вам нужно передать на серверную часть, где будет обработан платеж. Это тот же шаг, что и при использовании SDK.

Ответ №2:

Вы можете проверить Strip checkout, это позволяет вам представить страницу оплаты в веб-формате без какого-либо Stripe SDK на стороне клиента.

Комментарии:

1. Спасибо, но у меня это не работает. У нас есть Apple Pay, и я не хочу делать еще один шаг для пользователя, чтобы оплатить услугу.

2. Stripe checkout поддерживает Apple pay изначально. Но да, если речь идет об UX, то вам может потребоваться самостоятельно реализовать токен, упомянутый @karllekko.