Android开发:app工程集成银联支付功能(服务器端)

  • 一功能描述
  • 二实现过程
    • 1下载银联支付SDK和Demo

      • 1银联商家服务地址httpsopenunionpaycomajwebindex
      • 2下载的文件如下
    • 2集成过程
      • 1先试官方Demo
      • 2集成到自己的工程里

一.功能描述

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

二.实现过程

2.1下载银联支付SDK和Demo

(1)银联商家服务地址:https://open.unionpay.com/ajweb/index

第一步:注册;

第二步:然后在帮助中心界面的产品分类下载里选择手机控件支付;

第三步:下载安卓版的开发包。

(2)下载的文件如下

2.2集成过程

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

(1)先试官方Demo

  • 将工程导入

  • 修改acp_sdk_properties的配置

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

我的测试环境证书地址:

  • Run一个试试

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

  • 首页

  • 获取tn

最后打印的报文

(2)集成到自己的工程里

先讲服务器端,因为自己也才完成了这部分工作。运行了官方Demo以及相关说明文档后,整体思路其实就有了。

首先试试配置!!!

  • jar包

将Demo工程lib中的jar包复制到自己工程的lib里(如果已经有jar包了,就不需要复制了)

  • 修改acp_sdk_propertise和log4j.properties

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

  • 导入相关java文件

之所以写用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文件

  • web.xml配置

    增加

<servlet>
    <servlet-name>autoLoadServlet</servlet-name>
    <servlet-class>com.XXX.component.pay.AutoLoadServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>autoLoadServlet</servlet-name>
    <url-pattern>/autoLoadServlet</url-pattern>
  </servlet-mapping>

ok,配置过程就算完事了,现在就该写PayController来接受请求了。

  • PayController控制器

    其实就是Form05_6_2_AppConsume.java中的代码,因为使用是SSM架构,就改了改架构而已。

@Controller
public class PayController extends BasicController{
    @RequestMapping(value = "/pay/pay")
    @ResponseBody
    public void pay(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {

        request.setCharacterEncoding(DemoBase.encoding_UTF8);//
        response.setContentType("text/html; charset="+ DemoBase.encoding_UTF8);//这两句是我临时加的,因为出现了乱码

        Map<String, String> contentData = new HashMap<String, String>();

        /***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
        contentData.put("version", DemoBase.version);            //版本号 全渠道默认值
        contentData.put("encoding", DemoBase.encoding_UTF8);     //字符集编码 可以使用UTF-8,GBK两种方式
        contentData.put("signMethod", "01");                    //签名方法 目前只支持01:RSA方式证书加密
        contentData.put("txnType", "01");                       //交易类型 01:消费
        contentData.put("txnSubType", "01");                    //交易子类 01:消费
        contentData.put("bizType", "000201");                   //填写000201
        contentData.put("channelType", "08");                   //渠道类型 08手机

        String merId = request.getParameter("merId");
        String txnAmt = request.getParameter("txnAmt");
        String orderId = request.getParameter("orderId");
        String txnTime = request.getParameter("txnTime");

        /***商户接入参数***/
        contentData.put("merId", merId);                        //商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
        contentData.put("accessType", "0");                     //接入类型,商户接入填0 ,不需修改(0:直连商户, 1: 收单机构 2:平台商户)
        contentData.put("orderId", orderId);                    //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则
        contentData.put("txnTime", txnTime);                    //订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效
        contentData.put("accType", "01");                       //账号类型 01:银行卡02:存折03:IC卡帐号类型(卡介质)
        contentData.put("txnAmt", txnAmt);                      //交易金额 单位为分,不能带小数点
        contentData.put("currencyCode", "156");                 //境内商户固定 156 人民币
        //contentData.put("reqReserved", "透传字段");              //商户自定义保留域,交易应答时会原样返回
        //后台通知地址(需设置为外网能访问 http https均可),支付成功后银联会自动将异步通知报文post到商户上送的该地址,【支付失败的交易银联不会发送后台通知】
                //后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
                //注意:1.需设置为外网能访问,否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码
                //    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200或302,那么银联会间隔一段时间再次发送。总共发送5次,银联后续间隔1、2、4、5 分钟后会再次通知。
                //    5.后台通知地址如果上送了带有?的参数,例如:http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签,否则将会验签失败
        contentData.put("backUrl", DemoBase.backUrl);//[其实还没搞明白这个地址的作用]

        /**对请求参数进行签名并发送http post请求,接收同步应答报文**/
        Map<String, String> reqData = AcpService.sign(contentData,DemoBase.encoding_UTF8);           //报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
        String requestAppUrl = SDKConfig.getConfig().getAppRequestUrl();                                 //交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.backTransUrl
        Map<String, String> rspData = AcpService.post(reqData,requestAppUrl,DemoBase.encoding_UTF8);  //发送请求报文并接受同步应答(默认连接超时时间30秒,读取返回结果超时时间30秒);这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过

        /**对应答码的处理,请根据您的业务逻辑来编写程序,以下应答码处理逻辑仅供参考------------->**/
        //应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
        if(!rspData.isEmpty()){
            if(AcpService.validate(rspData, DemoBase.encoding_UTF8)){
                LogUtil.writeLog("验证签名成功");
                String respCode = rspData.get("respCode") ;
                if(("00").equals(respCode)){
                    //成功,获取tn号
                    //String tn = resmap.get("tn");//这里应该是rspData.get("tn");
                    //TODO
                }else{
                    //其他应答码为失败请排查原因或做失败处理
                    //TODO
                }
            }else{
                LogUtil.writeErrorLog("验证签名失败");
                //TODO 检查验证签名失败的原因
            }
        }else{
            //未返回正确的http状态
            LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
        }
        String reqMessage = DemoBase.genHtmlResult(reqData);
        String rspMessage = DemoBase.genHtmlResult(rspData);
        try {
            response.getWriter().write("请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"");
            //response.getOutputStream().write(("请求报文:<br/>"+reqMessage+"<br/>" + "应答报文:</br>"+rspMessage+"").getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            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获取搭好了,还有退款退货等等以及客户端的搭建,接着搞~~

时间: 2024-10-15 18:12:56

Android开发:app工程集成银联支付功能(服务器端)的相关文章

Android开发:app工程集成银联支付功能(客户端)

Android开发:app工程集成银联支付功能(客户端) email:[email protected] 上一篇博文完成了服务器端的集成,可参考: Android开发:app工程集成银联支付功能(服务器端).这一篇博文完成客户端的集成. 一.功能描述 银联支付流程如下所示: 上一篇尝试了tn的获取,本篇将跑通整个流程. 二.实现部分 先说一下我的IDE是as(Android Studio)+win7 64位 2.1配置,依旧是配置 按照官方说明文档,就可以完成,我在这里贴上结构图,因为as的特殊

Android开发:app工程集成银联-退货退款功能

一.前言 之前已经将银联支付功能进行了集成(服务器端戳这里,客户端戳这里),暂时将退款功能搁下了,今天抽了一小段光阴把这个洞给补上了. 其实有了上一次集成支付功能的经验,对退货退款的集成就很容易实现了.本文只讲服务器端的处理,客户端根据需求写好就行. 银联官方提供了一个退货退款流程图: 所以过程主要是:服务器端组织好请求报文->银联系统进行处理->将受理结果和处理结果返回给服务器. 二.实现 我在代码中做了一些注释,所以看完代码和注释基本就没问题了.前提条件依旧是,完成好各项配置工作,可以参考

Android开发App工程结构搭建

本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的.      从艺术的角度看,其实我们是在追求一种美. 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板.      1. 微盘      2. 久忆日记      3.网易新

iOS 集成银联支付(绕过文档的坑,快速集成)

iOS 集成银联支付(绕过文档的坑,快速集成) 本文是投稿文章,作者:南栀倾寒当初集成支付宝的时候,觉得见了这么丑的代码,加上这么难找的下载地址,在配上几乎为零的文档,寒哥就要吐血了. 下午去集成银联,才知道血吐的早了. 下载地址:https://open.unionpay.com/upload/download/Development_kit85427986.rar 其实我找了半个小时 也不知道怎么就下载好了 这个我在Chrome的下载记录里找到的 解压之后会有这样的目录结构 Paste_Im

SpringSide集成支付宝支付功能

网络购物很流行,那么最流行的支付手段估计应该是支付宝了,那么怎么样将支付宝集成到自己的环境中呢,今天我来讲一下如何在springside框架中集成支付宝支付功能. 首先,我们去支付宝商家服务页面去注册和申请支付功能,并在那里下载sdk开发包https://b.alipay.com/order/productDetail.htm?productId=2012111200373124,这个是支付宝的即时到账收款功能,然后下面有一个流程的介绍,我们选择下面的技术集成,先下载sdk开发包,下载完成之后解

Android开发:app工程集成mob短信验证码功能

一.前言 现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错.那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题. PS:太喜欢mob的logo了. 二.实现过程 本篇只涉及A

Android集成银联支付,提示java.lang.UnsatisfieldLinkError错误

尽管解决方法很简单,但还是记录一下吧. 最近做银联支付(Android),官方给的demo是eclipse的.按照官方(https://open.unionpay.com/ajweb/product)给的步骤,在Android studio中一步一步集成.运行出错,提示 java.lang.UnsatisfieldLinkError: Couldn't load entryexpro from loader dalvik.system.PathClassLoader... 官方文档中也提到了这个

怎么在我们的App中集成条码扫描功能?

现在很多App都有条码扫描功能,有的手机比如某米在照相机中集成了条码扫描功能,但是还有一部分手机没有这样的集成,比如韩国某星,需要自己下载一个条码扫描App.今天我们就来看看怎么在自己的App中集成一个条码扫描的功能. 本文源码下载地址http://download.csdn.net/detail/u012702547/9101419 先来看张效果图: 自己开发一个条码扫描显然是非常不现实的,我们可以使用GitHub上的开源控件ZXing来实现这样一个功能. 使用ZXing当然要先下载:http

iOS 集成银联支付swift

①  首先添加银联支付的SDK到项目中,如图: ② 由于类库使用的C++编写,所以需要写一个插件而且是用OC来写,如图: ③ 然后创建OC与swift的桥接文件,并且引入头文件. ④ 在支付页面调用支付 我这里用NSURLConnectionDelegate来做的网络请求,截图的方法是完成加载之后,调用插件的方法,这个方法有四个参数,第一个是把请求的结果,其实也就是支付单号(现实开发中是使用服务器返回的),第二个"00"代表真实环境,我这里传入的表示测试环境,第三个就是调用这个方法的控