其实支付并没有想象中的难,只是在签约上一大堆麻烦事,需要各种证件,需要审核...
首先申明该文章写于2014年12月初,大家可以参考.
先说说步骤:
一、签约
1. 银联商户入网申请,商家服务 --- 申请成商户 --- 在线产品
* 为了给您提供更好的服务,请耐心填写以下信息,提交申请后,我们的工作人员会及时与您取得联系。
认真填写、然后等电话吧,(1-2 个工作日)
2.客服会让你填写一堆文件,认证信息,然后快递到他们那里。
3.审核通过,技术接入。
4.先调试测试环境
5.上传商户测试环境报告(审核,发放正式环境参数)。
二、支付流程
相信这张流程图介绍的很清楚了..
1.Android客户端,给后台发送商品信息参数
2.然后台去推送订单,后台拿到交易流水号(tn)
3.Android客户端拿到tn后,才能启动银联
4.银联会根据tn查询订单信息,也就是我们后台推送的信息,给予显示
5.用户支付-操作
6.操作完毕,分别回调客户端、异步返回后台。
三、银联SDK接入
要把银联接入客户端非常简单,前提你要签约成功。
这里银联对Android有俩种方式接入
① Apk接入方式 :调用startPay方法,调起手机中单独安装的控件
② 静态库集成 :调用startPayByJar方法,调起内置在商户app里的控件
官方是推荐Apk接入,自己更新,方便接入,只需要一个jar包,相比静态酷一大堆so文件、太过麻烦,不易更新。
启动银联时候,监测不存在 需要提示安装,把银联UPPayPluginEx.apk (银联手机支付服务)放到assets 目录下,免流量下载,保证apk最新就ok!
四、简单Dome案例
---看代码不说话:
public class MainActivity extends Activity {
final String LOG_TAG = "MainActivity";
//模拟tn 流水号
private String tn ="201412111131390051642";
/**
* mMode参数解释:
* "00" - 启动银联正式环境
* "01" - 连接银联测试环境
*/
private final String mMode = "01";
public static final int PLUGIN_VALID = 0;
public static final int PLUGIN_NOT_INSTALLED = -1;
public static final int PLUGIN_NEED_UPGRADE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onButton(View view){
doStartUnionPayPlugin();
}
private void doStartUnionPayPlugin() {
// 用于启动前监测,如(银联支付服务apk),如果 tn 和 环境匹配会直接启动银联插件
int ret = UPPayAssistEx.startPay(this, null, null, tn, mMode);
Log.i(LOG_TAG, "状态:"+ (ret == UPPayAssistEx.PLUGIN_VALID));
//监测不存在 需要提示安装,把银联UPPayPluginEx.apk 放到assets 目录下,免流量下载,保证apk最新就ok
if (ret == PLUGIN_NEED_UPGRADE || ret == PLUGIN_NOT_INSTALLED) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("完成购买需要安装银联支付控件,是否安装?");
builder.setNegativeButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
boolean isUPPay = UPPayAssistEx.installUPPayPlugin(MainActivity.this);
Log.e(LOG_TAG, "是否安装成功: "+isUPPay);
}
});
builder.setPositiveButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data == null) {
return;
}
String msg = "";
/*
* 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
*/
String str = data.getExtras().getString("pay_result");
System.out.println("返回:"+str);
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();
}
}