自支付宝 SDK 15.5.7 开始,打包方式更换为 AAR,替代之前的 JAR 打包,SDK 支付接口部分不变.现在就基于支付宝SDK15.5.7集成支付宝支付
首先下载新的AAR的SDK包:
一.下载完将里面的AAR格式包放入到项目的libs里面
二.在您主项目的 build.gradle
中,添加下面的内容,将 libs
目录作为依赖仓库:
allprojects {
repositories {
google()
jcenter()
maven { url 'https://www.jitpack.io' }
flatDir {
dirs 'libs'
}
}
}
三.在您 App Module 的 build.gradle 中,添加下面的内容,将支付宝 SDK 作为项目依赖:
//支付宝支付
implementation (name: 'alipaySdk-15.5.7-20181023110917', ext: 'aar')
权限配置:
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果您的应用已经升级 targetSdk
到 23 及以上,则需要在运行时向用户申请 WRITE_EXTERNAL_STORAGE
和 READ_PHONE_STATE
这两项权限。
到这里咱们的资源和配置工作已经准备完成,接下来就是调起支付宝了
调起支付宝只需要一个参数就是订单的签名,就是后台返回给你的一个字符串,假装咱们已经有了这个字符串
String qianming = "后台返回过来的签名";
例如:
{
"code": 800,
"msg": "成功",
"obj": "alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2016120103702677&biz_content=%7B%22out_trade_no%22%3A%22R42581972062%22%2C%22product_code%22%3A%22QUICK_WAP_PAY%22%2C%22subject%22%3A%22%E6%94%AF%E4%BB%98%E5%AE%9D%E6%94%AF%E4%BB%98%22%2C%22total_amount%22%3A%220.01%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2F%E5%B7%A5%E7%A8%8B%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%9C%B0%E5%9D%80%2Falipay.trade.page.pay-JAVA-UTF-8%2Fnotify_url.jsp&sign=II53m99LCRlE%2BTnpYg6UzZa0TOmLdWXjb60ikkvkozgPHzwhtYsi4e%2B3gBw%2FaD7NtyURsxaXTmsEzwDB2D99oXzZbuWAOTQtRPLoaNXNu%2FouZqXmZ71aQ1llYpt1o%2FYe2YpUTO2cvQHLgBSC%2FBOK55avlm9LwEK4BkZVyz8qTLg%3D&sign_type=RSA×tamp=2018-11-27+21%3A32%3A26&version=1.0"
}
其中obj字段就是咱们需要用到的签名
然后就是根据这个签名调起支付宝进行支付,订单的信息全部都在这个签名里面,在你的获取签名的请求成功方法里面加入
//支付
PayUtils pay = new PayUtils(ConfirmOrderActivity.this, mHandler);
pay.ZFB_PAY(qianming, ConfirmOrderActivity.this);
private static final int SDK_PAY_FLAG = 1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
/**
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
Log.e("alicode", resultStatus + "");
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(ConfirmOrderActivity.this, "支付成功",
Toast.LENGTH_SHORT).show();
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(ConfirmOrderActivity.this, "支付结果确认中",
Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(ConfirmOrderActivity.this,
"支付失败" + resultStatus, Toast.LENGTH_SHORT)
.show();
}
}
break;
}
}
}
;
};