安卓支付篇|安卓接入支付宝支付 傻瓜式接入
我们的项目一般都会用到支付 这里涉及到支付宝,微信,银联等支付方式;
今天我们要讲的是 支付宝支付的接入;
为了方便新手的接入,这次的博客只讲应用App端的接入流程;
涉及到Appid 等参数的配置,我们在实际开发中只需要服务端配置即可;
有兴趣可以了解下配置流程;
言归正传 下面我们来看我们的接入流程:
1.下载支付宝 JAR包:
常规操作,到开放平台直接下载jar包,存放如图:
2.添加我们的Jar包依赖 一句话搞定:
//TODO 支付宝支付
api files('libs/alipaySdk.jar')
3.添加支付所需权限,应用已有的可忽略这步:
<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" />
4.支付宝支付Activity调用所需的Activity配置:
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
<activity
android:name="com.alipay.sdk.app.H5AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
5.添加支付宝Jar的混淆 :
在proguard-ules.pro文件中添加混淆,该文件在build.gradle下面
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
6.建立支付宝支付的回调类:
import android.text.TextUtils;
import java.util.Map;
/**
* 支付宝回调
*/
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;
}
}
7.最后一步,最重要的一步,调起支付相关核心代码:
/**
* 支付宝支付相关
*/
private static final int SDK_PAY_FLAG = 1;
private static class MyHandle extends MyHandler<ComfirmOrderAct> {
public MyHandle(ComfirmOrderAct classs) {
super(classs);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ComfirmOrderAct activity= ref.get();
switch (msg.what) {
case SDK_PAY_FLAG:
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
String resultStatus = payResult.getResultStatus();
/**
* 判断resultstatus,为9000则是支付成功,否则失败
* 9000这里有漏洞,需要深入判断??
*/
if (TextUtils.equals(resultStatus, "9000")) {
/**
* 真实支付结果还需要依赖服务端返回的信息.
*/
ToastUtil.show(activity,"支付成功");
activity.finish();
} else {
ToastUtil.show(activity,"支付失败");
}
break;
default:
break;
}
}
}
/**
* 用户先将下单的信息上传服务端,服务端返回一个orderInfo
* 再通过orderInfo调起支付宝APP支付.
*/
private String orderInfo;
private void payThread() {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(getActivity());
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
ThreadManager.THREAD_POOL_EXECUTOR.execute(payRunnable);
}
Handler可以修改为自己常用的方式,线程池可以修改为自己的普通线程运行;