当前位置:   article > 正文

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

mp推送图文

最近公众号要做一个活动,好友分享含有二维码的图片关注的活动。 首先呢就是用户生成自己独有的二维码,去查了查资料。 参考官方文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183) 第一步:生成TOKEN(当然TOKEN是要进行缓存的,官方文档是两分钟的有效时间)

  1. private function getWeiXinToken(){
  2. if($this->cache->get('access_token')){
  3. $access_token = $this->cache->get('access_token');
  4. }else{
  5. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
  6. $res = json_decode($this->httpPostFunc($url,'','GET'));
  7. if(isset($res->errcode)) {
  8. return false;
  9. }
  10. $access_token =$res->access_token;
  11. $this->cache->save('access_token', $access_token, $res->expires_in);
  12. }
  13. return $access_token;
  14. }

第二部:生成和保存二维码图片 参考官方文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1443433542) 输入图片说明 这里的POST数据里面的scene_id你可以自定义数据,例如用户id等等

  1. private function getQrCode($openId){
  2. header("Content-type: text/html; charset=utf-8");
  3. if($this->getWeiXinToken()){
  4. $access_token = $this->getWeiXinToken();//获取微信的access_token
  5. $weiXinUrl = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##';
  6. $url = str_replace("##TOKEN##", $access_token, $weiXinUrl);
  7. $userId = $this->getUserIdByOpenId($openId);//获得用户id
  8. $qr_code_data = "{\"action_name\":\"QR_LIMIT_SCENE\",\"action_info\":{\"scene\":{\"scene_id\":$userId}}}}";//return $url;
  9. $getData = $this->httpPostFunc($url, $qr_code_data, 'POST');
  10. $getData = json_decode($getData, true);
  11. $salt = '';//加盐保存
  12. $secret = md5($openId.$salt);
  13. //if($secret){//查询是否已经生成二维码图片}
  14. //根据ticket获取二维码图片
  15. if(isset($getData['ticket']) && $getData['ticket']) {
  16. $ticket = UrlEncode($getData['ticket']);
  17. $qr_img_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";
  18. $qr_img = $this->httpPostFunc($qr_img_url, '', 'GET');
  19. $qr_img = base64_encode($qr_img);//echo $qr_img;exit;
  20. // 判断目录是否存在,不存在则生成
  21. $file = "";
  22. if(!file_exists($file)) {
  23. mkdir($file, 0777);
  24. }
  25. $file_name = "xx.jpg";
  26. if (file_put_contents($file_name, base64_decode($qr_img))){
  27. $this->changePictureSize($file_name, '0.5',$file_name);
  28. $array = ['url'=>"", 'name'=>""];
  29. return $array;
  30. }else{
  31. return ['error'=>'save failed!'];
  32. }
  33. }else{
  34. return ['error'=>'not have ticket!'];
  35. }
  36. }else{
  37. return ['error'=>'not have access_token!'];
  38. }
  39. }

这里的changePictureSize方法是来缩略二维码图片的

  1. private function changePictureSize($srcfile,$rate=0.5, $filename = "" ){
  2. $size=getimagesize($srcfile);
  3. switch($size[2]){
  4. case 1:
  5. $img=imagecreatefromgif($srcfile);
  6. break;
  7. case 2:
  8. $img=imagecreatefromjpeg($srcfile);
  9. break;
  10. case 3:
  11. $img=imagecreatefrompng($srcfile);
  12. break;
  13. default:
  14. exit;
  15. }
  16. //源图片的宽度和高度
  17. $srcw=imagesx($img);
  18. $srch=imagesy($img);
  19. //目的图片的宽度和高度
  20. if($size[0] <= $rate || $size[1] <= $rate){
  21. $dstw=$srcw;
  22. $dsth=$srch;
  23. }else{
  24. if($rate <= 1){
  25. $dstw=floor($srcw*$rate);
  26. $dsth=floor($srch*$rate);
  27. }else {
  28. $dstw=$rate;
  29. $rate = $rate/$srcw;
  30. $dsth=floor($srch*$rate);
  31. }
  32. }
  33. //新建一个真彩色图像
  34. $im=imagecreatetruecolor($dstw,$dsth);
  35. $black=imagecolorallocate($im,255,255,255);
  36. imagefilledrectangle($im,0,0,$dstw,$dsth,$black);
  37. imagecopyresized($im,$img,0,0,0,0,$dstw,$dsth,$srcw,$srch);
  38. // 以 JPEG 格式将图像输出到浏览器或文件
  39. if( $filename ) {
  40. //图片保存输出
  41. imagejpeg($im, $filename );
  42. }else {
  43. //图片输出到浏览器
  44. imagejpeg($im);
  45. }
  46. //释放图片
  47. imagedestroy($im);
  48. imagedestroy($img);
  49. }

后面是把二维码图片合成到另一张图片

  1. private function compositeImages ($openId){
  2. //两张图片合成方法
  3. $baseMap = "upload/123.jpg";//获取底图
  4. $qrCodeImage = $this->getQrCode($openId);//获取二维码图片
  5. //return ['error'=>$qrCodeImage];
  6. if($qrCodeImage && !$qrCodeImage['error']){
  7. $name = $qrCodeImage['name'];
  8. $file_url = "upload/$name/"."$name".'_img'.".jpg";
  9. // header("Content-type:image/jpg");//展示图片
  10. $im1 = imagecreatefromjpeg($baseMap);
  11. $im2 = imagecreatefromjpeg($qrCodeImage['url']);
  12. imagecopymerge($im1, $im2, 200, 700, 0, 0, imagesx($im2), imagesy($im2), 63);
  13. imagejpeg($im1, $file_url);//保存图片,覆盖二维码
  14. $media_id = $this->addTemporaryMaterial($file_url);
  15. return ['media_id'=>$media_id, 'picUrl'=>$file_url];//上传素材库,返回media_id
  16. }else{
  17. $error = $qrCodeImage['error'];
  18. return ['error'=>$error];
  19. }
  20. }

这里的addTemporaryMaterial是用来上传临时素材的,因为要发送的是一张图片,所以要上传至素材库 参考文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726)

  1. private function addTemporaryMaterial($file_url){
  2. //url 里面的需要2个参数一个 access_token 一个是 type(值可为image、voice、video和缩略图thumb)
  3. $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=".$this->getWeiXinToken()."&type=image";
  4. if (class_exists('\CURLFile')) {
  5. $josn = array('media' => new \CURLFile(realpath($file_url)));
  6. } else {
  7. $josn = array('media' => '@' . realpath($file_url));
  8. }
  9. $ret = $this->httpPostFunc($url,$josn,'POST');
  10. $row = json_decode($ret);//对JSON格式的字符串进行编码
  11. if($row->media_id){
  12. return $row->media_id;
  13. }else{
  14. return false;
  15. }
  16. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/70806?site
推荐阅读
相关标签
  

闽ICP备14008679号