虽然银联在手机支付方面用处不多 ,但因为他集成简单,费率较低 ,我公司在app开发中调用发了银联支付
首先 第一步 导入包
关于上面的几个so文件 我在做测试的时候知保留了armeabi文件夹下的so文件,如果全加上的话只有华为的手机能够跑的起来,自己百度了一下,原来那几个文件夹是针对不同的手机处理器的,最简单的办法,就是只添加armeabi下的SO文件,,不管你信不信 反正我信了
第二部 清单文件中必要的权限,以及银联支付界面Activity
前几天有人问我 在jar包中封装的Activity怎么办 我当时还不知道,,直到用到了银联 银联的jar包中也封装了一个用于支付的Activity 只需要在清单文件中申明他的路径就行了,比如
<activity android:name="com.unionpay.uppay.PayActivity">
</activity>
还有 在jar包中还应提供方法,能够打开这个Activity
正常的银联支付流程应该是这样
1向服务器后台发请求,传递参数—>2服务器后台向银联发送请求,获取交易所需的TN号—>3服务器给前端返回结果(包括TN号,交易流水号等等)—>4前端拿着TN号向银联发送支付请求—>5银联返回交易结果(交易成功还是失败)
包括支付宝,微信支付等,,所有的MD5,base64加密,订单信息拼接等都是在服务器后台完成的,如果在前台的话安全性无法得到保证
//代码
package com.longyue.plugindemo2;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import com.unionpay.UPPayAssistEx;
import com.unionpay.uppay.PayActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.view.View;
import android.widget.Button;
public class BaseActivity extends Activity implements Callback,
Runnable {
private Handler mHandler = null;
private ProgressDialog mLoadingDialog = null;
/*****************************************************************
* mMode参数解释: "00" - 启动银联正式环境 "01" - 连接银联测试环境
*****************************************************************/
//在正式开发环境中要将参数置为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) {
mLoadingDialog = ProgressDialog.show(BaseActivity.this,//上下文
"提示信息", // title
"正在努力的获取tn中,请稍候...", // message
true); // 进度是否是不确定的,这只和创建进度条有关
/*************************************************
* 步骤1:从网络开始,获取交易流水号即TN
************************************************/
new Thread(BaseActivity.this).start();//启动线程向银联和后台发送请求
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler(BaseActivity.this);
Button btn0 = (Button) findViewById(R.id.btn0);
btn0.setTag(0);
btn0.setOnClickListener(mClickListener);
}
@Override
public boolean handleMessage(Message msg) {
if (mLoadingDialog.isShowing()) {
mLoadingDialog.dismiss();
}
String tn = "";
if (msg.obj == null || ((String) msg.obj).length() == 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("错误提示");
builder.setMessage("网络连接失败,请重试!");
builder.setNegativeButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
} else {
tn = (String) msg.obj;
/*************************************************
* 步骤2:通过银联工具类启动支付插件
************************************************/
doStartUnionPayPlugin(this, tn, mMode);
}
return false;
}
//处理银联支付结果回调
@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")) {
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.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
//在正式的开发环境中,用自己的网络请求框架访问服务器,获得TN号
@Override
public void run() {
//向服务器发送请求,获取交易流水号即TN
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();
}
//拿到交易流水号,向handler发送消息
Message msg = mHandler.obtainMessage();
msg.obj = tn;
mHandler.sendMessage(msg);
}
public void doStartUnionPayPlugin(Activity activity, String tn, String mode) {
//银联工具类,用于启动银联,向服务器发送请求
UPPayAssistEx.startPayByJAR(activity, PayActivity.class, null, null,tn, mode);
}
}