安卓集成云闪付,以及So库冲突多moudle项目解决办法

安卓集成云闪付,以及So库冲突多moudle项目解决办法

  • 支付流程介绍
    • 1.无图无真相
    • 2.前往银联下载修仙工具
    • 3.权限和混淆配置
    • 4.开始编写代码
    • 5.完结撒花

支付流程介绍

交易流程如下图:

安卓端 商户后台 银联后台 1.浏览商品,点击下单 2.提交订单信息 3.返回交易流水号(tn) 4.返回交易流水号(tn) 5.通过交易流水号启动支付控件开始支付 6.支付控件收集支付信息,完成支付 7.通知商户后台支付结果 8.通知支付控件支付结果 9.支付控件通知安卓端支付结果 安卓端 商户后台 银联后台

安卓端这边要做的就是把商品给后台,后台返回tn,然后通过tn去启动支付控件完成支付,银联返回支付结果
公司采用的是多Moudle项目管理,然后我在集成云闪付支付的时候,需要放so文件导致了冲突,但是又不报错,就是云闪付支付控件调用不起来。

1.无图无真相

安卓集成云闪付,以及So库冲突多moudle项目解决办法_第1张图片

安卓集成云闪付,以及So库冲突多moudle项目解决办法_第2张图片

2.前往银联下载修仙工具

安卓集成云闪付,以及So库冲突多moudle项目解决办法_第3张图片
1.首先去银联官网(银联安卓SDK包下载地址)下载对应的sdk包。
以防某些兄弟第一次,不熟悉这里老司机给你们引条路:
安卓集成云闪付,以及So库冲突多moudle项目解决办法_第4张图片安卓集成云闪付,以及So库冲突多moudle项目解决办法_第5张图片
2.有了开发包后,我们又可以愉快的进行下一步了,把开发包里面的东西放到我们自己项目里面
拷贝 upmp_android/sdkPro/jar/data.bin 到自己工程的 assets/目录下
拷贝upmp_android/sdkPro/UPPayAssistEx.jar到工程的libs/目录下
拷贝upmp_android/sdkPro/jar/UPPayPluginExPro.jar到工程的libs/目录下
拷贝所有的so文件到工程的jniLibs(与res同级)目录下,如下图所示(这个和官方的不一样,因为我的项目是多Moudle项目,不这么做会导致so库冲突,进而后续调用不起支付控件)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200521135324175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MzYzNTA2,size_16,color_FFFFFF,t_70#pic_center ==350x650)安卓集成云闪付,以及So库冲突多moudle项目解决办法_第6张图片

安卓集成云闪付,以及So库冲突多moudle项目解决办法_第7张图片
**这里讲个东西,很多人放进去后都喜欢在项目中app的build.gradle添加如下代码

 sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

安卓集成云闪付,以及So库冲突多moudle项目解决办法_第8张图片千万不要这样乱搞,这句话的意思是把库文件的位置转移到了libs目录下了,如果你是多Module,那你就冲突了兄弟,如果不是当我没说。

**3.**最后附上一张把开发包放到自己项目的集成图:
安卓集成云闪付,以及So库冲突多moudle项目解决办法_第9张图片安卓集成云闪付,以及So库冲突多moudle项目解决办法_第10张图片

3.权限和混淆配置

1.在工程的AndroidManifest.xml文件中注册支付插件使用的Activity。添加如下:

     <uses-library
        android:name="org.simalliance.openmobileapi"
        android:required="false"/>
    <activity
        android:name="com.unionpay.uppay.PayActivity"
        android:configChanges="orientation|keyboardHidden|keyboard"
        android:screenOrientation="portrait">
    </activity>
    <activity
        android:theme="@style/UPPay"
        android:name="com.unionpay.UPPayWapActivity"
        android:configChanges="orientation|keyboardHidden|fontScale"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize">
    </activity>

如果应用没有给Application显示设置dialogTheme,在Android Q上可能会出
现dialog是透明的现象,解决方法给com.unionpay.uppay.PayActivity和
com.unionpay.UPPayWapActivity设置一个定义了dialogTheme的主题。如:


同时添加,银联支付插件相关权限

<uses-permission
android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission
android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERN
AL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_PHONE_S
TATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_
STATE"/>
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc.hce"/>
<uses-permissionandroid:name="org.simalliance.openmobileapi.SMARTCARD" />

2.Proguard规则:

//在proguard文件中添加如下规则
-dontwarn com.unionpay.**
-keep class com.unionpay.** {*;}
-keep class org.simalliance.openmobileapi.** {*;}

4.开始编写代码

安卓集成云闪付,以及So库冲突多moudle项目解决办法_第11张图片
1.首先先判断用户有没有装云闪付APP

 if (!UPPayAssistEx.checkWalletInstalled(PayActivity.this)) {
                          //没装的话给个吐司让用户装咯
                        }

2.从后台获取tn

   String tn = getOrderQuickParamResult.getPayParam();//这个是我json解析后的对象,你们的自己换
   //这个tn是后台传过来的
   Message msg = mHandler.obtainMessage();
   msg.obj = tn;
   mUppHandler.sendMessage(msg);//mUppHandler这个自己定义下记得在onCreate中初始化( mUppHandler = new Handler(this); )

3.通过银联工具类启动支付插件
先让你的Activity去实现Handler.Callback接口,实现他的handleMessage方法

  //云闪付相关
    @Override
    public boolean handleMessage(Message msg) {
        String tn = "";
        if (msg.obj == null || ((String) msg.obj).length() == 0) {
            networkErrorDialog = new LenzDialog(PayActivity.this,
                    new Params().setTitle(PayActivity.this.getResources().getString(R.string.system_tip))
                            .setContent(PayActivity.this.getResources().getString(R.string.cloud_quickpass_number))
                            .setPositiveString(PayActivity.this.getResources().getString(R.string.confirm))
                           , R.style.lenzDialog);
            networkErrorDialog.setOnClickPositiveListener(new OnClickPositiveListener() {
                @Override
                public void onClick(View v) {
                    networkErrorDialog.dismiss();
                }
            });
            networkErrorDialog.setOnClickNegetiveListener(new OnClickNegetiveListener() {
                @Override
                public void onClick(View v) {
                    networkErrorDialog.dismiss();
                }
            });
            networkErrorDialog.show(); //这个就一个自定义的对话框,大家随意发挥
        } else {
            tn = (String) msg.obj;
            /*************************************************
             * 步骤2:通过银联工具类启动支付插件
             * 自己去定义private final String mMode = "01";
             * mMode参数解释: "00" - 启动银联正式环境 "01" - 连接银联测试环境
             ************************************************/
           UPPayAssistEx.startPay(this,  null, null, tn, mMode);
        }
        return false;

    }

4.在Activity的onActivityResult方法中接收支付插件返回的结果

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, 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 = getString(R.string.paysuccess_tip);
        } else if (str.equalsIgnoreCase("fail")) {
            msg = getString(R.string.payfailed_tip);
        } else if (str.equalsIgnoreCase("cancel")) {
            msg = getString(R.string.user_cancel_payment);
        }
        paymentResultDialog = new LenzDialog(PayActivity.this,
                new Params().setTitle(PayActivity.this.getResources().getString(R.string.system_tip))
                        .setContent(msg)
                        .setPositiveString(PayActivity.this.getResources().getString(R.string.confirm))
                , R.style.lenzDialog);
        paymentResultDialog.setOnClickPositiveListener(new OnClickPositiveListener() {
            @Override
            public void onClick(View v) {
                paymentResultDialog.dismiss();
            }
        });
        paymentResultDialog.setOnClickNegetiveListener(new OnClickNegetiveListener() {
            @Override
            public void onClick(View v) {
                paymentResultDialog.dismiss();
            }
        });
        paymentResultDialog.show();//这还是个自定义的对话框,兄弟们自己定义个就好了
    }

5.完结撒花

创作不易,欢迎一键三连(评论,点赞,关注)
在这里插入图片描述

你可能感兴趣的:(Android)