Files
cunkebao_v3/Server/application/cunkebao/controller/plan/PosterWeChatMiniProgram.php

254 lines
8.3 KiB
PHP
Raw Normal View History

2025-05-22 15:50:52 +08:00
<?php
namespace app\cunkebao\controller\plan;
use think\Controller;
use think\Request;
use EasyWeChat\Factory;
2025-09-26 17:06:14 +08:00
2025-05-22 15:50:52 +08:00
// use EasyWeChat\Kernel\Exceptions\DecryptException;
use EasyWeChat\Kernel\Http\StreamResponse;
use think\Db;
2025-09-26 17:06:14 +08:00
2025-05-22 15:50:52 +08:00
class PosterWeChatMiniProgram extends Controller
{
public function index()
{
return 'Hello, World!';
}
const MINI_PROGRAM_CONFIG = [
2025-09-26 17:06:14 +08:00
'app_id' => 'wx789850448e26c91d',
2025-07-10 14:07:11 +08:00
'secret' => 'd18f75b3a3623cb40da05648b08365a1',
2025-05-22 15:50:52 +08:00
'response_type' => 'array'
];
// 生成小程序码,存客宝-操盘手调用
2025-09-26 17:06:14 +08:00
public function generateMiniProgramCodeWithScene($taskId = '')
{
2025-05-22 15:50:52 +08:00
2025-09-26 17:06:14 +08:00
if (empty($taskId)) {
return json_encode(['code' => 500, 'data' => '', 'msg' => '任务id不能为空']);
2025-07-19 17:55:24 +08:00
}
2025-09-26 17:06:14 +08:00
2025-05-22 15:50:52 +08:00
2025-07-19 15:01:02 +08:00
try {
$app = Factory::miniProgram(self::MINI_PROGRAM_CONFIG);
// scene参数长度限制为32位
2025-07-19 17:38:47 +08:00
//$scene = 'taskId=' . $taskId;
2025-07-19 17:55:24 +08:00
$scene = sprintf("%s", $taskId);
2025-07-19 15:01:02 +08:00
// 调用接口生成小程序码
2025-07-19 17:41:31 +08:00
$response = $app->app_code->getUnlimit($scene, [
2025-07-19 17:26:27 +08:00
'page' => 'pages/poster/index2', // 必须是已经发布的小程序页面
2025-07-19 15:01:02 +08:00
'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;
2025-07-10 17:41:03 +08:00
2025-07-19 15:01:02 +08:00
$img = $response->getBody()->getContents();//获取图片二进制流
$img_base64 = 'data:image/png;base64,' . base64_encode($img);//转化base64
return json_encode(['code' => 200, 'data' => $img_base64]);
}
2025-09-26 17:06:14 +08:00
} catch (\Exception $e) {
return json_encode(['code' => 500, 'data' => '', 'msg' => $e->getMessage()]);
2025-05-22 15:50:52 +08:00
}
}
// getPhoneNumber
2025-09-26 17:06:14 +08:00
public function getPhoneNumber()
{
2025-05-22 15:50:52 +08:00
$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'],
2025-07-19 17:26:27 +08:00
'mobile' => $result['phone_info']['phoneNumber'],
'createTime' => time()
2025-05-22 15:50:52 +08:00
]);
}
// 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'],
2025-07-28 17:40:50 +08:00
'phone' => $result['phone_info']['phoneNumber'],
'source' => $task['name'],
'createTime' => time(),
'tags' => json_encode([]),
'siteTags' => json_encode([]),
2025-05-22 15:50:52 +08:00
]);
}
// return $result['phone_info']['phoneNumber'];
return json([
2025-07-10 17:23:46 +08:00
'code' => 200,
2025-05-22 15:50:52 +08:00
'message' => '获取手机号成功',
'data' => $result['phone_info']['phoneNumber']
]);
} else {
// return null;
return json([
'code' => 400,
'message' => '获取手机号失败: ' . $result['errmsg'] ?? '未知错误'
]);
}
// return $result;
2025-09-26 17:06:14 +08:00
}
2025-08-22 10:23:05 +08:00
2025-09-26 17:06:14 +08:00
public function decryptphones()
{
2025-08-22 10:23:05 +08:00
$taskId = request()->param('id');
2025-09-26 17:06:14 +08:00
$phoneData = request()->param('phone');
if (!$phoneData) {
2025-08-22 10:23:05 +08:00
return json([
'code' => 400,
'message' => '手机号不能为空'
]);
}
$task = Db::name('customer_acquisition_task')->where('id', $taskId)->find();
2025-09-26 17:06:14 +08:00
2025-08-22 10:23:05 +08:00
if (!$task) {
return json([
'code' => 400,
'message' => '任务不存在'
]);
}
2025-10-22 10:42:37 +08:00
$phoneData = explode("\n", $phoneData);
2025-09-26 17:06:14 +08:00
foreach ($phoneData as $phone) {
if (empty($phone)) {
continue;
}
2025-08-22 10:23:05 +08:00
$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();
2025-09-26 17:06:14 +08:00
if (empty($taskCustomer)) {
2025-08-22 10:23:05 +08:00
Db::name('task_customer')->insert([
'task_id' => $taskId,
// 'identifier' => $phone,
'phone' => $phone,
'source' => $task['name'],
'createTime' => time(),
'tags' => json_encode([]),
'siteTags' => json_encode([]),
]);
}
2025-09-26 17:06:14 +08:00
2025-08-22 10:23:05 +08:00
}
2025-09-26 17:06:14 +08:00
// return $phone;
return json([
'code' => 200,
'message' => '操作成功',
]);
2025-08-22 10:23:05 +08:00
}
2025-09-26 17:06:14 +08:00
// return $result;
2025-08-22 10:23:05 +08:00
2025-09-26 17:06:14 +08:00
// todo 获取海报获客任务的任务/海报数据 -- 表还没设计好,不急 ck_customer_acquisition_task
public
function getPosterTaskData()
{
2025-05-22 15:50:52 +08:00
$id = request()->param('id');
2025-07-21 16:03:04 +08:00
$task = Db::name('customer_acquisition_task')
2025-09-26 17:06:14 +08:00
->where(['id' => $id, 'deleteTime' => 0])
2025-07-21 16:03:04 +08:00
->field('id,name,sceneConf,status')
->find();
2025-07-10 14:57:32 +08:00
if (!$task) {
return json([
'code' => 400,
'message' => '任务不存在'
]);
}
2025-09-26 17:06:14 +08:00
if ($task['status'] == 0) {
2025-07-10 14:57:32 +08:00
return json([
'code' => 400,
'message' => '任务已结束'
]);
}
$sceneConf = json_decode($task['sceneConf'], true);
2025-09-26 17:06:14 +08:00
if (isset($sceneConf['posters']['url'])) {
2025-07-30 16:15:26 +08:00
$posterUrl = !empty($sceneConf['posters']['url']);
2025-07-10 14:57:32 +08:00
} else {
2025-07-30 16:15:26 +08:00
$posterUrl = 'https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E5%92%A8%E8%AF%A2-FTiyAMAPop2g9LvjLOLDz0VwPg3KVu.gif';
2025-07-10 14:57:32 +08:00
}
2025-09-26 17:06:14 +08:00
if (isset($sceneConf['tips'])) {
2025-07-21 15:21:19 +08:00
$sTip = $sceneConf['tips'];
} else {
$sTip = '';
}
2025-07-10 14:57:32 +08:00
2025-07-21 16:03:04 +08:00
unset($task['sceneConf']);
$task['sTip'] = $sTip;
2025-07-17 16:01:25 +08:00
2025-07-10 14:57:32 +08:00
$data = [
'id' => $task['id'],
'name' => $task['name'],
'poster' => ['sUrl' => $posterUrl],
2025-07-21 16:03:04 +08:00
'task' => $task,
2025-07-10 14:57:32 +08:00
];
2025-05-22 15:50:52 +08:00
// todo 只需 返回 poster_url success_tip
return json([
2025-07-10 17:23:46 +08:00
'code' => 200,
2025-05-22 15:50:52 +08:00
'message' => '获取海报获客任务数据成功',
2025-07-10 14:57:32 +08:00
'data' => $data
2025-05-22 15:50:52 +08:00
]);
}
}