@Override
  protected boolean getTempValue(ControlMessage cm, BusinessMessage bm) {
    try {
      TempData cashTemp = (TempData) baseHibernateDao.get(TempData.class, bm.getOldPbSeqno());
      if (cashTemp == null) {
        bm.setResponseCode(GlobalConst.RESPONSECODE_FAILURE);
        bm.setResponseMsg("缴费失败,请拨打客服电话咨询!");
        cm.setResultCode(GlobalConst.RESULTCODE_FAILURE);
        cm.setResultMsg("缴费失败,现金查询时没有保存水费明细数据等重要信息!");
        logger.info("现金查询时,水费明细数据等信息没有保存,商户号:{} ", bm.getShopCode());
        return false;
      }

      String str = cashTemp.getTempValue();
      String[] savedStr = str.split("\\|");
      String userno = savedStr[0]; // 用户编号
      String userName = savedStr[1]; // 用户名称
      Double sumFee = Double.parseDouble(savedStr[2]); // 应缴金额
      String recNum = savedStr[3]; // 欠费月数

      // 缴费金额必须大于应缴金额
      //			if (sumFee > bm.getAmount()) {
      //				cm.setResultCode(GlobalConst.RESULTCODE_FAILURE);
      //				cm.setResultMsg("缴费金额小于应缴金额!");
      //				bm.setResponseCode(GlobalConst.RESPONSECODE_FAILURE);
      //				bm.setResponseMsg("缴费金额小于应缴金额!");
      //				return false;
      //			}
      WaterCashData waterCashData = new WaterCashData();
      // 用户编号
      waterCashData.setUserNo(userno);
      // 用户编号
      waterCashData.setUsername(userName);
      bm.setUserName(userName);
      // 应收总额
      waterCashData.setSumFee(String.valueOf(sumFee));
      // 缴费金额
      waterCashData.setPayAmt(String.valueOf(bm.getAmount()));
      // 水费欠费月数
      waterCashData.setRecNum(recNum);
      // 凭证号码,如没有提供默认值
      waterCashData.setCertNo("");
      // 凭证类型,如没有提供默认值
      waterCashData.setVoucKind("");

      bm.setCustomData(waterCashData);
    } catch (Exception e) {
      bm.setResponseCode(GlobalConst.RESPONSECODE_FAILURE);
      bm.setResponseMsg("缴费不正常,请拨打客服电话咨询!");
      cm.setResultCode(GlobalConst.RESULTCODE_FAILURE);
      cm.setResultMsg("缴费不正常,请拨打客服电话咨询!");
      logger.error("缴费不正常!请查询表:CashTemp.商户号" + bm.getShopCode());
    }
    return true;
  }
  @Override
  protected boolean getTempValue(ControlMessage cm, BusinessMessage bm) {

    TempData cashTemp = (TempData) baseHibernateDao.get(TempData.class, bm.getOldPbSeqno());
    if (cashTemp == null) {
      bm.setResponseCode(GlobalConst.RESPONSECODE_FAILURE);
      bm.setResponseMsg("缴费失败,请拨打客服电话咨询!");
      cm.setResultCode(GlobalConst.RESULTCODE_FAILURE);
      cm.setResultMsg("缴费失败,现金查询时没有保存电费明细数据等重要信息!");
      logger.info("现金查询时,电力电费明细数据等信息没有保存,商户号:{} ", bm.getShopCode());
      return false;
    }
    if (bm.getCustomData() != null) {
      HeNDElecICCard customData = (HeNDElecICCard) bm.getCustomData();
      String[] split = String.valueOf(cashTemp.getTempValue()).split("\\^");
      customData.setCHECK_ID(split[0]);
      customData.setCONS_NO(split[1]);
      customData.setMETER_ID(split[2]);
      customData.setMETER_FLAG(split[3]);
      customData.setCARD_INFO(split[4]);
      customData.setIDDATA(split[5]);
      customData.setCONS_NAME(split[6]);
      customData.setCONS_ADDR(split[7]);
      customData.setPAY_ORGNO(split[8]);
      customData.setORG_NO(split[9]);
      customData.setCHARGE_CLASS(split[10]);
      customData.setFACTOR_VALUE(split[11]);
      customData.setPURP_PRICE(split[12]);
      customData.setCARD_NO(split[13]);
      customData.setOCS_MODE(split[14]);
      customData.setPRESET_VALUE(split[15]);
      bm.setCustomData(customData);
      return true;
    } else {
      return false;
    }
  }
Пример #3
0
  @Override
  public Map<DATA_TYPE, Object> packBuffer(Map<DATA_TYPE, Object> message)
      throws PacketOperationException {
    logger.info("开始进行FIXSTRING打包....");
    offset = 0;
    String packet = null;
    cm = PacketUtils.getControlMessage(message);
    bm = PacketUtils.getBusinessMessage(message);
    String tranCode = cm.getTranCode();

    // response code convert
    String resultCode = cm.getResultCode();
    if (GlobalConst.RESULTCODE_SUCCESS.equals(resultCode) && !"000010".equals(bm.getTranCode())) {
      bm.setResponseCode(GlobalConst.RESPONSECODE_SUCCESS);
    } else if (resultCode.equals("999999")) {
      // timeout or unknown result
      bm.setResponseCode("99");
      //					else
      //						bm.setResponseCode("01");
    }

    fieldValues.clear();
    headerHelper.pack(fieldValues, cm, bm);
    String header = packFIXSTRING();
    logger.info("交易{}打包包头完成,报文头[{}],用户号[{}]", new Object[] {tranCode, header, bm.getUserCode()});

    // pack body
    IPacketWEBSTRING packetHelper;
    String body = null;
    try {
      fieldValues.clear();

      packetHelper =
          (IPacketWEBSTRING) SpringContextHolder.getBean(getPacketBeanName(cm.getTranCode()));

      packetHelper.pack(fieldValues, cm, bm);
      body = packFIXSTRING();
      packet = header + body;

      // 减去报文头前10位+报文体作为MAB
      byte[] responseMac =
          getMac(packet.substring(10 + 6, packet.length()).getBytes("gb2312"), bm.getShopCode());
      logger.info("响应报文MAC值[{}]", responseMac);
      packet += ConvertUtils.bytes2HexStr(responseMac);

      // 报文长度处理
      packet =
          FieldUtils.leftAddZero4FixedLengthString(
                  String.valueOf(packet.getBytes("gb2312").length - 6), 6)
              + packet.substring(6);
      PacketUtils.setOrigAnsPacket(message, packet);
    } catch (InstantiationException e) {
      logger.error("get packet helper class error!", e);
      throw new PacketOperationException();
    } catch (IllegalAccessException e) {
      logger.error("get packet helper class error!", e);
      throw new PacketOperationException();
    } catch (ClassNotFoundException e) {
      logger.error("get packet helper class error!", e);
      throw new PacketOperationException();
    } catch (Exception e) {
      logger.error("get packet helper class error!", e);
      throw new PacketOperationException();
    }

    logger.info("交易{}报文打包完成,报文:[{}]", tranCode, packet);

    return message;
  }
Пример #4
0
  // 校验MAC
  private boolean checkMac(BusinessMessage bm) throws Exception {

    // 查询是否需要校验MAC
    ResourceBundle rb = null;
    try {
      rb = ResourceBundle.getBundle("conf.checkFlag");
      bm.setMacFlag(Boolean.valueOf(rb.getString(bm.getChanelType() + "checkMacFlag")));
      // WEBMessageHead  fixMsgHeadData = (WEBMessageHead)bm.getFixMsgHeadData();
      WEBMessageHead webMsgHeadData = (WEBMessageHead) bm.getWebMsgHeadData();
      if ("000010".equals(bm.getTranCode()) && "7".equals(webMsgHeadData.getHandleType())) {
        bm.setMacFlag(false);
      }
    } catch (Exception e) {
      logger.error("取mac校验标志错!", e);
      // 默认为true

      bm.setMacFlag(true);
    }
    logger.info("mac校验标志:[{}],交易码:[{}]!", bm.isMacFlag(), bm.getTranCode());
    if (bm.isMacFlag() == false || "000903".equals(bm.getTranCode())) {
      return true;
    }

    // 无论是否校验MAC,都取出MAB
    // 从报文头(除长度位字段)+报文体(除MAC字段)
    // (MAB),采用ECB算法,加密结果为64位的MAC。
    byte[] macData = getMacData();
    bm.setMacData(macData);

    // MAC
    String fieldName = "D_EPOS_MAC";
    int length = 0;
    String macstr = null;
    try {
      length = fieldsConfig.getFieldAsciiLength(fieldName);
      macstr = FieldUtils.getFixedLengthAsciiField(fieldName, buffer, offset, length, fieldsConfig);
      offset += length;
    } catch (Exception e) {
      e.printStackTrace();
      throw new PacketOperationException("mac获取出错");
    }
    if (null == macstr || macstr.length() != 16) {
      logger.error("获取MAC错误!");
      return false;
    }
    // String macstr = buffer.substring(buffer.length()-16);
    byte[] mac = ConvertUtils.str2Bcd(macstr);
    // (byte[])fieldValues.get("D_EPOS_MAC");
    bm.setMac(mac);

    byte[] origMac = bm.getMac();
    if (origMac == null) {
      throw new PacketOperationException("上传mac值为空!");
    }

    //		logger.info("mab:[{}]", new String(macData));
    //		logger.info("mac:[{}]", ConvertUtils.bytes2HexStr(origMac));

    logger.info("开始进行MAC校验");
    // POS不上送终端号,使用商户号作为密钥管理号
    boolean result = encryptionService.checkMAC(origMac, macData, bm.getShopCode());
    if (result) logger.info("MAC校验成功!");
    else logger.info("MAC校验失败!");
    return result;
  }