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

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

java实现银联商务公众号+服务窗对接----订单撤销

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

/**
  * 订单关闭接口
  * @param request
  * @param response
  * @param merOrderId
  * @return
  * @throws UnsupportedEncodingException
  */
 @RequestMapping(value = "/OrderClose", method = RequestMethod.POST)
// public Map<String, Object> close(HttpServletRequest request, HttpServletResponse response, String merOrderId) throws UnsupportedEncodingException {  
//  Map<String,Object> map = new HashMap<String,Object>(); //接收退款请求map
//  map.put("merOrderId", merOrderId); //商户订单号
//  Map<String, Object> closeordermap = closeorderserviceimpl.CloseOrder(map);
//  logger.info("closeordermap = " + closeordermap);
//  return closeordermap; //返回refundmap
// }
 
 public Map<String, Object> close(HttpServletRequest request, HttpServletResponse response, @RequestBody String jsonreq) throws UnsupportedEncodingException {  
  Map<String,Object> map = new HashMap<String,Object>();    //接收退款查询请求map
  Map<String,Object> reqmap = 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"); //请求体数据
  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:close-------------
   if (!"close".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<String, Object> closeordermap = closeorderserviceimpl.CloseOrder(map);
  logger.info("closeordermap = " + closeordermap);
  
  if(!"200".equals(closeordermap.get("statuscode"))) {
   resultmap.put("returnCode", "Union_Connect_Error");
   resultmap.put("returnInfo", "银联网付连接失败");
   return resultmap;
  }
  //------------------------step5接口返回数据------------------------------
  Map<String,Object> resultdatamap = new HashMap<String,Object>();  //resultmap中data数据
  resultdatamap.put("errCode", closeordermap.get("errCode"));    //平台错误码
  resultdatamap.put("status", closeordermap.get("status"));    //交易状态
  resultdatamap.put("totalAmount", closeordermap.get("totalAmount"));  //退款金额
  resultdatamap.put("targetSys", closeordermap.get("targetSys"));   //目标平台代码(第三方代码)
  resultdatamap.put("targetStatus", closeordermap.get("targetStatus")); //目标平台状态
  resultdatamap.put("messageType", closeordermap.get("msgType"));    //消息类型
  
  resultmap.put("data", resultdatamap);
  resultmap.put("returnCode", closeordermap.get("errCode")); 
  //resultmap.put("returnInfo", refundquerymap.get("errMsg"));
 
  return resultmap; //返回map
 }

1.2.2 closeorderserviceimpl代码

本部分代码为银联商务公众号订单撤销服务实现类。

@Override
 public Map<String, Object> CloseOrder(Map<String, Object> map) throws UnsupportedEncodingException {
  // TODO Auto-generated method stub
  
  logger.info("------------------close order--------------------------");
  Map<String, Object> reqmap = new HashMap<String, Object>(); //请求map
  Map<String, Object> resp = new HashMap<String, Object>(); //响应resp
  reqmap.put("mid", map.get("mid").toString());    //1商户号
  reqmap.put("tid", map.get("tid").toString());    //2终端号
  reqmap.put("instMid", map.get("instMid").toString());  //3业务类型
  reqmap.put("msgSrc", map.get("msgSrc").toString());   //4消息来源    
  reqmap.put("msgType", "close");        //5消息类型
  
  String aligetTime = PayUtil.aligetTime();
  logger.info("请求时间aligetTime = " + aligetTime);
  reqmap.put("requestTimestamp", aligetTime);     //6报文请求时间 
  reqmap.put("merOrderId", map.get("merOrderId").toString()); //7原交易订单号
  
  //生成待签名字符串并进行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.toLowerCase());       //8签名,转小写
  logger.info("reqmap= " + reqmap);
  
  String jsonstring = GGitUtil.MapToJson2(reqmap); //请求map转成json string
  logger.info("发送CloseOrder post请求消息:" + jsonstring);
  
  //接收银联商务返回map
  resp = unionpayrequest.dopost(UnionPayConstants.queryURL, jsonstring);
  return resp;
 }

1.3测试结果

本文对所写接口写了测试网页进行测试,如图所示。封装的银联商务响应接口中,输入的商户订单号为已支付订单号,响应结果中显示的是OPTION_NOT_ALLOWED,查看银联商务接口文档,表示此订单号已被支付,为关闭状态。(实际测试中,由于参数为测试环境参数,订单关闭接口测试会出现没有配置API的错误,需要连接生产环境,生产环境参数暂时没有下来。)
在这里插入图片描述

相关文章:

  • 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加密
  • Java Utils工具类--DateUtils
  • “停车场一码付”的一些思考与尝试
  • MySQL数据库表从一个数据库复制到另一个数据库
  • 【5+】跨webview多页面 触发事件(二)
  • Java程序员幽默爆笑锦集
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Python3爬取英雄联盟英雄皮肤大图
  • rc-form之最单纯情况
  • react 代码优化(一) ——事件处理
  • Redis在Web项目中的应用与实践
  • SQLServer之创建数据库快照
  • uva 10370 Above Average
  • Vue学习第二天
  • 阿里云应用高可用服务公测发布
  • 初探 Vue 生命周期和钩子函数
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 计算机常识 - 收藏集 - 掘金
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Linux·i2c驱动架构​
  • # Panda3d 碰撞检测系统介绍
  • ###C语言程序设计-----C语言学习(3)#
  • #if #elif #endif
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $.ajax,axios,fetch三种ajax请求的区别
  • (4) PIVOT 和 UPIVOT 的使用
  • (java)关于Thread的挂起和恢复
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (十六)一篇文章学会Java的常用API
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net6使用Sejil可视化日志
  • .Net小白的大学四年,内含面经
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...