本文的前提是你已经申请好了银联的相关资料,即将进入集成阶段或者遇到坑了(没错。我踩了== 吐槽下 这东西真是渣),不bb了,直接开始吧
照着文档把相关的so jar data.bin文件拷贝到相应的文件夹,权限,activity注册等弄完之后。(再看文档,想吐槽)接下来看demo的三个activity:BaseActivity APKActivity JARActivity
首先是BaseActivity,基本的流程都在这个Activity里了
/*****************************************************************
* mMode参数解释: "00" - 启动银联正式环境 "01" - 连接银联测试环境
*****************************************************************/
private final String mMode = "01";
private static final String TN_URL_01 = "http://101.231.204.84:8091/sim/getacptn";
private final View.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(LOG_TAG, " " + v.getTag());
mGoodsIdx = (Integer) v.getTag();
mLoadingDialog = ProgressDialog.show(mContext, // context
"", // title
"正在努力的获取tn中,请稍候...", // message
true); // 进度是否是不确定的,这只和创建进度条有关
/*************************************************
* 步骤1:从网络开始,获取交易流水号即TN
************************************************/
new Thread(BaseActivity.this).start();
}
};
@Override
public void run() {
String tn = null;
InputStream is;
try {
String url = TN_URL_01;
URL myURL = new URL(url);
URLConnection ucon = myURL.openConnection();
ucon.setConnectTimeout(120000);
is = ucon.getInputStream();
int i = -1;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((i = is.read()) != -1) {
baos.write(i);
}
tn = baos.toString();
is.close();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
Message msg = mHandler.obtainMessage();
msg.obj = tn;
mHandler.sendMessage(msg);
}
需要注意的,在用银联demo给的tn,和测试账号的时候,用01测试环境,在真正和后台交互的时候要换成00开发环境,不然报错。
demo中的步骤一,我们可以忽略掉,因为这个步骤一是在请求一个银联给的接口,只是用来获取tn值。(咱们上面第三部已经获取了tn值,所以直接跳过步骤一即可)
/*************************************************
* 步骤2:通过银联工具类启动支付插件
************************************************/
doStartUnionPayPlugin(this, tn, mMode);
其实这个是一个回调,你不封装的话这个没什么卵用,其实就是直接调用
UPPayAssistEx.startPay(activity, null, null, tn, mode);
上面代码可以在JARActivity中找到,当然,也可以在APKActivity中找到
// mMode参数解释:
// 0 - 启动银联正式环境
// 1 - 连接银联测试环境
int ret = UPPayAssistEx.startPay(this, null, null, tn, mode);
if (ret == PLUGIN_NEED_UPGRADE || ret == PLUGIN_NOT_INSTALLED) {
// 需要重新安装控件
Log.e(LOG_TAG, " plugin not found or need upgrade!!!");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("完成购买需要安装银联支付控件,是否安装?");
builder.setNegativeButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
UPPayAssistEx.installUPPayPlugin(APKActivity.this);
dialog.dismiss();
}
});
builder.setPositiveButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
这个可以自己看着办
最后,添加回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/*************************************************
* 步骤3:处理银联手机支付控件返回的支付结果
************************************************/
if (data == null) {
return;
}
String msg = "";
/*
* 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
*/
String str = data.getExtras().getString("pay_result");
if (str.equalsIgnoreCase("success")) {
// 如果想对结果数据验签,可使用下面这段代码,但建议不验签,直接去商户后台查询交易结果
// result_data结构见c)result_data参数说明
if (data.hasExtra("result_data")) {
String result = data.getExtras().getString("result_data");
try {
JSONObject resultJson = new JSONObject(result);
String sign = resultJson.getString("sign");
String dataOrg = resultJson.getString("data");
// 此处的verify建议送去商户后台做验签
// 如要放在手机端验,则代码必须支持更新证书
boolean ret = verify(dataOrg, sign, mMode);
if (ret) {
// 验签成功,显示支付结果
msg = "支付成功!";
} else {
// 验签失败
msg = "支付失败!";
}
} catch (JSONException e) {
}
}
// 结果result_data为成功时,去商户后台查询一下再展示成功
msg = "支付成功!";
} else if (str.equalsIgnoreCase("fail")) {
msg = "支付失败!";
} else if (str.equalsIgnoreCase("cancel")) {
msg = "用户取消了支付";
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("支付结果通知");
builder.setMessage(msg);
builder.setInverseBackgroundForced(true);
// builder.setCustomTitle();
builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
至此,demo中的东西都抄完了。满心欢喜运行起来。特么的坑爹了,竟然报错了。是的,就是下面这个坑爹的错误。
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.jlkf.mph-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] couldn't find "libentryexpro.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:988)
at com.unionpay.UPPayAssistEx.r(Unknown Source)
at com.unionpay.UPPayAssistEx.n(Unknown Source)
at com.unionpay.c.onError(Unknown Source)
at com.unionpay.b.b.a(Unknown Source)
at com.unionpay.b.b.a(Unknown Source)
at com.unionpay.UPPayAssistEx.a(Unknown Source)
at com.unionpay.UPPayAssistEx.a(Unknown Source)
at com.unionpay.UPPayAssistEx.startPay(Unknown Source)
at com.jlkf.mph.mine.activitys.AccountRechargeActivity.handleMessage(AccountRechargeActivity.java:317)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5298)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:708)
如果你也遇到了这个错误,恭喜你,我也遇到了,而且我也解决了,其实原因就是你把so文件什么的都放在了lib文件夹下,解决方法有两种
第一种,打开build.gradle文件,添加下面代码
sourceSets.main.jniLibs.srcDirs = ['libs']
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'x86', 'armeabi','arm64-v8a','x86_64'
}
}
再打开你的gradle.properties文件,添加
android.useDeprecatedNdk=true
运行起来,就ok了
第二种 把你的东西丢到jniLibs文件夹下就可以了,至此,总算把银联支付集成了
其他错误参考https://open.unionpay.com/ajweb/help/faq/list?id=142&level=0&from=1