最近公众号要做一个活动,好友分享含有二维码的图片关注的活动。 首先呢就是用户生成自己独有的二维码,去查了查资料。 参考官方文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183) 第一步:生成TOKEN(当然TOKEN是要进行缓存的,官方文档是两分钟的有效时间)
private function getWeiXinToken(){
if($this->cache->get('access_token')){
$access_token = $this->cache->get('access_token');
}else{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
$res = json_decode($this->httpPostFunc($url,'','GET'));
if(isset($res->errcode)) {
return false;
}
$access_token =$res->access_token;
$this->cache->save('access_token', $access_token, $res->expires_in);
}
return $access_token;
}
第二部:生成和保存二维码图片 参考官方文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542) 这里的POST数据里面的scene_id你可以自定义数据,例如用户id等等
private function getQrCode($openId){
header("Content-type: text/html; charset=utf-8");
if($this->getWeiXinToken()){
$access_token = $this->getWeiXinToken();//获取微信的access_token
$weiXinUrl = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##';
$url = str_replace("##TOKEN##", $access_token, $weiXinUrl);
$userId = $this->getUserIdByOpenId($openId);//获得用户id
$qr_code_data = "{\"action_name\":\"QR_LIMIT_SCENE\",\"action_info\":{\"scene\":{\"scene_id\":$userId}}}}";//return $url;
$getData = $this->httpPostFunc($url, $qr_code_data, 'POST');
$getData = json_decode($getData, true);
$salt = '';//加盐保存
$secret = md5($openId.$salt);
//if($secret){//查询是否已经生成二维码图片}
//根据ticket获取二维码图片
if(isset($getData['ticket']) && $getData['ticket']) {
$ticket = UrlEncode($getData['ticket']);
$qr_img_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";
$qr_img = $this->httpPostFunc($qr_img_url, '', 'GET');
$qr_img = base64_encode($qr_img);//echo $qr_img;exit;
// 判断目录是否存在,不存在则生成
$file = "";
if(!file_exists($file)) {
mkdir($file, 0777);
}
$file_name = "xx.jpg";
if (file_put_contents($file_name, base64_decode($qr_img))){
$this->changePictureSize($file_name, '0.5',$file_name);
$array = ['url'=>"", 'name'=>""];
return $array;
}else{
return ['error'=>'save failed!'];
}
}else{
return ['error'=>'not have ticket!'];
}
}else{
return ['error'=>'not have access_token!'];
}
}
这里的changePictureSize方法是来缩略二维码图片的
private function changePictureSize($srcfile,$rate=0.5, $filename = "" ){
$size=getimagesize($srcfile);
switch($size[2]){
case 1:
$img=imagecreatefromgif($srcfile);
break;
case 2:
$img=imagecreatefromjpeg($srcfile);
break;
case 3:
$img=imagecreatefrompng($srcfile);
break;
default:
exit;
}
//源图片的宽度和高度
$srcw=imagesx($img);
$srch=imagesy($img);
//目的图片的宽度和高度
if($size[0] <= $rate || $size[1] <= $rate){
$dstw=$srcw;
$dsth=$srch;
}else{
if($rate <= 1){
$dstw=floor($srcw*$rate);
$dsth=floor($srch*$rate);
}else {
$dstw=$rate;
$rate = $rate/$srcw;
$dsth=floor($srch*$rate);
}
}
//新建一个真彩色图像
$im=imagecreatetruecolor($dstw,$dsth);
$black=imagecolorallocate($im,255,255,255);
imagefilledrectangle($im,0,0,$dstw,$dsth,$black);
imagecopyresized($im,$img,0,0,0,0,$dstw,$dsth,$srcw,$srch);
// 以 JPEG 格式将图像输出到浏览器或文件
if( $filename ) {
//图片保存输出
imagejpeg($im, $filename );
}else {
//图片输出到浏览器
imagejpeg($im);
}
//释放图片
imagedestroy($im);
imagedestroy($img);
}
后面是把二维码图片合成到另一张图片
private function compositeImages ($openId){
//两张图片合成方法
$baseMap = "upload/123.jpg";//获取底图
$qrCodeImage = $this->getQrCode($openId);//获取二维码图片
//return ['error'=>$qrCodeImage];
if($qrCodeImage && !$qrCodeImage['error']){
$name = $qrCodeImage['name'];
$file_url = "upload/$name/"."$name".'_img'.".jpg";
// header("Content-type:image/jpg");//展示图片
$im1 = imagecreatefromjpeg($baseMap);
$im2 = imagecreatefromjpeg($qrCodeImage['url']);
imagecopymerge($im1, $im2, 200, 700, 0, 0, imagesx($im2), imagesy($im2), 63);
imagejpeg($im1, $file_url);//保存图片,覆盖二维码
$media_id = $this->addTemporaryMaterial($file_url);
return ['media_id'=>$media_id, 'picUrl'=>$file_url];//上传素材库,返回media_id
}else{
$error = $qrCodeImage['error'];
return ['error'=>$error];
}
}
这里的addTemporaryMaterial是用来上传临时素材的,因为要发送的是一张图片,所以要上传至素材库 参考文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726)
private function addTemporaryMaterial($file_url){
//url 里面的需要2个参数一个 access_token 一个是 type(值可为image、voice、video和缩略图thumb)
$url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=".$this->getWeiXinToken()."&type=image";
if (class_exists('\CURLFile')) {
$josn = array('media' => new \CURLFile(realpath($file_url)));
} else {
$josn = array('media' => '@' . realpath($file_url));
}
$ret = $this->httpPostFunc($url,$josn,'POST');
$row = json_decode($ret);//对JSON格式的字符串进行编码
if($row->media_id){
return $row->media_id;
}else{
return false;
}
}
好了,至此我们所需要的消息图片等已经准备好,接下来就是发送消息部分了