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

卡验证

在处理您客户的卡之前验证卡的详情。

警告:该验证并不会检查客户的卡详情是否正确。验证器只会检查所输入的详情格式。

开始

若要集成验证功能,您必须创建一个 AccessCheckoutCardValidationListener 的实施。在 CardValidationConfig 中传入安卓 UI 元素,以便使用 AccessCheckoutValidationInitialiser 来初始化验证。

完整示例集成:您可以在此处查看卡验证集成的示例。

实施 AccessCheckoutCardValidationListener

若要接收客户的卡详情的验证结果,则您必须创建自己的实施 AccessCheckoutCardValidationListener

Copied!
package com.worldpay.access.checkout.sample.code

import com.worldpay.access.checkout.client.validation.listener.AccessCheckoutCardValidationListener
import com.worldpay.access.checkout.client.validation.model.CardBrand

class CardValidationListener : AccessCheckoutCardValidationListener {

    override fun onCvcValidated(isValid: Boolean) {
        //TODO: handle the cvc validation result
    }

    override fun onPanValidated(isValid: Boolean) {
        //TODO: handle the pan validation result
    }

    override fun onBrandChange(cardBrand : CardBrand?) {
        //TODO: handle the card brand change
    }

    override fun onExpiryDateValidated(isValid: Boolean) {
        //TODO: handle the expiry date validation result
    }

    override fun onValidationSuccess() {
        //TODO: handle the form when the validation is complete i.e. all fields are valid
    }

}
package com.worldpay.access.checkout.sample.code

import com.worldpay.access.checkout.client.validation.listener.AccessCheckoutCardValidationListener;
import com.worldpay.access.checkout.client.validation.model.CardBrand;

public class CardValidationListener implements AccessCheckoutCardValidationListener {

    @Override
    public void onCvcValidated(Boolean isValid) {
        //TODO: handle the cvc validation result
    }

    @Override
    public void onPanValidated(Boolean isValid) {
        //TODO: handle the pan validation result
    }

    @Override
    public void onBrandChange(CardBrand cardBrand) {
        //TODO: handle the card brand change
    }

    @Override
    public void onExpiryDateValidated(Boolean isValid) {
        //TODO: handle the expiry date validation result
    }

    @Override
    public void onValidationSuccess() {
        //TODO: handle the form when the validation is complete i.e. all fields are valid
    }

}

功能和参数描述

方法描述
onCvcValidated该方法与 CVC 字段的有效性一起调用。 isValid 表示该字段是处于有效还是无效状态。
onPanValidated该方法与 PAN 字段的有效性一起调用。 isValid 表示该字段是处于有效还是无效状态。
onBrandChange该方法与基于您客户输入的详情的卡品牌一起调用。您可以使用该方法来确定可作为 UI 效果应用的卡徽标。如果无法识别卡品牌,则返回 null 响应。
卡品牌包含图像列表,您可以随后用其来显示已识别的卡品牌的图标。Access Worldpay 可同时托管支持的卡品牌的 PNG 和 SVG 版本。您可以立即使用这些图标并将它们应用于您的视图。
onExpiryDateValidated该方法与过期日期字段的有效性一起调用。 isValid 表示该字段是处于有效还是无效状态。
onValidationSuccess该方法在所有字段都处于有效状态时才调用。通常,您可以用它来启用提交按钮。

初始化卡验证

在实施 AccessCheckoutCardValidationListener 之后,您必须为视图初始化验证。为此,首先要使用构造器来创建一个 CardValidationConfig,如下所示。然后用它来初始化验证。

Copied!
package com.worldpay.access.checkout.sample.code

// android library imports omitted

import com.worldpay.access.checkout.client.validation.AccessCheckoutValidationInitialiser
import com.worldpay.access.checkout.client.validation.config.CardValidationConfig

class MainActivity : AppCompatActivity() {

    private val baseUrl = "TARGET_BASE_URL"

    // other fields omitted

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val pan = findViewById<EditText>(R.id.pan)
        val cvc = findViewById<EditText>(R.id.cvc)
        val expiryDate = findViewById<EditText>(R.id.expiryDate)

        // other view references omitted

        val cardValidationListener = CardValidationListener()

        val cardValidationConfig = CardValidationConfig.Builder()
                .baseUrl(baseUrl)
                .pan(pan)
                .expiryDate(expiryDate)
                .cvc(cvc)
                .validationListener(cardValidationListener)
                .lifecycleOwner(this)
                .build()

        AccessCheckoutValidationInitialiser.initialise(cardValidationConfig)

        //TODO: generate session here
    }

}
package com.worldpay.access.checkout.sample.code

// android library imports omitted

import com.worldpay.access.checkout.client.validation.AccessCheckoutValidationInitialiser;
import com.worldpay.access.checkout.client.validation.config.CardValidationConfig;
import com.worldpay.access.checkout.client.validation.listener.AccessCheckoutCardValidationListener;

public class MainActivity extends AppCompatActivity {

    private String baseUrl = "TARGET_BASE_URL";

    // other fields omitted

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        EditText pan = findViewById<EditText>(R.id.pan);
        EditText cvc = findViewById<EditText>(R.id.cvc);
        EditText expiryDate = findViewById<EditText>(R.id.expiryDate);

        // other view references omitted

        AccessCheckoutCardValidationListener cardValidationListener = CardValidationListener();

        CardValidationConfig cardValidationConfig = CardValidationConfig.Builder()
                .baseUrl(baseUrl)
                .pan(pan)
                .expiryDate(expiryDate)
                .cvc(cvc)
                .validationListener(cardValidationListener)
                .lifecycleOwner(this)
                .build();

        AccessCheckoutValidationInitialiser.initialise(cardValidationConfig);

        //TODO: generate session here
    }

}

卡验证规则

SDK 中的验证逻辑是基于任何卡类型的一套默认规则。具体品牌规则可从 CardTypes JSON 文件中获取,其中包含了每个品牌的验证规则和卡品牌徽标。徽标分为 SVGPNG 两种格式。

Validation rules

下表列出了我们的 SDK 用于验证您的客户卡详情的规则。

卡名称BIN 范围PAN 长度CVC 长度
Amex34、37154
Diners300-305、3095、36、38、3914、16、193
Discover6011、644 - 649、6516、193
JCB2131、1800、3088 - 3094、3096 - 3102、3112 - 3120、3158 - 3159、3337 - 3349、3528 - 358916、17、18、193
Maestro493698、500000 - 506698、506779 - 508999、56 - 59、63、67、612、13、14、15、16、17、18、193
MasterCard51 - 55、2221 - 2229、223 - 229、23 - 26、270 - 271、2720:使用 22 - 27163 优化
Visa413、16、18、193

卡品牌限制

SDK 可让您选择性地提供所支持的卡品牌列表。也就是说,如果您不支持特定卡品牌,在识别到不支持的品牌时,SDK 会通知您无效的 PAN 代码。

默认情况下,SDK 允许任何品牌的卡。如果您不希望限制自己接受的卡,则不需要传送任何配置。

配置示例

若要限制您接受的卡品牌,只需传送在初始化 SDK 时您的确希望接受的品牌阵列即可。

以下验证配置可限制 SDK 只接受 American Express、Visa 或 Mastercard BIN 系列。

Copied!
val cardValidationConfig = CardValidationConfig.Builder()
        ...
        .acceptedCardBrands(arrayOf("visa", "mastercard", "amex"))
        ...
        .build()
CardValidationConfig cardValidationConfig = new CardValidationConfig.Builder()
        ...
        .acceptedCardBrands(new String[] {"visa", "mastercard", "amex"})
        ...
        .build();

当前支持的卡品牌

SDK 能够识别以下卡品牌:

品牌代码
American Express"amex"
Diners"diners"
Discover"discover"
JCB"jcb"
Maestro"maestro"
Mastercard"mastercard"
Visa"visa"

如果 SDK 无法识别作为上述品牌之一的 PAN,只要它符合有效 PAN 的一般标准,则也会被准许。

PAN 格式化

SDK 允许根据客户类型进行 PAN 格式设置。在默认情况下,此功能被禁用。

PAN 的格式如下所示:

卡类型格式设置
Visa、Mastercard、JCB、Discover、Diners、MaestroXXXX XXXX XXXX XXXX
AmexXXXX XXXXXX XXXXX

启用 PAN 格式设置

如要启用 PAN 格式设置行为,只需调用构造器中的 enablePanFormatting 方法即可。

Copied!
val cardValidationConfig = CardValidationConfig.Builder()
        ...
        .enablePanFormatting()
        ...
        .build()
CardValidationConfig cardValidationConfig = new CardValidationConfig.Builder()
        ...
        .enablePanFormatting()
        ...
        .build();


后续步骤


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