Lite SDK Enrollment 卓系统 Enrollment

本页提供了用于安卓注册的 YunoLite SDK 指南。该 SDK 简化了集成流程,具有基本的注册功能,非常适合有以下需求的商家:

  • 需要快速实施,并将定制要求降至最低
  • 希望将重点主要放在付款方式注册上
  • 首选可处理注册流程的即用型用户界面

Lite SDK 包括以下核心功能:

  • 预置的注册用户界面组件
  • 卡片注册处理
  • 基本注册状态处理
  • 基本错误管理

对于需要多种支付方式、自定义用户界面或高级防欺诈等更高级功能的商户,请考虑使用我们的 Full SDK来代替。

要求

在开始 Yuno Android SDK 集成之前,请确保您的项目符合技术要求。此外,还要确保具备以下先决条件:

步骤 1:创建客户

在 Yuno 系统中使用 创建客户endpoint 在注册付款方式之前,该端点将返回该endpoint 将返回一个 customer_id 用于将已注册的付款方式与特定客户关联起来。

endpoint 将返回一个 customer_session 在调用注册方法时需要使用。

第 2 步:在项目中加入程序库

将 YunoLite SDK 添加到您的 Android 项目中:

添加存储库

将 Yuno 的 Maven 仓库添加到项目的 Gradle 配置中:

maven { url "https://yunopayments.jfrog.io/artifactory/snapshots-libs-release" }

build.gradle 文件,将 Yuno SDK 依赖关系添加到应用程序中:

dependencies {
    implementation 'com.yuno.payments:android-sdk:{last_version}'
}

权限

Yuno SDK 包括 INTERNET 默认情况下,该权限是提出网络请求所必需的。

<uses-permission android:name="android.permission.INTERNET" />

步骤 3:使用公钥Initialize SDK

Initialize SDK:

  1. Yuno 控制面板获取公共 API 密钥
  2. 如果尚未创建自定义应用程序类,请创建自定义应用程序类
  3. onCreate() 方法,调用 Yuno.initialize() 使用您的 API 密钥:
class CustomApplication : Application() {
  override fun onCreate() {
    super.onCreate()
    Yuno.initialize(
      this,
      PUBLIC_API_KEY,
      config: YunoConfig,
    )
  }
}

使用数据类 YunoConfig 来定制 SDK 的行为。在调用 Yuno.initialize().可用的选项有

data classYunoConfig(
    val cardFlow:CardFormType =CardFormType.ONE_STEP、
    val saveCardEnabled:Boolean = false、
    val keepLoader:Boolean = false、
    val cardFormDeployed:Boolean = false、
    val language:YunoLanguage? = null、
    val styles:YunoStyles? = null
)

下表介绍了每个自定义选项:

定制选项

说明

卡片流

该可选配置定义了支付和注册卡流程。默认情况下 CardFormType.ONE_STEP 选项。参见 渲染选项 部分获取更多信息。

SaveCardEnabled

启用卡片流上的保存卡片复选框。请参阅保存卡片部分了解更多信息。

保持装载机

保留 Yuno 的加载屏幕,直到您创建并继续付款。要使用此功能,请使用功能 startCompletePaymentFlow()在接下来的章节中将进行介绍。参见 装载机 以获取更多信息。

语言

定义付款表单中使用的语言。您可以将其设置为可用语言选项之一:

  • es (西班牙文)
  • en (英语)
  • pt (葡萄牙语)
  • 菲力
  • id(印尼语)
  • 马来文
  • th(泰语)
  • zh-TW(繁体中文,台湾
  • zh-CN (简体中文,中国
  • vi(越南语)
  • 法文
  • pl (波兰语)
  • it(意大利语)
  • 德文
  • ru(俄文)
  • tr (土耳其语)
  • nl(荷兰语)
  • sv(瑞典语)
  • 韩语
  • ja (日语)

  • pt (葡萄牙语)

款式

支持 SDK 范围内的用户界面自定义。使用它可以定义全局可视化样式,如字体家族和按钮外观(颜色、填充、半径、排版)。 YunoStyles 对象。更多信息,请参阅 styles 节。

您还需要更新您的清单,以便使用您的应用程序:

<application android:name=".CustomApplication"></application>

步骤 4:注册新的付款方式

注册流程分为两步。首先,initialize 流程,设置必要的组件。然后,启动用户界面流程,让用户注册付款方式。

4.1Initialize 注册程序

致电 initEnrollment 方法中的 onCreate 方法来准备您的应用程序以处理注册流程。这是 Android 操作系统要求的一个强制设置步骤,目的是注册合约,以便 SDK 将最终注册状态发送回您的应用程序。

fun ComponentActivity.initEnrollment(
   callbackEnrollmentState: ((String?) -> Unit)? = null
)

4.2 启动注册流程

致电 startEnrollment 方法启动用户界面并开始注册新的支付方式。您可以在 initEnrollment 例如当用户点击 "注册新付款方式 "按钮时。

fun Activity.startEnrollment(
    customerSession:String、
   countryCode:countryCode: String、
    showEnrollmentStatus:Boolean = true、
   callbackEnrollmentState: ((String?) -> Unit)? = null、
    requestCode:Int
)

下表介绍了 startEnrollment 参数

参数说明
customerSession与当前注册流程相关的会话客户。
countryCode执行付款的国家代码。有关支持国家及其代码的完整列表,请参阅国家覆盖范围
showEnrollmentStatus表示是否显示注册状态。此参数为可选参数,默认为 true.
callbackEnrollmentState返回注册过程当前状态的函数。此参数为可选参数,默认为 null.要注册该回调,必须调用 initEnrollment 方法中的 onCreate 活动的方法。检查 可能状态 可以返回。
requestCode这是一个可选参数,如果要使用 onActivityResult 方法来捕捉注册状态。

回拨注册状态

"(《世界人权宣言》) callbackEnrollmentState 参数是一个返回当前注册流程状态的函数。只有在要跟踪注册状态时才提供该函数。

使用 AppCompatActivity.enrollmentStatus() 函数来随时检查当前的注册状态。该函数是可选的,接受的参数与 startEnrollment.以下代码块显示了函数签名:

fun AppCompatActivity.enrollmentStatus(
    customerSession:String、
   countryCode:countryCode: String、
    showEnrollmentStatus:Boolean = false、
   callbackEnrollmentState: ((String?) -> Unit)? = null、
)
📘

可选功能

使用功能 enrollmentStatus 是可选的。这不是完成注册过程的必要条件。 了解更多

🚧

回调覆盖

如果在调用函数时提供新的回调 enrollmentStatus时设置的回调。 initEnrollment.

下面的代码块显示了可能的状态:

const valSUCCEEDED=SUCCEEDED" (SUCCEEDED")
const val ENROLLMENT_STATE_FAIL = "FAIL" (失败)
const val ENROLLMENT_STATE_PROCESSING = "PROCESSING" (处理中)
const val ENROLLMENT_STATE_REJECT = "REJECT" (拒绝)
const val ENROLLMENT_STATE_INTERNAL_ERROR = "INTERNAL_ERROR" (内部错误)
const val ENROLLMENT_STATE_CANCELED_BY_USER = "CANCELED" (取消)

下表提供了有关可能状态的更多信息:

国家说明需要采取的额外行动
SUCCEEDED注册过程顺利完成,未出现任何错误。
FAIL由于数据验证问题、服务器连接失败或技术问题等错误,注册尝试失败。调查故障原因(验证、网络、服务器)并采取纠正措施。
PROCESSING目前报名正在进行中,等待批准或核实。
REJECT由于缺少要求或检测到不一致等原因,注册被拒绝。是的,通知用户被拒绝,尽可能说明原因,并建议下一步措施。
INTERNAL_ERROR处理注册过程的系统出现意外内部错误。是。需要技术干预,以审查系统、修复内部问题、重试或通知用户。
CANCELED用户自愿取消注册过程或在注册完成前退出。

使用 OnActivityResult 方法

❗️

已废弃的方法

"(《世界人权宣言》) onActivityResult 方法已经过时。如果要执行新的 Android 集成,Yuno 建议使用 initEnrollment() 合同,该合同遵循谷歌的最佳实践。

当活动返回结果时,会自动调用onActivityResult方法。只要注册状态发生变化,就可以使用该选项执行操作。请按照以下步骤处理注册结果:

📘

使用默认请求代码

如果您使用的是 onActivityResult 方法,但没有通知 requestCode 在调用 startEnrollment步骤 3您必须使用 YUNO_ENROLLMENT_REQUEST_CODE 由 Yuno 提供。

  1. 覆盖 onActivityResult 方法。这样可以确保层次调用得到尊重。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
}
  1. 检查是否 requestCode 相当于 YUNO_ENROLLMENT_REQUEST_CODE.由于您正在运行 Yuno 您可以在应用程序中导入 YUNO_ENROLLMENT_REQUEST_CODE 来使用它。
如果 (requestCode == YUNO_ENROLLMENT_REQUEST_CODE) {
}
  1. 如果 requestCode 匹配,处理注册结果。使用 YUNO_ENROLLMENT_RESULT 由 Yuno 库提供的密钥。创建一个 onEnrollmentStateChange 函数来处理状态变化。
onEnrollmentStateChange(data.getStringExtra(YUNO_ENROLLMENT_RESULT))

下面的代码块显示了使用 OnActivityResult 方法,以便在注册状态发生变化时执行函数:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == YUNO_ENROLLMENT_REQUEST_CODE) {
        val enrollmentState = data?.getStringExtra(YUNO_ENROLLMENT_RESULT)
        onEnrollmentStateChange(enrollmentState)
    }
}

fun onEnrollmentStateChange(enrollmentState: String?) {
    when (enrollmentState) {
        "SUCCEEDED" -> {
        }
        "FAIL" -> {
        }
    }
}

步骤 5:获取注册状态

致电 initEnrollment 方法中的 onCreate 方法注册回调,以获取最终的注册状态。

补充功能

Yuno Android SDK 提供额外的服务和配置,您可以用来改善客户体验。使用SDK 定制功能可更改 SDK 外观,使其与您的品牌相匹配,或配置加载器。

styles

随着 styles 自定义选项,您可以通过一个 YunoStyles 对象。通过自定义按钮外观和排版,您可以在整个 SDK 中应用一致的品牌。

data classYunoStyles(
    val buttonStyles:YunoButtonStyles? = null、
    val fontFamily:= null
)
参数说明
buttonStyles自定义 SDK 中显示的主要按钮。
fontFamily设置所有 SDK 文本元素使用的字体系列。

"(《世界人权宣言》) YunoButtonStyles 对象可让您定义按钮外观的特定设置:

data class YunoButtonStyles(
    val backgroundColor: Color? = null、
    val contentColor: Color? = null、
    val cornerRadius:= null
    val elevation:= null、
    val padding:= null、
    val fontFamily:= null、
    val fontSize:TextUnit? = null、
    val fontStyle:FontStyle?
)

使用 YunoConfig 数据类,以使用步骤 3 中描述的 styles 自定义选项。

装载机

通过 keepLoader 参数中的 YunoConfig 数据类,该类已在上文 SDK 配置部分内嵌记录。

渲染选项

您可以选择两种卡片表单渲染选项。下面的截图显示了 cardFormType ONE_STEPSTEP_BY_STEP:

SDK 定制

您可以更改 SDK 的外观,使其与您的品牌相匹配。有关详细信息,请参阅SDK 定制页面。

📘

演示应用程序

除了提供的代码示例,您还可以查看Yuno 存储库,以完成 Yuno Android SDK 的实施。

渲染模式(报名)

通过 Yuno SDK 渲染模式,您可以将注册流程与完整的 UI 控制集成在一起,同时保留 SDK 验证和逻辑。SDK 返回安卓 Fragment 实例,您可以在 Jetpack Compose(通过 AndroidView)和传统 XML 布局中显示这些实例。

主要功能 startEnrollmentRender

fun Activity.startEnrollmentRender(
    customerSession:String、
   countryCode:countryCode: String、
    submitButton:Boolean = false、
    coroutineScope:CoroutineScope、
    listener:YunoEnrollmentRenderListener
):YunoEnrollmentFragmentController

参数

参数类型需要说明
customerSessionString当前注册流程的客户会话
countryCodeString用于区域配置的国家代码
submitButtonBoolean没有如果 true,SDK 会在内部渲染提交操作;否则,请使用您的用户界面
coroutineScopeCoroutineScope用于运行与活动生命周期相关的异步操作的范围
listenerYunoEnrollmentRenderListener接收片段、加载和最终状态事件的监听器

返回值

返回一个 YunoEnrollmentFragmentController 控制注册流程(如提交表格)。

使用示例

class EnrollmentActivity : Activity() {

    private lateinit var fragmentController: YunoEnrollmentFragmentController

    private fun initializeEnrollment() {
        fragmentController = startEnrollmentRender(
            customerSession = "your_customer_session_id",
            countryCode = "US",
            submitButton = false,
            coroutineScope = lifecycleScope,
            listener = enrollmentRenderListener
        )
    }
}

接口: YunoEnrollmentRenderListener

执行此接口可接收注册片段和事件。

interface YunoEnrollmentRenderListener {
    fun showView(fragment: Fragment, needSubmit: Boolean)
    fun returnStatus(resultCode: Int, paymentStatus: String)
    fun loadingListener(isLoading: Boolean)
}

showView(fragment: 片段, needSubmit: 布尔值)

  • 接收要在用户界面容器中显示的片段
  • needSubmit 表示是否应显示自己的提交按钮(当 submitButton = false)

示例 (XML):

override fun showView(fragment: Fragment, needSubmit: Boolean) {
    supportFragmentManager.beginTransaction()
        .replace(R.id.enrollment_container, fragment)
        .commit()

    clientSubmitButton.isVisible = needSubmit
    if (needSubmit) {
        clientSubmitButton.setOnClickListener { fragmentController.submitForm() }
    }
}

returnStatus(resultCode: Int, paymentStatus: String)

  • 最终注册状态事件。用它来通知用户成功或失败

loadingListener(isLoading: 布尔值)

  • 加载状态回调,用于显示/隐藏旋转器和禁用/启用用户界面
override fun loadingListener(isLoading: Boolean) {
    progressBar.isVisible = isLoading
    clientSubmitButton.isEnabled = !isLoading
}

接口: YunoEnrollmentFragmentController

返回 startEnrollmentRender 来控制报名流量。

接口 YunoEnrollmentFragmentController {
    fun submitForm()
}
val fragmentController = startEnrollmentRender(
    customerSession = "your_customer_session_id"、
   countryCode = "US"、
    submitButton = false、
    coroutineScope = lifecycleScope、
    listener = enrollmentRenderListener
)
  1. 控制流量(必要时提交):
fragmentController.submitForm()

渲染模式的优势

用户界面的灵活性

  • 与 Compose(通过 AndroidView)和 XML 兼容
  • 完全控制视图显示的位置和方式
  • 轻松匹配您的应用程序设计系统

流量控制

  • 使用 submitForm()

重要考虑因素

  • 领带 coroutineScope 到您的活动/片段生命周期(如 lifecycleScope)
  • 何时 needSubmit = true渲染自己的提交按钮,并调用 submitForm()
  • 在 Compose 中,将片段放在 AndroidView 集装箱