#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:
Мне удалось решить эту ситуацию, и вот решение, если кому-то интересно. Вот шаги, чтобы это произошло:
- Подготовьте модель запроса
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()
}
}
}
-
Используйте
JSONEncoder
и установитеkeyEncodingStrategy
значение.convertToSnakeCase
. -
Создайте POST-запрос к
https://api.stripe.com/v1/tokens
конечной точке, где вам нужно указать параметры кодирования URL. Если вы используете Alamofire, вам необходимо установить кодировку наURLEncoding.default
. -
Проанализируйте ответ. Я использую
JSONDecoder
со следующей моделью:
import Foundation
struct StripeTokenResponse: Decodable {
let id: String
}
- Создайте платеж
StripeTokenResponse.id
это то, что вам нужно передать на серверную часть, где будет обработан платеж. Это тот же шаг, что и при использовании SDK.
Ответ №2:
Вы можете проверить Strip checkout, это позволяет вам представить страницу оплаты в веб-формате без какого-либо Stripe SDK на стороне клиента.
Комментарии:
1. Спасибо, но у меня это не работает. У нас есть Apple Pay, и я не хочу делать еще один шаг для пользователя, чтобы оплатить услугу.
2.
Stripe checkout
поддерживает Apple pay изначально. Но да, если речь идет об UX, то вам может потребоваться самостоятельно реализовать токен, упомянутый @karllekko.