最近做一个PC端商城,需要添加银联网关支付,几经摸索,终于搞出来了,现将代码贴下,以供参考!

一、开发前的准备

1 去银联官网下载相关证书及配置文件
https://open.unionpay.com/ajweb/help/file/techFile?productId=1

2 申请测试账号
https://open.unionpay.com/ajweb/account/testPara

3 注意区分,生产环境还是测试环境,测试环境使用4个证书,生成环境使用3个证书,(我使用的是5.1.0版本,测试证书)

二、项目中的相关配置

1 项目中增加银联配置文件


其中,银联的版本视下载版本而定,密码和用户名均不需用修改;
将下载的证书按图链接的地址进行配置;

2 导入银联所需要的相关工具类

2.1 AutoLoadServlet

    package com.snow.core.pay.yl.config;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import com.snow.core.pay.yl.sdk.SDKConfig;/*** 功能:从应用的classpath下加载acp_sdk.properties属性文件并将该属性文件中的键值对赋值到SDKConfig类中 <br>* 声明:以下代码只是为了方便接入方测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码,性能,规范性等方面的保障*/public class AutoLoadServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {SDKConfig.getConfig().loadPropertiesFromSrc();super.init();}
}**2.2  ChinapayConfig**package com.snow.core.pay.yl.config;import com.snow.core.pay.yl.sdk.SDKConfig;import com.snow.core.pay.yl.sdk.SDKConstants;/*** 名称: demo中用到的方法<br>* 日期: 2015-09<br>* 版权: 中国银联<br>* 声明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码,性能,规范性等方面的保障<br>*/  public class ChinapayConfig {//默认配置的是UTF-8public static String encoding = "UTF-8";//全渠道固定值public static String version = SDKConfig.getConfig().getVersion();//后台服务对应的写法参照 FrontRcvResponse.javapublic static String frontUrl = SDKConfig.getConfig().getFrontUrl();//后台服务对应的写法参照 BackRcvResponse.javapublic static String backUrl = SDKConfig.getConfig().getBackUrl();//受理方和发卡方自选填写的域[O]--后台通知地址// 商户发送交易时间 格式:YYYYMMDDhhmmsspublic static String getCurrentTime() {return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());}// AN8..40 商户订单号,不能含"-"或"_"public static String getOrderId() {return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());}

}
2.3 项目启动时加载配置文件

2.4 修改JDK及增加jar包
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider 因为加入了jdk的第三方安全库,需要额外配置


2.5 演示流程



2.6 相关代码

银联支付

public String goUnionpay(){String basePath = getRequest().getScheme() + "://" + getRequest().getServerName() + ":" + getRequest().getServerPort();if(StrUtils.objectIsNotNull(id)){try {//订单IDorder = microShopService.findEntityById(EcOrder.class, id);//参数配置Map<String, String> requestData = new HashMap<String, String>();requestData.put("version", ChinapayConfig.version);    //版本号,全渠道默认值requestData.put("encoding", ChinapayConfig.encoding);  //字符集编码,可以使用UTF-8,GBK两种方式requestData.put("signMethod", "01");   //签名方法,只支持 01:RSA方式证书加密requestData.put("txnType", "01");      //交易类型 ,01:消费requestData.put("txnSubType", "01");   //交易子类型, 01:自助消费requestData.put("bizType", "000201");  //业务类型,B2C网关支付,手机wap支付requestData.put("channelType", "07");   //渠道类型,这个字段区分B2C网关支付和手机wap支付;07:PC,平板  08:手机/***商户接入参数***/requestData.put("merId", "777290058155070");  //商户号码,请改成自己申请的正式商户号或者open上注册得来的777测试商户号requestData.put("accessType", "0");    //接入类型,0:直连商户requestData.put("orderId", order.getCode());   //商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则requestData.put("txnTime", ChinapayConfig.getCurrentTime());   //订单发送时间,取系统时间,格式为YYYYMMDDhhmmss,必须取当前时间,否则会报txnTime无效requestData.put("currencyCode", "156");   //交易币种(境内商户一般是156 人民币)//查询支付金额BigDecimal totPrice = null;totPrice = new BigDecimal(order.getTotalPrice());//查询金额requestData.put("txnAmt", String.valueOf((totPrice.multiply(new BigDecimal(100))).longValue())); //交易金额,单位分,不要带小数点/** 设置url 必填,不能修改 */StringBuffer rn_url = getRequest().getRequestURL();  String contextUrl = rn_url.delete(rn_url.length() - getRequest().getRequestURI().length(), rn_url.length()).append(getRequest().getContextPath()).toString(); //地址配置requestData.put("frontUrl", contextUrl +"/pc/ec/pay/tp002PcEcPaymentAction_goFrontUrl.action"); //前台请求地址requestData.put("backUrl", contextUrl +"/pc/ec/pay/tp002PcEcPaymentAction_goBackUrl.action");  //后台请求地址Map<String, String> submitFromData = AcpService.sign(requestData, ChinapayConfig.encoding); //签名System.out.println(submitFromData.toString());String requestFrontUrl = "https://gateway.test.95516.com/gateway/api/frontTransReq.do";  //获取请求银联的前台地址:对应属性文件acp_sdk.properties文件中的acpsdk.frontTransUrlString html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData, ChinapayConfig.encoding);   //生成自动跳转的Html表单//将生成的html写到浏览器中完成自动跳转打开银联支付页面;这里调用signData之后,将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改,如果修改会导致验签不通过getResponse().getWriter().write(html);} catch (Exception e) {e.printStackTrace();}}return null;
}   /**前台请求地址*/
public String goFrontUrl(){String result = "orderNotExist";try {logger.info("FrontRcvResponse前台接收报文返回开始");String encoding = getRequest().getParameter(SDKConstants.param_encoding);logger.info("返回报文中encoding=[" + encoding + "]");Map<String, String> respParam = getAllRequestParam();//获取银联回调的参数// 打印请求报文LogUtil.printRequestLog(respParam);Map<String, String> valideData = valideData();//验证签名if (!AcpService.validate(valideData, encoding)) {//验证签名失败logger.info("验证签名结果[失败].");} else {String respCode = valideData.get("respCode");//验证成功后获取银联响应码if ("00".equals(respCode)) {//响应码为00表示支付成功。logger.info("验证签名结果[成功]");//TODO:这个方法在用户支付成功后点击返回商户时,银联回调,这里写回调成功后的一些业务逻辑。String orderCode = valideData.get("orderId");order = microShopService.findEntityByAttribute(EcOrder.class, "code", orderCode);if(null != order){EcOrderItemGroup eoig = microShopService.findEntityByAttribute(EcOrderItemGroup.class, "ecOrder.id", order.getId());microShopId = eoig.getMicroShop().getId();eoig.setPaymentStatus(PaymentStatusConstant.EO_PS_HASTOPAY);eoig.setDealStatus(DealStatusConstant.EO_DS_HASCONFIRMED);eoig = ecOrderItemGroupService.merge(eoig);}List<String> keyWordList = searchKeyWordService.findSearchKeyWordByCount(6, "desc",getPcCompanyCode());if(null != keyWordList && keyWordList.size() > 0){getRequest().setAttribute("keyWordList", keyWordList);}result = "home";} else {logger.info("验证签名结果[失败].");}}} catch (Exception e) {e.printStackTrace();}return result;
}/**后台请求地址*/
public void goBackUrl(){try {logger.info("[进入银联支付回调方法]");String encoding = getRequest().getParameter(SDKConstants.param_encoding);// 获取银联通知服务器发送的后台通知参数Map<String, String> valideData = valideData();//重要!验证签名前不要修改reqParam中的键值对的内容,否则会验签不过if (!AcpService.validate(valideData, encoding)) {logger.info("验证签名结果[失败].");} else {logger.info("验证签名结果[成功].");//【注:为了安全验签成功才应该写商户的成功处理逻辑】交易成功,更新商户订单状态String respCode = valideData.get("respCode");if ("00".equals(respCode)) {//银联返回00代表支付成功//:TODO:该方法在用户支付成功后银联自动异步回调。此处可以写订单支付成功后的业务逻辑getResponse().getWriter().print("ok");//这里一定要写响应。否则银联会认为商户后台没有收到回调信息。}}LogUtil.writeLog("BackRcvResponse接收后台通知结束");} catch (Exception e) {e.printStackTrace();}
} /**验证银联签名*/
private static Map<String, String> valideData() throws IOException {String encoding = getRequest().getParameter(SDKConstants.param_encoding);// 获取银联通知服务器发送的后台通知参数Map<String, String> reqParam = getAllRequestParam();Map<String, String> valideData = null;if (null != reqParam && !reqParam.isEmpty()) {Iterator<Map.Entry<String, String>> it = reqParam.entrySet().iterator();valideData = new HashMap<String, String>(reqParam.size());while (it.hasNext()) {Map.Entry<String, String> e = it.next();String key = (String) e.getKey();String value = (String) e.getValue();value = new String(value.getBytes(encoding), encoding);valideData.put(key, value);}}return valideData;
} /**获取请求参数中所有的信息*/
public static Map<String, String> getAllRequestParam() {Map<String, String> res = new HashMap<String, String>();Enumeration<?> temp = getRequest().getParameterNames();if (null != temp) {while (temp.hasMoreElements()) {String en = (String) temp.nextElement();String value = getRequest().getParameter(en);res.put(en, value);// 在报文上送时,如果字段的值为空,则不上送<下面的处理为在获取所有参数数据时,判断若值为空,则删除这个字段>if (res.get(en) == null || "".equals(res.get(en))) {res.remove(en);}}}return res;
}

银联网关支付 java版相关推荐

  1. 银联批量结算 java_银联在线 网关支付 (JAVA版)

    这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...

  2. 银联在线支付 java_银联在线 网关支付 (JAVA版)

    这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...

  3. java微信支付代码_10行代码搞定微信支付(Java版)

    原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...

  4. 银联在线 网关支付(中国银联全渠道系统商户接入 测试指引-银联网关支付产品)

    https://blog.csdn.net/yulei_qq/article/details/49025045 中国银联全渠道系统商户接入 测试指引-银联网关支付产品 https://blog.csd ...

  5. 微信支付java版v2.0_刷卡支付-翟东平-专题视频课程

    微信支付java版v2.0_刷卡支付-1814人已学习 课程介绍         微信支付系列课程将讲解"刷卡支付"."扫码支付"."公众号支付&qu ...

  6. 视频教程-企业微信支付JAVA版_向员工收款-微信开发

    企业微信支付JAVA版_向员工收款 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息 ...

  7. 银联网关支付demo

    对接银联支付接口,通过一个例子向商家支付金额. 1.首先在银联开放平台下载支付Demo,点击链接 或者直接拿我修改好的demo,链接: https://pan.baidu.com/s/1FywgOf5 ...

  8. springMvc之银联网关支付(详解)

    一.申请与配置 1.了解产品和申请测试账号 无论接入什么平台,首先就是了解自己的需求,然后从开发文档中查看接入方式. 进入银联技术开放平台 点击 点击我是商户,然后进行注册.(注意:注册或登录时用IE ...

  9. thinkphp集成银联网关支付简单实例

    thinkphp集成银联手机网关支付简单实例 准备工作 网银手机网关支付产品开发包下载: https://open.unionpay.com/ajweb/help/file/toDetailPage? ...

  10. 银联支付-java版(亲测OK)

    一.前提 先参考:https://blog.csdn.net/sunroyi666/article/details/71107228 二.废话不多说直接上代码 https://github.com/P ...

最新文章

  1. Google Instant 瞬时搜索上手指南
  2. 小调查:足足两周了,下周你上班否?
  3. [ 墨者学院 ] 命令执行——Bash漏洞分析溯源
  4. 运行 命令 linux,Linux基本命令运行
  5. 查看oracle连接数满了的记录,查看Oracle的连接数
  6. el表达式遍历list中的list_EL表达式获取map和list集合中的值 | 学步园
  7. 最小生成树算法讨论(转)
  8. java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO
  9. HTTP 请求之性能优化:DNS预解析 dns-prefetch
  10. 【Redis 开发与运维】初识 Redis
  11. PC端如何跟手机端兼容
  12. 手写板(数位板)如何和希沃白板5无缝切换
  13. 如何在python同一行内输入若干个数?
  14. 数码数字字体_拍中画幅胶片能不能用数码相机测光?
  15. 镜像加速器——使用加速器可以提升获取Docker官方镜像的速度
  16. java 调用 yed 绘制 流程图_流程图绘制软件──yEd
  17. 计算机应用基础 第一次形成作业(计算机知识综合测试,在线答题)
  18. 如何在OpenAI创建一个api key(chatgpt)?
  19. Java:StringBuffer
  20. 如何在https协议下访问http等不安全的资源

热门文章

  1. 企业oa系统是什么,有什么好用的办公软件推荐?
  2. OA系统中的会议管理
  3. 数据结构与算法分析Java语言描述 第三版 课后习题 练习 答案
  4. 基础篇:6.5)形位公差-标注 Mark
  5. uni-app使用小图标的方式
  6. MTK6589编译出错
  7. 计算机网络的定义以及分类
  8. 思科模拟器cisco模拟器
  9. 下载频道2013免积分人气资源大汇总
  10. 这101个网站你要是没进过,那你就OUT了