/**
  * {@link PayCCPC} 转 {@link PayInfoResponse}
  *
  * @param payCCPC
  * @return
  */
 private PayInfoResponse payCCPCToPayInfoResponse(PayCCPC payCCPC) {
   PayInfoResponse payInfoResponse = new PayInfoResponse();
   payInfoResponse.setTransRefNo(payCCPC.getPayNo());
   payInfoResponse.setTransToken(payCCPC.getUpSno());
   payInfoResponse.setRmtAccNo(StringUtils.cardNoFilter(payCCPC.getRmtAccNo()));
   payInfoResponse.setRmtBankName(payCCPC.getRmtBankName());
   payInfoResponse.setBnyAccNo(StringUtils.cardNoFilter(payCCPC.getBnyAccNo()));
   payInfoResponse.setBnyAccName(payCCPC.getBnyAccName());
   payInfoResponse.setBnyAmt(payCCPC.getBnyAmt().toPlainString());
   payInfoResponse.setBnyBankName(payCCPC.getBnyBankName());
   payInfoResponse.setRemitFee(
       payCCPC.getFee() == null ? "0.00" : payCCPC.getFee().toPlainString());
   payInfoResponse.setRemitStatus(payCCPC.getRemitStatus().toString());
   payInfoResponse.setTransCode(payCCPC.getErrCode());
   payInfoResponse.setTimestamp(DateUtils.dateToString(payCCPC.getRmtTime()));
   payInfoResponse.setTransMsg(payCCPC.getErrMsg());
   payInfoResponse.setIsNeedBillInfo(payCCPC.getIsNeedBillInfo());
   payInfoResponse.setRmtElecsignStatus(
       (payCCPC.getRmtElecsignStatus().intValue() == 0
               ? Const.VLDSTATE_INVALID
               : Const.VLDSTATE_VALID)
           + "");
   payInfoResponse.setBnyElecsignStatus(
       (payCCPC.getBnyElecsignStatus().intValue() == 0
               ? Const.VLDSTATE_INVALID
               : Const.VLDSTATE_VALID)
           + "");
   payInfoResponse.setRemark(payCCPC.getRemark());
   payInfoResponse.setNotifyMobile(payCCPC.getNotifyMobile());
   return payInfoResponse;
 }
 private CreditcardFeeQueryTradeRequestEntity packUp(
     CupsTrmnl cupsTrmnl, UlinkplusKeyManage ulinkplusKeyManage, UlinkplusRequestInfo request)
     throws TransferFailedException {
   // 消费报文打包
   // {2,3,4,11,22,25,41,42,48,49,64}
   CreditcardFeeQueryTradeRequestEntity requestEntity = new CreditcardFeeQueryTradeRequestEntity();
   requestEntity.setCardNo(request.getCardNo()); // 2
   requestEntity.setProcessCode("310000"); // 3
   requestEntity.setTransAmt(StringUtils.amtToBCD(request.getAmount())); // 4
   requestEntity.setTrmnlFlowNo(cupsTrmnl.getTrmnlFlowNo()); // 11
   requestEntity.setPosEntryMode("012"); // 22
   requestEntity.setServiceCode("92"); // 25
   requestEntity.setTrmnlNo(cupsTrmnl.getTrmnlNo());
   requestEntity.setTrmnlMrchNo(cupsTrmnl.getMrchNo());
   // 位置	长度	格式	内容	说明
   // 0	2	n2	用法标志	“PA”
   // 2	2	n2	帐单号码类型	08
   // 4	19	Ans19	信用卡卡码	左对齐,右补空格
   // 23	11	N11	手机号码
   // 34	1	ans1	结束标志	#
   // PA086222040000000001   #
   requestEntity.setSelfDefined48(
       ("PA08" + StringUtils.rightPad(request.getCreditcardNo(), 19, " ") + "#").getBytes());
   requestEntity.setCurrency(Currency.CNY.getCodeN());
   requestEntity.setMacCode(new byte[8]);
   cupsTrmnlService.updateCupsTrmnlFlowNo(cupsTrmnl);
   return requestEntity;
 }
 @Override
 public RemittanceAccountResponsePage queryRmtAccount(Long usrId, String mrchNo) {
   RemittanceAccountResponsePage remittanceAccountResponsePage =
       new RemittanceAccountResponsePage();
   // 是否设置是否密码
   boolean isSetPayPwd = false;
   MrchUsr mrchUsr = mrchUsrService.findById(usrId);
   if (mrchUsr != null) {
     if (StringUtils.isNotBlank(mrchUsr.getPayPwd())) {
       isSetPayPwd = true;
     }
   }
   // 查询账户信息
   List<RemittanceAccountResponse> lists = new ArrayList<RemittanceAccountResponse>();
   try {
     lists = remitProcess.queryRmtAccount(mrchNo);
     remittanceAccountResponsePage.setMrchNo(mrchNo);
     remittanceAccountResponsePage.setIsRegisterRemit(true);
   } catch (Exception e) {
     remittanceAccountResponsePage.setIsRegisterRemit(false);
   }
   remittanceAccountResponsePage.setIsSetPayPwd(isSetPayPwd);
   remittanceAccountResponsePage.setRmtAccounts(lists);
   return remittanceAccountResponsePage;
 }
 @Override
 public boolean addPayPwd(Long usrId, String payPwd) {
   boolean addSuccess = false;
   MrchUsr mrchUsr = mrchUsrService.findById(usrId);
   if (mrchUsr == null || (!mrchUsr.isUsrState())) {
     logger.info("用户[" + usrId + "]不存在或者用户被禁用");
     throw new AppRTException(AppExCode.MRCH_USR_UNAVAILABLE, "用户不存在或者用户被禁用!");
   }
   if (StringUtils.isNotBlank(mrchUsr.getPayPwd())) {
     throw new AppRTException(AppExCode.PAY_PWD_SETTED, "支付密码已设置,无法重新设置!");
   }
   mrchUsr.setPayPwd(StringUtils.trim(payPwd));
   mrchUsrService.updateMrchUsr(mrchUsr);
   addSuccess = true;
   return addSuccess;
 }
  @Override
  public CCPCBillInfo queryCCPCBillInfo(String mrchNo, String rmtAccNo, String payNo) {
    CCPCBillInfo billInfo = null;
    PayCCPC payCCPC = payCCPCService.findPayCCPCByPayNoAndMrchNo(payNo, mrchNo);
    if (payCCPC != null) {
      if (StringUtils.isNotBlank(rmtAccNo)) {
        if (payCCPC.getRmtAccNo().equals(rmtAccNo)) {
          throw new AppRTException(
              AppExCode.ILLEGAL_PARAMS,
              "非法数据,transRefNo["
                  + payNo
                  + "]对应rmtAccNo["
                  + rmtAccNo
                  + "],但查出的是rmtAccNo["
                  + payCCPC.getRmtAccNo()
                  + "]");
        }
      }
      billInfo = XPOSPClientUtils.payCCPCToCCPCBillInfo(payCCPC);

      String elecsignsPath =
          XpospSysProperty.getESignaturePath()
              + payCCPC.getMrchNo()
              + File.separatorChar
              + payCCPC.getStoreNo()
              + File.separatorChar;
      String rmtElecSignDataFileName =
          payNo + "-rmt" + "." + XPOSPClientUtils.ESIGNATURE_PICTURE_SUFFIX;
      String bnyElecSignDataFileName =
          payNo + "-bny" + "." + XPOSPClientUtils.ESIGNATURE_PICTURE_SUFFIX;
      File remitElecSignDataFile = new File(elecsignsPath + rmtElecSignDataFileName);
      File bnyElecSignDataFile = new File(elecsignsPath + bnyElecSignDataFileName);
      if (remitElecSignDataFile.exists()) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        BufferedImage image;
        try {
          image = ImageIO.read(remitElecSignDataFile);
          ImageIO.write(image, XPOSPClientUtils.BILLINFO_PICTURE_SUFFIX, out);
          billInfo.setRmtElecsignData(CodecUtils.hexString(out.toByteArray()));
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if (bnyElecSignDataFile.exists()) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        BufferedImage image;
        try {
          image = ImageIO.read(bnyElecSignDataFile);
          ImageIO.write(image, XPOSPClientUtils.BILLINFO_PICTURE_SUFFIX, out);
          billInfo.setBnyElecsignData(CodecUtils.hexString(out.toByteArray()));
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return billInfo;
  }
  @Override
  public Page<Device> queryDeviceByCon(
      String batchNo, String devSn, String devKsn, int startIndex, int pageSize) throws Exception {

    if (StringUtils.isBlank(batchNo) && StringUtils.isBlank(devSn) && StringUtils.isBlank(devKsn)) {
      return null;
    }

    List<Object> params = new ArrayList<Object>();
    StringBuilder sb = new StringBuilder();

    sb.append("from " + Device.class.getName() + " dev");

    sb.append(" where 1=1");

    if (StringUtils.isNotBlank(batchNo)) {
      sb.append(" and dev.batchNo like ?");
      params.add("%" + batchNo + "%");
    }

    if (StringUtils.isNotBlank(devSn)) {
      sb.append(" and dev.devSn like ?");
      params.add("%" + devSn + "%");
    }

    if (StringUtils.isNotBlank(devKsn)) {
      sb.append(" and dev.devKsn like ?");
      params.add("%" + devKsn + "%");
    }

    sb.append(" order by dev.devId asc");

    return find(sb.toString(), startIndex, pageSize, params.toArray(new Object[params.size()]));
  }
  private IcScriptUploadTradeRequestEntity packUp(
      CupsTrmnl cupsTrmnl, CupsKeyManage cupsKeyManage, PepsiColaRequestInfo request)
      throws TransferFailedException {
    if (request.getIcScript() == null) {
      throw new TransferFailedException(
          AppExCode.ILLEGAL_PARAMS, "isScript upload failed! IcScript objet is null");
    }
    PayCups originalPayCups = payCupsService.findPayCups(request.getOriginalPayNo());
    // 脚本上送打包
    IcScriptUploadTradeRequestEntity entity = new IcScriptUploadTradeRequestEntity();
    entity.setCardNo(originalPayCups.getCardNo()); // 2 卡号
    entity.setProcessCode(originalPayCups.getProcessCode()); // 3 未选卡种
    String amount = null;
    if (originalPayCups.getTransAmt() != null
        || BigDecimal.ZERO.compareTo(originalPayCups.getTransAmt()) != 0) {
      amount = com.newland.base.util.StringUtils.amtToBCD(originalPayCups.getTransAmt());
    }
    entity.setTransAmt(amount); // 4 交易金额
    entity.setTrmnlFlowNo(cupsTrmnl.getTrmnlFlowNo()); // 11 终端流水号
    entity.setPosEntryMode(originalPayCups.getPosEntryMode()); // 22 卡输入方式
    if (StringUtils.isBlank(originalPayCups.getIcData())) { // 磁条卡
      entity.setSelfDefined60(
          Const.SD60_1_MSGTYPE_CONTROL
              + cupsTrmnl.getTrmnlBatchNo()); // 60 自定义域 22(交易类型码)+000001(批次号)+000(网络管理信息码)
    } else { // IC卡
      entity.setCardSeqNum(originalPayCups.getCardSeqNum()); // IC卡必须上送该域
      byte[] icData = getIcData(originalPayCups.getIcData(), request.getIcScript());
      entity.setIcData(icData); // 55 IC卡数据
      String selfDefined60 =
          Const.SD60_1_MSGTYPE_CONTROL
              + cupsTrmnl.getTrmnlBatchNo()
              + Const.SD60_3_IC_CRIPT_UPLOAD
              + Const.SD60_4_TERMINAL_READING_ABILITY_CONTACT_ICCARD
              + Const.SD60_5_IC_SERVICE_CODE_NORMAL;
      entity.setSelfDefined60(selfDefined60);
    }
    entity.setTrmnlRefferNo(originalPayCups.getTrmnlReferNo()); // 37
    entity.setTrmnlNo(originalPayCups.getTrmnlNo()); // 41 终端号
    entity.setTrmnlMrchNo(originalPayCups.getTrmnlMrchNo()); // 42 终端商户号
    entity.setCurrency(originalPayCups.getCurrency()); // 49 货币代码
    entity.setOriginalMessage(
        originalPayCups.getTrmnlBatchNo()
            + originalPayCups.getTrmnlFlowNo()
            + originalPayCups.getTransDate()); // 61 原批次号+原流水号
    entity.setMacCode(new byte[8]); // 64 mac

    return entity;
  }
 @Override
 public boolean updatePayPwd(Long usrId, String loginPasswd, String newPayPwd) {
   boolean updateSuccess = false;
   MrchUsr mrchUsr = mrchUsrService.findById(usrId);
   if (mrchUsr == null || (!mrchUsr.isUsrState())) {
     logger.info("用户[" + usrId + "]不存在或者用户被禁用");
     throw new AppRTException(AppExCode.MRCH_USR_UNAVAILABLE, "用户不存在或者用户被禁用!");
   }
   if (StringUtils.isBlank(mrchUsr.getPayPwd())) {
     throw new AppRTException(
         AppExCode.PAY_PWD_NOT_EXIST, "mrchUsr[" + usrId + "] payPwd not exitst");
   }
   if (mrchUsr.getUsrPwd().equals(loginPasswd)) {
     mrchUsr.setPayPwd(newPayPwd);
     mrchUsrService.updateMrchUsr(mrchUsr);
     updateSuccess = true;
   } else {
     throw new AppRTException(AppExCode.MRCH_USR_PWD_ERROR, "修改支付密码失败,登录密码有误!");
   }
   return updateSuccess;
 }
  @Override
  public PayInfoResponse pay(PayInfoRequest request) {
    Long usrId = request.getUsrId();
    Assert.notNull(usrId, "usrId should not be null!");
    // 支付密码校验
    MrchUsr mrchUsr = mrchUsrService.findById(usrId);
    if (mrchUsr == null || (!mrchUsr.isUsrState())) {
      throw new AppRTException(
          AppExCode.MRCH_USR_UNAVAILABLE, "mrchUsr[" + usrId + "] not exist or disable!");
    }
    if (StringUtils.isBlank(mrchUsr.getPayPwd())) {
      throw new AppRTException(
          AppExCode.PAY_PWD_NOT_EXIST, "mrchUsr[" + usrId + "] payPwd not exitst");
    }
    if (!mrchUsr.getPayPwd().equalsIgnoreCase(request.getPayPwd())) {
      throw new AppRTException(AppExCode.PAY_PWD_ERROR, "payPwd error");
    }
    // 商户、门店校验
    Merchant merchant = merchantService.findMerchantByMrchNo(request.getMrchNo());
    if (merchant == null || !merchant.isAvailable()) {
      throw new AppRTException(
          AppExCode.MERCHANT_NOT_AVAILABLE, "merchant not exist!" + request.getMrchNo());
    }

    Store store = null;
    if (StringUtils.isNotBlank(request.getStoreNo())) {
      store = storeService.findByStoreNo(request.getStoreNo());
      if (store == null || !store.isAvailable()) {
        throw new AppRTException(
            AppExCode.STORE_NOT_AVAILABLE, "store not exist!" + request.getStoreNo());
      }
    }
    /** 交易流水是否重复* */
    String upSno = request.getTransToken();
    PayCCPC tempPayCCPC = payCCPCService.findPayCCPCByUpSno(upSno);
    if (tempPayCCPC != null) {
      logger.error("payCCPC[upSno:" + upSno + "] exist!!!");
      throw new AppRTException(AppExCode.TRADE_EXIST, "payCCPC[upSno:" + upSno + "] exist");
    }

    // 设置常用联系人 如果不存在则新增
    if (request.getIsFavoriteBnyAcc() != null) {
      if (request.getIsFavoriteBnyAcc()) {
        CCPCAccount temp =
            cCPCAccountService.findCCPCAccount(mrchUsr.getUsrLogin(), request.getBnyAccNo());
        if (temp == null) {
          CCPCAccount ccpcAccount = new CCPCAccount();
          ccpcAccount.setMrchNo(request.getMrchNo());
          ccpcAccount.setUsrLogin(mrchUsr.getUsrLogin());
          ccpcAccount.setRmtAccNo(request.getRmtAccNo());
          ccpcAccount.setBnyAccNo(request.getBnyAccNo());
          ccpcAccount.setBnyAccName(request.getBnyAccName());
          ccpcAccount.setBnyBankName(request.getBnyBankName());
          CCPCBank ccpcBank = ccpcBankService.findCCPCBankByBankName(request.getBnyBankName());
          ccpcAccount.setAbbrName(ccpcBank == null ? "DEFAULT" : ccpcBank.getAbbrName());
          cCPCAccountService.addCCPCAccount(ccpcAccount);
        }
      }
    }

    /** 构造支付流水* */
    String payNo = payNoGenerator.generate();
    Coordinate location = request.getLocation();

    /** 保存电子签名* */
    // 电子签名格式 payNo-transType.png
    boolean isSaveRmtEsignSuccess = false;
    boolean isSaveBnyEsignSuccess = false;
    if (request.getIsNeedBillInfo() != null && request.getIsNeedBillInfo()) {
      String rmtElecSignDataFileName =
          payNo + "-rmt" + "." + XPOSPClientUtils.ESIGNATURE_PICTURE_SUFFIX;
      String bnyElecSignDataFileName =
          payNo + "-bny" + "." + XPOSPClientUtils.ESIGNATURE_PICTURE_SUFFIX;
      isSaveRmtEsignSuccess =
          XPOSPClientUtils.saveElecsignPic(
              rmtElecSignDataFileName,
              request.getMrchNo(),
              request.getStoreNo(),
              request.getRmtElecsignData());
      isSaveBnyEsignSuccess =
          XPOSPClientUtils.saveElecsignPic(
              bnyElecSignDataFileName,
              request.getMrchNo(),
              request.getStoreNo(),
              request.getBnyElecsignData());
      request.setRmtElecsignData(null); // 由于电子签名数据量大,保存成功后清空
      request.setBnyElecsignData(null); // 由于电子签名数据量大,保存成功后清空
    }

    PayCCPC payCCPC = new PayCCPC();
    payCCPC.setPayNo(payNo);
    payCCPC.setMrchNo(request.getMrchNo());
    payCCPC.setMrchName(merchant.getMrchName());
    payCCPC.setStoreNo(request.getStoreNo());
    payCCPC.setStoreName(store == null ? null : store.getStoreName());
    payCCPC.setOperatorName(mrchUsr.getUsrName());
    payCCPC.setUpSno(upSno);
    payCCPC.setImei(request.getImei());
    payCCPC.setLatitude(location == null ? null : location.getLatitude());
    payCCPC.setLongitude(location == null ? null : location.getLongitude());
    payCCPC.setRmtAccNo(request.getRmtAccNo());
    payCCPC.setRmtBankName(request.getRmtBankName());
    payCCPC.setBnyAccNo(request.getBnyAccNo());
    payCCPC.setBnyAccName(request.getBnyAccName());
    payCCPC.setBnyBankName(request.getBnyBankName());
    payCCPC.setIsNeedBillInfo(
        request.getIsNeedBillInfo() == null ? false : request.getIsNeedBillInfo());
    payCCPC.setNotifyMobile(request.getNotifyMobile());
    payCCPC.setRmtElecsignStatus(
        isSaveRmtEsignSuccess ? Const.VLDSTATE_VALID : Const.VLDSTATE_INVALID);
    payCCPC.setBnyElecsignStatus(
        isSaveBnyEsignSuccess ? Const.VLDSTATE_VALID : Const.VLDSTATE_INVALID);
    payCCPC.setCnaps(request.getCnaps());
    payCCPC.setBnyAmt(request.getBnyAmt());
    payCCPC.setBnyRealAmt(request.getBnyAmt());
    payCCPC.setRemitStatus(CCPCConfig.REMIT_STATUS_CCPC_PROCESSING);
    payCCPC.setUsrLogin(mrchUsr.getUsrLogin());
    payCCPC.setRemark(request.getRemark());
    payCCPCService.addPayCCPC(payCCPC);
    // 对外付款
    payCCPC = remitProcess.pay(payCCPC);
    PayInfoResponse response = payCCPCToPayInfoResponse(payCCPC);
    return response;
  }
  public UlinkplusResponseInfo process(
      CupsTrmnl cupsTrmnl, UlinkplusKeyManage ulinkplusKeyManage, UlinkplusRequestInfo request)
      throws TransferFailedException {
    logger.info("ulinkplus渠道信用卡手续费查询开始...");
    // 1.组装报文
    CreditcardFeeQueryTradeRequestEntity requestEntity =
        packUp(cupsTrmnl, ulinkplusKeyManage, request);

    // TODO 是否需要记录交易流水

    // 1.2mac计算
    byte[] iso_8583_main = requestEntity.pack();
    byte[] input = ArrayUtils.subarray(iso_8583_main, 6, iso_8583_main.length - 8); // 去除body head
    byte[] macKey = CodecUtils.hex2byte(ulinkplusKeyManage.getTrmnlMacKey());

    //		byte[] mac = MacUtils.tCountMAC_CBC(input, macKey);
    //		input = ArrayUtils.subarray(iso_8583_main, 0, iso_8583_main.length-8);
    //		iso_8583_main = ArrayUtils.addAll(input, mac);

    byte[] mac;
    try {
      mac = CodecUtils.hex2byte(hsmService.calculateMAC_LOCALLIFE(macKey, input));
      input = ArrayUtils.subarray(iso_8583_main, 0, iso_8583_main.length - 8);
      iso_8583_main = ArrayUtils.addAll(input, mac);
    } catch (HSMException e) {
      String hsmRespCode = XPOSPClientUtils.getCode(e);
      if (!AppExCode.UNKNOWN.equals(hsmRespCode)) {
        hsmRespCode = Const.TP_BEGIN_HSM + hsmRespCode;
      }
      logger.error(
          "ulinkplus credicard fee query failed,when calculate mac form hsm error code["
              + hsmRespCode
              + "]");
      throw new TransferFailedException(
          hsmRespCode,
          "ulinkplus credicard fee query failed,when calculate mac form hsm error code["
              + hsmRespCode
              + "]");
    }
    // 1.3组装报文报文头
    byte[] iso_8583_body =
        ArrayUtils.addAll(
            XPOSPClientUtils.getTpduHeader(XpospSysProperty.getUlinkPlusQmf1TPDU()).pack(),
            iso_8583_main);
    String iso_8583_body_length =
        StringUtils.leftPad(Integer.toHexString(iso_8583_body.length), 4, "0");
    byte[] iso_8583_length = ISOUtils.hex2byte(iso_8583_body_length);
    byte[] iso_8583 = ArrayUtils.addAll(iso_8583_length, iso_8583_body);

    // 2.发送报文
    byte[] respData =
        TCPUtils.getInstance().sendReciveMsg(iso_8583, XpospSysProperty.getUlinkPlusQMFIP_PORT());

    // 3.解析报文
    UlinkplusResponseInfo response = new UlinkplusResponseInfo();
    try {
      CreditcardFeeQueryTradeResponseEntity responseEntity = unpack(respData);
      // CreditcardFeeQueryTradeResponseEntity responseEntity = getResponseData(null);
      String isoRespCode = responseEntity.getRespCode();
      if (!Const.ISO_RESPCODE_OK.equals(isoRespCode)) {
        isoRespCode = XPOSPClientUtils.getRespCode(isoRespCode);
        isoRespCode =
            Const.TP_BEGIN_ISO + StringUtils.leftPad("" + Integer.parseInt(isoRespCode), 3, "0");

        logger.info(
            "pay via ulinkplus failed,iso error code[" + responseEntity.getRespCode() + "]");
        throw new TransferFailedException(
            isoRespCode,
            "pay via ulinkplus failed,iso error code[" + responseEntity.getRespCode() + "]");
      }

      // 响应
      try {
        String selfDefined48 = new String(responseEntity.getSelfDefined48(), "GBK");
        logger.debug("信用卡还款手续费查询,48域信息:" + selfDefined48);
        // 位置	长度	格式	内容	说明
        // 0	2	n2	用法标志	“PA”
        // 2	2	n2	帐单号码类型	08
        // 4	12	n12	还款总金额	右对齐,左补空格
        // 16	12	n12	手续费	右对齐,左补空格
        // 28	12	n12	还款金额	右对齐,左补空格
        // 40	100	Ans100	终端提示信息	左对齐,右补空格
        // 140	11	N11	手机号码	左对齐,右补空格
        // 151	1	ans1	结束标志	#
        response.setFee(
            StringUtils.amtToBigDecimal(StringUtils.trimToEmpty(selfDefined48.substring(16, 28)))
                .toPlainString());
        response.setMsgTip(
            StringUtils.trimToEmpty(selfDefined48.substring(40, selfDefined48.length() - 12)));
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
    } catch (RuntimeException e) {
      // 更新终端流水
      cupsTrmnlService.updateCupsTrmnlFlowNo(cupsTrmnl);
      throw e;
    }

    logger.info("ulinkplus渠道手机充值结束...");
    return response;
  }