ThinkPHP5实现生成小程序码并更新logo
- 新建控制器Qrcode.php
<?php
namespace app\studio_admin\controller;
use think\Controller;
use think\Request;
use app\studio_admin\controller\Invt;
class Qrcode extends Check
{
/**
* 小程序码
* @return [type] [description]
*/
public function index()
{
// 商家id
$uid = session('studio_sid');
// 查询商家数据 商家logo 商家小程序logo 商家小程序码
$goods = db('studio')->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 "<img src='data:image/png;base64,".base64_encode($sharePic)."'>";
$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
<?php
namespace app\studio_admin\controller;
use think\Request;
use app\studio_admin\controller\Qrcode;
class Invt extends Check
{
/**
* 请帖设置
*
* @return \think\Response
*/
public function invtSet()
{
$studio = model('StudioData');
$data = $studio->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控制器方法的接口
<?php
namespace app\studio_admin\controller;
use app\studio_admin\controller\Qrcode;
class Test extends Check
{
public function index()
{
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET, POST, PUT');
$qr = new Qrcode();
// echo "<pre>";
$obj = $qr->index();
// print_r($obj);
echo "showData('".$obj['data']."')";
}
}
- 模板页面
{include file="public/header" title="小程序码设置"}
<style type="text/css">
.logo{
width: 150px;
height: 150px;
/*border: 1px solid black;*/
float: left;
margin-left:10%
}
.my_form{
width:45%
}
.change_logo{
position: absolute;
bottom: 0;
margin-left: 2%;
}
body,html,select,option{font-family:'微软雅黑';}
.box{width:600px;margin:10px auto;}
.box select{width:115px;}
</style>
<div class="ibox-content" style="margin-top: 5%;border-top: 0">
<form method="post" class="form-horizontal" action="{:url('studio_admin/invt/updateData')}" style="margin:0 auto;width: 65%;" enctype="multipart/form-data">
<div class="form-group">
<label class="col-sm-2 control-label">商家名称</label>
<div class="col-sm-10" style="width: 70%;margin-left: 6%">
<input type="text" class="form-control my_form" value="{$data.studio_name}">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group" style="margin-bottom: 3%;position: relative;">
<label class="col-sm-2 control-label">商家小程序logo</label>
<img class="logo" src="{$data['studio_invt_logo']|default=$data['studio_logo']}">
<input type="file" name="studio_invt_logo" style="display: none;">
<div style="position: absolute;bottom: 0;display: inline-block;margin-left: 1%;width: 20%;margin-bottom: 10px;">
<button type="button" class="change_logo">更改logo</button>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group" style="margin-bottom: 3%;position: relative;">
<label class="col-sm-2 control-label">商家小程序码</label>
<input type="hidden" name="studio_invt_applet" value="" id="applet">
<img class="logos" src="{$data['studio_invt_applet']|default=''}" style="margin-left: 5%">
<div style="position: absolute;bottom: 0;display: inline-block;margin-left: 1%;width: 20%;margin-bottom: 10px;">
<button type="button" "fn();">更新小程序码</button>
</div>
<!-- <form action="{:url('studio_admin/invt/download')}" style="margin-top: 10px">
<input type="submit" value="下载小程序码">
</form> -->
<a href="{:url('studio_admin/invt/download')}?data={$data['studio_invt_applet']}">下载小程序码</a>
</div>
<div style="width: 20%;margin-left: 35%">
<span style="color: red">点击更新小程序码</span>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group" style="margin-bottom: 3%;position: relative;">
<label class="col-sm-2 control-label">商家广告图</label>
<img class="ad_logo" src="{$data['studio_invt_ad']|default=''}" width="300" height="150" style="margin-left: 8%">
<input type="file" name="studio_invt_ad" style="display: none;">
<div style="position: absolute;bottom: 0;display: inline-block;margin-left: 1%;width: 20%;">
<button type="button" class="change_logo1">更改广告</button>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2" style="float: initial;margin:0 auto">
<button class="btn btn-primary" type="submit">保存</button>
</div>
</div>
</form>
</div>
<script type="text/javascript">
function localView(from) {
var file = from.files[0]
var url = null ;
if (window.createObjectURL!=undefined) {
url = window.createObjectURL(file) ;
} else if (window.URL!=undefined) {
url = window.URL.createObjectURL(file) ;
} else if (window.webkitURL!=undefined) {
url = window.webkitURL.createObjectURL(file) ;
}
return url
}
function fn() {
window.location.replace('http://www.xxx.com/index.php/studio_admin/invt/invtset');
}
$(function(){
$('.change_logo').click(function(){
$("input[name=studio_invt_logo]").click();
});
$("input[name=studio_invt_logo]").change(function(){
var imgUrl = localView(this);
$(".logo").attr("src",imgUrl);
});
function demo()
{
var url = 'https://www.xxxx.com/studio_admin/test';
$.ajax({
url: url,
type: "GET",
dataType: "jsonp",
jsonpCallback: "showData",
success: function(data) {
$('.logos').attr('src',data);
$('#applet').attr('value',data);
}
});
}
demo();
$('.change_logo1').click(function(){
$("input[name=studio_invt_ad]").click();
});
$("input[name=studio_invt_ad]").change(function(){
var imUrl = localView(this);
$(".ad_logo").attr("src",imUrl);
});
});
</script>
{include file="public/footer"}