流程:
1、获取带有参数的二维码;
2、获取微信用户头像;
3、二维码、头像、活动模板整合成一张图保存到本地;
4、上传图片换取mediaID
get_prcode.php 获取带参数的二维码,进行图片处理,返回处理过后的图片地址
<?php
include('edit_pic.php'); //整合图片方法
include('/op****c/function.php');//在服务器上保存图片固定方法(防止没有权限生成目录)
/**
* 获取二维码并保存,活动ID与发起人openid存入二维码
**/
function get_prcode($open_id,$act_id){
$open_id = json_decode(json_encode($open_id),true);//微信端传过来的是对象格式
$open_id = $open_id['0'];
$mediaID = judgeTuan($open_id,$act_id); //判断是否已经成团;成团则返回保存过的mediaID(在保存数据文件中tuan_redis.php)
$par_str = $open_id.",".$act_id; //openid与actid合成字符串
if($mediaID){
return $mediaID;
}else{
$token = getToken(); //获取access_token
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$token; //微信公众号生成临时二维码接口(字符串参数)
$data = array(
"expire_seconds" => 604800,
"action_name" => "QR_STR_SCENE",
"action_info" =>array(
"scene" => array("scene_str" => $par_str)
)
);
$info = json_decode(curl_post($url,json_encode($data)),true); //获取二维码兑换条件
$ticket = urlencode($info['ticket']);
$url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
$qr = curl_get($url);
$code_url = save_img($open_id,$qr,$act_id); //返回最终合成之后的本地图片地址
$mediaID_json = get_mediaID($code_url); //获取mediaID
$mediaID_arr = json_decode($mediaID_json,true);
$mediaID = $mediaID_arr['media_id'];
if($mediaID){
startTuan($open_id,$act_id,$mediaID); //开团成功,保存数据
}
return $mediaID;
}
}
/*
* 上传素材二维码换取mediaID
*/
function get_mediaID($code_url){
$token = getToken();
$url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=".$token."&type=image";
$data['media'] = "@".$code_url; //绝对路径,PHP5.5以下的写法
$mediaID = curl_media($url,$data);
return $mediaID;
}
function save_img($openid,$qr,$act_id){
$dir = "/opt/ci1*********p/tuan/"; //获取原生二维码保存地址
$path = $dir.$openid."/".$act_id."/";
create_dirs($path,0777);
$file_name = $act_id.$openid.".png";
$img = file_put_contents($path.$file_name,$qr); //接收的是图片流
$water_src_tou = get_user($openid); //获取用户头像(在发送通知文件中put_tongzhi.php)
$my_head = $water_src_tou['user_info_list'][0]['headimgurl'];
if($img){
$bg = editData($act_id,$path.$file_name,$act_id."code",$my_head,$act_id."head",$dir,$openid);
//活动模板原图,原图二维码,缩小版二维码,头像,缩小版头像,个人openid(在图片处理文件中edit_pic.php)
}
return $bg;
}
/*
* post方式传本地图片获取mediaID
*/
function curl_media($url,$data) {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_URL, $url);
$result = curl_exec($curl);
if(curl_error($curl)){
var_dump(curl_error($curl));
}
curl_close($curl);
return $result;
}
/*
* 获取二维码流文件
*/
function curl_get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($ch, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
}
?>
整合图片并返回最终图片本地地址 edit_pic.php
<?php
function editData($act_id,$water_src,$water_src3,$water_src_tou,$water_src_tou3,$dir,$openid){
$my_dir = $dir.$openid.'/'.$act_id.'/';
$bg_dir = $dir.'act_modules/';
create_dirs($bg_dir,0777);
$bg = $bg_dir.$act_id.".jpg"; //活动模板原图
$water_src = $water_src; //原图二维码
$water_src3 = $my_dir.$water_src3.".png";//缩小版二维码
$water_src_tou = $water_src_tou; //头像
$water_src_tou3 = $my_dir.$water_src_tou3.".png";//缩小版头像
$my_act_url = $my_dir.$act_id.".jpg"; //保存我活动图
$my_bg = editPic($bg,$water_src,$water_src3,$water_src_tou,$water_src_tou3,$my_act_url);
return $my_bg;
}
function editPic($bg,$water_src,$water_src3,$water_src_tou,$water_src_tou3,$my_act_url){
$a = cut_photo($water_src,$water_src3,190,190,$rate=100); //缩小二维码
$b = cut_photo($water_src_tou,$water_src_tou3,99,99,$rate=100); //缩小头像
if($a == 1 && $b == 1){
return waterMark($bg,$water_src3,$water_src_tou3,$my_act_url);//把缩小版的二维码与头像贴到模板图对应地方,另存
}
}
function waterMark($src,$water_src,$water_src_tou,$my_act_url)
{
$old_info = getimagesize($src);
switch($old_info[2]){
case 1:$im = imagecreatefromgif($src);break;
case 2:$im = imagecreatefromjpeg($src);break;
case 3:$im = imagecreatefrompng($src);break;
case 6:return false;
}
if(!$im) return 2;
//二维码
$waterinfo = getimagesize($water_src);
switch($waterinfo[2]){
case 1:$water_im = imagecreatefromgif($water_src);break;
case 2:$water_im = imagecreatefromjpeg($water_src);break;
case 3:$water_im = imagecreatefrompng($water_src);break;
case 6:return false;
}
//头像
$waterinfo2 = getimagesize($water_src_tou);
switch($waterinfo2[2]){
case 1:$water2_im = imagecreatefromgif($water_src_tou);break;
case 2:$water2_im = imagecreatefromjpeg($water_src_tou);break;
case 3:$water2_im = imagecreatefrompng($water_src_tou);break;
case 6:return false;
}
imagecopy($im,$water2_im,326,66,0,0,$waterinfo2[0],$waterinfo2[1]); //头像
imagecopy($im,$water_im,428,1048,0,0,$waterinfo[0],$waterinfo[1]); //二维码
//保存图片
imagejpeg($im,$my_act_url,100);
imagedestroy($im);
imagedestroy($water_im);
imagedestroy($water2_im);
return $my_act_url;
}
function cut_photo($old_src,$new_src,$new_width,$new_height,$rate=100){
//成功返回1,格式不符合返回2,生成图片失败返回3,按给定长宽生成图片
$old_info = getimagesize($old_src);
switch($old_info[2]){
case 1:$im = imagecreatefromgif($old_src);break;
case 2:$im = imagecreatefromjpeg($old_src);break;
case 3:$im = imagecreatefrompng($old_src);break;
}
$old_width = imagesx($im);
$old_height = imagesy($im);
if($old_width<$new_width && $old_height<$new_height){
imagejpeg($im,$new_src,$rate);
imagedestroy($im);
}
$x_rate = $old_width/$new_width;
$y_rate = $old_height/$new_height;
if($x_rate<$y_rate){//宽度优先压缩
$dst_x = $new_width;
$dst_y = ceil($old_height/$x_rate);
$new_start_x = 0;
$new_start_y = ($dst_y-$new_height)/2;
}else{//高度优先压缩
$dst_x = ceil($old_width/$y_rate);
$dst_y = $new_height;
$new_start_x = ($dst_x-$new_width)/2;
$new_start_y = 0;
}
$newim = imagecreatetruecolor($dst_x,$dst_y);//压缩
$background_color = imagecolorallocate($newim,0,0,0);
//imagefilledrectangle($newim,0,0,$dst_x,$dst_y,$background_color);
imagecopyresampled($newim,$im,0,0,0,0,$dst_x,$dst_y,$old_width,$old_height);
imagejpeg($newim,$new_src,$rate);//压缩完成
imagedestroy($im);
imagedestroy($newim);
}
?>