因为是自己开发了一个app应用,没资格去申请微信支付和支付宝支付,于是就采用了银联支付功能,银联支付分为了两种环境:测试环境和生产环境,一般前期开发的时候都是使用测试环境,数据都是测试数据,不会发生真实交易。第一次做Android项目+IDE为Android Studio+第一次集成支付功能,所以个人觉得整个集成过程可能有点复杂,而且银联支付产品众多:网关支付产品、手机控件支付、手机网页支付等等,第一次看的时候真是云里雾里,不知道选哪个,不知道他们的区别,最后自己选择了手机控件支付,先试试,光看没有用。自己做了多少写多少,好记性不如烂笔头,就怕后面想记录的时候忘记了前面的过程。
2.1下载银联支付SDK和Demo
第一步:注册;
第二步:然后在帮助中心界面的产品分类下载里选择手机控件支付;
第三步:下载安卓版的开发包。

(2)下载的文件如下

2.2集成过程
个人建议可以先把服务器端的工程跑一下,这样结合代码的时候就很容易明白怎么集成到自己的工程里了。所以这一小部分内容是官方Demo的运行情况,需要修改的配置很少,但是还是有小地方需要调整一下。
(1)先试官方Demo

将这三个路径修改为测试环境证书的路径(证书在assets文件夹下),可以使用相对路径或者绝对路径都行,下面图中是绝对路径,我把assets/测试环境证书下的三个文件移动到了C盘。
我的测试环境证书地址:

启动tomcat过程中比较关键的一处就是


最后打印的报文

(2)集成到自己的工程里
先讲服务器端,因为自己也才完成了这部分工作。运行了官方Demo以及相关说明文档后,整体思路其实就有了。
首先试试配置!!!
将Demo工程lib中的jar包复制到自己工程的lib里(如果已经有jar包了,就不需要复制了)

- 修改acp_sdk_propertise和log4j.properties
(主要是一些路径的修改,因为我的服务器上只有C盘,所以我必须得改,acp_sdk_properties的修改见(1)运行Demo部分)

之所以写用import的方式是为了少出现乱码的问题,见下图

第一部分 controller对应于Demo中的ACPSample_AppServer\src\com\unionpay\acp\demo,其中PayController是我自己写的Controller。
第二部分model对应于Demo中的ACPSample_AppServer\src\com\unionpay\acp\sdk
第三部分的两个java文件对应于Demo中的\ACPSample_AppServer\src\web中的两个java文件
autoLoadServlet
com.XXX.component.pay.AutoLoadServlet
0
autoLoadServlet
/autoLoadServlet
ok,配置过程就算完事了,现在就该写PayController来接受请求了。
- PayController控制器
其实就是Form05_6_2_AppConsume.java中的代码,因为使用是SSM架构,就改了改架构而已。
@Controller
public class PayController extends BasicController{
@RequestMapping(value = )
@ResponseBody
public void pay(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding(DemoBase.encoding_UTF8);
response.setContentType(+ DemoBase.encoding_UTF8);
Map contentData = new HashMap();
/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
contentData.put(, DemoBase.version);
contentData.put(, DemoBase.encoding_UTF8);
contentData.put(, );
contentData.put(, );
contentData.put(, );
contentData.put(, );
contentData.put(, );
String merId = request.getParameter();
String txnAmt = request.getParameter();
String orderId = request.getParameter();
String txnTime = request.getParameter();
/***商户接入参数***/
contentData.put(, merId);
contentData.put(, );
contentData.put(, orderId);
contentData.put(, txnTime);
contentData.put(, );
contentData.put(, txnAmt);
contentData.put(, );
contentData.put(, DemoBase.backUrl);
/**对请求参数进行签名并发送http post请求,接收同步应答报文**/
Map reqData = AcpService.sign(contentData,DemoBase.encoding_UTF8);
String requestAppUrl = SDKConfig.getConfig().getAppRequestUrl();
Map rspData = AcpService.post(reqData,requestAppUrl,DemoBase.encoding_UTF8);
/**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
if(!rspData.isEmpty()){
if(AcpService.validate(rspData, DemoBase.encoding_UTF8)){
LogUtil.writeLog();
String respCode = rspData.get() ;
if(().equals(respCode)){
}else{
}
}else{
LogUtil.writeErrorLog();
}
}else{
LogUtil.writeErrorLog();
}
String reqMessage = DemoBase.genHtmlResult(reqData);
String rspMessage = DemoBase.genHtmlResult(rspData);
try {
response.getWriter().write("+reqMessage+ + "+rspMessage+);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后浏览器输入(get方式,在Form05_6_2_AppConsume.java中get和post方式是一样的,我的PayController因为没有指定请求方式,所以两种方式也是兼容的,而且只是为了测试采用的get,后面把客户端搭好,就用post方式)
:http://123.XX.XXX.127:8080/intveh/pay/pay?merId=777290058110048&txnTime=20160505092851&orderId=20160505092851&txnAmt=5
效果和官方Demo一样:

目前就把服务器端的tn获取搭好了,还有退款退货等等以及客户端的搭建,接着搞~~