Android支付(支付宝,微信,银联)集成使用
关于Android支付(支付宝,微信,银联),在做过的项目中都有涉及过,无非就是按照其官方开发文档来写,但是不乏有许多坑的地方。这里趁着闲暇时间来写出来,如果有些的不正确的地方请大家及时提出来,谢谢!(这里只是简单的集成和使用,具体的按需求来)
一,支付宝
先看交互流程(重要)
1.准备
①创建应用(生成APPID),登录https://openhome.alipay.com/platform/appManage.htm
最后上传应用图标,填写回调接口地址和设置公钥后提交审核即可,审核通过后就会如第一张图所示。
②生成公钥和私钥
生成公钥和私钥,请查看https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1
当生成后,公钥和私钥(请勿丢失)会在以下图中的目录中
2.集成
①导入jar包,这里可以到https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1下载,然后导入即可
3,使用
① 在AndroidManifest.xml配置
1》权限
<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"/>
2》Activity
<!--Alipay begin-->
<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>
<!--Alipay end-->
②复制需要的文件,可以参考官方Demo
这里我将开发所需的APPID和私钥为方便写在了本地,这里不推荐,不太安全。
4,调用
调用方法
AlipayApi.AliPay(this,mHandler, "这里传入商户后台返回的订单信息"); //注意:后台返回的订单信息是根据一定的格式拼接的
public class AlipayApi {
public static final int SDK_PAY_FLAG = 1;
public static final int SDK_AUTH_FLAG = 2;
public static void AliPay(final Activity mContext, final Handler mHandler, final String orderInfos) {
if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {
new AlertDialog.Builder(mContext).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
mContext.finish();
}
}).show();
return;
}
boolean rsa2 = (RSA2_PRIVATE.length() > 0);
Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
final String orderInfo = orderParam + "&" + sign;
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(mContext);
Map<String, String> result = alipay.payV2(orderInfo, 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();
}
}
支付回调(异步)
/**
* 支付宝支付通知
* 注意:在新版支付宝中,异步通知商户后台的接口在支付宝平台配置的"接口回调地址"中配置,这里就不像老版本一样需要在代码中配置
*/
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case AlipayApi.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(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); //支付成功操作
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); //支付失败操作
}
break;
}
case AlipayApi.SDK_AUTH_FLAG: {
@SuppressWarnings("unchecked")
AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判断resultStatus 为“9000”且result_code
// 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 获取alipay_open_id,调支付时作为参数extern_token 的value
// 传入,则支付账户为该授权账户
Toast.makeText(MainActivity.this,
"授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
.show();
} else {
// 其他状态值则为授权失败
Toast.makeText(MainActivity.this,
"授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
};
};
注:关于订单信息这块,可以是商户后台按照一定的格式传入,也可以是Android开发者按照官方文档来进行拼接,具体的就不在描述。
最后集成和使用完成。
二,微信
更新中……
三,银联
银联支付请查看该地址:http://www.devstore.cn/evaluation/testInfo/98-133.html
上一篇: 【微信支付】微信APP支付
下一篇: ANN之手写数字识别