ThinkPHP5实现生成小程序码并更新logo
- 新建控制器Qrcode.php
field('studio_invt_logo,studio_logo,studio_id,studio_invt_applet')->where(['studio_id'=>$uid])->find();
// 修改商家logo路径
$goods['studio_logo'] = str_replace('__STATIC__', '/public/static', $goods['studio_logo']);
// 修改商家小程序logo路径
$goods['studio_invt_logo'] = str_replace('__STATIC__', '/public/static', $goods['studio_invt_logo']);
// 微信配置
$goods_id = time();
$url = 'https://'.$_SERVER['HTTP_HOST'];
$path = "";
// appid
$appid = 'xx';
// app secret
$appsecret = 'xxx';
// 传给微信的参数
$send = array('scene'=>"$goods_id"."&"."$uid", 'path' =>$path, 'width'=>'300');
// 请求微信,获取小程序二维码
$resWxQrCode = $this->getWxQrcode($send,$appid,$appsecret);
// 如果不存在小程序码 && 不存在小程序logo 则用商家logo
if (empty($goods['studio_invt_applet']) && empty($goods['studio_invt_logo'])) {
// logo图片变圆形
// 使用商家logo
$default = $url.$goods['studio_logo'];
$avatar = file_get_contents($default);
// $avatar = file_get_contents($avatarUrl);
//返回的是图片数据流
$logo = $this->yuanImg($avatar);
// 二维码与头像结合
$sharePic = $this->qrcodeWithLogo($resWxQrCode,$logo);
// 拼接图片路径
$img = "/public/qrcode/code".$uid.'_'.$goods_id.'.jpg';
// 文件名
$urlss = ROOT_PATH.$img;
// 保存文件
file_put_contents($urlss, $sharePic);
// 执行修改
db('studio')->where('studio_id',$uid)->update(array('studio_invt_applet'=>$url.$img));
// 存入数组
$list['studio_invt_applet'] = $url.$img;
} elseif (empty($goods['studio_invt_applet']) && !empty($goods['studio_invt_logo'])) {
// 不存在小程序码 && 存在小程序码logo 则使用使用小程序logo
// logo图片变圆形
// 使用小程序logo
$default = $url.$goods['studio_invt_logo'];
// echo $default;exit;
$avatar = file_get_contents($default);
//返回的是图片数据流
$logo = $this->yuanImg($avatar);
// 二维码与头像结合
$sharePic = $this->qrcodeWithLogo($resWxQrCode,$logo);
// 拼接图片路径
$img = "/public/qrcode/code".$uid.'_'.$goods_id.'.jpg';
// 文件名
$urlss = ROOT_PATH.$img;
// 保存文件
file_put_contents($urlss, $sharePic);
// 执行修改
db('studio')->where('studio_id',$uid)->update(array('studio_invt_applet'=>$url.$img));
// 存入数组
$list['studio_invt_applet'] = $url.$img;
} else {
// 存在二维码
if (session('option') == 1) {
// 修改了小程序logo
$logos = db('studio')->field('studio_invt_logo,studio_invt_applet')->where(['studio_id'=>$uid])->find();
// 修改商家小程序logo路径
$logos['studio_invt_logo'] = str_replace('__STATIC__', '/public/static', $logos['studio_invt_logo']);
// echo $good['studio_invt_applet'];exit;
// logo图片变圆形
// 使用小程序logo
$default = $url.$logos['studio_invt_logo'];
$avatar = file_get_contents($default);
//返回的是图片数据流
$logo = $this->yuanImg($avatar);
// 二维码与头像结合
$sharePic = $this->qrcodeWithLogo($resWxQrCode,$logo);
// 拼接图片路径
$img = "/public/qrcode/code".$uid.'_'.$goods_id.'.jpg';
// 文件名
$urlss = ROOT_PATH.$img;
// 保存文件
file_put_contents($urlss, $sharePic);
// 执行修改
db('studio')->where('studio_id',$uid)->update(array('studio_invt_applet'=>$url.$img));
// 存入数组
$list['studio_invt_applet'] = $url.$img;
} else {
// 未修改小程序logo,直接取出
$list['studio_invt_applet'] = $goods['studio_invt_applet'];
}
}
//直接输出图片
// echo "";
$arr = [
'code' => 0,
'msg' => '获取成功!',
'data' => $list['studio_invt_applet']
];
return json($arr);
}
/**
* curl方法
* @param $url 请求url
* @param $data 传送数据,有数据时使用post传递
* @param type 为2时,设置json传递
*/
public function curlRequest($url,$data = null , $type = 1){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
if($type == 2){
curl_setopt($curl, CURLOPT_HTTPHEADER,
array('Content-Type: application/json','Content-Length: ' . strlen($data)));
}
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
/**
* 请求微信服务器,生成二维码
* @param $data array('scene'=>$setid, 'path' =>'pages/question/question', 'width'=>'100');
*/
public function getWxQrcode($data,$appid,$appsecret){
//get access_token
$wxTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$access_token = $this->curlRequest($wxTokenUrl);
$access_token = json_decode($access_token,true);
if(!empty($access_token['errcode']))
var_dump(['code'=>2004,'msg'=>'请求微信服务器access_token失败']);
//get qrcode 微信B接口
$wxQrcodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token['access_token'];
$data = json_encode($data,JSON_UNESCAPED_UNICODE);
return $this->curlRequest($wxQrcodeUrl,$data);
}
/**
* 在二维码的中间区域镶嵌图片
* @param $QR 二维码数据流。比如file_get_contents(imageurl)返回的东东,或者微信给返回的东东
* @param $logo 中间显示图片的数据流。比如file_get_contents(imageurl)返回的东东
* @return 返回图片数据流
*/
public function qrcodeWithLogo($QR,$logo){
$QR = imagecreatefromstring ($QR);
$logo = imagecreatefromstring ($logo);
$QR_width = imagesx ( $QR );//二维码图片宽度
$QR_height = imagesy ( $QR );//二维码图片高度
$logo_width = imagesx ( $logo );//logo图片宽度
$logo_height = imagesy ( $logo );//logo图片高度
$logo_qr_width = $QR_width / 2.2;//组合之后logo的宽度(占二维码的1/2.2)
$scale = $logo_width / $logo_qr_width;//logo的宽度缩放比(本身宽度/组合后的宽度)
$logo_qr_height = $logo_height / $scale;//组合之后logo的高度
$from_width = ($QR_width - $logo_qr_width) / 2;//组合之后logo左上角所在坐标点
/**
* 重新组合图片并调整大小
* imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
*/
imagecopyresampled ( $QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height );
/**
* 如果想要直接输出图片,应该先设header。header("Content-Type: image/png; charset=utf-8");
* 并且去掉缓存区函数
*/
//获取输出缓存,否则imagepng会把图片输出到浏览器
ob_start();
imagepng ( $QR );
imagedestroy($QR);
imagedestroy($logo);
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
/**
* 剪切图片为圆形
* @param $picture 图片数据流 比如file_get_contents(imageurl)返回的东东
* @return 图片数据流
*/
public function yuanImg($picture) {
$src_img = imagecreatefromstring($picture);
$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);
}
}
}
/**
* 如果想要直接输出图片,应该先设header。header("Content-Type: image/png; charset=utf-8");
* 并且去掉缓存区函数
*/
//获取输出缓存,否则imagepng会把图片输出到浏览器
ob_start();
imagepng ( $img );
imagedestroy($img);
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
}
- 修改logo的控制器Invt.php
getInvtData();
$data['studio_logo'] = str_replace('__STATIC__', '/public/static', $data['studio_logo']);
// mp($data);
$this->assign('data', $data);
return $this->fetch();
}
/**
* 修改请帖小程序logo
* @return mixed
* @throws \think\Exception
* @throws \think\exception\PDOException
*/
public function updateData(Request $request)
{
$data = [];
$data['studio_invt_applet'] = $request->param('studio_invt_applet');
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('studio_invt_logo');
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS .'static'. DS . 'studio_invt_logo');
if($info){
$image = $info->getFilename();
$data['studio_invt_logo'] = '__STATIC__/studio_invt_logo/'.date('Ymd',time())."/".$image;
}else{
// 上传失败获取错误信息
return $this->error('图片上传出错');
}
}
// 获取表单上传文件 例如上传了001.jpg
$file1 = request()->file('studio_invt_ad');
// 移动到框架应用根目录/public/uploads/ 目录下
if($file1){
$info1 = $file1->move(ROOT_PATH . 'public' . DS .'static'. DS . 'studio_invt_ad');
if($info1){
$image1 = $info1->getFilename();
$data['studio_invt_ad'] = '__STATIC__/studio_invt_ad/'.date('Ymd',time())."/".$image1;
}else{
// 上传失败获取错误信息
return $this->error('图片上传出错');
}
}
// 执行修改
$update = db('studio')->where(['studio_name'=>session('studio_name')])->update($data);
// 修改成功,将修改的小程序logo复制到
if($update) {
session("option",'1');
} else {
session("option",'2');
}
$this->redirect('studio_admin/Invt/invtSet');
}
/**
* 下载图片
*/
public function download($data)
{
$filename = $data;
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename="下载下来显示的图片名.jpg"');
$img = file_get_contents($filename);
echo $img;
}
}
- 调用Qrcode控制器方法的接口
";
$obj = $qr->index();
// print_r($obj);
echo "showData('".$obj['data']."')";
}
}
- 模板页面
{include file="public/header" title="小程序码设置"}
{include file="public/footer"}