From 46d6be83f45cfc8558aea4c2c94a375ba5348d9b Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Sat, 18 Dec 2021 20:26:00 +0800 Subject: [PATCH] fix jinmao --- .../controller/callback/JinMaoController.java | 190 +++++++++++++++--- 1 file changed, 167 insertions(+), 23 deletions(-) diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/JinMaoController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/JinMaoController.java index a97d8672d..845e52fa0 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/JinMaoController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/JinMaoController.java @@ -1,24 +1,17 @@ package com.iformall.controller.callback; - -import com.iformall.common.ErrorCode; -import com.iformall.common.ResultData; -import com.iformall.common.SysConfigConstant; +import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON; import com.iformall.controller.base.BaseController; import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.vo.WxCouponOrderCVo; import com.iformall.enums.EnumAssignTagsTrigger; -import com.iformall.enums.EnumCouponType; -import com.iformall.enums.EnumCouponValidType; -import com.iformall.enums.EnumCouponVerifyType; -import com.iformall.enums.EnumCreditLockedStatus; -import com.iformall.exception.MallinkException; import com.iformall.service.*; import com.iformall.service.tags.jinmao.JinMaoOrderTagsDeveloper; import com.iformall.service.tags.jinmao.JinMaoUserTagsDeveloper; +import com.iformall.utils.Base64Util; import com.iformall.utils.DateUtils; - +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,12 +21,17 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; -import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.Locale; import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * 金茂数据推送 @@ -206,23 +204,92 @@ public class JinMaoController extends BaseController { } + + + /** + * Request: + * 二维码、指纹、RFID + * GET /data/Acs.aspx?method=SearchCardAcs&type=1&Reader=0&DataLen=1024&Index=4681&Serial=R12034&Status=03&Input=0000&Ver=135&ID=R12034&MAC=0004A33CCCB2&Card=Base64编码的数据 + * POST BODY {"type":"10","Reader":"1","DataLen":"952","Index":"1979","Serial":"R12034","Status":"03","Input":"0000","Ver":"135","ID":"R12034","IP":"192.168.3.34","MAC":"0004A33CCCB2","Card":"S4dTUzIxAAACxMgECAUHCc7QAADixCEBAAAAgmkSmsQtAB4PxgD1AKLLygBQAKIPmgBhxBUOpABnAGUPysSSADIPRABcAHHJUgCfAIQNbQCdxKwPTgCyAI4NLsSyAGUORwALAEzKtQDzAL0P4AD1xAMPDgACAcEPTcQCAa4OlADPAbTLUwATAZwPooCZR35/GgBnhP4DmMBLB3uHw6Nyk3GzzwMf9gdyB4X1UhKTHfA9K6sRj9RIOWojxn1WDg03AMnl24H/3x34MT8a/QfW6jrMKM5+E4+P7QJPV5WtaAZ/W4tryBRca45isvpHH5YLnzR+nePru1jHICzFAMsW2gQAZwkejgcAtgUgwDpGBsTCBiLA/wXFlAvTNgYAqwYeBT4IxIYMFsD//wXALcIBWA8JQcHMAHDKDkZEwBEAiRUOBMD9wP7/wAXA/TtG/xIARR7MwMI6/sA2PsE/Og8C+icDP0A1UzoKAvIsA/9LPf/NAJ7oG0xHCQCZ9SDCBEs4BADJM+JVCMQ0NQZKMELQACyE/C/A/v5DO//9+sH/SwUAJo/9/QT8EABgTRAFK/07/v1YRg0A2lX4hUrAKMAGANJh9YX+DgBjYhA7wf6I/jJWDwBiohdJOkFF/2wKAGJrJYXAPsAWAA+r9EQ5/iv+NT5iSRMCyXnwNf4u/+z+wgVQFQAIhPCE//zj//7+wf9nBH8RxAqP6/47/Tgq/I7AwnsFAMxQLTzCAceWN8FEwwBCXXXBwWkHAJablQDFwnMHAE9lgMcEYxIACZvrOv7DP//7//3//a/CdM8BVqMr/TIEksPOAVSpPTeGQgcChLNXwP//+zoEAu23Z1YHAEMVU8I+/jYEAEnSjJsExArY7cLCT80AS3RSU/wnBQDv9gE//8AGEBEAMv3/8QcQEQYD/+4FEsgMCcBAUkLFC0HFAQALRVIAayMBAA=="} + * @param 接收到的数据类型 type + 0 = 卡; + 1 = 串口232接口输入字符串,如二维码等;(不推荐) + 2 = 密码; + 3 = 按钮请求; + 6 或者26= 二代证数据; + 9 = Base64编码数据,用于串口输入,二维码;(推荐) + 10 = 指纹数据; + 11 = 指静脉数据; + 12 = RFID卡; + 13或者23 = 人脸; + * + * @param Card:接收到的卡号、密码、二维码、身份证号码等 + * @param Serial:控制器序列号,用于区别设备 + * + * Response: + * DATA={"Card":"4238669","Systime":"2017-01-18 11:47:09","Voice":"........,........","ActIndex":"0","AcsRes":"1","Time":"1","Note":"..........................","Name":"................"} + * @param AcsRes : 必须。处理结果,1打开,2报警,3关闭,0拒绝 + * @param ActIndex : 必须。动作位置,继电器位置, 0-2,0:进,1:出,2:报警 + * @param Time : 必须。继电器动作时间,也就是继电器保持动作多少秒 + * @param LCD : 可选参数,屏幕显示页面,无表示由控制器本身控制。2019-06-14 + * @param LCDTime : 可选参数,屏幕保持显示的时间 2019-07-05 + * @param Name: 可选参数,姓名,显示在LCD屏幕上,小于16字节 + * @param Note : 可选参数,事件说明,显示在LCD屏幕上,小于32字节 + * @param Card : 可选参数,卡号字符串,显示在LCD屏幕上,小于16字节 + * @param Systime : 可选参数,时间,显示在LCD屏幕上,小于20字节 + * @param Voice : 可选参数,语音字符串,用于播报,小于,小于40字 + * + * AcsRes ActIndex 动作继电器 + 不允许开 0 0 - + 允许进 1 0 打开LockA + 允许出 1 1 打开LockB + 控制输出 1 2 打开Alarm + 报警 2 0 Alarm + 关闭输出 3 0 关闭 LockA + 关闭输出 3 1 关闭LockB + 关闭输出 3 2 关闭Alarm + 全关 4 X 关闭LockA LockB + 全开 100 x 打开LockA LockB + * @param param + * @return + * @throws Exception + */ + @RequestMapping(value = "/dfh/verify") - public ResultData dfhVerify(@RequestBody Map param) throws Exception { - logger.info("dfh verify:"+param); + public void dfhVerify(HttpServletRequest request,HttpServletResponse response) throws Exception { + InputStream inputStream = null; try { - String couponOrderIdStr = param.get("couponOrderId")==null?"":param.get("couponOrderId").toString(); - if (StringUtils.isBlank(couponOrderIdStr)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + inputStream = request.getInputStream(); + String paramStr = IOUtils.toString(inputStream, "utf-8"); + logger.info("dfh verify: {}",paramStr); + if (StringUtils.isBlank(paramStr)) { + generateResult(response,true,false, null, "参数不能为空paramStr", null, "参数非法"); + return ; } - String _decodeCouponOrderId = WxCouponOrderCVo.getDecodeExpiredCouponOrderId(couponOrderIdStr); + Map param = JSON.parseObject(paramStr, Map.class); + String typeStr = param.get("type")==null?"":param.get("type").toString(); + if (StringUtils.isBlank(typeStr) || (!"9".equals(typeStr))) { + generateResult(response,true,false, null, "参数非法type"+typeStr, null, "参数非法"); + return ; + } + String couponOrderIdStr = param.get("Card")==null?"":param.get("Card").toString(); + if (StringUtils.isBlank(couponOrderIdStr)) { + generateResult(response,true,false, null, "参数不能为空Card", null, "参数非法"); + return ; + } + String mac = (String)param.get("MAC"); + String serial = (String)param.get("Serial"); + String _base64CouponOrderId = decodeBase64Url(couponOrderIdStr); + String _decodeCouponOrderId = WxCouponOrderCVo.getDecodeExpiredCouponOrderId(_base64CouponOrderId); if (_decodeCouponOrderId.contains(WxCouponOrderCVo.arg)) { String[] decodeids = _decodeCouponOrderId.split(WxCouponOrderCVo.arg); couponOrderIdStr = decodeids[0]; String expiredtimeStr = decodeids[1]; Date expiredtime = DateUtils.string2Date(expiredtimeStr).getTime(); if (expiredtime.before(new Date())) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"码已失效,请更新二维码后重试"); + generateResult(response,true,false, null, "码已失效,请刷新", null, "码已失效"); + return ; } } @@ -232,21 +299,98 @@ public class JinMaoController extends BaseController { } catch (NumberFormatException e) { couponOrderId = 0L; logger.error("couponOrderId参数不正确: " + param.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + generateResult(response,true,false, null, "参数非法Card"+couponOrderIdStr, null, "参数非法"); + return ; } try { - WxCouponOrder couponOrder = wxCouponOrderService.verifyByEquiment(couponOrderId, "1035", "1037", "闸机扫码核销"); - return new ResultData(couponOrder); + WxCouponOrder couponOrder = wxCouponOrderService.verifyByEquiment(couponOrderId, "789", "null", "闸机扫码核销[Serial:"+serial+",MAC:"+mac+"]"); + generateResult(response,false,true, couponOrder.getCouponName(), "核销成功", String.valueOf(couponOrder.getId()), "核销成功"); + return ; }catch(Exception e) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getMessage()); + logger.error("JinMaoController --dfhOrder",e); + generateResult(response,true,false, null, "核销错误"+e.getMessage(), null, "核销错误"); + return ; } }catch(Exception e){ logger.error("JinMaoController --dfhOrder",e); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),e.getMessage()); + generateResult(response,true,false, null, "核销错误"+e.getMessage(), null, "核销错误"); + return ; + }finally { + if (null != inputStream ) { + inputStream.close(); + } } } + + //Base64解码规则: 用+替换-, 用/替换_ 字符串后面按4的倍数补齐= 然后正常解码 + private static String decodeBase64Url(String secureUrlBase64) + { + secureUrlBase64 = secureUrlBase64.replace('-', '+').replace('_', '/'); + switch (secureUrlBase64.length() % 4) { + case 2: + secureUrlBase64 += "=="; + break; + case 3: + secureUrlBase64 += "="; + break; + } + return new String(Base64Util.decode(secureUrlBase64)); + } + + private void generateResult(HttpServletResponse response,boolean alerm,boolean open,String name, String msg,String card,String voice) { + Map retMap = new HashMap(); + if (alerm) { + //报警 + retMap.put("AcsRes", "2"); + retMap.put("ActIndex", "0"); + }else { + if (open) { + //允许进 + retMap.put("AcsRes", "1"); + retMap.put("ActIndex", "0"); + }else { + //不允许进 + retMap.put("AcsRes", "0"); + retMap.put("ActIndex", "0"); + } + } + retMap.put("Time", "3"); + if (null != name) { + try { + retMap.put("Name", new String(name.getBytes(),"utf-8")); + } catch (UnsupportedEncodingException e) { + } + } + if (null != msg) { + try { + retMap.put("Note", new String(msg.getBytes(),"utf-8")); + } catch (UnsupportedEncodingException e) { + } + } + if (null != card) { + retMap.put("Card", card); + } + retMap.put("Systime", DateUtils.date2String(new Date())); + if (null != voice) { + try { + retMap.put("Voice", new String(voice.getBytes(),"utf-8")); + } catch (UnsupportedEncodingException e) { + } + } + PrintWriter out; + try { + response.setContentType("text/html"); + response.setCharacterEncoding("GB2312"); + out = response.getWriter(); + out.print("DATA="+JSON.toJSONString(retMap)); + out.close(); + } catch (IOException e) { + logger.error(" jinmao writeResponse error.",e); + } + } + }