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

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

创建一个 session,以便使用我们的 Andriod SDK 来保护您客户的卡详情。

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

设置您的视图

在创建结账表时,您必须设置供您的客户用于输入其卡详情的视图。您必须为视图配置使用独特识别码。

以下是您应如何设置视图配置的示例。

Copied!
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent" >

    <!-- layout style attributes omitted -->
    <EditText android:id="@+id/pan" />

    <!-- layout style attributes omitted -->
    <EditText android:id="@+id/expiryDate" />

    <!-- layout style attributes omitted -->
    <EditText android:id="@+id/cvc" />

    <!-- layout style attributes omitted -->
    <Button android:id="@+id/submit_button" />

</LinearLayout>

引用您的视图

现在您必须引用您的视图配置。使用与上述相同的独特视图识别码。

以下是您应如何引用视图配置的示例。

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

// android library imports omitted

class MainActivity : AppCompatActivity() {

    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)
        val submit = findViewById<Button>(R.id.submit_button)
    }

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

// android library imports omitted

public class MainActivity extends AppCompatActivity {

    @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);
        Button submit = findViewById<Button>(R.id.submit_button);
    }

}

验证卡详情

您可以选择验证客户的卡详情。您可以在此处查找说明。

创建 session

实施回调

SDK 可转换客户的卡详情。然后 SDK 会检索 session,方法是通过调用回调至 SessionResponseListener 界面的实施类别。

您必须创建一个实施我们 SessionResponseListener 界面的类别。

一旦会话请求完成,您的实施就会收到通知。

如果出错,您会收到作为 Map<SessionType, String>session 或作为 AccessCheckoutException 的异常。

以下是 SessionResponseListener 界面的实施示例。

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

import com.worldpay.access.checkout.client.api.exception.AccessCheckoutException
import com.worldpay.access.checkout.client.session.listener.SessionResponseListener
import com.worldpay.access.checkout.client.session.model.SessionType

class MySessionResponseListener: SessionResponseListener {

    override fun onSuccess(sessionResponseMap: Map<SessionType, String>) {
        //TODO: handle the session response here
    }

    override fun onError(error: AccessCheckoutException) {
        //TODO: handle the exception here
    }

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

import com.worldpay.access.checkout.client.api.exception.AccessCheckoutException;
import com.worldpay.access.checkout.client.session.listener.SessionResponseListener;
import com.worldpay.access.checkout.client.session.model.SessionType;

public class MySessionResponseListener implements SessionResponseListener {

    @Override
    public void onSuccess(Map<SessionType, String> sessionResponseMap) {
        //TODO: handle the session response here
    }

    @Override
    public void onError(AccessCheckoutException error) {
        //TODO: handle the exception here
    }

}

初始化 AccessCheckoutClient

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

为此,您必须提供 baseUrlmerchantId 和其他参数。有关更多信息,请参见下表。

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

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

// android library imports omitted

import com.worldpay.access.checkout.client.session.AccessCheckoutClientBuilder
import com.worldpay.access.checkout.client.session.AccessCheckoutClient
import com.worldpay.access.checkout.client.session.model.SessionType

class MainActivity : AppCompatActivity() {

    private val baseUrl = "TARGET_BASE_URL"
    private val checkoutId = "YOUR_CHECKOUT_ID"

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

        // reference views code ommited

        val sessionResponseListener = MySessionResponseListener()

        val accessCheckoutClient = AccessCheckoutClientBuilder()
                .baseUrl(baseUrl)
                .merchantId(checkoutId)
                .context(this)
                .sessionResponseListener(sessionResponseListener)
                .lifecycleOwner(this)
                .build()
    }

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

// android library imports omitted

import com.worldpay.access.checkout.client.session.AccessCheckoutClientBuilder;
import com.worldpay.access.checkout.client.session.AccessCheckoutClient;
import com.worldpay.access.checkout.client.session.listener.SessionResponseListener;
import com.worldpay.access.checkout.client.session.model.SessionType;

public class MainActivity extends AppCompatActivity {

    private String baseUrl = "TARGET_BASE_URL";
    private String checkoutId = "YOUR_CHECKOUT_ID";

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

        // reference views code ommited

        SessionResponseListener sessionResponseListener = new MySessionResponseListener();

        final AccessCheckoutClient accessCheckoutClient = new AccessCheckoutClientBuilder()
                .baseUrl(baseUrl)
                .merchantId(checkoutId)
                .context(this)
                .sessionResponseListener(sessionResponseListener)
                .lifecycleOwner(this)
                .build();
    }

}

重要信息:在使用 AndroidX Lifecycle 2.3.0 及更高版本的 SDK 时,必须在主 UI 线程上调用 build()。这是由于 SDK 使用的 LifecycleRegistry 类发生了更改,现在将强制执行此约束条件。

必需参数

参数描述
baseUrl
  • 对于测试用途:https://try.access.worldpay.com/
  • 对于实时用途:https://access.worldpay.com/
merchantId您独特的商户标识号。
sessionResponseListener返回您客户的 session 的回调监听器。
contextAndroid 上下文
lifecycleAndroid LifecycleOwner

生成 CARD session

您必须将客户的卡详情和 SessionType.CARD 枚举传送至 AccessCheckoutClient 实例上的 generateSessions 方法。

以下是在客户点击提交按钮时您应该做什么的示例。

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

// android library imports omitted

import com.worldpay.access.checkout.client.session.AccessCheckoutClient
import com.worldpay.access.checkout.client.session.model.CardDetails
import com.worldpay.access.checkout.client.session.model.SessionType

class MainActivity : AppCompatActivity() {

    // fields ommitted

    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)
        val submit = findViewById<Button>(R.id.submit_button)

        // AccessCheckoutClient creation code ommitted

        submit.setOnClickListener {
            val cardDetails = CardDetails.Builder()
                    .pan(pan.getInsertedText())
                    .expiryDate(expiryDate.getInsertedText())
                    .cvc(cvc.getInsertedText())
                    .build()

            accessCheckoutClient.generateSessions(cardDetails, listOf(SessionType.CARD))
        }
    }

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

// android library imports omitted

import com.worldpay.access.checkout.client.session.AccessCheckoutClient;
import com.worldpay.access.checkout.client.session.model.CardDetails;
import com.worldpay.access.checkout.client.session.model.SessionType;

public class MainActivity extends AppCompatActivity {

    // fields ommitted

    @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);
        Button submit = findViewById<Button>(R.id.submit_button);

        // AccessCheckoutClient creation code ommitted

        submit.setOnClickListener(view -> {
            CardDetails cardDetails = new CardDetails.Builder()
                    .pan(pan.getInsertedText())
                    .expiryDate(expiryDate.getInsertedText())
                    .cvc(cvc.getInsertedText())
                    .build();

            accessCheckoutClient.generateSessions(cardDetails, singletonList(SessionType.CARD));
        });
    }

}

完整代码示例

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

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

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.widget.Button
import android.widget.EditText
import com.worldpay.access.checkout.sample.code.R

import com.worldpay.access.checkout.client.session.AccessCheckoutClient
import com.worldpay.access.checkout.client.session.model.CardDetails
import com.worldpay.access.checkout.client.session.model.SessionType

class MainActivity : AppCompatActivity() {

    private val baseUrl = "TARGET_BASE_URL"
    private val checkoutId = "YOUR_CHECKOUT_ID"

    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)
        val submit = findViewById<Button>(R.id.submit_button)

        val sessionResponseListener = MySessionResponseListener()

        val accessCheckoutClient = AccessCheckoutClientBuilder()
                .baseUrl(baseUrl)
                .merchantId(checkoutId)
                .context(this)
                .sessionResponseListener(sessionResponseListener)
                .lifecycleOwner(this)
                .build()

        submit.setOnClickListener {
            val cardDetails = CardDetails.Builder()
                    .pan(pan.getInsertedText())
                    .expiryDate(expiryDate.getInsertedText())
                    .cvc(cvc.getInsertedText())
                    .build()

            accessCheckoutClient.generateSessions(cardDetails, listOf(SessionType.CARD))
        }
    }

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

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import com.worldpay.access.checkout.sample.code.R;

import com.worldpay.access.checkout.client.session.AccessCheckoutClient;
import com.worldpay.access.checkout.client.session.model.CardDetails;
import com.worldpay.access.checkout.client.session.model.SessionType;

public class MainActivity extends AppCompatActivity {

    private String baseUrl = "TARGET_BASE_URL";
    private String checkoutId = "YOUR_CHECKOUT_ID";

    @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);
        Button submit = findViewById<Button>(R.id.submit_button);

        SessionResponseListener sessionResponseListener = new MySessionResponseListener();

        final AccessCheckoutClient accessCheckoutClient = new AccessCheckoutClientBuilder()
                .baseUrl(baseUrl)
                .merchantId(checkoutId)
                .context(this)
                .sessionResponseListener(sessionResponseListener)
                .lifecycleOwner(this)
                .build();

        submit.setOnClickListener(view -> {
            CardDetails cardDetails = new CardDetails.Builder()
                    .pan(pan.getInsertedText())
                    .expiryDate(expiryDate.getInsertedText())
                    .cvc(cvc.getInsertedText())
                    .build();

            accessCheckoutClient.generateSessions(cardDetails, singletonList(SessionType.CARD));
        });
    }

}

创建已验证 Token

一旦收到了 CARD session,您就必须创建已验证 Token接受支付

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


后续步骤


创建已验证 Token