前段时间集成了银联、微信和支付宝,感觉银联和微信的集成过程都是比较容易的,只有支付宝在和后台进行加签的过程中容易出错,导致支付失败。自己总结了集成的过程,希望可以分享和记录下来。

一.银联的demo和jar包下载流程就不细讲了,可以到官网进行下载。

二.支付流程:

1.银联支付流程图:

ios 银联支付sdk app银联支付_控件


三.支付流程文字讲解:

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中,会有一个验签证书的过程,我们在开发时你不需要,直接删掉
好,不然会支付失败。