'wx789850448e26c91d', 'secret' => 'd18f75b3a3623cb40da05648b08365a1', 'response_type' => 'array' ]; // 生成小程序码,存客宝-操盘手调用 public function generateMiniProgramCodeWithScene($taskId = '') { if (empty($taskId)) { return json_encode(['code' => 500, 'data' => '', 'msg' => '任务id不能为空']); } try { $app = Factory::miniProgram(self::MINI_PROGRAM_CONFIG); // scene参数长度限制为32位 //$scene = 'taskId=' . $taskId; $scene = sprintf("%s", $taskId); // 调用接口生成小程序码 $response = $app->app_code->getUnlimit($scene, [ 'page' => 'pages/poster/index2', // 必须是已经发布的小程序页面 'width' => 430, // 二维码的宽度,默认430 // 'auto_color' => false, // 自动配置线条颜色 // 'line_color' => ['r' => 0, 'g' => 0, 'b' => 0], // 颜色设置 // 'is_hyaline' => false, // 是否需要透明底色 ]); // 保存小程序码到文件 if ($response instanceof StreamResponse) { // $filename = 'minicode_' . $taskId . '.png'; // $response->saveAs('path/to/codes', $filename); // return 'path/to/codes/' . $filename; $img = $response->getBody()->getContents();//获取图片二进制流 $img_base64 = 'data:image/png;base64,' . base64_encode($img);//转化base64 return json_encode(['code' => 200, 'data' => $img_base64]); } } catch (\Exception $e) { return json_encode(['code' => 500, 'data' => '', 'msg' => $e->getMessage()]); } } // getPhoneNumber public function getPhoneNumber() { $taskId = request()->param('id'); $code = request()->param('code'); // code 不能为空 if (!$code) { return json([ 'code' => 400, 'message' => 'code不能为空' ]); } $task = Db::name('customer_acquisition_task')->where('id', $taskId)->find(); if (!$task) { return json([ 'code' => 400, 'message' => '任务不存在' ]); } $app = Factory::miniProgram(self::MINI_PROGRAM_CONFIG); $result = $app->phone_number->getUserPhoneNumber($code); if ($result['errcode'] == 0 && isset($result['phone_info']['phoneNumber'])) { // TODO 拿到手机号之后的后续操作: // 1. 先写入 ck_traffic_pool 表 identifier mobile 都是 用 phone字段的值 $trafficPool = Db::name('traffic_pool')->where('identifier', $result['phone_info']['phoneNumber'])->find(); if (!$trafficPool) { Db::name('traffic_pool')->insert([ 'identifier' => $result['phone_info']['phoneNumber'], 'mobile' => $result['phone_info']['phoneNumber'], 'createTime' => time() ]); } // 2. 写入 ck_task_customer: 以 task_id ~~identifier~~ phone 为条件,如果存在则忽略,使用类似laravel的firstOrcreate(但我不知道thinkphp5.1里的写法) // $taskCustomer = Db::name('task_customer')->where('task_id', $taskId)->where('identifier', $result['phone_info']['phoneNumber'])->find(); $taskCustomer = Db::name('task_customer')->where('task_id', $taskId)->where('phone', $result['phone_info']['phoneNumber'])->find(); if (!$taskCustomer) { Db::name('task_customer')->insert([ 'task_id' => $taskId, // 'identifier' => $result['phone_info']['phoneNumber'], 'phone' => $result['phone_info']['phoneNumber'], 'source' => $task['name'], 'createTime' => time(), 'tags' => json_encode([]), 'siteTags' => json_encode([]), ]); } // return $result['phone_info']['phoneNumber']; return json([ 'code' => 200, 'message' => '获取手机号成功', 'data' => $result['phone_info']['phoneNumber'] ]); } else { // return null; return json([ 'code' => 400, 'message' => '获取手机号失败: ' . $result['errmsg'] ?? '未知错误' ]); } // return $result; } public function decryptphones() { $taskId = request()->param('id'); $phoneData = request()->param('phone'); if (!$phoneData) { return json([ 'code' => 400, 'message' => '手机号不能为空' ]); } $task = Db::name('customer_acquisition_task')->where('id', $taskId)->find(); if (!$task) { return json([ 'code' => 400, 'message' => '任务不存在' ]); } $phoneData = explode("\n", $phoneData); foreach ($phoneData as $phone) { if (empty($phone)) { continue; } $trafficPool = Db::name('traffic_pool')->where('identifier', $phone)->find(); if (!$trafficPool) { Db::name('traffic_pool')->insert([ 'identifier' => $phone, 'mobile' => $phone, 'createTime' => time() ]); } $taskCustomer = Db::name('task_customer')->where('task_id', $taskId)->where('phone', $phone)->find(); if (empty($taskCustomer)) { Db::name('task_customer')->insert([ 'task_id' => $taskId, // 'identifier' => $phone, 'phone' => $phone, 'source' => $task['name'], 'createTime' => time(), 'tags' => json_encode([]), 'siteTags' => json_encode([]), ]); } } // return $phone; return json([ 'code' => 200, 'message' => '操作成功', ]); } // return $result; // todo 获取海报获客任务的任务/海报数据 -- 表还没设计好,不急 ck_customer_acquisition_task public function getPosterTaskData() { $id = request()->param('id'); $task = Db::name('customer_acquisition_task') ->where(['id' => $id, 'deleteTime' => 0]) ->field('id,name,sceneConf,status') ->find(); if (!$task) { return json([ 'code' => 400, 'message' => '任务不存在' ]); } if ($task['status'] == 0) { return json([ 'code' => 400, 'message' => '任务已结束' ]); } $sceneConf = json_decode($task['sceneConf'], true); if (isset($sceneConf['posters']['url'])) { $posterUrl = !empty($sceneConf['posters']['url']); } else { $posterUrl = 'https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E5%92%A8%E8%AF%A2-FTiyAMAPop2g9LvjLOLDz0VwPg3KVu.gif'; } if (isset($sceneConf['tips'])) { $sTip = $sceneConf['tips']; } else { $sTip = ''; } unset($task['sceneConf']); $task['sTip'] = $sTip; $data = [ 'id' => $task['id'], 'name' => $task['name'], 'poster' => ['sUrl' => $posterUrl], 'task' => $task, ]; // todo 只需 返回 poster_url success_tip return json([ 'code' => 200, 'message' => '获取海报获客任务数据成功', 'data' => $data ]); } }