## 合成分享码 由于公众号二维码有次数跟时间的限制,素材上传也有次数限制,这里对素材ID做了一个redis缓存,缓存时间就是最大的30天。 >[danger] 小插曲:由于这个方法是在守护进程里面实现的,当时还遇到一个小问题,就是 PHP CLI模式下无法使用 `file_putcontents` 这个方法,由于此时我已经成功的对接了对话聊天功能,我就通过聊天窗口向ChatGPT询问解决方案,结果也让我很满意,对话内容贴在下方,当前分享码也只需要给公众号发送关键字 **推广码** 就能看到推文。 >[info] 代码逻辑,有图片素材ID的缓存就直接拿这个缓存去发消息给关键词 **推广码** ,没有缓存就直接调用公众号的生成带参二维码的接口,生成一个有效期为30天的临时二维码,只要素材ID的缓存时间小于二维码有效期,就不会担心分享出去的二维码失效。 二维码下载保存本地以后做了图片压缩以及图片合成,才达到了最终的效果: [项目演示](项目演示.md) ### 聊天内容:(<span style="color:red;font-weight:800">相关核心代码在图片下方</span>) ![](https://img.kancloud.cn/d3/77/d377eb02e51b8ce60d608ed34554e713_394x987.png) ![](https://img.kancloud.cn/fb/a0/fba074bdac5754634bd09b6f41cd03e1_302x390.png) ``` /** * @param $openId * @return void * 推广码 */ public function CreateAndSends($openId) { if ($openId) { $redis = new Redis(); $opmedia_id = $openId . 'md'; if ($redis->has($opmedia_id)) { $media_id = $redis->get($opmedia_id); if ($media_id) { $image = new Image($media_id); $this->app->customer_service->message($image)->to($openId)->send(); /*补充一句说明*/ $memo = unicode2utf8("❤") . '温馨提示:凡事通过您二维码关注的用户,对方可以获得' . config("site.times") . '次机会,您自己会获得' . config("site.give_up_times") . '次机会,邀请无上限' . unicode2utf8("🎉") . unicode2utf8("🎉") . unicode2utf8("🎉"); $message = new Text($memo); $this->app->customer_service->message($message)->to($openId)->send(); } else { self::GetCode($openId); } } else { self::GetCode($openId); } } } /** * @param $openId * @return void * 生成二维码 */ public function GetCode($openId) { /*计算请求次数START*/ $hx = new Redis(); if ($hx->has("hexin")) { $hxnum = $hx->get("hexin"); $newhxnum = bcadd($hxnum, 1); $hx->set("hexin", $newhxnum); } else { $hxnum = 1; $hx->set("hexin", $hxnum); } /*计算请求次数END*/ $redis = new Redis(); $opmedia_id = $openId . 'md'; $result = $this->app->qrcode->temporary($openId, 2592000); /*合成二维码*/ $ticket = ''; if (isset($result['ticket'])) { $ticket = $result['ticket']; } else if (isset($result['errcode'])) { $message = new Text(unicode2utf8("‼") . '公众号人数压力过大,请明日来获取推广码,今日已达上限'); $this->app->customer_service->message($message)->to($openId)->send(); return; } if (!$ticket) { $message = new Text(unicode2utf8("‼") . '公众号人数压力过大,请明日来获取推广码,今日已达上限'); $this->app->customer_service->message($message)->to($openId)->send(); return; } $redis->set($result['ticket'], $openId); /*对应二维码的ticket跟Openid进行绑定*/ $url = $this->app->qrcode->url($ticket); $path = __DIR__ . '/../../../public/images/' . $openId . '.jpg'; /*PHPCLI 代码改写START*/ // $url = '<图片 URL>'; // $destination = '<图片保存路径>'; $ch = curl_init($url); $fp = fopen($path, "wb"); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp); /*PHPCLI 代码改写END*/ /*压缩图片*/ $imageYs = \think\Image::open($path); $imageYs->thumb(150, 150)->save($path); $backpath = __DIR__ . '/../../../public/images/' . 'back.jpg'; /*背景图*/ $path2 = __DIR__ . '/../../../public/images/' . 'newimg/' . $openId . '.jpg'; /*保存路径*/ $image = \think\Image::open($backpath); // 给原图左上角添加水印并保存water_image.png[390, 1030] $image->water($path, [390, 1030])->save($path2); $result2 = $this->app->material->uploadImage($path2); if ($result2) { if (isset($result2['media_id'])) { $media_id = $result2['media_id']; $redis->set($opmedia_id, $media_id, 864000); $image = new Image($media_id); $this->app->customer_service->message($image)->to($openId)->send(); /*补充一句说明*/ $memo = unicode2utf8("❤") . '温馨提示:凡事通过您二维码关注的用户,对方可以获得' . config("site.times") . '次机会,您自己会获得' . config("site.give_up_times") . '次机会,邀请无上限' . unicode2utf8("🎉") . unicode2utf8("🎉") . unicode2utf8("🎉"); $message = new Text($memo); $this->app->customer_service->message($message)->to($openId)->send(); } } } ``` *****