Tinkoff Acquiring SDK for iOS
Acquiring SDK 允许将互联网收单集成到iOS平台的移动应用程序中。
模块
Tinkoff Acquiring SDK 由三个模块组成,可以根据需要将它们连接到您的应用程序
- TinkoffASDKCore - 低级别模块,用于向收单API 发送网络请求,同时配置网络中安全数据传输
- TinkoffASDKUI - 包含将各种用户接收支付场景集成到您的应用程序中所需的所有逻辑。在大多数情况下,您只需连接它即可。
- TinkoffASDKYandexPay - 辅助模块,封装了与 YandexPaySDK 的全部操作。如果需要集成用于通过 Tinkoff Касса在线收单 接收支付的
YandexPay
按钮,请连接此模块。
连接
Cocoapods
使用 Cocoapods
连接时,请在 Podfile
文件中添加必需的依赖项。
pod 'TinkoffASDKCore'
pod 'TinkoffASDKUI'
pod 'TinkoffASDKYandexPay'
Swift Package Manager
Package.swift
使用 要使用 Package.swift
将 AcquiringSdk 集成到您的项目中,请指定依赖项
dependencies: [
.package(url: "https://github.com/tinkoff-mobile-tech/AcquiringSdk_IOS.git", .upToNextMajor(from: "3.0.0"))
]
通过 Xcode
文件 -> 添加包 -> https://github.com/tinkoff-mobile-tech/AcquiringSdk_IOS
选择所需模块
要求 和 限制
要使用Tinkoff Acquiring SDK,需要以下条件
- 支持iOS 12.3及以上版本
- Swift的最小版本为5.7(Xcode 14.0)
准备工作
开始使用SDK之前,需要以下内容
- TerminalKey - 卖方终端标识符
- PublicKey – 用于加密数据的公共密钥
数据在连接到互联网收银服务后,可在个人账户中获取。
有关设置个人账户的详细信息,请参阅此处
使用 SSL/TLC 证书的措施
如果需要撤销全局证书,SDK中提供了切换到由数字发展部
签发的证书的可能性。
⚠️ 根据下面的说明调整您的项目极为重要。否则,在证书被突然撤销的情况下,您的应用程序将不能接收支付
为了正确使用数字发展部的证书,需要在Info.plist
中添加属性App Transport Security Settings
,设置标志为Allow Arbitrary Loads = true
您可以直接复制source code
并将其粘贴到Info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果您的应用程序已使用Allow Arbitrary Loads
针对特定域名进行设置,则需要添加几个我们的域名(rest-api-test.tinkoff.ru
- 测试域,可选)并设置属性Allow Arbitrary Loads in Web Content = true
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>qr.nspk.ru</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>rest-api-test.tinkoff.ru</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>securepay.tinkoff.ru</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
初始化 SDK
在初始化 SDK 之前,首先需要创建配置,然后将它传递给 init
。以下是包含必需参数的示例。
import TinkoffASDKCore
import TinkoffASDKUI
let credential = AcquiringSdkCredential(
terminalKey: "TERMINAL_KEY",
publicKey: "PUBLIC_KEY"
)
let coreSDKConfiguration = AcquiringSdkConfiguration(
credential: credential,
server: .prod // Используемое окружение
)
let uiSDKConfiguration = UISDKConfiguration()
do {
let sdk = try AcquiringUISDK(
coreSDKConfiguration: coreSDKConfiguration,
uiSDKConfiguration: uiSDKConfiguration
)
} catch {
// Ошибка может возникнуть при некорректном параметре `publicKey`
assertionFailure("\(error)")
}
在 AcquiringSdkConfiguration 中的附加参数
- logger: ILogger? - 用于日志记录网络层工作的接口。您可以传递默认实现 -
Logger
,它会格式化并输出数据到控制台。 - language - 服务器发送错误文本的语言。这些消息永远不会显示给用户,仅用于调试。
- requestsTimeoutInterval: TimeInterval - 网络请求的超时时间。默认值 - 40秒。
- tokenProvider: ITokenProvider? - 提供用于 API 支付终端签名请求的令牌的协议。仅在终端启用了令牌验证时需要。了解更多详情
- urlSessionAuthChallengeService: IURLSessionAuthChallengeService? - 用于请求数据和认证方法的
URLSession
接口。不建议随意传递任何内容,因为默认实现将确保与服器的正确交互,在过渡到 SSL/TLC 证书时(如Ministry of Digital Development
)。了解更多详情
在 UISDKConfiguration 中的附加参数
- webViewAuthChallengeService: IWebViewAuthChallengeService? - 用于请求数据和认证方法的
WKWebView
接口。不建议随意传递任何内容,因为默认实现将确保与服器的正确交互,在过渡到 SSL/TLC 证书时(如Ministry of Digital Development
)。了解更多详情 - paymentStatusRetriesCount: Int - 负责更新支付状态请求的最大次数。用于在用户完成支付后获取最终状态。可以设置任何正数。默认值为10次,每次间隔为3秒尝试获取最终状态
- addCardCheckType: PaymentCardCheckType - 绑定卡时的验证类型。默认为
.no
。更多信息
使用令牌签名请求
如果您的终端支持在API聚合支付请求中验证发送的令牌,则必须实现协议ITokenProvider
并将其传递给AcquiringSdkConfiguration
func provideToken(
forRequestParameters parameters: [String: String], // Параметры, участвующие в генерации токена
completion: @escaping (Result<String, Error>) -> Void // Замыкание, которое необходимо вызвать, передав результат генерации токена
)
生成令牌需要
- 将终端密码添加到密码字典中,键为
Password
- 按键名对键值对进行字母顺序排序
- 连接所有键值对的值
- 对生成的字符串计算SHA-256哈希值
示例
在最简单的情况下,实现可能如下所示
import TinkoffASDKCore
func provideToken(
forRequestParameters parameters: [String: String],
completion: @escaping (Result<String, Error>) -> Void
) {
let sourceString = parameters
.merging(["Password": password]) { $1 }
.sorted { $0.key < $1.key }
.map(\.value)
.joined()
let hashingResult = Result {
try SHA256.hash(from: sourceString)
}
completion(hashingResult)
}
⚠️ 上面的实现仅仅是作为示例。出于安全考虑,不应在移动应用的代码中保存或以任何方式与终端密码交互。最佳方案是将获取的参数发送到服务器,然后在服务器上根据参数和密码生成令牌
执行支付
所有与不同支付场景的交互均通过一个统一的门面 AcquiringUISDK
来完成。其初始化的示例可以在 上面提到的部分 中看到。
SDK 实现了针对每种支付场景的独立入口点,同时也包含了一个包含多种支付方式的通用支付表单,这些支付方式在该终端上可用。
格式化支付信息
为了进行支付,需要创建一个PaymentFlow
对象并将其传递给AcquiringUISDK
中的相应函数。
PaymentFlow
是一个表示特定支付方式的enum
,在SDK的所有支付场景中都使用。
/// Тип проведения оплаты
public enum PaymentFlow: Equatable {
/// Оплата совершится с помощью вызова `v2/Init` в API эквайринга, на основе которого будет сформирован `paymentId`
case full(paymentOptions: PaymentOptions)
/// Используется в ситуациях, когда вызов `v2/Init` и формирование `paymentId` происходит на бекенде продавца
case finish(paymentOptions: FinishPaymentOptions)
}
这种划分允许SDK在客户端实现支付数据生成逻辑的应用程序以及服务器端进行这项工作的应用程序中使用。
以下将讨论每个案例的参数生成。
全额支付
在此,客户端应用程序提供所有参与支付的数据。SDK将自动启动和完成支付。
要创建类型为.full
的PaymentFlow
,需要使用PaymentOptions
传递付款参数。
let receipt: Receipt
let shops: [Shop]
let receipts: [Receipt]
let orderOptions = OrderOptions(
/// Идентификатор заказа в системе продавца
orderId: "ORDER_ID",
// Полная сумма заказа в копейках
amount: 100000,
// Краткое описание заказа
description: "DESCRIPTION",
// Данные чека
receipt: receipt,
// Данные маркетплейса. Используется для разбивки платежа по партнерам
shops: shops,
// Чеки для каждого объекта в `shops`.
// В каждом чеке необходимо указывать `Receipt.shopCode` == `Shop.shopCode`
receipts: receipts,
// Сохранить платеж в качестве родительского
savingAsParentPayment: false
)
let customerOptions = CustomerOptions(
// Идентификатор покупателя в системе продавца.
// С помощью него можно привязать карту покупателя к терминалу после успешного платежа
customerKey: "CUSTOMER_KEY",
// Email покупателя
email: "EMAIL"
)
// Используется для редиректа в приложение после успешного или неуспешного совершения оплаты с помощью `TinkoffPay`
// В иных сценариях передавать эти данные нет необходимости
let paymentCallbackURL = PaymentCallbackURL(
successURL: "SUCCESS_URL",
failureURL: "FAIL_URL"
)
// Словарь, содержащий дополнительные параметры в виде `[Key: Value]`, которые можно передать по необходимости
let paymentData = ["someKey": "someValue"]
let paymentOptions = PaymentOptions(
orderOptions: orderOptions,
customerOptions: customerOptions,
paymentCallbackURL: paymentCallbackURL,
paymentData: paymentData
)
let paymentFlow: PaymentFlow = .full(paymentOptions: paymentOptions)
所有这些数据都可以使用v2/Init
方法的来启动支付。更多详情请参考此处
完成支付
在此,客户端应用程序提供最小数据集以完成支付,前提是支付已由SDK以外的在先前期间启动
// Идентификатор платежа, полученный при вызове `v2/Init`
let paymentId: String
let finishOptions = FinishPaymentOptions(
paymentId: paymentId,
amount: 100000,
orderId: "ORDER_ID",
customerOptions: customerOptions
)
let paymentFlow: PaymentFlow = .finish(paymentOptions: finishOptions)
获取支付结果
在Acquiring SDK的所有支付场景中,执行结果通过回调返回,该回调在支付屏幕关闭后立即调用。
/// Замыкание с результатом, вызываемое после закрытия экрана оплаты
public typealias PaymentResultCompletion = (PaymentResult) -> Void
在这里,PaymentResult
代表包含三个可能情况的enum
/// Результат платежа
public enum PaymentResult {
/// Успешное завершение оплаты
case succeeded(PaymentInfo)
/// Произошла ошибка на этапе оплаты
case failed(Error)
/// Оплата отменена пользователем
case cancelled(PaymentInfo? = nil)
}
在 PaymentInfo
中包含有关已完成支付的信息
/// Информация о проведенном платеже
public struct PaymentInfo {
/// Идентификатор платежа
public let paymentId: String
/// Идентификатор заказа в системе продавца
public let orderId: String
/// Сумма заказа в копейках
public let amount: Int64
// Последний детальный статус о платеже
public let paymentStatus: AcquiringStatus
}
PaymentInfo
也可能位于 cancelled
中,在这些情况下,当 SDK 开始支付流程,但用户关闭了屏幕,没有等到操作完成。
使用支付表单支付
SDK 实现了一个通用支付表单。在该表单中显示了适用于该终端的几种支付方式,用户可以选择其中任意一种。
- 使用新卡支付
- 使用已保存的卡支付
- ТинковPay
- 快速支付系统
⚠️ 为了正确使用 TinkoffPay 和快速支付系统,需要进一步配置您的项目,因此请参阅下面有关这些支付方式的描述。.
要显示支付表单,需要在 AcquiringUISDK
中调用相应的函数。
/// Отображает основную платежную форму с различными способами оплаты
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого отобразится платежная форма
/// - paymentFlow: Содержит тип платежа и параметры оплаты
/// - configuration: Конфигурация платежной формы
/// - cardScannerDelegate: Делегат, предоставляющий возможность отобразить карточный сканер поверх заданного экрана
/// - completion: Замыкание с результатом, вызываемое после закрытия экрана оплаты
public func presentMainForm(
on presentingViewController: UIViewController,
paymentFlow: PaymentFlow,
configuration: MainFormUIConfiguration,
cardScannerDelegate: ICardScannerDelegate? = nil,
completion: PaymentResultCompletion? = nil
)
可以使用 MainFormConfiguration
对象设置支付表单的附加配置。
/// Конфигурация главной платежной формы
///
/// На основе этих данный будет формироваться отображение UI платежной формы с разными способами оплаты
public struct MainFormUIConfiguration {
/// Очень краткое описание заказа, отображаемое пользователю
public let orderDescription: String?
}
您还可以传递 ICardScannerDelegate 的实现链接,用户可以通过它扫描自己的银行卡。
支付表单将在支付完成后关闭,并将返回 PaymentResult
对象到 completion
。
使用 TinkoffPay 支付
首先,为了使您的应用程序中的 TinkoffPay
正确运行,您需要在 Info.plist
中添加到 LSApplicationQueriesSchemes
键的数组中 tinkoffbank
值
<key>LSApplicationQueriesSchemes</key>
<array>
<string>tinkoffbank</string>
</array>
因此,SDK 能够正确确定用户设备上是否存在 Тинькофф
应用程序。
要显示 TinkoffPay
的支付屏幕,需要在 AcquiringUISDK
中调用相应的函数。
/// Отображает экран оплаты `TinkoffPay`
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран оплаты `TinkoffPay`
/// - paymentFlow: Содержит тип платежа и параметры оплаты
/// - completion: Замыкание с результатом оплаты, вызываемое после закрытия экрана `TinkoffPay`
public func presentTinkoffPay(
on presentingViewController: UIViewController,
paymentFlow: PaymentFlow,
completion: PaymentResultCompletion? = nil
)
如果用户已安装 Тинькофф
应用程序,SDK 将将其带入。
支付完成后,屏幕将关闭,并将返回 PaymentResult
对象到 completion
。
使用 TinkoffPay
的支付可通过 支付表单 进行
使用快速支付系统付款
SDK 中提供了多种通过 快速支付系统
进行支付的选项。本节描述了用户会看到一个支持 快速支付系统
的银行列表的场景。从列表中选择特定银行后,将会跳转到相应的银行应用。
为了获取可用银行的列表,SDK 将向 НСПК 发送请求,并返回包含银行应用程序 URL 调用的 JSON
文件。
{
"version": "1.0",
"dictionary": [
{
"bankName": "Сбербанк",
"logoURL": "https://qr.nspk.ru/proxyapp/logo/bank100000000111.png",
"schema": "bank100000000111",
"package_name": "ru.sberbankmobile"
},
{
"bankName": "Тинькофф Банк",
"logoURL": "https://qr.nspk.ru/proxyapp/logo/bank100000000004.png",
"schema": "bank100000000004",
"package_name": "com.idamob.tinkoff.android"
},
{
"bankName": "Банк ВТБ",
"logoURL": "https://qr.nspk.ru/proxyapp/logo/bank100000000005.png",
"schema": "bank110000000005",
"package_name": "ru.vtb24.mobilebanking.android"
}
]
}
由于列表包含超过百家银行,为了方便使用,SDK 会优先显示那些已安装在用户设备上的银行。我们通过基于 schema
的值构建 URL
并调用系统函数 canOpenURL(:) 来实现这一点。
根据 文档,此方法只有在将方案添加到 Info.plist
中以 LSApplicationQueriesSchemes
为键的数组中时才会返回正确的响应。同时,它指出,您可以将不超过 50 个方案添加到此列表中。
因此,为了正确显示银行列表,您需要选择您最优先考虑的银行应用程序,它们将首先显示在快速支付系统的银行屏幕上,并将它们添加到 Info.plist
中。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>bank100000000111</string>
<string>bank100000000004</string>
<string>bank110000000005</string>
<string>bank100000000008</string>
</array>
⚠️ 由于 AppStore 中银行应用的锁定,方案可能会发生变化。您需要定期与 列表 进行核对,并更新您的应用中的 Info.plist。
要显示银行列表屏幕,请在 AcquiringUISDK
中调用相应的函数。
/// Отображает экран со списком приложений банков, с помощью которых можно провести оплату через `Систему быстрых платежей`
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран со списком банков
/// - paymentFlow: Содержит тип платежа и параметры оплаты
/// - completion: Замыкание с результатом оплаты, вызываемое после закрытия экрана оплаты `СБП`
public func presentSBPBanksList(
on presentingViewController: UIViewController,
paymentFlow: PaymentFlow,
completion: PaymentResultCompletion? = nil
)
支付完成后,屏幕将关闭,并通过 completion
返回 PaymentResult
对象。
此支付方式可通过 付款表单 使用。
使用快速支付系统QR码付款
SDK 提供了显示带有用于通过 快速支付系统
进行支付的链接的 QR码
的功能。用户扫描二维码后,将在其设备上打开一个支付表单,在这里要注意两种 QR
类型:
- QR-Static - 为多次用于支付商品或服务而创建的快速支付系统的付款链接
- QR-Dynamic - 用于单次用于支付商品或服务的快速支付系统付款链接
使用静态QR支付
为了启动使用静态QR支付的支付,在AcquiringUISDK中使用以下函数:
/// Отображает экран с многоразовым `QR-кодом`, отсканировав который, пользователь сможет провести оплату с помощью `Системы быстрых платежей`
///
/// При данном типе оплаты SDK никак не отслеживает статус платежа
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран с `QR-кодом`
/// - completion: Замыкание, вызываемое при закрытии экрана с `QR-кодом`
public func presentStaticSBPQR(
on presentingViewController: UIViewController,
completion: (() -> Void)? = nil
)
关闭屏幕时,会调用completion函数而不传递任何数据。
使用动态QR支付
为了启动使用动态QR支付的支付,在AcquiringUISDK中使用以下函数:
/// Отображает экран с одноразовым `QR-кодом`, отсканировав который, пользователь сможет провести оплату с помощью `Системы быстрых платежей`
///
/// При данном типе оплаты сумма и информация о платеже фиксируется, и SDK способен получить и обработать статус платежа
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран с `QR-кодом`
/// - paymentFlow: Содержит тип платежа и параметры оплаты
/// - completion: Замыкание с результатом оплаты, вызываемое после закрытия экрана с `QR-кодом`
public func presentDynamicSBPQR(
on presentingViewController: UIViewController,
paymentFlow: PaymentFlow,
completion: @escaping PaymentResultCompletion
)
支付完成后,屏幕将关闭,并将返回 PaymentResult
对象到 completion
。
重复支付
⚠️ 重复支付不与СБП(系统间结算支付)一起使用。
如果存在重复支付标识符rebillId,您也可以进行重复支付。为此,请使用AcquiringUISDK中的函数。
/// Отображает экран, выполняющий рекуррентный платеж
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран рекуррентного платежа
/// - paymentFlow: Содержит тип платежа и параметры оплаты
/// - rebillId: Идентификатор родительского платежа, на основе которого будет произведено списание средств
/// - failureDelegate: Делегат, обрабатывающий ошибку списания средств при вызове `v2/Charge`.
/// Используется только при оплате на основе уже существующего `paymentId (PaymentFlow.finish)`.
/// При `PaymentFlow.full` SDK способен самостоятельно обработать полученную ошибку.
/// - completion: Замыкание с результатом оплаты, вызываемое после закрытия экрана рекуррентного платежа
public func presentRecurrentPayment(
on presentingViewController: UIViewController,
paymentFlow: PaymentFlow,
rebillId: String,
failureDelegate: IRecurrentPaymentFailiureDelegate? = nil,
completion: PaymentResultCompletion? = nil
)
支付完成后,屏幕将关闭,并通过 completion
返回 PaymentResult
对象。
在调用PaymentFlow.finish时
这里需要特别注意的是参数failureDelegate。
只有在调用PaymentFlow.finish时才需要传递此代理的链接。因为当尝试在API的v2/Charge请求中扣除资金时,服务器可能返回错误104。这意味着客户端需要请求用户输入CVC卡号的码并重新发起支付。
在调用PaymentFlow.full时,SDK已经具备所有必要数据以再次调用v2/Init,因此客户端代码无需执行任何额外操作。
对于PaymentFlow.finish来说,不预期支付数据会在移动应用程序中显示,因此您需要自行实现IRecurrentPaymentFailiureDelegate协议。
/// Делегат, обрабатывающий ошибку списания средств при вызове `v2/Charge`
///
/// Используется только при оплате на основе уже существующего `paymentId (PaymentFlow.finish)`
public protocol IRecurrentPaymentFailiureDelegate: AnyObject {
/// В случае вызова этого метода делегата, необходимо совершить повторный запрос v2/Init, для получения обновленного paymentId
/// для этого необходимо в запросе к полю DATA добавить additionalData (в PaymentOptions поле называется paymentFormData)
/// - Parameters:
/// - additionalData: содержаться два доп. поля failMapiSessionId c failedPaymentId и recurringType
/// - completion: после успешного выполнения запроса, необходимо передать в completion новый paymentId
func recurrentPaymentNeedRepeatInit(additionalData: [String: String], completion: @escaping (Result<PaymentId, Error>) -> Void)
在实现此协议的过程中,预计会向卖家服务器发起调用 v2/Init
来通过重新初始化支付流程。调用此方法时,需在 DATA
字段中添加从 SDK 中获取的 additionalData
字典中的所有值。然后,需要通过调用 completion
将初始化后获得的 PaymentId
反馈给 SDK,SDK 再进行最终的支付处理。
使用 YandexPay 进行支付
您可以在 单独页面 上阅读关于集成 YandexPay 按钮的详细说明,该按钮通过 Тинькофф Касса
的网络收单服务接收支付。
管理银行卡
SDK 除了支付功能外,还为管理卡片屏提供了入口点。
已保存卡片列表
要打开已保存卡片列表屏,只需在 AcquiringUISDK
中调用相应的函数即可。
/// Отображает экран со списком карт
///
/// На этом экране пользователь может ознакомиться со списком привязанных карт, удалить или добавить новую карту
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран добавления карты
/// - customerKey: Идентификатор покупателя в системе Продавца, к которому будет привязана карта
/// - cardScannerDelegate: Делегат, предоставляющий возможность отобразить карточный сканер поверх заданного экрана
public func presentCardList(
on presentingViewController: UIViewController,
customerKey: String,
cardScannerDelegate: ICardScannerDelegate? = nil
)
您还可以传递 ICardScannerDelegate 的实现链接,用户可以通过它扫描自己的银行卡。
绑定新卡片
用户可以从卡片列表屏中绑定新卡片,但在需要的情况下,您也可以将其集成到自己的应用程序中。为此,您需要在 AcquringUISDK
中调用以下函数。
/// Отображает экран привязки новой карты
/// - Parameters:
/// - presentingViewController: `UIViewController`, поверх которого будет отображен экран привязки карты
/// - customerKey: Идентификатор покупателя в системе Продавца, к которому будет привязана карта
/// - cardScannerDelegate: Делегат, предоставляющий возможность отобразить карточный сканер поверх заданного экрана
/// - completion: Замыкание с результатом привязки карты, которое будет вызвано на главном потоке после закрытия экрана
public func presentAddCard(
on presentingViewController: UIViewController,
customerKey: String,
cardScannerDelegate: ICardScannerDelegate? = nil,
completion: ((AddCardResult) -> Void)? = nil
)
您还可以传递 ICardScannerDelegate 的实现链接,用户可以通过它扫描自己的银行卡。
卡片绑定完成后,屏幕会关闭,并通过 completion
返回 AddCardResult
。
/// Результат привязки карты
public enum AddCardResult {
/// Привязка карты произошла успешно.
/// В этом случае возвращается модель с подробной информацией о карте
case succeded(PaymentCard)
/// В процессе привязки карты произошла ошибка
case failed(Error)
/// Пользователь отменил привязку новой карты
case cancelled
}
对象 PaymentCard
将包含有关绑定的所有可用信息
- pan: String - 隐藏的卡号,例如
430000******0777
- cardId: String - 银行系统中卡的标识符
- expDate: String? - 卡的有效期,格式为
MMYY
,例如1212
- status: PaymentCardStatus - 卡的当前状态。在绑定成功的情况下为
active
- parentPaymentId: Int64 - 最后一笔已注册为父级付款的付款标识符
额外功能
无UI ASDK 进行付款
创建一个新的 IPaymentController
,通过它可以使用自己的 UI
完成带有 3DS
验证的付款。
public func paymentController() -> IPaymentController {
paymentControllerAssembly.paymentController()
}
无UI ASDK 处理卡片
创建一个新 ICardsController
,通过它可以使用自己的 UI
获取活动卡片列表、删除卡片和通过3DS验证绑定新的卡。
/// - Parameter customerKey: Идентификатор покупателя в системе продавца
/// - Returns: ICardsController
public func cardsController(customerKey: String) -> ICardsController {
cardsControllerAssembly.cardsController(customerKey: customerKey)
}
扫描卡
在启动所有可能包含卡片数据输入字段的自定义脚本时,您有机会传递一个指向实现协议 ICardScannerDelegate
的链接。
/// Замыкание, в которое необходимо передать карточные данные по завершении сканирования
public typealias CardScannerCompletion = (_ cardNumber: String?, _ expiration: String?, _ cvc: String?) -> Void
/// Делегат, предоставляющий возможность отобразить карточный сканер поверх заданного экрана
public protocol ICardScannerDelegate: AnyObject {
/// Уведомляет о нажатии пользователем на кнопку сканера при вводе карточных данных
///
/// Объект, реализующий данный протокол, должен отобразить экран со сканером.
/// После завершения сканирования необходимо передать полученные карточные данные в `completion`
/// - Parameters:
/// - viewController:`UIViewController`, поверх которого необходимо отобразить экран со сканером
/// - completion: Замыкание, в которое необходимо передать карточные данные по завершении сканирования
func cardScanButtonDidPressed(on viewController: UIViewController, completion: @escaping CardScannerCompletion)
}
在这种情况下,用户界面会显示扫描器图标,点击后可以捕获 cardScanButtonDidPressed
事件并显示扫描器屏幕。
支持
- 有关错误报告,请参阅问题部分。
- 有关添加新功能或更改功能请求,请联系经理或通过以下[email protected]发邮件。
- 有关付款场景和相关操作的所有问题,请联系[email protected]。
- API 方法文档。