uni-app+php 生成微信二维码 分销海报

ops/2024/10/18 19:39:38/

主要代码如下,可直接复制调试参数:

 //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user = $this->getUserInfoById($this->user_id);if(!empty($user['distribution_img'])){$result['data'] = $user['distribution_img'];}else{$result = $this->getDistributorImg();}$this->success("请求成功!", $result);}//获取小程序分享二维码--分销海报public function getDistributorImg(){try{//查询会员信息$userinfo = $this->getUserInfoById($this->user_id);$url = $this->request->get('url');$save_dir = 'upload/qr_code/user_share/';$save_key = 'uid'.$userinfo['id'];$img_src = md5($save_key) . '.png';$poster_config = $this->userShareConfig();$poster_url = root_path().'public/'.$save_dir . $img_src;//生成小程序二维码$res = $this->makeUserMnpQrcode($userinfo,$save_key,$img_src);if(true !== $res){return ['status' => 0, 'msg' => '微信配置错误:'.$res, 'data' => ''];}$background_img = root_path().'public/images/share_user_bg.png';$user_avatar =  root_path().'public/images/default_logo.jpg';$qr_code_logic = new MemberController();//获取背景图$share_background_img = imagecreatefromstring(file_get_contents($background_img));//合成头像$qr_code_logic->writeImg($share_background_img, $user_avatar, $poster_config['head_pic'],true);//合成昵称$nickname = self::filterEmoji($userinfo['nickname']);$qr_code_logic->writeText($share_background_img, $nickname, $poster_config['nickname']);//长按识别$notice = '长按识别二维码 >>';$qr_code_logic->writeText($share_background_img, $notice, $poster_config['notice']);//合成商品标题$title = self::auto_adapt($poster_config['title']['font_size'], 0, $poster_config['title']['font_face'], '邀请你一起来赚大钱', $poster_config['title']['w'],$poster_config['title']['y'],getimagesize($background_img));$qr_code_logic->writeText($share_background_img, $title, $poster_config['title']);//邀请码$qr_code_logic->writeText($share_background_img, '邀请码 '.$userinfo['distribution_code'], $poster_config['code_text']);//合成二维码$qr_code_logic->writeImg($share_background_img, $poster_url, $poster_config['qr'],false);imagepng($share_background_img, $poster_url);$file_name = 'public/'.$save_dir . $img_src;$result['data'] = $file_name;$dis_oss_img = $this->local_upload($result['data']);//更新会员分销海报信息$dis_oss_img = cmf_get_asset_url($dis_oss_img);$this->up_member(['distribution_img' => $dis_oss_img]);//上传oss$result['data'] = $dis_oss_img;return $result;}catch(Exception $e){return ['status' => 0, 'msg' => $e->getMessage(), 'data' => ''];}}public function up_member($params){$this->checkAuth();$this->MemberModel = new MemberModel();$params['update_time'] = time();$member                = $this->getUserInfoByOpenid($this->openid);if (empty($member)) $this->error("该会员不存在!");$result = $this->MemberModel->where('id', $member['id'])->strict(false)->update($params);if ($result) {$result = $this->getUserInfoById($this->user_id);return true;} else {return false;}}

需要引用的方法

/** 生成海报自动适应标题*/
public function auto_adapt($size, $angle = 0, $fontfile, $string, $width, $height, $bg_height)
{$content = "";// 将字符串拆分成一个个单字 保存到数组 letter 中for ($i = 0; $i < mb_strlen($string); $i++) {$letters[] = mb_substr($string, $i, 1);}foreach ($letters as $letter) {$str = $content . " " . $letter;$box = imagettfbbox($size, $angle, $fontfile, $str);$total_height = $box[1] + $height;if ($bg_height[1] - $total_height < $size) {break;}//右下角X位置,判断拼接后的字符串是否超过预设的宽度if (($box[2] > $width) && ($content !== "")) {if ($bg_height[1] - $total_height < $size * 2) {break;}$content .= "\n";}$content .= $letter;}return $content;
}//写入文字public function writeText($poster, $text, $config){$font_uri = $config['font_face'];$font_size = $config['font_size'];$color = substr($config['color'],1);//颜色转换$color= str_split($color, 2);$color = array_map('hexdec', $color);if (empty($color[3]) || $color[3] > 127) {$color[3] = 0;}//写入文字$font_col = imagecolorallocatealpha($poster, $color[0], $color[1], $color[2], $color[3]);imagettftext($poster, $font_size,0, $config['x'], $config['y'], $font_col, $font_uri, $text);return $poster;}
/*** Notes:去掉名称中的表情* @param $str* @return string|string[]|null* @author: cjhao 2021/3/29 15:56*/
public function filterEmoji($str)
{$str = preg_replace_callback('/./u',function (array $match) {return strlen($match[0]) >= 4 ? '' : $match[0];},$str);return $str;
}public function makeUserMnpQrcode($userinfo,$save_key,$img_src) {try {$config = cmf_get_option('weipay');$wechatC['app_id'] = $config['wx_mini_app_id'];$wechatC['secret'] = $config['wx_mini_app_secret'];$app = Factory::miniProgram($wechatC);$code = $userinfo['distribution_code']; //邀请码$response = $app->app_code->get('pages/index/index'.'?invite_code='.$code, ['width' => 170,]);if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {$response->saveAs('upload/qr_code/user_share/', $img_src);return true;}if(isset($response['errcode']) && 41030 === $response['errcode']){return '商城小程序码,先提交审核并通过';}return $response['errmsg'];} catch (\EasyWeChat\Kernel\Exceptions\Exception $e){return $e->getMessage();}}//写入图片public function writeImg($poster, $img_uri, $config, $is_rounded = false){$pic_img = imagecreatefromstring(file_get_contents($img_uri));$is_rounded?$pic_img = self::rounded_corner($pic_img):'';//切成圆角返回头像资源$pic_w = imagesx($pic_img);$pic_h = imagesy($pic_img);//圆形头像大图合并到海报imagecopyresampled($poster, $pic_img,$config['x'],$config['y'],0, 0,$config['w'],$config['h'],$pic_w,$pic_h);return $poster;}/*** 将图片切成圆角*/
public function rounded_corner($src_img)
{$w = imagesx($src_img);//微信头像宽度 正方形的$h = imagesy($src_img);//微信头像宽度 正方形的$w = min($w, $h);$h = $w;$img = imagecreatetruecolor($w, $h);//这一句一定要有imagesavealpha($img, true);//拾取一个完全透明的颜色,最后一个参数127为全透明$bg = imagecolorallocatealpha($img, 255, 255, 255, 127);imagefill($img, 0, 0, $bg);$r = $w / 2; //圆半径
//    $y_x = $r; //圆心X坐标
//    $y_y = $r; //圆心Y坐标for ($x = 0; $x < $w; $x++) {for ($y = 0; $y < $h; $y++) {$rgbColor = imagecolorat($src_img, $x, $y);if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {imagesetpixel($img, $x, $y, $rgbColor);}}}unset($src_img);return $img;
}//用户图片配置public function userShareConfig(){return [//会员头像'head_pic' => ['w' => 80, 'h' => 80, 'x' => 30, 'y' => 680,],//会员昵称'nickname' => ['color' => '#333333', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 120, 'y' => 730,],//标题'title' => ['color' => '#333333', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'w' => 360, 'x' => 30, 'y' => 810,],//提醒长按扫码'notice' => ['color' => '#333333', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 30, 'y' => 880,],//邀请码文本'code_text' => ['color' => '#FF2C3C', 'font_face' => root_path().'public/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 355, 'y' => 930,],//二维码'qr' => ['w' => 170,'h' => 170, 'x' => 370, 'y' => 730,],];}

最终效果:


http://www.ppmy.cn/ops/47281.html

相关文章

python数据分析——逻辑回归

参考资料&#xff1a;活用pandas库 逻辑回归 当响应变量为二值响应变量时&#xff0c;经常使用逻辑回归对数据建模。 # 导入pandas库 import pandas as pd # 导入数据集 acspd.read_csv(r"...\data\acs_ny.csv") # 展示数据列 print(acs.columns) # 展示数据集 pri…

Facebook开户Facebook三不限企业户是什么?

Facebook三不限企业户是指在Facebook广告平台上&#xff0c;不受预算限制、地域限制和时间限制的广告账户。这种广告账户的特点是不需要设定广告投放的预算上限&#xff0c;并且可以在任何时间和地点进行广告投放&#xff0c;以达到更精准、更有效的广告效果。 Facebook三不限…

智慧冶金:TSINGSEE青犀AI+视频技术助力打造高效、安全的生产环境

一、建设背景 冶金行业因其特殊的生产环境和工艺要求&#xff0c;对安全生产、环境保护以及质量监控等方面有着极高的要求。因此&#xff0c;将视频智能监控技术引入冶金行业&#xff0c;不仅有助于提升生产效率&#xff0c;更能有效保障生产安全&#xff0c;降低事故风险。 …

BM25算法以及变种算法简介

深入理解TF-IDF、BM25算法与BM25变种&#xff1a;揭秘信息检索的核心原理与应用 原文链接&#xff1a; https://xie.infoq.cn/article/8b7232877d0d4327a6943e8ac BM25算法以及变种算法简介 Okapi BM25&#xff0c;一般简称 BM25 算法&#xff0c;在 20 世纪 70 年代到 80 年代…

解决Linux中特殊文件名删除难题

最近在使用rz上传文件时出现中断&#xff0c;导致生成了乱码文件&#xff0c;尝试删除这些文件时遇到各种报错。 在Linux操作系统中&#xff0c;当尝试删除以特殊字符&#xff08;如-&#xff09;开头的文件时&#xff0c;可能会遇到错误信息&#xff0c;提示“invalid option”…

AI大模型探索之路-实战篇15: Agent智能数据分析平台之整合封装Tools和Memory功能代码

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

SQL入门教程,很详细

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库的标准语言。它被广泛用于存储、操作和检索数据。在这篇文章中&#xff0c;我们将介绍SQL的基本概念和常用命令。 首先&#xff0c;我们需要了解SQL的基本结构。SQL语句通常由以下几个部分组成&…

MySQL Hints:控制查询优化器的选择

码到三十五 &#xff1a; 个人主页 MySQL Hints是优化数据库查询性能的一种强大工具。它们允许开发者在SQL查询中嵌入指令&#xff0c;以影响MySQL优化器的决策过程。在某些情况下&#xff0c;优化器可能无法选择最佳的查询执行计划&#xff0c;这时我们可以使用Hints来引导优化…