在安卓系统中整合Hover SDK进行离线M-Pesa支付
在Android应用程序中整合支付模块是很有趣的,但对初学者来说,这可能是一个挑战。电子支付是电子商务应用货币化的一个关键功能。在现代社会中,M-Pesa交易可以在线和离线进行。
在你的应用程序中纳入支付功能时,有不同的支付网关可供选择。
例如,你可以使用Safaricom Daraja API,iPay,Pesapal,和PayPal。然而,这些网关缺乏一个东西;离线支持。
大多数人拥有智能手机,但并不总是连接到互联网。他们可能需要在离线时进行交易,如汇款。这就是Hover SDK 的用处。
什么是Hover SDK?
Hover是一个安卓SDK,允许将货币功能整合到移动应用程序中。
这个SDK不需要互联网连接,相反,它可以在安卓应用中自动进行USSD 。
该SDK可以在全球任何移动网络上运行USSD会话。这包括USSD互动,如移动货币支付、购买通话时间、支付账单、购买互联网捆绑服务、访问银行服务等。
前提条件
要继续学习,你应该具备以下条件
- 在你的机器上安装了[Android Studio]。
- 具有创建和运行Android应用程序的良好知识。
- [Kotlin]编程语言和视图绑定的基本知识。
- 一个Hover账户。
目标
在本教程中,我们将。
- 了解Hover SDK如何工作。
- 创建一个Hover应用程序。
- 了解动作,包括如何创建和定制它们。
- 将Hover SDK集成到Android应用中。
Hover SDK是如何工作的?
通常情况下,USSD会话涉及拨打一个给定的根代码,然后按照编号指示访问所提供的服务。
这个过程有时是令人厌烦的,因为用户可能会犯错或USSD会话可能会超时。
在我们的案例中,我们需要用Hover SDK在安卓系统中实现M-Pesa Send Money 服务的自动化。
以下是你在使用USSD会话时向一个人汇款的步骤。
- 拨打
*334#。 - 按
1,选择Send money。 - 再一次,按
1,选择Send money。 - 输入收件人的
phone number。 - 输入你想发送的
amount。 - 输入你的
M-Pesa PIN。 - 最后,按
1到accept并完成交易。
有了Hover SDK,用户不需要通过所有这些步骤来进行交易。USSD会话是自动化的。
什么是行动?
术语action ,指的是使用USSD代码时的路径。Hover使用创建的行动来导航到设备的USSD菜单。
登录到您的Hover账户,点击仪表板上的+ New Action ,创建一个动作。

行动包括。
- 一个名称 - 在本教程中我们将使用
Send Money。 - 一个描述,这是可选的。
- 运行该服务的移动网络供应商/SIM卡 - 本教程中我们将使用Safaricom。
- 行动类型--我们将使用
USSD类型。 - 根代码 - 用于启动会话的短代码。
创建动作后,你需要添加steps 。USSD会话中的每个屏幕都由一个步骤表示。
下面是你可以按照不同种类的步骤从USSD会话中发送钱的例子。
- 数字 - 预定义的选项,如输入1。
- 变量 - 随着程序的运行而改变的条目,如要发送的金额。Hover SDK将在运行时输入它们。
- PIN提示 - 向用户显示PIN输入界面。
下面是你如何将这些步骤放在Hover仪表板中。
- 一个
Number类型的步骤,选择 "1 "来发送金钱。 - 同样,一个
Number类型的步骤来选择 "1 "发送金钱。 - 一个
Variable的步骤,选择收件人的电话号码。 - 一个
Variable,选择要转移的金额。 - 增加插入用户的PIN码步骤--当行动在设备上执行时,用户被要求输入他们的PIN码。
- 最后,提供一个
Number步骤,让你选择 "1 "来完成交易。

对于我们所包含的两个变量,我们将使用变量名称phoneNumber 和amount ,在运行时为这些步骤提供数值。
一旦你保存了这个动作,你就可以进入下一个步骤。在你的仪表板上,你会看到与此类似的东西。

在Hover仪表板中创建一个Hover应用程序
你的安卓应用由一个在Hover服务器上运行的Hover应用来代表。一个独特的API令牌被分配给在Hover仪表板上建立的每个应用程序。
要创建一个Hover应用,请进入你的账户仪表板,选择+ New App 。
- 输入你的应用程序的名称 - 这将只作为一个参考。
- 输入你的应用程序包的名称 - 它必须与你的应用程序级
build.gradle文件中的applicationId相同。 - 你可以指定一个Webhook URL,Hover将向其发送USSD会话信息的JSON表示。

在Android中实现Hover
利用Hover SDK,我们将创建一个简单的Android应用程序,执行M-Pesa汇款交易。
第1步 - 创建我们的安卓应用程序
在这一步,创建一个空的Android Studio项目,如下图所示。

第2步 - 设置项目
在你的项目级build.gradle 文件中,添加Hover maven资源库。
allprojects {
repositories {
google()
mavenCentral()
maven { url "http://maven.usehover.com/releases" }
}
}
在你的应用级build.gradle 文件中,添加Hover依赖项。
implementation 'com.hover:android-sdk:1.7.2'
在你的AndroidManifest.xml 文件中,包括你的API令牌。
<application
...
<meta-data
android:name="com.hover.ApiKey"
android:value="Your_Token"/>
</application>
当仍在清单文件中时,别忘了包括以下权限。
<manifest
...
<uses-sdk tools:overrideLibrary="com.hover.sdk" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
</manifest>
第3步 - 设计用户界面
在这一步,我们将设计一个简单的XML 布局,提示用户输入收件人的电话号码和交易的金额。
最后,该布局将有一个按钮来启动交易过程。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Hover SDK M-PESA Send Money"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editTextPhoneNumber"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:hint="Phone e.g. 07123456"
android:inputType="phone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<EditText
android:id="@+id/editTextAmount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:hint="Amount"
android:inputType="number"
app:layout_constraintEnd_toEndOf="@+id/editTextPhoneNumber"
app:layout_constraintStart_toStartOf="@+id/editTextPhoneNumber"
app:layout_constraintTop_toBottomOf="@+id/editTextPhoneNumber" />
<Button
android:id="@+id/buttonSend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Send"
app:layout_constraintEnd_toEndOf="@+id/editTextAmount"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="@+id/editTextAmount"
app:layout_constraintTop_toBottomOf="@+id/editTextAmount"/>
</androidx.constraintlayout.widget.ConstraintLayout>
第4步 - 在MainActivity中初始化Hover
在onCreate 方法中,调用Hover.initialize(this) ,下载我们创建的动作,并在应用程序中初始化Hover SDK。
第5步 - 运行USSD会话
在这一步,一旦用户点击发送按钮,USSD动作就会启动。
binding.buttonSend.setOnClickListener {
try {
val intent = HoverParameters.Builder(this)
.request("ActionID")
.extra("phoneNumber", binding.editTextPhoneNumber.text.toString().trim())
.extra("amount", binding.editTextAmount.text.toString().trim())
.buildIntent()
startActivityForResult(intent, 0)
} catch (e: Exception) {
Toast.makeText(this@MainActivity, "Hover Error", Toast.LENGTH_SHORT).show()
}
}
在上面的代码中,我们已经创建了一个类型为HoverParameters 的意图,并将以下方法串联起来。
.request("ActionID")并传递你在hover dashboard中生成的ActionID。.extra("phoneNumber", PHONE_NUMBER)和 - 这些是我们在创建Action时声明的运行时变量。.extra("amount", AMOUNT)- 最后,我们添加了
buildIntent()方法来创建一个HoverParamater意向。
创建意图后,调用startActivityForResult(intent, 0) 来启动它。
注意:记得把你的代码包在一个
try...catch块内,以处理任何异常。
第6步--监听USSD会话的信息
我们在MainActivity中覆盖了onActivityResult() ,以获得经过处理的USSD会话的结果。
RESULT_OK 表示一个请求被接受,并且正在被USSD运营商处理,而 表示出了问题。RESULT_CANCELED
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
try {
if (requestCode == 0 && resultCode == RESULT_OK) {
Toast.makeText(this, "You will receive an M-Pesa confirmation message shortly",
Toast.LENGTH_SHORT).show()
} else if (requestCode == 0 && resultCode == RESULT_CANCELED) {
Toast.makeText(this, data?.getStringExtra("error"), Toast.LENGTH_SHORT).show()
Log.d(TAG, "onActivityResult: ${data?.getStringExtra("error")}")
}
} catch (e: Exception) {
Log.d(TAG, "onActivityResult: ${e.localizedMessage}")
}
}
你可以通过以下方式获得会话的universally unique identifier (UUID)。
val uuid = data?.getStringExtra("uuid");
结论
Hover SDK可以被集成到需要支付模块的大型项目中。
在本教程中,我们已经学会了如何在Hover仪表板上勾勒动作、添加步骤以及创建悬停应用程序。我们还将Hover SDK整合到了一个Android应用程序中。