前段时间集成了银联、微信和支付宝,感觉银联和微信的集成过程都是比较容易的,只有支付宝在和后台进行加签的过程中容易出错,导致支付失败。自己总结了集成的过程,希望可以分享和记录下来。
一.银联的demo和jar包下载流程就不细讲了,可以到官网进行下载。
二.支付流程:
1.银联支付流程图:
三.支付流程文字讲解:
1.在客户端提交用户选择的产品信息,如:价格、产品名称等信息到我们的服务端。
2.我们的服务端会从银联服务端返回一个流水号(21位纯数字)给客户端。
3.客户端通过这个流水号(即是tn)调用起银联的支付界面。
4.然后我们在银联的支付控件填写银行卡等信息,支付控件会把这些信息发送到银联服务端。
5.最终银联服务端把支付结果返回我支付控件,支付控件会调用当前Activity的onActivityResult()方法。
四.开发步骤:(在AndroidStudio中开发)
一.导入jar包、.so文件、bin文件和在AndroidManifest配置一些信息。
1.添加资源文件
在我们中银联官网下载的文件中找到libentryexpro.so和ibuptsmaddon.so文件,并拷贝到
工程的libs/xxx/目录下,其中xxx为 armeabi-v7a、armeabi、arm64-v8a、x86、x86_64中之一;拷贝UPPayAssistEx.jar和UPPayPluginExPro.jar到libs目录下;在工程中新建一个assets目录,把data.bin复制到该目录下。
2.在AndroidManifest文件下配置。
<application>
<!--工程其它配置此处省略…-->
<uses-library android:name="org.simalliance.openmobileapi" android:required="false"/>
<activity
android:name="com.unionpay.uppay.PayActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
android:excludeFromRecents="true"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name="com.unionpay.UPPayWapActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"/>
</application>
<textarea readonly="readonly" name="code" class="java">
配置一些权限:
<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_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<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="android.permission.RECORD_AUDIO"/>
<uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permissionandroid:name="org.simalliance.openmobileapi.SMARTCARD" />
</textarea>
二.前期工作都做好了,是时候开始写代码了。
1.第一步是向后台发送请求,把金额和订单信息传给后台。
2.我使用的是retrofit和Rxjava网络请求,这是我请求后台成功后调用的方法。
// “00” – 银联正式环境
// “01” – 银联测试环境,该环境中不发生真实交易
@Override
public void getBankPayCodeSuccess(String model) {
int ret = UPPayAssistEx.startPay(PayMentActivity.this, null, null, model, "00");
if (ret == PLUGIN_NEED_UPGRADE || ret == PLUGIN_NOT_INSTALLED) {
// 需要重新安装控件
NormalAlertDialog dialog = new NormalAlertDialog.Builder(PayMentActivity.this)
.setBoolTitle(true)
.setContentText("完成购买需要安装银联支付控件,是否安装?")
.setLeftText("取消")
.setRightText("确认")
.setHeight(0.23f)
.setWidth(0.75f)
.setOnclickListener(new DialogInterface.OnLeftAndRightClickListener<NormalAlertDialog>() {
@Override
public void clickLeftButton(NormalAlertDialog dialog, View view) {
dialog.dismiss();
}
@Override
public void clickRightButton(NormalAlertDialog dialog, View view) {
UPPayAssistEx.installUPPayPlugin(PayMentActivity.this);
dialog.dismiss();
}
}).setTouchOutside(true)
.build();
dialog.show();
}
}
model就是我们的服务端返回的流水号,然后我们通过银联jar的
UPPayAssistEx.startPay(PayMentActivity.this, null, null, model, "00")方法去调起银联支付控件。
3.重写onActivityResult(intrequestCode,intresultCode, Intent data)方法,在该方法中判断支付的结果。
if( data == null ){
return;
}
String str = data.getExtras().getString("pay_result");
if( str.equalsIgnoreCase(R_SUCCESS) ){
// 支付成功后,extra中如果存在result_data,取出校验
// result_data结构见c)result_data参数说明
if(data.hasExtra("result_data")) {
String sign = data.getExtras().getString("result_data");
} else {
// 未收到签名信息
// 建议通过商户后台查询支付结果
}
}else if( str.equalsIgnoreCase(R_FAIL) ){
showResultDialog(" 支付失败! ");
}else if( str.equalsIgnoreCase(R_CANCEL) ){
showResultDialog(" 你已取消了本次订单的支付! ");
到这一步,银联支付基本完成了,在官方的demo中,会有一个验签证书的过程,我们在开发时你不需要,直接删掉
好,不然会支付失败。