项目中需要集成支付宝支付,看了下支付宝官方文档,真是越来越简单,用起来真的太方便了。废话不多说,直接上图:
大概说下实现思路:
1、首先在官方注册成为开发者,这点太简单了,照着官方文档操作即可。(点击进入)
2、导入官方的sdk,下载官方Sdk(下载)。
3、配置相关的权限。
4、进行支付接口的调用。
5、支付结果获取和处理。
开撸:
由于第一二步,网上的demo实在太多,这里就不在重复。直接说说最新版中的相关配置,以及调用:
导入最新的jar包,并且进行同步。
在清单文件中声明:
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
配置权限:
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<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" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
支付接口的调用:
<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" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
private void pay(final BBB body) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayActivity.this);
Map<String, String> result = alipay.payV2(body.getData(), true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
private void pay(final BBB body) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayActivity.this);
Map<String, String> result = alipay.payV2(body.getData(), true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}
(注意:此处调用支付接口中的参数,全部是来源于服务器,包括秘钥等信息,这也就是我说无脑的原因,之前这些信息都是需要在客户端进行加密。最新版直接获得服务器返回数据即可。且支付行为需要在独立的非ui线程中执行);
支付结果获取和处理:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为9000则代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
setResult(1);
finish();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(PayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
};
(该回调方法用户接口,服务器异步返回的信息,可用于判断是否支付成功)