体彩新春季 竞猜不打烊

1. 活动方案

    为持续打造具有体彩特色的节日营销契机,进一步提升竞猜游戏品牌认知度,在回馈广大购彩者的同时,聚焦新客户群体的拓展,我中心拟在春节期间开展趣味线上竞猜活动,具体活动方案如下:

一、活动主题

“体彩新春季 竞猜不打烊”

二、活动时间

2021年2月9日-2月18日 每天10时-20时

三、参与方式

关注“湖北体彩”微信公众号,进入“体彩新春季 竞猜不打烊”H5主题活动页面即可参与活动。

四、活动规则

活动期间内,每两天(即2月9、11、13、15、17日)上午10时,在“体彩新春季 竞猜不打烊”H5主题活动页面发布一轮“竞猜胜平负”游戏,共五轮,持续十天。

(一)用户只要参与活动即可获得一次抽奖机会;

(二)在微信朋友圈、微信群内分享活动页面可额外增加一次抽奖机会;

(三)每轮竞猜正确再增加一次抽奖机会。

参与抽奖就有机会获得体彩现金红包、体彩“乐小星”玩偶(个)、移动电源和价值千元华为蓝牙耳机等奖励。若五轮游戏全部竞猜正确,即可参与抽取终极大奖——2000元现金奖励。

五、竞猜场次(暂定)

  • 第一轮:2月9日10时发布

    竞猜场次—足总杯“埃弗顿VS托特纳姆热刺”

    比赛时间:2月11日 03:45

    备用场次:法国杯“卡昂VS巴黎圣日耳曼”

    比赛时间:2月11日 04:00

  • 第二轮:2月11日10时发布

    竞猜场次—德甲“RB莱比锡VS奥格斯堡”

    比赛时间:2月13日 03:30

    备用场次:意甲“博洛尼亚VS贝内文托”

    比赛时间:2月13日 03:45

  • 第三轮:2月13日10时发布

    竞猜场次—意甲“国际米兰VS拉齐奥”

    比赛时间:2月15日 03:45

    备用场次:德甲“沃尔夫斯堡VS门兴格拉德巴赫”

    比赛时间:2月15日 01:00

  • 第四轮:2月15日10时发布:

    竞猜场次—欧冠“巴塞罗那VS巴黎圣日耳曼”

    比赛时间:2月17日 04:00

    备用场次:欧冠“RB莱比锡VS利物浦”

    比赛时间:2月17日 04:00

  • 第五轮:2月17日10时发布:

    竞猜场次—欧联“皇家社会VS曼联”

    比赛时间:2月19日 01:55

    备用场次:欧联“贝尔格莱德红星VSAC米兰”

    比赛时间:2月19日 04:00

六、注意事项

(一)用户参与竞猜活动及抽奖时间:每天10时-20时;

(二)每天20时至第二天9时59分59秒为非活动期间,用户无法进行竞猜及抽奖操作;

(三)每轮比赛结束后,在比赛完赛当天北京时间上午10时发布竞猜场次的比赛结果,若当前比赛场次因不可抗因素产生中断、延期等,且未在比赛当天北京时间上午10时前完赛,所有参与当前竞猜场次的用户竞猜结果均视为正确。

七、奖励发放规则

(一)体彩现金红包在用户参与活动后直接发放(累计0.3元可提现);

(二)体彩“乐小星”玩偶、移动电源和华为蓝牙耳机等实物奖励,中奖用户需在活动页面填写正确的姓名、联系方式和地址详情,省中心在活动结束后统一邮寄。

八、活动奖品

现金红包,体彩“乐小星”玩偶,移动电源,华为蓝牙耳机。

2.活动效果图

2.项目实施

    因为竞猜比赛总共分为五轮,奖品涉及到现金红包、体彩“乐小星”玩偶、移动电源、华为蓝牙耳机实物和虚拟两种奖品,并且要求前四轮控制相应奖品的发放数量,最后一轮若前四轮没有抽走的剩余奖品可以继续抽走,考虑到同时参加人数较多并发量较高,所有奖品全部提前存入redis奖品相应队列,并且前四轮每轮奖品的发放数量也提前存入redis控制发放奖品数量相应队列,抽奖时若抽中奖品,先判断当轮奖品数量控制队列是否可以lpop出值,再从奖品队列lpop出值即可。特别注意是红包的发放,如果抽中红包,先从红包控制队列和红包奖品队列取出,再调用企业付款到零钱成功之后才算成功,如果两个队列都取出成功但是付款时出现异常,应把红包控制队列数量加1并且把从红包奖品队列lpop出的金额rpush加回红包奖品队列,如果付款异常是微信没有实名认证,应把红包留给其他用户,当然付款异常也有可能是其它情况比如微信支付商户没有余额了,可以在调用接口时进行异常捕获做相应处理。

Db::startTrans();
        try {
            if (empty($this->openid)) {
                $response['code'] = 500;
                $response['message'] = '请用微信登录参加活动!';
                return json($response);
            }

            //活动时间早10到晚8 //2月20日晚八点结束
            list($usec, $sec) = explode(" ", microtime());

            if ($sec < strtotime('2021-02-09 10:00:00')) {
                $response['code'] = 500;
                $response['message'] = '活动开始时间2月9日上午10点!';
                return json($response);
            }

            if ($sec > strtotime('2021-02-20 20:00:00')) {
                $response['code'] = 500;
                $response['message'] = '活动已经结束!';
                return json($response);
            }

            if (intval(date("H")) < 10 || intval(date("H")) >= 20) {
                $response['code'] = 500;
                $response['message'] = '活动时间早10点到晚8点!';
                return json($response);
            }
            //加锁
            $personLock = date("Ym", $sec) . $this->openid;
            $lock = $this->redis->set($personLock, $sec . $usec * 1000000, array('nx', 'ex' => 2));
            if (!$lock) {
                $response['code'] = 500;
                $response['message'] = '操作频繁,请稍等!';
                return json($response);
            }

            $user = Db::name('wechat_user')->where('openid', $this->openid)->find();
            if (!$user || $user['prize_draw_num'] <= 0) {
                $response['code'] = 500;
                $response['message'] = '没有抽奖机会!';
                return json($response);
            }

            //从奖品概率中得到抽出的奖品id
            $prize_arr = Db::name('prize')->order('id')->select();
            $status = 1;

            foreach ($prize_arr as $key => $val) {
                $arr[$val['id']] = $val['probability'];
            }
            try {
                $prize_id = $this->get_rand($arr); //根据概率获取奖项id
                foreach ($prize_arr as $value) {
                    if ($value['id'] == $prize_id) {
                        $prize_name = $value['alias'];//奖项名称
                        $prize_type = $value['type'];
                        break;
                    }
                }
            } catch (\think\Exception $exception) {
                $prize_id = 1;//谢谢参与
                $prize_type = 0;
                $prize_name = '谢谢参与';
                $status = 2;
            }

            //拿到当前场次并判断
            $phase_data = $this->get_phase_data();
            if (!isset($phase_data['id']) || !in_array($phase_data['id'], [1, 2, 3, 4, 5])) {
                $prize_id = 1;//谢谢参与
                $prize_type = 0;
                $prize_name = '谢谢参与';
                $status = 2;
            }
            $turn_id = $phase_data['id'];
            //如果该轮所有的奖品都领完了(1到4轮控制每个奖品发的个数,第5轮不用)
            if (in_array($turn_id, [1, 2, 3, 4]) && !$this->redis->lLen($this->redPacketTurnPrefix . $turn_id) && !$this->redis->lLen($this->bluetoothHeadsetTurnPrefix . $turn_id) && !$this->redis->lLen($this->portablePowerTurnPrefix . $turn_id) && !$this->redis->lLen($this->dollTurnPrefix . $turn_id)) {
                $prize_id = 1;//谢谢参与
                $prize_type = 0;
                $prize_name = '谢谢参与';
                $status = 2;
            }

            //红包的话调用发送接口成功后,才返回给用户说中了红包,否则只是谢谢参与
            if ($prize_name == '红包') {
                //(1到4轮控制每个奖品发的个数,第5轮不用)
                if (in_array($turn_id, [1, 2, 3, 4])) {
                    if ($this->redis->lPop($this->redPacketTurnPrefix . $turn_id)) {
                        $amount = $this->redis->lPop($this->redPacketRedisList);
                    }
                } else {
                    $amount = $this->redis->lPop($this->redPacketRedisList);
                }
                //如果本轮红包队列个数控制不为空,并且全部红包队列不为空
                if (isset($amount) && $amount && $amount <= 8) {
                    try {
                        $app = Factory::payment(config('wechat_config'));
                        $ret = $app->transfer->toBalance([
                            'partner_trade_no' => $sec . $usec * 1000000, // 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)
                            'openid' => $this->openid,
                            'check_name' => 'NO_CHECK', // NO_CHECK:不校验真实姓名, FORCE_CHECK:强校验真实姓名
                            'amount' => $amount * 100, // 企业付款金额,单位为分
                            'desc' => '体彩新春季,竞猜不打烊', // 企业付款操作说明信息。必填
                        ]);

                        if ($ret['return_code'] != 'SUCCESS') {
                            //如果调用失败,把本轮红包控制和全部红包队列的队列都加回去,
                            //因为有用户可能微信没有实名制等,导致调用红包接口失败,但队列已经弹出了所以要加回去
                            $this->redis->rPush($this->redPacketTurnPrefix . $turn_id, $amount);
                            $this->redis->rPush($this->redPacketRedisList, $amount);
                            $prize_id = 1;//谢谢参与
                            $prize_type = 0;
                            $prize_name = '谢谢参与';
                            $status = 2;
                        }

                        if ($ret['return_code'] == 'SUCCESS') {
                            if ($ret['result_code'] == 'SUCCESS') {
                                $prize_record_id = Db::name('prize_record')->insertGetId([
                                    'openid' => $this->openid,
                                    'prize_id' => $prize_id,
                                    'prize_name' => $prize_name,
                                    'prize_type' => $prize_type,
                                    'amount' => $amount,
                                    'status' => 2,
                                    'create_time' => date("Y-m-d H:i:s", $sec),
                                    'update_time' => date("Y-m-d H:i:s", $sec)
                                ]);
                                $this->redis->incrByFloat('jingcai_hb_turn:' . $turn_id, $amount);
                                $this->redis->incrByFloat('jingcai_hb_total', $amount);
                            }
                            if ($ret['result_code'] == 'FAIL') {
                                //调用接品成功但提现失败
                                ////这里一定要注意:出现未明确的错误码时(NOTENOUGH,SYSTEMERROR,NAME_MISMATCH,SIGN_ERROR,FREQ_LIMIT,MONEY_LIMIT,CA_ERROR,V2_ACCOUNT_SIMPLE_BAN,PARAM_IS_NOT_UTF8,SENDNUM_LIMIT,SEND_MONEY_LIMIT,RECEIVED_MONEY_LIMIT,等),请务必用原商户订单号重试,或通过查询接口确认此次付款的结果。
                                //如果调用失败,视情况把本轮红包控制和全部红包队列的队列都加回去
                                $this->redis->rPush($this->redPacketTurnPrefix . $turn_id, $amount);
                                $this->redis->rPush($this->redPacketRedisList, $amount);
                                $prize_id = 1;//谢谢参与
                                $prize_type = 0;
                                $prize_name = '谢谢参与';
                                $status = 2;
                            }
                        }
                    } catch (\EasyWeChat\Kernel\Exceptions\InvalidArgumentException $exception) {
                        //如果调用企业付款到零钱接口失败为谢谢参与
                        //如果调用失败,把本轮红包控制和全部红包队列的队列都加回去
                        $this->redis->rPush($this->redPacketTurnPrefix . $turn_id, $amount);
                        $this->redis->rPush($this->redPacketRedisList, $amount);
                        $prize_id = 1;//谢谢参与
                        $prize_type = 0;
                        $prize_name = '谢谢参与';
                        $status = 2;
                    } catch (\EasyWeChat\Kernel\Exceptions\InvalidConfigException $exception) {
                        //如果调用企业付款到零钱接口失败为谢谢参与
                        //如果调用失败,把本轮红包控制和全部红包队列的队列都加回去
                        $this->redis->rPush($this->redPacketTurnPrefix . $turn_id, $amount);
                        $this->redis->rPush($this->redPacketRedisList, $amount);
                        $prize_id = 1;//谢谢参与
                        $prize_type = 0;
                        $prize_name = '谢谢参与';
                        $status = 2;
                    } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
                        //如果调用企业付款到零钱接口失败为谢谢参与
                        //如果调用失败,把本轮红包控制和全部红包队列的队列都加回去
                        $this->redis->rPush($this->redPacketTurnPrefix . $turn_id, $amount);
                        $this->redis->rPush($this->redPacketRedisList, $amount);
                        $prize_id = 1;//谢谢参与
                        $prize_type = 0;
                        $prize_name = '谢谢参与';
                        $status = 2;
                    } catch (Exception $exception) {
                        //如果调用企业付款到零钱接口失败为谢谢参与
                        //如果调用失败,把本轮红包控制和全部红包队列的队列都加回去
                        $this->redis->rPush($this->redPacketTurnPrefix . $turn_id, $amount);
                        $this->redis->rPush($this->redPacketRedisList, $amount);
                        $prize_id = 1;//谢谢参与
                        $prize_type = 0;
                        $prize_name = '谢谢参与';
                        $status = 2;
                    }
                } else {
                    $prize_id = 1;//谢谢参与
                    $prize_type = 0;
                    $prize_name = '谢谢参与';
                    $status = 2;
                }
            } else {
                //如果是华为蓝牙耳机 或者移动电源或者乐小星玩偶
                if ($prize_name == '华为蓝牙耳机') {
                    //(1到4轮控制每个奖品发的个数,第5轮不用)
                    $redisList = $this->bluetoothHeadsetRedisList;
                    if (in_array($turn_id, [1, 2, 3, 4])) {
                        if ($this->redis->lPop($this->bluetoothHeadsetTurnPrefix . $turn_id)) {
                            $popResult = $this->redis->lPop($redisList);
                        }
                    } else {
                        $popResult = $this->redis->lPop($redisList);
                    }
                }
                if ($prize_name == '移动电源') {
                    //(1到4轮控制每个奖品发的个数,第5轮不用)
                    $redisList = $this->portablePowerRedisList;
                    if (in_array($turn_id, [1, 2, 3, 4])) {
                        if ($this->redis->lPop($this->portablePowerTurnPrefix . $turn_id)) {
                            $popResult = $this->redis->lPop($redisList);
                        }
                    } else {
                        $popResult = $this->redis->lPop($redisList);
                    }
                }
                if ($prize_name == '乐小星玩偶') {
                    //(1到4轮控制每个奖品发的个数,第5轮不用)
                    $redisList = $this->dollRedisList;
                    if (in_array($turn_id, [1, 2, 3, 4])) {
                        if ($this->redis->lPop($this->dollTurnPrefix . $turn_id)) {
                            $popResult = $this->redis->lPop($redisList);
                        }
                    } else {
                        $popResult = $this->redis->lPop($redisList);
                    }
                }

                //如果没有弹出的或者弹出为空,说明本轮或者全部华为蓝牙耳机 或者移动电源或者乐小星玩偶没有了,或者奖品为谢谢参与
                if (!isset($popResult) || !$popResult) {
                    $prize_id = 1;//谢谢参与
                    $prize_type = 0;
                    $prize_name = '谢谢参与';
                    $status = 2;
                }

                $prize_record_id = Db::name('prize_record')->insertGetId([
                    'openid' => $this->openid,
                    'prize_id' => $prize_id,
                    'prize_name' => $prize_name,
                    'prize_type' => $prize_type,
                    'status' => $status,
                    'create_time' => date("Y-m-d H:i:s", $sec),
                    'update_time' => date("Y-m-d H:i:s", $sec)
                ]);
            }

            //没有$prize_record_id说明为其它异常
            if (!isset($prize_record_id)) {
                $prize_record_id = Db::name('prize_record')->insertGetId([
                    'openid' => $this->openid,
                    'prize_id' => $prize_id,
                    'prize_name' => $prize_name,
                    'prize_type' => $prize_type,
                    'status' => $status,
                    'create_time' => date("Y-m-d H:i:s", $sec),
                    'update_time' => date("Y-m-d H:i:s", $sec)
                ]);
            }

            Session::set('prize_record_id', $prize_record_id);

            Db::name('prize_draw_list')->insert([
                'openid' => $this->openid,
                'num' => -1,
                'desc' => '抽奖',
                'create_time' => date("Y-m-d H:i:s", $sec),
                'phase_num' => (isset($phase_data['id']) && $phase_data['id']) ? $phase_data['id'] : 0
            ]);

            Db::name('wechat_user')->where('openid', $this->openid)->setDec('prize_draw_num');

            $response['code'] = 200;
            $response['data'] = [
                'amount' => (isset($amount) && $amount) ? $amount : 0,
                'prize_id' => $prize_id,
                'prize_name' => $prize_name,
                'prize_type' => $prize_type,
                'prize_record_id' => $prize_record_id
            ];
            $response['message'] = '成功';
            Db::commit();
        } catch (\think\Exception $exception) {
            $response['code'] = 500;
            $response['message'] = $exception->getMessage();
            Db::rollback();
        }
        return json($response);

PHP技术分享
请先登录后发表评论
  • latest comments
  • 总共0条评论