微信公众号 PHP 开发二 上传素材库得到mediaID (整合二维码,头像,活动模板图并上传素材库得到mediaID)

流程:

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);
}

?>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中开发微信素材永久上传接口需要进行以下步骤: 1. 导入必要的依赖:首先在pom.xml文件中添加相关的依赖,如Spring Web、Spring Boot DevTools以及第三方库如Apache HttpComponents等。 2. 创建Access Token获取接口:微信接口需要Access Token进行身份验证。可以创建一个Controller类,定义一个调用微信API获取Access Token的方法,并使用Scheduled定时任务来定期刷新Access Token。在该方法中,可以使用HttpComponents库来发送请求并解析返回的JSON数据,最后将获取到的Access Token存储在一个全局变量中。 3. 创建素材上传接口:同样,创建一个Controller类,并定义一个用于处理上传素材的方法。在该方法中,需要先获取到之前获取的Access Token,然后使用HttpComponents库发送POST请求,将素材文件内容作为请求的Body发送给微信API。 4. 处理上传结果:根据微信API返回的结果,可以采取不同的处理方式。如果上传成功,可以将返回的MediaId等相关信息保存到数据库中。如果上传失败,可以返回相应的错误信息。 5. 配置文件设置:在application.properties或application.yml(根据实际使用的配置文件类型而定)中设置微信公众号的相关配置信息,如AppID、AppSecret等。在Controller类中可以通过@Value注解来读取并使用这些配置信息。 6. 异常处理:当出现异常情况时,可以使用Spring Boot的全局异常处理机制来统一处理异常,返回相应的错误信息。 通过以上步骤,我们可以在Spring Boot中开发一个用于微信素材永久上传的接口。接口可以通过访问URL来调用,将素材文件上传微信服务器,并将上传结果返回给调用方。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值