java实现银联商务扫码支付----微信、支付宝

本文对接银联商务扫码支付,实现支付下单、订单查询、订单退款、退款查询和订单关闭几个功能,使用到银联商务的公众+服务窗支付接口规范,请自行百度下载。
一、接入前准备
创建maven项目,项目目录如下,各目录功能不再详细介绍,直接看接口和功能。

二、接口及代码实现
1.1接口规范
接口规范请查看下载的银联商务公众号+服务窗接口规范下单接口部分,这里不做展示。
1.2 代码实现
1.2.1 UnionPayScanController代码

@RestController
@CrossOrigin
@RequestMapping("/lay")
public class UnifiedPayScanController {private final static Logger logger = LoggerFactory.getLogger(UnifiedPayScanController.class);@Autowiredprivate UnifiedOrderServiceimpl unionpayserviceimpl;/*** 扫码付下单接口* @param request* @param response* @param jsonreq* @return*/@RequestMapping(value = "/UnifiedOrder", method = RequestMethod.POST)public Map<String, Object> unionpayorder(HttpServletRequest request, HttpServletResponse response,@RequestBody String jsonreq) {Map<String,Object> reqmap = new HashMap<String,Object>(); //客户端原始请求mapMap<String,Object> datamap = new HashMap<String,Object>(); //客户端原始请求Data数据Map<String,Object> resultmap = new HashMap<String,Object>(); //返回结果//接收客户端请求数据并转换成mapreqmap = JsonUtils.JsonToMapObj(jsonreq);logger.info("unifiedquery reqmap = " + reqmap);datamap = (Map<String, Object>) reqmap.get("tradeParam"); //请求体数据logger.info("unifiedquery datamap = " + datamap);//---------------------step1  验证签名-----------------------------String sign = (String) reqmap.get("sign");  //获取signString key = UnionPayConstants.GGMD5KEY;  //国光MD5密钥
try {if (!PayUtil.verifySign(datamap,key,sign)) {resultmap.put("returnInfo", "签名错误");resultmap.put("returnCode", "Bad_Sign");return resultmap;}//----------------------step2  验证消息类型  tradeType:UnifiedOrder--------if (!"UnifiedOrder".equals(reqmap.get("tradeType"))) {resultmap.put("returnCode", "TradeType_Error");resultmap.put("returnInfo", "消息类型不符");return resultmap;}//-----------------------step3  验证传参完整性-------------------------- //验证公共参数完整性if(!PayUtil.verifyParameter(datamap)) {resultmap.put("returnCode", "Common_Value_Error");resultmap.put("returnInfo", "缺少必要公共参数");return resultmap;}//验证接口参数完整性if(datamap.get("totalAmount").equals("") || datamap.get("msgType").equals("") || datamap.get("notifyUrl").equals("") || datamap.get("returnUrl").equals("") ||datamap.get("merOrderId").equals("") ) {resultmap.put("returnCode", "Value_Error");resultmap.put("returnInfo", "缺少必要接口参数");return resultmap;}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();resultmap.put("returnCode", "System_Error");resultmap.put("returnInfo", "系统异常");return resultmap;}//-----------------------step4 传值并调用支付链接生成接口--------------------------------Map<String,Object> resultdatamap = new HashMap<String,Object>();resultdatamap.put("mid", datamap.get("mid"));         //商户号resultdatamap.put("tid", datamap.get("tid"));      //终端号resultdatamap.put("instMid", datamap.get("instMid"));    //机构商户号resultdatamap.put("msgSrc", datamap.get("msgSrc"));     //消息来源//  //分转元
//  String Amount = PayUtil.changeF2Y(datamap.get("totalAmount").toString());
//  resultdatamap.put("totalAmount", Amount);       //支付总金额resultdatamap.put("totalAmount", datamap.get("totalAmount"));   //总金额resultdatamap.put("msgType", datamap.get("msgType"));    //支付类型resultdatamap.put("notifyUrl", datamap.get("notifyUrl"));   //支付结果通知resultdatamap.put("returnUrl", datamap.get("returnUrl"));   //网页跳转地址resultdatamap.put("merOrderId", datamap.get("merOrderId"));   //C端上送商户订单号Map<String, Object> urlmap = unionpayserviceimpl.CreateUrl(resultdatamap);   //生成支付链接,返回给前端生成二维码//-----------------------step5 返回报文,支付链接--------------------------------resultmap.put("returnCode", "SUCCESS"); //resultmap.put("returnInfo","生成支付链接成功");Map<String,Object> urldatamap = new HashMap<String,Object>();urldatamap.put("url", urlmap.get("url"));//urldatamap.put("merOrderId", urlmap.get("merOrderId"));urldatamap.put("merOrderId", datamap.get("merOrderId"));resultmap.put("data", urldatamap);return resultmap;
}

1.2.2 UnionpayScanServiceimpl代码
本部分代码为银联商务支付下单接口实现类。本案例对接银联商务支付下单接口,并对接口进行封装,返回给测试网页一个URL支付链接,前端接收到url后,对其进行qrCode转为二维码,用户扫描二维码后完成支付。
包括UnifiedOrder方法和CreateUrl方法,其中UnifiedOrder方法为调起银联商务支付下单的支付链接,CreateUrl方法为返回到前端用于生成支付二维码的实现类。

/***  银联商务支付下单* return map* @throws UnsupportedEncodingException */@Overridepublic String UnifiedOrder(Map<String,Object> map) throws UnsupportedEncodingException {// TODO Auto-generated method stubMap<String, Object> reqmap = new HashMap<String, Object>(); //请求银联商务mapreqmap.put("mid", map.get("mid"));   //商户号reqmap.put("tid", map.get("tid"));   //终端号reqmap.put("instMid", map.get("instMid"));reqmap.put("msgSrc", map.get("msgSrc")); //消息来源reqmap.put("msgId", "UnionPay_F001");  //自定义reqmap.put("msgType", map.get("msgType")); //支付类型,前端传入//报文请求时间String aligetTime = PayUtil.aligetTime();logger.info("end_time = " + aligetTime);reqmap.put("requestTimestamp", aligetTime); //商户订单号//reqmap.put("msgSrcId", this.msgSrcId); //来源编号
//   String orderid = GGitUtil.createOrderID();
//   StringBuffer buff = new StringBuffer();
//   buff.append(this.msgSrcId);
//   buff.append(orderid);reqmap.put("merOrderId", map.get("merOrderId"));reqmap.put("originalAmount", map.get("totalAmount")); //前端传入reqmap.put("totalAmount",map.get("totalAmount")); //订单金额reqmap.put("notifyUrl", map.get("notifyUrl")); //支付结果通知地址reqmap.put("returnUrl", map.get("returnUrl")); //网页跳转地址//生成待签名字符串并进行MD5加密String builderSignStr = "";try {builderSignStr = PayUtil.builderSignStr(reqmap,UnionPayConstants.MD5KEY);//signString = PayUtil.generateSignature(reqmap, UnionPayConstants.MD5KEY);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}reqmap.put("sign", builderSignStr);logger.info("reqmap= " + reqmap);//拼接请求URLStringBuffer url = new StringBuffer();try {url.append("https://qr-test2.chinaums.com/netpay-portal/webpay/pay.do?");url.append("requestTimestamp=" + URLEncoder.encode((String) reqmap.get("requestTimestamp"), "UTF-8") +"&mid=" + URLEncoder.encode((String) reqmap.get("mid"), "UTF-8") + "&tid="+ URLEncoder.encode((String) reqmap.get("tid"), "UTF-8") + "&instMid=" + URLEncoder.encode((String) reqmap.get("instMid"), "UTF-8") + "&msgSrc=" + URLEncoder.encode((String) reqmap.get("msgSrc"), "UTF-8") + "&merOrderId=" + URLEncoder.encode((String) reqmap.get("merOrderId"), "UTF-8") + "&totalAmount=" + URLEncoder.encode((String) reqmap.get("totalAmount"), "UTF-8") + "&msgId=" + URLEncoder.encode((String) reqmap.get("msgId"), "UTF-8") + "&msgType=" + URLEncoder.encode((String) reqmap.get("msgType"), "UTF-8") + "&originalAmount=" + URLEncoder.encode((String) reqmap.get("originalAmount"), "UTF-8") + "&notifyUrl=" + URLEncoder.encode((String) reqmap.get("notifyUrl"), "UTF-8") + "&returnUrl=" + URLEncoder.encode((String) reqmap.get("returnUrl"), "UTF-8") + "&sign=" + URLEncoder.encode((String) reqmap.get("sign"), "UTF-8"));logger.info("银联商务下单url = " + url);} catch (Exception e) {// TODO: handle exceptionreturn "缺少必要参数,请核实后再进行下单";}return url.toString();}/*** 生成支付链接+商户号*/@Overridepublic Map<String, Object> CreateUrl(Map<String, Object> reqmap) {// TODO Auto-generated method stub//生成商户订单号//reqmap.put("msgSrcId", this.msgSrcId); //来源编号
//  String orderid = GGitUtil.createOrderID();
//  StringBuffer buff = new StringBuffer();
//  buff.append(this.msgSrcId);
//  buff.append(orderid);
//  String merOrderId = buff.toString();//拼接请求URLString mid = (String) reqmap.get("mid");String tid = (String) reqmap.get("tid");String instMid = (String) reqmap.get("instMid");String msgSrc = (String) reqmap.get("msgSrc");String totalAmount = (String) reqmap.get("totalAmount");String msgType = (String) reqmap.get("msgType");String notifyUrl = (String) reqmap.get("notifyUrl");String returnUrl = (String) reqmap.get("returnUrl");String merOrderId = (String) reqmap.get("merOrderId");StringBuffer url = new StringBuffer();url.append("http://www.ggzzrj.cn:8081/unionpay/lay/unifiedpay?");url.append("mid=" + mid + "&tid=" + tid + "&instMid=" + instMid + "&msgSrc=" + msgSrc + "&totalAmount=" + totalAmount + "&msgType=" + msgType + "&notifyUrl=" + notifyUrl +"&returnUrl=" + returnUrl + "&merOrderId=" + merOrderId);Map<String,Object> respmap = new HashMap<String,Object>();respmap.put("merOrderId", merOrderId);respmap.put("url", url.toString());return respmap;}

1.3 支付结果截图
在下单接口中,使用测试网页进行测试,用户扫描测试网页生成的支付二维码,然后调起支付页面,用户支付完成时,点击“完成”按钮,跳转到程序中指定的returnurl地址中,支付结果通知到notifyurl地址中,测试网页截图如图示。

支付页面

java对接银联商务扫码支付相关推荐

  1. Java对接支付宝网站扫码支付

    一.对接流程概述 申请支付宝商户号 > 开通支付能力 >申请应用>开发设置>签约开通支付能力>集成SDK 二.流程详解 2.1 申请支付宝账号 2.2开通网站支付功能

  2. Java实现PC微信扫码支付

    Java实现PC微信扫码支付 做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付. 微信支付官方网站 业务流程: 开发指引文档 支付服务开发前提准备: 1.SDK下载:SDK 2.利用外网穿 ...

  3. java对接银联商务公众号+服务窗支付(1)

    java实现银联商务公众号+服务窗对接----支付下单 GitLab地址:https://gitlab.com/982837387/UnionPayGetWay.git 本文对接银联商务公众号+服务窗 ...

  4. java对接银联商务公众号+服务窗支付(2)

    java实现银联商务公众号+服务窗对接----下单查询 本文对接银联商务公众号+服务窗支付,实现支付下单.订单查询.订单退款.退款查询和订单关闭几个功能,使用到银联商务的公众+服务窗支付接口规范,请自 ...

  5. java对接银联商务公众号+服务窗支付(5)

    java实现银联商务公众号+服务窗对接----订单撤销 本文对接银联商务公众号+服务窗支付,实现支付下单.订单查询.订单退款.退款查询和订单关闭几个功能,使用到银联商务的公众+服务窗支付接口规范,请自 ...

  6. java对接银联商务公众号+服务窗支付(4)

    java实现银联商务公众号+服务窗对接----退款查询 本文对接银联商务公众号+服务窗支付,实现支付下单.订单查询.订单退款.退款查询和订单关闭几个功能,使用到银联商务的公众+服务窗支付接口规范,请自 ...

  7. java对接银联商务公众号+服务窗支付(3)

    java实现银联商务公众号+服务窗对接----订单退款 本文对接银联商务公众号+服务窗支付,实现支付下单.订单查询.订单退款.退款查询和订单关闭几个功能,使用到银联商务的公众+服务窗支付接口规范,请自 ...

  8. 微信PC端扫码支付 java 模式二的扫码支付

    前言 这次分享的是java对接微信的支付接口,实现电脑端扫码支付后,跳转支付成功页面的例子.之所以分享是微信的Api太坑了.留下的文档也少,对接过程中容易出现各种各样的问题,在实现这扫码支付功能的时候 ...

  9. java 实时监控微信扫码支付,支付成功跳转到成功页面

    **原文链接:https://www.blog-china.cn/liuzaiqingshan/home/39/1510305872502 欢迎访问个人博客,分享更多技术码上中国博客(CodeChin ...

  10. 企业实战, java、spingboot微信扫码支付,页面生成微信二维码,微信扫码付款,websocket通知,处理订单!复制粘贴代码直接开干

    一  功能描述:    前端选择商品后生成二维码,用户微信扫码支付 备注: 红色为后台给前端的接口 1.前端 选择确认商品 2.调后台生成订单接口 (状态未付款) 3.返回订单的详情(订单确认页面  ...

最新文章

  1. Css 浏览器兼容性及其其他常见问题
  2. latex 数学公式_技能分享——LaTeX篇I
  3. 黑马程序员——GUI篇
  4. 一张图看明白云计算架构核心竞争力
  5. 两台电脑共享怎么设置_两台电脑共用键鼠的简单设置
  6. pytorch卷积神经网络_知识干货-动手学深度学习(pytorch)-06 卷积神经网络基础
  7. 一)关于java的认识:
  8. java之SpringMVC配置!配置!配置!
  9. 关于移动端设备适配的问题
  10. MessageBox.Show常用的2个方法
  11. mysql语句解析_MYSQL中SQL执行分析
  12. MySQL可视化工具推荐
  13. 新媒体广告摘录 形泰传媒 尹语堂®
  14. 常用电子元器件应用要点及识别方法,知识点很专业!
  15. js和ts两种 将 小写金额转中文大写汉字,阿拉伯数字金额格式化成中文大写汉字,数字金额转换成财务发票大写中文
  16. 堆晶结构_堆晶岩形成条件
  17. KVS(AWS Kinesis Video Stream)HLS IOS端播放声音停顿问题解决办法
  18. CSS:使用线性渐变实现标签右上角三角形角标效果/HTML上标、下标
  19. 2015-4-11更新的pdf
  20. 津津的储蓄计划python_津津的储蓄计划 c++

热门文章

  1. H桥和NMOS,PMOS理解
  2. 常用工具列表清单及常用系统介绍
  3. Python菜鸟起飞day2--数据类型(元组,字典,字符串)
  4. POST参数转为DICT
  5. RabbitMQ windows 管理工具
  6. dB dBm dBW 的关系与换算
  7. ss php 搭建,sspanel 前端搭建教程
  8. CDH未开启订阅前下载的安装包!
  9. C++实现双人对战五子棋(附源码)
  10. QT实现的人机对战五子棋