工作中项目涉及的小细节,你都遇到了吗
1.订单与支付
1.1问题背景
假如有一个快递下单系统,在寄快递时,客户下单并支付费用,支付后会生成验货码用于商家扫描入库,其支付和退款流程如下:
支付:创建业务订单---> 创建支付订单---> 唤起支付收银台---> 输入密码---> 进入支付回调处理 ---> 更改支付状态及业务状态 退款:创建退款订单---> 发起退款---> 进入退款回调处理 ---> 更改支付状态及业务状态
那么在编写程序时会思考:支付时,是先生成验货码后再支付呢?还是先支付再生成验货码?同样在退款时,是先退码后再退款呢?还是先退款再退码?
1.2问题分析
支付:
- 先生成验货码后再支付。
A.若生成验货码成功,支付成功,则完事大吉;
B.若生成验货码成功,支付失败,会在异常处理中进行退码处理,但不一定退码成功。造成短款(客户没支付,但服务方的码可用。损失的是服务方);
C.若生成验货码失败,则无需支付。
- 先支付再生成验货码。
A.若支付成功,生成验货码成功,则完事大吉;
B.若支付成功,生成验货码失败,会造成长款(客户已支付,但码不可用。客户可申请退款进行处理,损失的是客户);
C.若支付失败,则无需生成验货码。
退款:
- 先退码后再退款。
A.若退码成功,退款成功,则完事大吉;
B.若退码成功,退款失败,会造成长款(客户已支付,但码不可用。客户可申请退款进行处理,损失的是客户);
C.若退码失败,则不再继续往后走,需通过分析找出原因并解决。
- 先退款再退码。
A.若退款成功,退码成功,则完事大吉;
B.若退款成功,退码失败,会造成短款(客户已退款,但码可用。损失的是服务方);
C.若退款失败,则不再继续往后走,需通过分析找出原因并解决。
1.3结论
针对上述问题分析,可得出结论是支付时先支付再生成验货码,退款时退码后再退款。
那么针对支付问题,处理方式如下:
支付时,一定要先完成支付,再处理业务系统的业务。
退款时,一定要先完成业务确认,再执行退款。
2.Redis凌晨按点过期
有个需求,无论什么时候的缓存数据,都必须在第二天凌晨0点失效。redis官网并未提供某个时间点失效的方法,那么何去做呢?
思路:先计算当前时间到第二天凌晨0点相差的时间(推荐以秒为单位),将此时间设置为key的过期时间即可。
计算的java代码如下:
/** * 计算第二天凌晨与当前时间的时间差秒数 * * @return */ public static Long getNowToNextDaySeconds() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, 1);//相差的天数 cal.set(Calendar.HOUR_OF_DAY, 0);//相差的小时 cal.set(Calendar.MINUTE, 0);//分钟 cal.set(Calendar.SECOND, 0);//秒 cal.set(Calendar.MILLISECOND, 0);//毫秒 return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000; }
返回值的单位是秒。
就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !