/** * 入口 * * @return */ public String execute() throws Exception { // 判服务名称不为空 if (StringUtils.isBlank(merchantCode) || StringUtils.isBlank(orderNo)) { // 组织失败结果 write(createFailResponse("商户号或者订单号不能为空!")); return null; } // 验证签名 String preMd5Str = merchantCode + orderNo + PropertyUtil.getInstance().getProperty(BaseInterface.MD5_KEY_WITH_BACK); String generateSign = new MD5Util().md5(preMd5Str); if (!StringUtils.equalsIgnoreCase(sign, generateSign)) { // 组织失败结果 write(createFailResponse("签名验证失败!")); return null; } PayRecord payRecord = payRecordService.getPayRecord(merchantCode, orderNo); if (payRecord == null) { // 记录不存在 // 组织失败结果 write(createFailResponse("记录不存在!")); return null; } else { // 记录存在 不判状态,强制查询 // 分发处理器 向银行发起查询 ISingleTradeQueryResolver singleTradeQueryResolver = SingleTradeQueryResolverDispatcher.dispatch(); // 查询交易 SingleTradeQueryResult singleTradeQueryResult = singleTradeQueryResolver.query(payRecord); // 判断查询结果 if (!singleTradeQueryResult.isQuerySuccess()) { // 查询失败 write(createFailResponse("查询银行返回异常发生!")); return null; } else { // 查询成功 // 定义查询返回结果 int queryPayState; String tradeDateTime; String tradeBankSeq; // 判交易存在 if (!singleTradeQueryResult.isExist()) { // 不存在 queryPayState = PayRecordInterface.STATE_FAILED; tradeDateTime = StringUtils.EMPTY; tradeBankSeq = StringUtils.EMPTY; } else { // 存在 queryPayState = singleTradeQueryResult.getTradeState(); tradeDateTime = singleTradeQueryResult.getTradeDateTime(); tradeBankSeq = singleTradeQueryResult.getTradeBankSeq(); } // 由于查询交易消耗时间 重新查询最新的支付记录 payRecord = payRecordService.getPayRecordByTradeNo(payRecord.getTradeNo()); // 查询前老的状态 int oldTradeState = payRecord.getTradeState(); // 为支付状态判优先级 优先则需要修改 boolean needUpdate = BaseUtil.comparePriorityForPayState(queryPayState, payRecord.getTradeState()); if (!needUpdate && (queryPayState != payRecord.getTradeState())) { // 这里比较只为记录下,不需要修改但是又强制修改了的数据,而且前后状态不一致的,log记录异常: logger.error("_FORCE_UPDATE_NOT_NEED_UPDATE_PAY_RECORD_->" + payRecord.toString()); } /** 修改最新交易状态(不比较状态优先级,强制修改记录,以银行返回状态为准) */ payRecord.setTradeState(queryPayState); payRecord.setTradeDateTime(tradeDateTime); payRecord.setTradeBankSeq(tradeBankSeq); payRecord.setTradeDesc(BaseUtil.translatePayRecordStateDesc(queryPayState)); payRecord.setUpdateDate(DateUtil.getNowDate()); payRecord.setUpdateTime(DateUtil.getNowTime()); payRecord.setUpdateIp(IPAddressUtil.getIPAddress(request)); // 银行返回交易状态【强制】修改支付记录 payRecordService.forceUpdateTradeState(payRecord); tradeDateTime = payRecord.getTradeDateTime(); if (StringUtils.isBlank(tradeDateTime)) { tradeDateTime = payRecord.getCreateDate() + payRecord.getCreateTime(); } // 组织成功结果 write( createSuccessResponse( oldTradeState, payRecord.getTradeState(), StringUtils.trimToEmpty(payRecord.getTradeDesc()))); return null; } } }