@Override public boolean signUp(Device device) throws TransferFailedException { boolean isSignUpSuccess = false; CupsTrmnl cupsTrmnl = cupsTrmnlService.findById(device.getBindTransId()); if (cupsTrmnl == null) { throw new TransferFailedException( AppExCode.TERMINAL_NOT_EXIST, "goodee signup failed,not find CupsTrmnl"); } PaySignUp paySignUp = paySignUpService.findPaySignUpByMrchNoAndTrmnlNo( cupsTrmnl.getMrchNo(), cupsTrmnl.getTrmnlNo()); if (paySignUp != null) { if (StringUtils.isNotBlank(paySignUp.getRespCode()) && Const.ISO_RESPCODE_OK.equals(paySignUp.getRespCode())) { long workingKeyTimeout = paySignUp.getUpdTime().getTime() + Const.WORKING_KEY_TIMEOUT; long nowTime = (new Date()).getTime(); if (workingKeyTimeout > nowTime) { isSignUpSuccess = true; } } } if (!isSignUpSuccess) { signUpProcess.process(cupsTrmnl); isSignUpSuccess = true; } return isSignUpSuccess; }
@Override public CardInfo balance(Device device, BalanceRequest 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, "goodee balance failed,cardNo null"); } if (StringUtils.isBlank(request.getTrack2Data()) && StringUtils.isBlank(request.getTrackData())) { throw new TransferFailedException( AppExCode.ILLEGAL_PARAMS, "goodee banlance 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, "goodee balance 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()); if (cupsTrmnl == null) { throw new TransferFailedException( AppExCode.TERMINAL_NOT_EXIST, "goodee banlance failed,not find CupsTrmnl"); } // 获取密钥信息 DeviceKeymanage deviceKeymanage = deviceKeymanageService.findDeviceKeymanageByDevId(device.getDevId()); if (deviceKeymanage == null) { throw new TransferFailedException( AppExCode.DEVICE_KEY_NOT_EXIST, "goodee balance failed,not find deviceKeymanage info"); } PaySignUp paySignUp = paySignUpService.findPaySignUpByMrchNoAndTrmnlNo( cupsTrmnl.getMrchNo(), cupsTrmnl.getTrmnlNo()); if (paySignUp == null) { throw new TransferFailedException( AppExCode.TERMINAL_KEY_NOT_EXIST, "goodee pay 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.setPinblock(request.getPinblock()); requestInfo.setEmvTransInfo(request.getEmvTransInfo()); requestInfo.setCardSeqNum(request.getCardSeqNum()); requestInfo.setCurrency(request.getCurrency().getCodeN()); 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, "goodee balance failed, when descrypt track data form hsm error code[" + hsmRespCode + "]"); } CupsResponseInfo cupsResponseInfo = new CupsResponseInfo(); try { cupsResponseInfo = balanceProcess.process(cupsTrmnl, cupsKeyManage, requestInfo); } catch (TransferFailedException e) { String errorCode = XPOSPClientUtils.getCode(e); processErrorCode(errorCode, cupsTrmnl); throw e; } CardInfo cardInfo = new CardInfo(); cardInfo.setTransRefNo(cupsResponseInfo.getPayNo()); cardInfo.setTransCode(cupsResponseInfo.getTransCode()); cardInfo.setCardNo(request.getCardNo()); // 返回的卡号需带有掩码 cardInfo.setBalance(cupsResponseInfo.getBalance()); cardInfo.setEmvTransInfo(cupsResponseInfo.getEmvTransInfo()); return cardInfo; }
@Override public void cashPay(final Device device, final Payment payment, final PaymentRequest request) throws TransferFailedException { logger.info("entryMode:" + request.getEntryMode()); logger.info("EmvTransInfo is not null :" + StringUtils.isNotBlank(request.getEmvTransInfo())); // 校验数据 if (StringUtils.isBlank(request.getCardNo())) { throw new TransferFailedException(AppExCode.ILLEGAL_PARAMS, "pay failed ,cardNo null"); } // 卡输入方式 // if(StringUtils.isNotBlank(request.getEntryMode())){ // boolean isOk=isEntryModeOk(request.getEntryMode(),request.getPinblock(), // request.getEmvTransInfo()); // if(!isOk){ // throw new TransferFailedException(AppExCode.ILLEGAL_PARAMS, "pay failed,entryMode is // "+request.getEntryMode()+" but pinBlock is not // null:"+StringUtils.isNotBlank(request.getPinblock())+" ,emvTransInfo is not // null:"+StringUtils.isNotBlank(request.getEmvTransInfo())); // } // } // 非接交易时候,55域的tag“9F74”必须出现 if (StringUtils.isBlank(request.getEmvTransInfo())) { throw new TransferFailedException( AppExCode.ILLEGAL_PARAMS, "pay failed,emvTransInfo is" + request.getEmvTransInfo()); } // 获取当前设备的终端信息 CupsTrmnl cupsTrmnl = cupsTrmnlService.findById(device.getBindTransId()); if (cupsTrmnl == null) { throw new TransferFailedException( AppExCode.TERMINAL_NOT_EXIST, "pay failed,not find CupsTrmnl"); } // 获取密钥信息 DeviceKeymanage deviceKeymanage = deviceKeymanageService.findDeviceKeymanageByDevId(device.getDevId()); if (deviceKeymanage == null) { throw new TransferFailedException( AppExCode.DEVICE_KEY_NOT_EXIST, "pay failed,not find deviceKeymanage info"); } PaySignUp paySignUp = paySignUpService.findPaySignUpByMrchNoAndTrmnlNo( cupsTrmnl.getMrchNo(), cupsTrmnl.getTrmnlNo()); if (paySignUp == null) { throw new TransferFailedException( AppExCode.TERMINAL_KEY_NOT_EXIST, "pay 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(payment.getPayNo()); requestInfo.setAmount(request.getAmount()); requestInfo.setPinblock(request.getPinblock()); requestInfo.setEmvTransInfo(request.getEmvTransInfo()); requestInfo.setCardSeqNum(request.getCardSeqNum()); requestInfo.setEntryMode(request.getEntryMode()); requestInfo.setCurrency(request.getCurrency().getCodeN()); requestInfo.setExtFld01(request.getStoreNo()); requestInfo.setCardNo(request.getCardNo()); requestInfo.setCardExpiryDay(request.getCardExpire()); requestInfo.setOrderNo(request.getOrderNo()); requestInfo.setIcScript(request.getIcScript()); CupsResponseInfo responseInfo = null; try { responseInfo = cashConsumeProcess.process(cupsTrmnl, cupsKeyManage, requestInfo); } catch (TransferFailedException e) { String errorCode = XPOSPClientUtils.getCode(e); processErrorCode(errorCode, cupsTrmnl); throw e; } // 如果没有抛异常,则交易成功 payment.setTransStatus(Const.TransStatus.SUCCESS); payment.setTransCode(responseInfo.getTransCode()); payment.setEmvTransInfo(responseInfo.getEmvTransInfo()); }