@Override
 public void syncCashLoadLog(PayCashLoad cashLoad, Integer appSyn) {
   PayCups payCups = payCupsService.findPayCups(cashLoad.getCashLoadNo());
   if (payCups == null) {
     // throw new TransferFailedException(AppExCode.TRANS_NOT_EXIST, "sysncPayLog failed,not find
     // payCups");
     cashLoad.setTransStatus(Const.TransStatus.FAILED); // 银联直连表无交易流水记录,未发交易,消费失败
     return;
   }
   if (appSyn == null) {
     // 如果iso中心已经返回,但app与xposp已经断开,写卡失败
     String isoRespCode = payCups.getRespCode();
     if (StringUtils.isNotBlank(isoRespCode)) {
       // 服务端到银联已经响应成功,但客户端因超时交易未知
       if (Const.ISO_RESPCODE_OK.equals(isoRespCode)) {
         cashLoad.setTransStatus(Const.TransStatus.SUCCESS);
       } else {
         cashLoad.setTransStatus(Const.TransStatus.FAILED);
         isoRespCode =
             Const.TP_BEGIN_ISO
                 + StringUtils.leftPad(
                     "" + Integer.parseInt(isoRespCode.replace("A", "10")), 3, "0");
         cashLoad.setErrCode(isoRespCode);
       }
       return;
     }
   }
   CupsTrmnl cupsTrmnl =
       cupsTrmnlService.findByTrmnlNoAndMrchNo(payCups.getTrmnlNo(), payCups.getTrmnlMrchNo());
   if (cupsTrmnl == null) {
     throw new TransferFailedException(
         AppExCode.TERMINAL_NOT_EXIST, "sysncPayLog failed,not find CupsTrmnl");
   }
   reversalProcess.process(cupsTrmnl, payCups);
   cashLoad.setTransStatus(TransStatus.FAILED);
 }
  @Override
  public void cashLoad(Device device, PayCashLoad cashLoad, CashLoadRequest request)
      throws TransferFailedException {
    logger.info("entryMode:" + request.getEntryMode());
    logger.info("Pinblock is not null:" + StringUtils.isNotBlank(request.getPinblock()));
    logger.info("EmvTransInfo is not null:" + StringUtils.isNotBlank(request.getEmvTransInfo()));

    // 校验数据
    if (StringUtils.isBlank(request.getCardNo())) {
      throw new TransferFailedException(AppExCode.ILLEGAL_PARAMS, "cash Load failed,cardNo null");
    }
    if (StringUtils.isBlank(request.getTrackData())) {
      throw new TransferFailedException(
          AppExCode.ILLEGAL_PARAMS, "cash Load failed,track2data or trackData null");
    }
    // 卡输入方式
    if (StringUtils.isNotBlank(request.getEntryMode())) {
      boolean isOk =
          isEntryModeOk(request.getEntryMode(), request.getPinblock(), request.getEmvTransInfo());
      if (!isOk) {
        throw new TransferFailedException(
            AppExCode.ILLEGAL_PARAMS,
            "cash PayCupsTransferChannel failed,entryMode is "
                + request.getEntryMode()
                + " but pinBlock is not null:"
                + StringUtils.isNotBlank(request.getPinblock())
                + " ,emvTransInfo is not null:"
                + StringUtils.isNotBlank(request.getEmvTransInfo()));
      }
    }
    // 获取当前设备的终端信息
    // CupsTrmnl cupsTrmnl = cupsTrmnlService.findById(device.getBindTransId());
    String trmnlNo = XpospSysProperty.getUlinkPlusQmf3TrmnlNo();
    String mrchNo = XpospSysProperty.getUlinkPlusQmf3MrchNo();
    logger.info("电子现金圈存交易 发到渠道的商户号[" + mrchNo + "],终端号[" + trmnlNo + "]");
    CupsTrmnl cupsTrmnl = cupsTrmnlService.findByTrmnlNoAndMrchNo(trmnlNo, mrchNo);
    if (cupsTrmnl == null) {
      throw new TransferFailedException(
          AppExCode.TERMINAL_NOT_EXIST, "cash Load failed,not find CupsTrmnl");
    }
    // 获取密钥信息
    DeviceKeymanage deviceKeymanage =
        deviceKeymanageService.findDeviceKeymanageByDevId(device.getDevId());
    if (deviceKeymanage == null) {
      throw new TransferFailedException(
          AppExCode.DEVICE_KEY_NOT_EXIST, "cash Load failed,not find deviceKeymanage info");
    }
    PaySignUp paySignUp =
        paySignUpService.findPaySignUpByMrchNoAndTrmnlNo(
            cupsTrmnl.getMrchNo(), cupsTrmnl.getTrmnlNo());
    if (paySignUp == null) {
      throw new TransferFailedException(
          AppExCode.TERMINAL_KEY_NOT_EXIST, "cash Load failed,not find cups signUp info");
    }
    // 密钥体系转换
    CupsKeyManage cupsKeyManage = new CupsKeyManage();
    cupsKeyManage.setDevPinKey(deviceKeymanage.getPinkey());
    cupsKeyManage.setTrmnlPinKey(paySignUp.getTrmnlPinKey());
    cupsKeyManage.setTrmnlMacKey(paySignUp.getTrmnlMacKey());
    // CUPS请求信息
    CupsRequestInfo requestInfo = new CupsRequestInfo();
    requestInfo.setPayNo(cashLoad.getCashLoadNo());
    requestInfo.setAmount(request.getAmount());
    requestInfo.setPinblock(request.getPinblock());
    requestInfo.setEmvTransInfo(request.getEmvTransInfo());
    requestInfo.setCardSeqNum(request.getCardSeqNum());
    requestInfo.setCurrency(request.getCurrency().getCodeN());
    requestInfo.setExtFld01(request.getStoreNo());
    requestInfo.setOrderNo(request.getOrderNo());
    try {
      TrackContext trackContext =
          getTrackData(deviceKeymanage.getDatakey(), request.getTrackData());

      requestInfo.setCardNo(trackContext.getTrack2Data().split("=")[0]);
      requestInfo.setTrack2Data(trackContext.getTrack2Data());
      requestInfo.setTrack3Data(trackContext.getTrack3Data());
    } catch (HSMException e) {
      String hsmRespCode = XPOSPClientUtils.getCode(e);
      if (!AppExCode.UNKNOWN.equals(hsmRespCode)) {
        hsmRespCode = Const.TP_BEGIN_HSM + hsmRespCode;
      }
      throw new TransferFailedException(
          hsmRespCode,
          "cash Load failed, when descrypt track data form hsm error code[" + hsmRespCode + "]");
    }

    CupsResponseInfo responseInfo = null;
    try {
      // 构建发起金融交易
      responseInfo = cashLoadProcess.process(cupsTrmnl, cupsKeyManage, requestInfo);
    } catch (TransferFailedException e) {
      String errorCode = XPOSPClientUtils.getCode(e);
      processErrorCode(errorCode, cupsTrmnl);
      throw e;
    }

    // 如果没有抛异常,则交易成功
    cashLoad.setTransStatus(Const.TransStatus.SUCCESS);
    cashLoad.setTransCode(responseInfo.getTransCode());
    cashLoad.setEmvTransInfo(responseInfo.getEmvTransInfo());
  }