银联支付流程

本文的前提是你已经申请好了银联的相关资料,即将进入集成阶段或者遇到坑了(没错。我踩了== 吐槽下 这东西真是渣),不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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值