request; if ($retuest->isPost) { $mall_id = $this->mall_id; $sign = $this->mall['mall_sign']; $where[] = ['=', 'status', StatusEnum::ENABLED]; $where[] = ['=', 'mall_id', $mall_id]; $select = "id,name,key_word,poster_content"; $params = ['where' => $where, 'order' => 'id desc', 'select' => $select]; $list = ShareRedpack::lists($params); if (empty($list)) return $this->success('获取成功', $list); foreach ($list as $key => $item) { $data = [ 'user_id' => $this->user_id, 'nickname' => $this->user->nickname, 'avatar_url' => $this->user->avatar_url, 'item_id' => $item['id'], ]; // 生成海报对应码 $select_code = "id,mall_id,user_id,source,code,content,applet_code"; if ($key == 0) $select_code.= ",applet_code"; $poster = PosterCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, $data, $select_code); $sharePoster = ShareRedpackCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, $data, $select_code,$poster['code']); if ($poster == false) return $this->error(ShareRedpackCode::getStaticError()); $list[$key]['poster_code_id'] = $poster['id']; // $list[$key]['qrcode_url'] = DiyEnum::HOME_PAGE_PATH . "?sign={$sign}&parent_id=" . $this->user->id."&source=".User::SOURCE_SHARE_REDPACK; $list[$key]['qrcode_url'] = DiyEnum::USER_LOGIN . "?sign={$sign}&scene=" . $poster['code']; // 第一张图片请求获取小程序二维码 if ($this->platform == User::PLATFORM_MP_WX && $key == 0 && empty($poster['applet_code'])) { //二维码携带user_id 跟活动类型 // $codeParams = 'parent_id='.$this->user_id.'&'.'source='.User::SOURCE_SHARE_REDPACK; // $codeParams = $this->user_id.'&'.User::SOURCE_SHARE_REDPACK; $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN , $poster['code']);// 获取小程序二维码base64数据 // $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN , $codeParams);// 获取小程序二维码base64数据 if ($applet_url == false) return $this->error('获取小程序二维码失败'); $list[$key]['applet_code'] = $applet_url; ShareRedpackCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, array_merge($data,['id' => $sharePoster['id'], 'applet_code' => $applet_url]), $select_code,$poster['code']); PosterCode::setData($this->mall_id, $this->user->id, User::SOURCE_SHARE_REDPACK, array_merge($data,['id' => $poster['id'], 'applet_code' => $applet_url]), $select_code); } if ($key == 0) { // 统计浏览次数 ShareRedpack::updateAllCounters(['look_num' => 1],"id=" . $item['id']); } } //生成邀请详情表数据 $findInvate = ShareRedpackInvate::findOne(['mall_id'=>$this->mall_id,'user_id'=>$this->user_id]); if(empty($findInvate)){ $invateCode = $this->randomkeys(2); $invateModel = new ShareRedpackInvate(); $invateModel->mall_id = $this->mall_id; $invateModel->user_id = $this->user_id; $invateModel->invite_code = $invateCode; $invateModel->num = 0; if(!$invateModel->save()){ return $this->error($invateModel->getStaticError()); } } //浏览 $event = new ShareEvent($this->mall_id); $data['mall_id'] =$this->mall_id; \Yii::$app->services->events->dispatch($event, ['mall_id'=>$this->mall_id,'user_id'=>$this->user_id], $event->listeners); $this->success('获取成功', $list); } } /** * 获取海报码详情 * @Author: lun * @DateTime: 2021/12/30 0030 14:07 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionPosterCodeDetail() { $retuest = Yii::$app->request; if ($retuest->isPost) { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['scene'], 'string'], [['poster_code_id'], 'integer'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $mall_id = $this->mall_id; $is_save = false; !empty($params['poster_code_id']) && $where['id'] = $params['poster_code_id']; $where['mall_id'] = $mall_id; !empty($params['scene']) && $where['code'] = $params['scene']; $where['status'] = StatusEnum::ENABLED; $select = "id,applet_code,user_id,source,item_id,source,content"; $detail = ShareRedpackCode::find()->select($select)->where($where)->one(); if (empty($detail)) return $this->error('暂无内容'); if (!empty($params['poster_code_id']) && $this->platform == User::PLATFORM_MP_WX) { // 小程序二维码为空则去获取小程序二维码 if (empty($detail['applet_code'])) { //二维码携带user_id 跟活动类型 // $codeParams = 'parent_id='.$detail->user_id.'&'.'source='.User::SOURCE_SHARE_REDPACK; $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN, $detail['code']);// 获取小程序二维码base64数据 // $applet_url = $this->getAppletQrCode(DiyEnum::USER_LOGIN, $codeParams);// 获取小程序二维码base64数据 if ($applet_url == false) $this->error('获取小程序二维码失败'); // 获取到base64将其临时存服务器 $detail->applet_code = $applet_url; $is_save = true; } } // 统计浏览次数 if (!empty($params['poster_code_id'])) { ShareRedpack::updateAllCounters(['look_num' => 1],"id=" . $detail->item_id); } // 统计海报扫码次数 if (!empty($params['scene']) && $detail['source'] == User::SOURCE_SHARE_REDPACK) { ShareRedpack::updateAllCounters(['scan_code_num' => 1],"id=" . $detail->item_id); } // 保存数据 if ($is_save && !$detail->save()) return $this->error("获取错误:" . ShareRedpackCode::getStaticError()); // 解析json $content = Json::decode($detail['content'], true); if (!empty($content['user_id'])) { $content = array_merge(['share_user_id' => $content['user_id']], $content); $user = User::findOne(['id'=>$content['user_id']]); $content['invite_mobile'] = $user['mobile']??''; $detail['content'] = Json::encode($content); } $this->success('获取成功', $detail->toArray()); } } /** * 红包设置页面 */ public function actionRedPacketSettingPage() { $retuest = Yii::$app->request; if ($retuest->isPost) { //获取用户余额 $userWallet = UserWallet::findOne(['mall_id'=>$this->mall_id, 'user_id'=>$this->user_id]); $balance = 0; if(!empty($userWallet)){ $balance = $userWallet->balance; } $data = []; $data['head_title'] = '发红包'; $data['red_packet_text'] = '红包记录'; $data['amount_text'] = '单个红包金额'; $data['number_text'] = '红包个数'; $data['balance'] = $balance; $data['button_text'] = '塞钱进红包(从余额中扣款)'; $data['notes'] = '红包扣款源于您的消费钱包余额'; $this->success('获取成功', $data); } } /** * 红包设置(发红包) */ public function actionRedPacketSetting() { $retuest = Yii::$app->request; if ($retuest->isPost) { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['money','num','id'], 'required'], [['money'], 'double'], [['num','id'], 'integer'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); if ($params['money'] < 0.01) return $this->error("金额必须大于或等于一分钱",['recharge_balance'=>0]); //获取用户钱包数据 $walletData = UserWallet::findOne(['mall_id'=>$this->mall_id,'user_id'=>$this->user_id]); $allMoney = $params['money'] * $params['num']; if($walletData->balance < $allMoney) return $this->error("红包余额不足,请前往余额充值",['recharge_balance'=>1]); $trans = Yii::$app->db->beginTransaction(); try { //生成红包活动 $RedpackRecord = ShareRedpackRecord::findOne(['mall_id'=>$this->mall_id,'user_id'=>$this->user_id]); if(empty($RedpackRecord)){ $RedpackRecord = new ShareRedpackRecord(); }else{ //判断红包个数是否消费完 if($RedpackRecord->num > 0){ return $this->error("还有剩余的红包".$RedpackRecord->num.'个未领取',['recharge_balance'=>0]); } } $RedpackRecord->mall_id = $this->mall_id; $RedpackRecord->user_id = $this->user_id; $RedpackRecord->money = $params['money']; $RedpackRecord->all_num = $params['num']; $RedpackRecord->num = $params['num']; $RedpackRecord->repack_id = $params['id']; if(!$RedpackRecord->save()){ throw new Exception(ShareRedpackRecord::getStaticError()); } //扣除用户余额 $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE, 'money' => '-'.$allMoney, 'desc' => '分享海报得红包', 'source_table' => ShareRedpackRecord::tableName(), 'source_table_id' => $this->user_id, 'from_type' => ShareRedpackEnum::FROM_SHARE_REDPACK, 'capital_type' => ShareRedpackEnum::SHARE_REDPACK_SETTING, ]; $res = UserWalletService::batchHandleByQueue($insert_wallet); if ($res == false) throw new Exception(UserWalletService::getStaticError()); $trans->commit(); return $this->success('操作成功',['recharge_balance'=>0]); } catch (\Exception $e) { $trans->rollBack(); return $this->error($e->getMessage()); } } } /** * 红包记录列表(领取红包的时候会生成记录) */ public function actionRedPacketList() { if (Yii::$app->request->isPost) { $params = Yii::$app->request->post(); $where = []; $where[] = ['=', 'mall_id', $this->mall_id]; $where[] = ['=', 'user_id', $this->user_id]; $where[] = ['=', 'status', StatusEnum::ENABLED]; $order = 'id desc'; $select = "id,user_id,get_user_id,change_num,change_type,desc,created_at"; $limit = $params['limit'] ?? 20; $with = ['user']; $params = compact('where','order','select','limit','with'); // $params = ['select' => $select, 'where' => $where, 'order' => $order, 'with'=>$with]; $list = ShareRedpackRecordLog::listPage($params, false, true); if(!empty($list['list'])){ foreach ($list['list'] as &$item){ $item['created_at'] = date('Y-m-d H:i:s',$item['created_at']); $item['desc'] = '发给用户:'.$item['user']['id'].' '.$item['user']['nickname']; } } unset($list['sql']); return $this->success('获取成功', compact('list')); } } /** * 登录判断是否显示红包弹框 */ public function actionShareRedpackPopup() { if (Yii::$app->request->isPost && $this->user_id) { //登录调用 //判断用户来源 $userData = User::findOne(['id' => $this->user_id]); $data = []; $data['is_open'] = 0; if ($userData->source == ShareRedpackEnum::SOURCE_SHARE_REDPACK) { //判断是否领取 $find = ShareRedpackRecordLog::findOne(['get_user_id' => $this->user_id]); $record = ShareRedpackRecord::findOne(['mall_id'=>$this->mall_id, 'user_id'=>$userData->parent_id]); if (empty(($find)) && !empty($record)) { $data['is_open'] = 1; } } return $this->success('操作成功',$data); } } /** * 用户登录获取红包 */ public function actionGetRedpack() { if (Yii::$app->request->isPost) { //登录调用 //判断用户来源 $userData = User::findOne(['id'=>$this->user_id]); if($userData->source == ShareRedpackEnum::SOURCE_SHARE_REDPACK){ //判断是否领取 $find = ShareRedpackRecordLog::findOne(['get_user_id' => $this->user_id]); $record = ShareRedpackRecord::findOne(['mall_id'=>$this->mall_id, 'user_id'=>$userData->parent_id]); $trans = Yii::$app->db->beginTransaction(); try { $data = []; if (empty($find) && !empty($record)) { $model = new ShareRedpackRecordLog(); $model->record_id = $record->id; $model->mall_id = $this->mall_id; $model->user_id = $userData->parent_id; $model->get_user_id = $this->user_id; $model->change_num = $record->money; $model->change_type = 'sub'; $model->desc = '发给用户:'.$userData->id.$userData->nickname; if (!$model->save()) { throw new Exception($model->getStaticError()); } //红包数量-1 $num = $record->num - 1; if ($num < 0) { return $this->error('来慢了,红包已被领取完'); } $record->num = $num; if (!$record->save()) { throw new Exception($record->getStaticError()); } //海报扫码次数加一 $shareRepack = ShareRedpack::findOne(['id'=>$record->repack_id]); if(!empty($shareRepack)){ $shareRepack->scan_code_num = $shareRepack->scan_code_num+1; if (!$shareRepack->save()) { throw new Exception($shareRepack->getStaticError()); } } //增加用户余额 $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE, 'money' => $record->money, 'desc' => '分享海报得红包', 'source_table' => ShareRedpackRecord::tableName(), 'source_table_id' => $this->user_id, 'from_type' => ShareRedpackEnum::FROM_SHARE_REDPACK, 'capital_type' => ShareRedpackEnum::SHARE_REDPACK_SETTING, ]; $res = UserWalletService::batchHandleByQueue($insert_wallet); if ($res == false) throw new Exception(UserWalletService::getStaticError()); //share_redpack_invate 邀请数量 +1 $invateModel = ShareRedpackInvate::findOne(['user_id'=>$userData->parent_id]); if(!empty($invateModel)){ $invateModel->num = $invateModel->num + 1; if(!$invateModel->save()) throw new Exception($invateModel->getStaticError()); //share_redpack_invate_log 生成邀请记录 $invateLogModel = new ShareRedpackInvateLog(); $invateLogModel->mall_id = $this->mall_id; $invateLogModel->invate_id = $invateModel->id; $invateLogModel->user_id = $this->user_id; if(!$invateLogModel->save()) throw new Exception($invateLogModel->getStaticError()); } $data['desc'] = '恭喜您获得好友发放的红包'; $data['money'] = $record->money.'元'; } $trans->commit(); return $this->success('操作成功',$data); } catch (\Exception $e) { $trans->rollBack(); return $this->error($e->getMessage()); } } } } function randomkeys($length) { $key = ''; $pattern = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ'; $time = time(); $number = substr($time,6,4); for($i=0;$i<=$length;$i++) { $key .= $pattern[mt_rand(0,35)]; //生成php随机数 } return $key.$number; } /** * 获取小程序二维码 * @Author: lun * @DateTime: 2021/12/27 0027 17:25 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $page * @param $scene * @return mixed|void */ public function getAppletQrCode($page, $scene) { $page = ltrim($page, '/'); $url = ''; /** @var Wechat $wechat */ Yii::$app->params['wechatMiniProgramConfig'] = Yii::$app->services->setting->mall->get($this->mall_id, 'mini_program'); $miniProgram = Yii::$app->wechat->miniProgram; $response = $miniProgram->app_code->getUnlimit($scene, ['width' => 200, 'page' => $page]); if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) { if (in_array('image/jpeg', $response->getHeader('Content-Type'))) { //返回base64图片 $content = 'data:image/jpg;base64,'. base64_encode($response->getBody()->getContents()); $path = Yii::getAlias('@attachment') . '/download/qrcode'; if (!file_exists($path)) {// 异步生成小程序图片文件夹 Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, ['path' => $path], PosterCode::class, 'mkdirQrcode'); } $fileName = $this->base64_image_content($content, $path); if ($fileName == false) return false; // 图片上传到云存储 $csv = new CsvTool(); $url = $csv->upload($this->mall_id, 'download/qrcode/' . $fileName); $config = Yii::$app->services->attachment->getStorageConfig($this->mall_id); if ($config['drive'] != Attachment::DRIVE_LOCAL) unlink($path .'/'. $fileName);// 删除临时存储的文件 } else { //返回文字 // $res = Json::decode($response->getBody()->getContents(), true); return $this->error('获取失败:' . $response->getBody()->getContents()); // return false; } }else{ return $this->error($response['errmsg']); // return false; } return $url; } function base64_image_content($base64_image_content,$path, $fileName = ''){ try { //匹配出图片的格式 if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){ $type = $result[2]; if(!file_exists($path)){ //检查是否有该文件夹,如果没有就创建,并给予最高权限 mkdir($path, 0777, true); } $fileName = !empty($fileName) ? $fileName : md5(microtime(true)); if (file_put_contents($path . '/' . $fileName. ".{$type}", base64_decode(str_replace($result[1],'', $base64_image_content)))){ return $fileName . ".{$type}"; }else{ return false; } }else{ return false; } } catch (\Exception $e) { // echo $e->getMessage(); return false; } } }