创建会话以便使用卡进行支付
创建一个 session
,以便使用我们的 Andriod SDK 来保护您客户的卡详情。
完整示例集成:您可以在
设置您的视图
在创建结账表时,您必须设置供您的客户用于输入其卡详情的视图。您必须为视图配置使用独特识别码。
以下是您应如何设置视图配置的示例。
<?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>
引用您的视图
现在您必须引用您的视图配置。使用与
以下是您应如何引用视图配置的示例。
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
界面的实施示例。
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
。
为此,您必须提供 baseUrl
、merchantId
和其他参数。有关更多信息,请参见下表。
以下是如何利用必需参数和配置来初始化 SDK 的示例。
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 |
|
merchantId | 您独特的商户标识号。 |
sessionResponseListener | 返回您客户的 session 的回调监听器。 |
context | |
lifecycle |
生成 CARD session
您必须将客户的卡详情和 SessionType.CARD
枚举传送至 AccessCheckoutClient
实例上的 generateSessions
方法。
以下是在客户点击提交按钮时您应该做什么的示例。
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));
});
}
}
完整代码示例
以下是上述步骤的完整代码示例。
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
,您就必须创建
重要信息:CARD session
具有 1 分钟的使用寿命,并且您只能使用一次。如果未在该时间内创建 Token,您就必须创建新的 CARD session
值。
后续步骤