本文的前提是你已经申请好了银联的相关资料,即将进入集成阶段或者遇到坑了(没错。我踩了== 吐槽下 这东西真是渣),不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() {@Overridepublic void onClick(View v) {Log.e(LOG_TAG, " " + v.getTag());mGoodsIdx = (Integer) v.getTag();mLoadingDialog = ProgressDialog.show(mContext, // context"", // title"正在努力的获取tn中,请稍候...", // messagetrue); // 进度是否是不确定的,这只和创建进度条有关/************************************************** 步骤1:从网络开始,获取交易流水号即TN************************************************/new Thread(BaseActivity.this).start();}};
@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {UPPayAssistEx.installUPPayPlugin(APKActivity.this);dialog.dismiss();}});builder.setPositiveButton("取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}
这个可以自己看着办
最后,添加回调
@Overrideprotected 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() {@Overridepublic 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