示例#1
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;
  }