交易流程如下图:
安卓端这边要做的就是把商品给后台,后台返回tn,然后通过tn去启动支付控件完成支付,银联返回支付结果
公司采用的是多Moudle项目管理,然后我在集成云闪付支付的时候,需要放so文件导致了冲突,但是又不报错,就是云闪付支付控件调用不起来。
1.首先去银联官网(银联安卓SDK包下载地址)下载对应的sdk包。
以防某些兄弟第一次,不熟悉这里老司机给你们引条路:
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)
**这里讲个东西,很多人放进去后都喜欢在项目中app的build.gradle添加如下代码
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
千万不要这样乱搞,这句话的意思是把库文件的位置转移到了libs目录下了,如果你是多Module,那你就冲突了兄弟,如果不是当我没说。
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.** {*;}
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();//这还是个自定义的对话框,兄弟们自己定义个就好了
}
创作不易,欢迎一键三连(评论,点赞,关注)