## 合成分享码
由于公众号二维码有次数跟时间的限制,素材上传也有次数限制,这里对素材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();
}
}
}
```
*****