本文问主要介绍接入支付宝支付中客户端的代码集成过程,运用的工具为AS(Android Studio)。(​​官网说明文档​​)

一、 集成支付宝SDK

  (1) 找到项目代码中app文件夹下的build.gradle文件。

    APP接入支付宝支付(二)-- APP客户端集成_支付宝

  (2) 在dependencies下添加依赖

    

dependencies{
......
//支付宝
implementation(name: 'alipaysdk-15.8.01.210112203525', ext: 'aar')
......
}


    添加完之后点击编辑器窗口右侧的Sync Now,当AS下方提示完成时,表示支付宝SDK资源导入完成。

    APP接入支付宝支付(二)-- APP客户端集成_异步调用_02

二、 添加权限

    运行支付宝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;
}
}