本文问主要介绍接入支付宝支付中客户端的代码集成过程,运用的工具为AS(Android Studio)。(官网说明文档)
一、 集成支付宝SDK
(1) 找到项目代码中app文件夹下的build.gradle文件。
(2) 在dependencies下添加依赖
dependencies{
......
//支付宝
implementation(name: 'alipaysdk-15.8.01.210112203525', ext: 'aar')
......
}
添加完之后点击编辑器窗口右侧的Sync Now,当AS下方提示完成时,表示支付宝SDK资源导入完成。
二、 添加权限
运行支付宝SDK需要以下三个权限,这样能够优化支付体验。
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
在应用项目代码中main文件夹下的AndroidManifest.xml文件中,在manifest下添加权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="XXX">
......
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
......
</manifest>
三、 调用支付接口
(1) 设置一个点击事件,表示启用支付宝支付。调用服务端的接口,参数为支付金额、产品描述等信息,返回值为订单信息。
(2) 将从服务端返回的订单信息作为参数,调用如下方法:
private void AliPay(String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(MainActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;//int 自定义 异步调用标识 唯一
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
其中的参数orderInfo是从服务端获取的订单信息。
(3) 通过Handler对象获取支付结果。在调用支付的Activity中创建全局变量
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what){
case MainActivity.SDK_PAY_FLAG: //异步调用标识 与(2)中调用的是同一参数
//获取支付结果
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
* 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
break;
}
}
};
(4) 类PayResult.java。第(3)中的类PayResult代码如下:
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(Map<String, String> rawResult) {
if (rawResult == null) {
return;
}
for (String key : rawResult.keySet()) {
if (TextUtils.equals(key, "resultStatus")) {
resultStatus = rawResult.get(key);
} else if (TextUtils.equals(key, "result")) {
result = rawResult.get(key);
} else if (TextUtils.equals(key, "memo")) {
memo = rawResult.get(key);
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}
}