当前位置: 首页 > news >正文

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

java实现银联商务公众号+服务窗对接----下单查询

本文对接银联商务公众号+服务窗支付,实现支付下单、订单查询、订单退款、退款查询和订单关闭几个功能,使用到银联商务的公众+服务窗支付接口规范,请自行百度下载。
在上一篇支付下单中,已经实现公众号下单支付,本篇将介绍下单查询接口的对接实现,并将我使用到的银联商务的请求接口和响应接口进行封装,使用测试网页输出测试信息。
一、接口及代码实现
1.下单查询接口
1.1接口规范
接口规范请查看下载的银联商务公众号+服务窗接口规范下单查询接口部分,这里不做展示。
1.2 代码实现
1.2.1 UnifiedQueryInfoController代码

/**
  * 
  * 根据商户订单号查询支付状态
  * @param request
  * @param response
  * @param merOrderId 商户订单号
  * @return
  * @throws UnsupportedEncodingException
  */
 @RequestMapping(value = "/OrderQuery", method = RequestMethod.POST)
 public Map<String, Object> query(HttpServletRequest request, HttpServletResponse response, @RequestBody String jsonreq) throws UnsupportedEncodingException {  
  Map<String,Object> reqmap = new HashMap<String,Object>();  //客户端原始请求map
  Map<String,Object> map = new HashMap<String,Object>();   //请求银联商务map
  Map<String,Object> datamap = new HashMap<String,Object>();  //客户端原始请求Data数据
  Map<String,Object> resultmap = new HashMap<String,Object>(); //返回结果
  //接收客户端请求数据并转换成map
  reqmap = JsonUtils.JsonToMapObj(jsonreq);
  logger.info("unifiedquery reqmap = " + reqmap);
  
  datamap = (Map<String, Object>) reqmap.get("tradeParam"); //tradeParam请求体数据
  logger.info("unifiedquery datamap = " + datamap);
  
  //---------------------step1  验证签名-----------------------------
  String sign = (String) reqmap.get("sign");  //获取sign
  String key = UnionPayConstants.GGMD5KEY;  //国光MD5密钥
  try {
   if (!PayUtil.verifySign(datamap,key,sign)) {
    resultmap.put("returnCode", "Bad_Sign");
    resultmap.put("returnInfo", "签名错误");
    return resultmap;
   }
  //-----------------------step2  验证消息类型  tradeType:query-------------------- 
   if (!"query".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("merOrderId").equals(" ")) {
    resultmap.put("returnCode", "Value_Error");
    resultmap.put("returnInfo", "缺少必要接口参数");
    return resultmap;
    }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   resultmap.put("returnCode", "System_Error");
   resultmap.put("returnInfo", "系统异常");
   return resultmap;
  }
  //------------------------step4 传值并调用订单查询接口----------------------------------
  map.put("mid", datamap.get("mid"));         //商户号
  map.put("tid", datamap.get("tid"));      //终端号
  map.put("instMid", datamap.get("instMid"));    //机构商户号
  map.put("msgSrc", datamap.get("msgSrc"));    //消息来源
  map.put("merOrderId", datamap.get("merOrderId"));  //需查询的商户的订单号
  //map.put("msgType", reqmap.get("tradeType"));   //消息类型 query
  Map<String, Object> querymap = queryinfoserviceimpl.QueryInfo(map);
  logger.info("return querymap = " + querymap);
  //根据post返回码,判断是否接收银联网付响应信息
  if(!"200".equals(querymap.get("statuscode"))) {
   resultmap.put("returnCode", "Union_Connect_Error");
   resultmap.put("returnInfo", "银联网付连接失败");
   return resultmap;
  }
  //------------------------step5接口返回数据----------------------------------
  if(querymap.get("errCode").equals("SUCCESS")) {
  Map<String,Object> resultdatamap = new HashMap<String,Object>(); //resultmap中data数据
  resultdatamap.put("errCode", querymap.get("errCode"));    //平台错误码
  resultdatamap.put("errMsg", querymap.get("errMsg"));    //平台错误信息
  resultdatamap.put("status", querymap.get("status"));    //交易状态
  resultdatamap.put("totalAmount", querymap.get("totalAmount"));  //支付总金额
  resultdatamap.put("targetOrderId", querymap.get("targetOrderId")); //第三方订单号
  resultdatamap.put("targetSys", querymap.get("targetSys"));   //目标平台代码(第三方支付状态)
  resultdatamap.put("targetStatus", querymap.get("targetStatus")); //目标平台状态
  resultdatamap.put("payTime", querymap.get("payTime"));    //支付时间
  resultdatamap.put("messageType", querymap.get("msgType"));   //消息类型
  
  resultmap.put("data", resultdatamap);
  resultmap.put("returnCode", querymap.get("errCode")); 
  //resultmap.put("returnInfo", querymap.get("errMsg"));
  return resultmap; 
  }else{
//错误返回信息
   resultmap.put("returnCode", querymap.get("errCode"));
   resultmap.put("returnInfo", querymap.get("errMsg"));
   return resultmap;
    } 
 }
 
}

1.2.2 queryinfoserviceimpl代码

本部分代码为银联商务支付下单查询接口服务。

@Override
 public Map<String, Object> QueryInfo(Map<String, Object> map) throws UnsupportedEncodingException {
  // TODO Auto-generated method stub
  logger.info("------------------unfiedquery--------------------------");
  Map<String, Object> reqmap = new HashMap<String, Object>();  //请求map
  Map<String, Object> resp = new HashMap<String, Object>();  //响应resp
  //reqmap.put("mid", this.mid);   //内部测试
  reqmap.put("mid", map.get("mid").toString());   //商户号
  reqmap.put("tid", map.get("tid").toString());   //终端号
  reqmap.put("instMid", map.get("instMid").toString());
  reqmap.put("msgSrc", map.get("msgSrc").toString());  //消息来源
  reqmap.put("msgId", "UnionPay_F002");     //msgId,查询接口
  reqmap.put("msgType", "query");       //消息类型
  
  //报文请求时间
  String aligetTime = PayUtil.aligetTime();
  logger.info("请求时间aligetTime = " + aligetTime);
  reqmap.put("requestTimestamp", aligetTime); 
  reqmap.put("merOrderId", map.get("merOrderId").toString());  //商户订单号,前端传入
  
  //生成待签名字符串并进行MD5加密
  String builderSignStr = "";
  try {
     builderSignStr = PayUtil.builderSignStr(reqmap,UnionPayConstants.MD5KEY);
   //signString = PayUtil.generateSignature(reqmap, UnionPayConstants.MD5KEY);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  reqmap.put("sign", builderSignStr);
  logger.info("reqmap= " + reqmap);
  
  String jsonstring = GGitUtil.MapToJson2(reqmap);  //请求map转成json
  logger.info("发送query post请求消息:" + jsonstring);
  
  //接收银联商务返回map
  resp = unionpayrequest.dopost(UnionPayConstants.queryURL, jsonstring);
  return resp;
 }

其中,queryURL为请求银联商务地址:

https://qr-test2.chinaums.com/netpay-route-server/api/

1.3测试结果
本文对所写接口写了测试网页进行测试,如图所示。
在这里插入图片描述

相关文章:

  • java对接银联商务公众号+服务窗支付(3)
  • java对接银联商务公众号+服务窗支付(4)
  • java对接银联商务公众号+服务窗支付(5)
  • java对接银联商务扫码支付
  • 报错:Invalid bound statement (not found): com.wshy.example.dao.UserDao.getUsers
  • Field userDao ....service.impl...'com.lzj.springcloud.dao.UserDao' that could not be found
  • java对接银联商务扫码支付(银联商务扫码支付文档)
  • Java中拦截器的使用
  • 记项目中出现的数据库若干问题和注意事项
  • 工行icbc 在线支付jar包下载及maven导入本地库
  • 工行聚合支付二维码扫码付对接流程及代码实现
  • Java常量类配置--json文件方式
  • Java中File类的常用操作及项目中的使用
  • Java Utils工具类--jsonmap
  • Java Utils工具类--MD5加密
  • 《剑指offer》分解让复杂问题更简单
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • mongodb--安装和初步使用教程
  • Puppeteer:浏览器控制器
  • Python语法速览与机器学习开发环境搭建
  • scala基础语法(二)
  • session共享问题解决方案
  • tab.js分享及浏览器兼容性问题汇总
  • Terraform入门 - 3. 变更基础设施
  • 阿里云Kubernetes容器服务上体验Knative
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 关于Flux,Vuex,Redux的思考
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 小试R空间处理新库sf
  • 一个SAP顾问在美国的这些年
  • 从如何停掉 Promise 链说起
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #define,static,const,三种常量的区别
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (11)MATLAB PCA+SVM 人脸识别
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (汇总)os模块以及shutil模块对文件的操作
  • (排序详解之 堆排序)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)模仿学习-Action数据的模仿
  • (十八)三元表达式和列表解析
  • (四)汇编语言——简单程序
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)关于pipe()的详细解析
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net CHARTING图表控件下载地址
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 中什么样的类是可使用 await 异步等待的?