公众号自定义图文消息推送(1)

最近公众号要做一个活动,好友分享含有二维码的图片关注的活动。 首先呢就是用户生成自己独有的二维码,去查了查资料。 参考官方文档(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;
        }
    }

好了,至此我们所需要的消息图片等已经准备好,接下来就是发送消息部分了

转载于:https://my.oschina.net/Shinsg/blog/1052771

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值