工作中项目涉及的小细节,你都遇到了吗

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;
    }

返回值的单位是秒。

posted @ 2022-07-06 19:39  钟小嘿  阅读(58)  评论(0编辑  收藏  举报