最近公众号要做一个活动,好友分享含有二维码的图片关注的活动。 首先呢就是用户生成自己独有的二维码,去查了查资料。 参考官方文档(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;
- }
- }
好了,至此我们所需要的消息图片等已经准备好,接下来就是发送消息部分了