Translation disclaimer

Documentation is written in English and subsequently translated. This page, therefore, might not have the most up-to-date content. If any questions arise relating to the accuracy of the translated content, please refer to the English version of the page.

Menu

创建会话以便使用卡和 CVC 进行支付

为卡详情和 CVC 创建单独的会话,从而使用我们的 iOS SDK 来确保您客户支付详情的安全。

完整示例集成:您可以在此处查看会话生成示例。

引用您的 UI 组件

若要显示您的结账表,则必须首先使用故事板来创建您的布局。

以下是如何利用独特的识别码来引用您的 UI 组件的示例。

Copied!
import AccessCheckoutSDK
class ViewController: UIViewController {

    @IBOutlet weak var panTextField: UITextField!
    @IBOutlet weak var expiryDateTextField: UITextField!
    @IBOutlet weak var cvcTextField: UITextField!

    func submitButtonClickHandler() {
        // code to generate your sessions
        ...
    }    ...

Card validation

您可以选择验证客户的卡详情。您可以在[此处]查找说明(/zh/docs/access-worldpay/checkout/ios/card-validator)

创建 session

初始化 AccessCheckoutClientBuilder

现在,您必须使用 AccessCheckoutClientBuilder 来初始化 SDK。

为此,您必须提供 BaseURLmerchantID 和其他参数。

以下是如何利用必需参数来初始化 SDK 的示例。

Copied!
// The AccessCheckoutClientBuilder throws an error if either the accessBaseUrl() or merchantId() calls are omitted 
let accessCheckoutClient:AccessCheckoutClient? = try? AccessCheckoutClientBuilder().accessBaseUrl(<ACCESS_BASE_URL>)
   .merchantId(<MERCHANT_ID>)
   .build()
占位符描述
<ACCESS_BASE_URL>
  • 对于测试用途:https://try.access.worldpay.com/
  • 对于实时用途:https://access.worldpay.com/
<MERCHANT_ID>您的唯一商户标识号由 Worldpay 提供。

检索 session

提交客户的卡详情。

CardDetails 包含提交用于检索 session 的客户数据。

Copied!
// The CardDetailsBuilder throws an error if the expiry date is provided in a format different from MM/YY or MMYY (which will not happen if you use the components with built-in validation provided by the SDK)
let cardDetails:CardDetails = try! CardDetailsBuilder().pan(panTextField.text!)
    .expiryDate(expiryDateTextField.text!)
    .cvc(cvcTextField.text!)
    .build()

指定会话

您必须将要生成的 [SessionType.card][SessionType.cvc] 类型指定为 session

Copied!
try? accessCheckoutClient?.generateSessions(cardDetails: cardDetails, sessionTypes: [SessionType.card, SessionType.cvc]) { result in
    DispatchQueue.main.async {
        switch result {
        case .success(let sessions):
            // The session is returned in a Dictionary[SessionType:String]
            let cardSession = sessions[SessionType.card]
            let cvcSession = sessions[SessionType.cvc]
            ...
        case .failure(let error):
            // The error returned is of type AccessCheckoutError 
            let errorMessage = error.message
            ...
        }
    }
}

注释:

  • generateSessions 的调用可作为闭包返回 Result<[SessionType: String], AccessCheckoutError>
  • 在处理成功/失败可能导致更新 UI 时,您必须使用闭包中主线程的模式

完整代码示例

以下是上述步骤的完整代码示例。

Copied!
import AccessCheckoutSDK
class MyViewController: UIViewController {
    private let accessBaseUrl = "https://try.access.worldpay.com"
    private let checkoutId = "your-checkout-id"
    @IBOutlet weak var panTextField: UITextField!
    @IBOutlet weak var expiryDateTextField: UITextField!
    @IBOutlet weak var cvcTextField: UITextField!
    @IBAction func submit(_ sender: Any) {
        let cardDetails = try! CardDetailsBuilder().pan(panTextField.text!)
            .expiryDate(expiryDateTextField.text!)
            .cvc(cvcTextField.text!)
            .build()
        let accessCheckoutClient = try? AccessCheckoutClientBuilder().accessBaseUrl(accessBaseUrl)
            .merchantId(checkoutId)
            .build()
        try? accessCheckoutClient?.generateSessions(cardDetails: cardDetails, sessionTypes: [SessionType.card, SessionType.cvc]) { result in
            DispatchQueue.main.async {
                switch result {
                    case .success(let sessionsDictionary):
                        let cardSession = sessionsDictionary[SessionType.card]
                        let cvcSession = sessionsDictionary[SessionType.cvc]
                        ...
                    case .failure(let error):
                        ...
                }
            }
        }
    }
}

Create a verified token

一旦收到了 CARD session,您就必须创建已验证 Token并将其与 CVC session 配合使用,以便接受支付

重要信息:CARD session 具有 1 分钟的使用寿命,并且您只能使用一次。如果未在该时间内创建 Token,您就必须创建新的 CARD session 值。

接受支付

Use the value of the CVC session and the verified token in our card/checkout paymentInstrument to take a card on file payment.

重要信息:CVC session 具有 15 分钟的使用寿命,并且您只能使用一次。如果未在该时间内接受支付,您就必须创建新的 CVC session 值。您可以利用仅限 CVC 的 SDK来完成此操作。

paymentInstrument 可用于任何预存卡号资源(payments:cardonFileAuthorizepayments:migrateCardOnFileSalepayments:migrateCardOnFileAuthorize)。


需要仅为 CVC 创建会话吗?查看下面的集成示例:

仅为 CVC 创建会话

发送您客户的 CVC,从而创建一个支付 CVC session

完整示例集成:您可以在此处查看会话生成示例。

引用您的 UI 组件

若要显示您的结账表,则必须首先使用故事板来创建您的布局。

以下是如何利用独特的识别码来引用您的 UI 组件的示例。

Copied!
import AccessCheckoutSDK

class ViewController: UIViewController {

    @IBOutlet weak var cvcTextField: UITextField!

    func submitButtonClickHandler() {
        // code to generate your session
        ...
    }   
    ...

CVC validation

您可以选择验证客户的 CVC。您可以在[此处]查找说明(/zh/docs/access-worldpay/checkout/ios/cvc-validator)

创建 CVC session

初始化 AccessCheckoutClientBuilder

现在,您必须使用 AccessCheckoutClientBuilder 来初始化 SDK。

为此,您必须提供 BaseURLmerchantID 和其他参数。

以下是如何利用必需参数来初始化 SDK 的示例。

Copied!
// The AccessCheckoutClientBuilder throws an exception if either the accessBaseUrl() or merchantId() calls are omitted 
let accessCheckoutClient:AccessCheckoutClient? = try? AccessCheckoutClientBuilder().accessBaseUrl(<ACCESS_BASE_URL>)
   .merchantId(<MERCHANT_ID>)
   .build()
占位符描述
<ACCESS_BASE_URL>
  • 对于测试用途:https://try.access.worldpay.com/
  • 对于实时用途:https://access.worldpay.com/
<MERCHANT_ID>您的唯一商户标识号由 Worldpay 提供。

检索 session

提交客户的卡详情。

CardDetails 包含提交用于检索 session 的客户数据。

Copied!
let cardDetails:CardDetails = try! CardDetailsBuilder().cvc(cvcTextField.text!)
    .build()

指定会话

您必须将要生成的[SessionType.cvc]类型指定为session

Copied!
try? accessCheckoutClient?.generateSessions(cardDetails: cardDetails, sessionTypes: [SessionType.cvc]) { result in
    DispatchQueue.main.async {
        switch result {
        case .success(let sessions):
            // The session is returned in a Dictionary[SessionType:String]
            let session = sessions[SessionType.cvc]
            ...
        case .failure(let error):
            // The error returned is of type AccessCheckoutError 
            let errorMessage = error.message
            ...
        }
    }
}

建议:

  • generateSessions 的调用可作为闭包返回 Result[SessionType: String], AccessCheckoutError>
  • 在处理成功/失败可能导致更新 UI 时,您必须使用闭包中主线程的模式

完整代码示例

以下是上述步骤的完整代码示例。

Copied!
import AccessCheckoutSDK
class MyViewController: UIViewController {
    private let accessBaseUrl = "https://try.access.worldpay.com"
    private let checkoutId = "your-checkout-id"
    @IBOutlet weak var cvcTextField: UITextField!
    @IBAction func submit(_ sender: Any) {
        let cardDetails = try! CardDetailsBuilder().cvc(cvcTextField.text!)
            .build()
        let accessCheckoutClient = try? AccessCheckoutClientBuilder().accessBaseUrl(accessBaseUrl)
            .merchantId(checkoutId)
            .build()
        try? accessCheckoutClient?.generateSessions(cardDetails: cardDetails, sessionTypes: [SessionType.card, SessionType.cvc]) { result in
            DispatchQueue.main.async {
                switch result {
                    case .success(let sessionsDictionary):
                        let cardSession = sessionsDictionary[SessionType.card]
                        let cvcSession = sessionsDictionary[SessionType.cvc]
                        ...
                    case .failure(let error):
                        ...
                }
            }
        }
    }
}

Take a payment

Use the value of the CVC session and your stored verified token in our card/checkout paymentInstrument to take a card on file payment.

重要信息:CVC session 具有 15 分钟的使用寿命,并且您只能使用一次。如果未在该时间内接受支付,您就必须创建新的 CVC session 值。

paymentInstrument 可用于任何预存卡号资源(payments:cardonFileAuthorizepayments:migrateCardOnFileSalepayments:migrateCardOnFileAuthorize)。

Next steps


接受预存卡号销售
接受预存卡号授权
迁移预存卡号授权