小程序拼团业务,并发支付导致重复给用户返利bug

今天遇到了一个线上的重大bug,小程序拼团业务,例如当一个团金额达到10000元时,这个团就表示拼团成功,但是在金额马上到达10000元瞬间,多个用户同时下单,支付完成微信后台调取callback接口,因为当成团的那一刻,给当前团的用户发送奖励,线程1正在发送奖励,还没有完成时,线程2又过来了,线程三,线程四同时过来,就会循环执行发送奖励代码,造成线上多个给用户返利,解决方案:
把跟用户的交互不能交给用户来完成,要交给系统处理,写一个定时方法,定时查看哪个团拼成功了,然后给已拼成功但是还未发奖励的用户发送奖励,完美解决
在这里插入代码片
//已成团
if (group.equals(1)) {

        //发放奖励
        List<ActivityGroupRechargeOrder> list = activityGroupRechargeOrderDaoService.query()
                                                                                    .eq("activity_group_recharge_team_id", team.getId())
                                                                                    .eq("status", 1)
                                                                                    .eq("send", 0)
                                                                                    .list();

        Map<String, Person> personMap = personDaoService.getMapByIds(list.stream().map(ActivityGroupRechargeOrder::getPersonId).collect(Collectors.toList()));

        for (ActivityGroupRechargeOrder vo : list) {

            //占比
            Double percent = NumberUtil.round(vo.getAmount().doubleValue() / team.getRecharge().doubleValue(), 5, RoundingMode.HALF_DOWN).doubleValue();
            //应到金额
            Double amount = NumberUtil.round(team.getReceipt() * percent, 0, RoundingMode.HALF_DOWN).doubleValue();

            //修改用户余额
            personDaoService.update()
                            .setSql(" balance = balance + " + amount)
                            .eq("id", vo.getPersonId())
                            .update();

            PersonBalanceLog log = new PersonBalanceLog();
            log.setId(IdUtil.objectId());
            log.setPersonId(vo.getPersonId());
            log.setOpera("+");
            log.setType(1);
            log.setAmount(amount);
            log.setTitle("拼团成功,团编号" + team.getOrderNo() + ",到账金额:" + log.getAmount() + "元");
            log.setSurplus(0.0);
            personBalanceLogDaoService.save(log);

            //已发放奖励
            activityGroupRechargeOrderDaoService.update()
                                                .set("send", 1)
                                                .eq("id", vo.getId())
                                                .update();

            if (personMap.containsKey(vo.getPersonId())) {

                Person person = personMap.get(vo.getPersonId());

                WeChat.Message.mini("user")
                              .openid(person.getOpenId())
                              .template("X1UaO1H_iR3QVoB_Bar1C63nhWpEFtTv_VkWI9FmEP8")
                              .option("thing3", "成功")
                              .option("thing4", "拼团金额已到账~")
                              .send();
            }

        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值