【定时】自动二次接口退款
2017-03-13 17:43:18 0 举报
自动二次接口退款是一种智能化的退款方式,它可以根据用户的需求和商家的政策,自动进行退款操作。这种方式可以大大提高退款的效率,减少人工干预,降低错误率。例如,当用户在购买商品后发现商品有问题或者不满意时,可以通过系统提交退款申请。系统会自动检查用户的退款申请是否符合商家的退款政策,如果符合,就会自动进行退款操作。此外,系统还可以根据用户的购物记录和行为分析,预测用户可能的退款需求,提前进行处理,提高用户体验。总之,自动二次接口退款是一种高效、便捷、智能的退款方式,能够满足用户和商家的不同需求。
作者其他创作
大纲/内容
newProcessRecord.setRefundProcessStatus(RefundProcessRecordStatusEnum.REFUND_FAIL);newProcessRecord.setCommitBankStatus(CommitBankStatusEnum.COMMIT_FAIL);newProcessRecord.setCommitBankTime(new Date());newProcessRecord.setFailReason(\"退款超过非联机退款有效期\");newProcessRecord.setFinishTime(new Date());newProcessRecord.setLastModifyTime(new Date());refundDetailEntity.setRefundStatus(RefundDetailStatusEnum.BANK_PROCESSING);refundOrderEntity.setRefundStatus(RefundOrderStatusEnum.BANK_PROCESSING);
异常
抛出相应的异常
修改退款处理记录属性
修改原有的退款处理记录属性orgProcessRecord.setHasRegenerateFlag(true)
更新退款处理记录
(该逻辑,在本定时任务执行时,理论上肯定是不会执行的)首先,校验是否超过了联机有效期,如果超过了则,执行如下所示的更新 ↓
判断是否可发起二次退款
该定时肯定会执行该逻辑:1. 在白名单上的支付接口,如果首次退款不是接口退款,允许其进行接口退款2. 若支付接口不可退款,即refundable为false,则抛出异常3. 若支付接口可退款,则校验该接口的退款方式列表是否为空,为空则抛出异常。
校验通过
查询最近的退款处理记录
1. 先用1查,若未查询到结果,且原记录退款方式不是接口退款时,则用2进行查询。2. 若1.中查询到了最近一次的退款处理记录,则校验其退款次数是否超限,若超限则抛出异常,否则,将其isLastItf置为false。3. 若1.中未查询到记录,且原记录的退款方式为接口退款,或者1.中查到的最近的一次退款就是原退款记录,则,校验原记录的退款次数是否超限,如果超限→抛出异常,如果ok→isLastItf(是否为最近的一次退款)置为false
是否为接口退款
退款处理记录校验
1. 是否存在2. 退款处理状态是否为REFUND_FAIL3. 该退款记录是否已重新发起退款 - getHasRegenerateFlag
创建新的退款处理记录
在原退款处理记录的基础上进行如下修改:
newProcessRecord.setHasRegenerateFlag(false); newProcessRecord.setRefundWay(refundWay); // refundWay = BANK_INTERFACE_REFUND newProcessRecord.setRefundTimes(newProcessRecord.getRefundTimes() + 1); newProcessRecord.setRefundProcessStatus(status); // status = INIT newProcessRecord.setRefundBatchId(null); newProcessRecord.setCommitBankStatus(CommitBankStatusEnum.INIT); newProcessRecord.setCommitBankTime(null); newProcessRecord.setFinishTime(null); newProcessRecord.setFailReason(\"\"); newProcessRecord.setConfirmOperName(null); newProcessRecord.setRefundIsFundNotify(查询确认是否需要退款通知); // 人工置备注清空 newProcessRecord.setFailByManualReason(null); newProcessRecord.setItfFailCode(null); newProcessRecord.setItfFailMsg(null); newProcessRecord.setFailType(null); newProcessRecord.setBackTime(null); newProcessRecord.setBankBackOperateTime(null);\tnewProcessRecord.setIsLastItf(true); // 重新发起的接口退款为保证每天的定时提交银行可以触发,重设处理记录可调用时间为当前时间 newProcessRecord.setUsableTime(Calendar.getInstance().getTime()); processRecord.setRefundType(正常退款/过期订单退库);
入库
原退款处理记录新退款处理记录最近的退款处理记录退款详情、退款订单(这两个表的修改时在前一步流程中进行的)
POS退款结果通知
如果退款方式不是接口退款,且产品类型是POS,则对pos进行通知
若已冻结,则直接结束流程(不会抛出异常)
接口退款
查询退款处理记录
根据ID进行查询
退款方式校验
该定时的校验肯定会通过,故略过细节。
线下退款上传文件退款
超过联机则发送邮件通知
若超过了联机有效期,则进行邮件通知
该记录是否已冻结
orgProcessRecord.isBlocked(
该部分是否执行,依赖于“更新退款处理记录”
校验未通过
SELECT * FROM TBL_REFUND_PROCESS_RECORD RECORDWHERE REFUND_PROCESS_STATUS = 'REFUND_FAIL' AND EXISTS ( \tSELECT 1 FROM TBL_REFUND_INTERFACE \tWHERE INTERFACE_CODE = RECORD.REFUND_INTERFACE \t\t AND (MANUL_INTERFACE_REFUND = '0' or MANUL_INTERFACE_REFUND is null)) AND EXISTS ( \tSELECT 1 FROM TBL_EXCEPTION_CODE_CTL \tWHERE INITIATOR = RECORD.INITIATOR \t AND PAY_INTERFACE = RECORD.PAY_INTERFACE \t AND EXCEPTIONCODE = RECORD.ITF_FAIL_CODE \t \t AND ALLOWREREFUND = '1') AND (BLOCKED IS NULL OR BLOCKED = '0') AND END_REFUND_STATUS is NULL AND AUDITING_STATUS is NULL AND HAS_REGENERATE_FLAG = 0 AND REFUND_TIMES = 1 AND REFUND_WAY = 'BANK_INTERFACE_REFUND' AND USABLE_TIME #{usableDate} AND CREATE_TIME BETWEEN #{createStartDate} AND #{createEndDate}WITH UR
0 条评论
下一页