总结微信公众号开发者模式下如何使用自定义菜单连接图文消息
最近给小程序增加了一个通过发送模板消息由微信公众号发给关注微信公众号的会员!
好不容易实现了以后,结果发现只要一开启微信公众号的开发者模式,客户原有的自定义菜单和自动回复都会被关闭!
总不能这样交代客户吧,只能又要通过代码实现客户原来的自定义菜单和自定义回复!
总体实现自定义菜单并不是很难!
根据微信的官方开发文档,大体上是可以实现的!
其中type分为view、miniprogram、click、view_limited等,前两种仔细看文档,没什么问题,只是这个click和view_limited我需要特别说下!
当使用click的时候,需要指定一个key,一开始实在不知道这个key是在哪设置关联的,一度还认为是微信公众平台自动回复那设置的关键词,结果发现不是!
通过百度查询,才发现这个key的使用是自己开发的程序中来关联的!
比如你设置了个key为contactus,在您微信公众平台设置的服务器url里面可以将接收到的key和您设置的key作对比,
这个可以看下“点击菜单拉取消息时的事件推送”这个接口,
具体的您也可以参考https://www.cnblogs.com/cssfirefly/p/4503663.html
明白这个了,就不再多说了
这里主要说下发送图文消息时的问题,也就是type为view_limited时,需要必须设置media_id,这个media_id究竟如何获取!因为这个可把我害苦了!
获取这个media_id,流程:
1.通过接口上传一张图片素材,上传成功后,会在返回值中获取一个图片素材的media_id
2.有了这个图片的media_id,通过新增永久素材的接口(这个接口也就是发送图文消息)成功后,会再返回一个media_id,这个media_id可以理解为就是这个图文消息的id!
3.有了图文消息的id,我们就可以配置到自定义菜单了
流程是不是很简单?但是过程确实很坑!
首先,必须吐槽下这个微信的官方文档,感觉描述的不是很近人意,如果你会了,我感觉一看都知道了,如果你第一次接触这个文档,除非有很好的理解能力,要不然真是不好理解!
借此,我一般看不懂的时候,都会借助百度,去看网友们的方法!
但这次,我确实。。。。。
上面流程第一步,我们知道,需要先通过接口上传一张图片,来获取返回的media_id.
我猜着,是不是之前微信的官方文档提出的那个接口确实不能用,然后大家发现了一个新的接口!
https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE就是官方提供的接口,但是之前的很多网友发帖反映,说这个接口返回的media_id用在新增永久素材的时候,
会报错{"errcode":40007,"errmsg":"invalid media_id hint: [51TBDa0350sz63]"}
他们都提供了一个接口http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE,这个接口最早他们是在哪找到的,我也不知道,因为我在微信官方那里始终没找到,但是大家都这样说了,那就先用来试试吧!
需要注意的是:文件名必须是完整绝对路径,另外需要绝对路径前加上“@”以示区分。
在Windows服务器上,格式示例为:”@F:\israel\upload\winter.jpg”,而在Linux服务器上,格式示例为:”@home/israel/upload/winter.jpg”。
http请求方式: POST/FORM
http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
这个地方,我分享大家一个连接,是方倍工作室的,https://www.cnblogs.com/txw1958/p/weixin80-upload-download-media-file.html 这上面有最好的解释!
$type="thumb";
$appid=config("wxconfig.appMpId");
$appSecret=config("wxconfig.appMpSecret");
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appSecret;
$res = HttpCurl::get($url, 'json');
$access_token = $res['access_token'];
$url="https://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=$type";
$filepath="{$_SERVER['DOCUMENT_ROOT']}/test01.jpg";
$filedata=array("media"=>"@".$filepath);
//$postjson = json_encode($filedata, JSON_UNESCAPED_UNICODE);
$res = HttpCurl::post($url, $filedata, 'json');
dd($res);
不得不说,我也确实通过此接口很轻松的获得了media_id,
但是这个media_id放到新增永久素材的接口的时候,一直提示invalid media_id hint
怎么试都不行,最终迫不得己,我只好再试了一下官方的提供的接口,即https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYP
$type="thumb";
$appid=config("wxconfig.appMpId");
$appSecret=config("wxconfig.appMpSecret");
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appSecret;
$res = HttpCurl::get($url, 'json');
$access_token = $res['access_token'];
//$url="https://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=$access_token&type=$type";
$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=$type";
$filepath="{$_SERVER['DOCUMENT_ROOT']}/test01.jpg";
$filedata=array("media"=>"@".$filepath);
//$postjson = json_encode($filedata, JSON_UNESCAPED_UNICODE);
$res = HttpCurl::post($url, $filedata, 'json');
dd($res);
这个时候也轻松获得了media_id,而且轻松的实现了新增永久素材!
我试猜想:之前的微信官方文档肯定是有这方面的纰漏的,但是经过广大网友发现以及提醒,微信官方文档又做了调整,这次是正确的!
这个在新增永久素材的时候,又出现一个小插曲,提示empty news data hint
关于微信上传永久素材接口报错(empty news data),其实问题就是参数格式问题,话不多说,直接上代码
$articles_value = [
'title'=>$content['name'],
'thumb_media_id'=>$content['thumb_media_id'],
'show_cover_pic'=>1,
'content'=>$content['content'],
'content_source_url'=>'http://www.baidu.com',
];
$articles = [];
//我这里只有一条数据,多条数据直接循环array_push()就ok了
array_push($articles,$articles_value);
$data = [
'articles'=>$articles
];
$ACCESS_TOKEN = $this->getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token='.$ACCESS_TOKEN;
//这里一定要注意需要json_encode();
$result = request_post($url,json_encode($data,JSON_UNESCAPED_UNICODE));
$result = json_decode($result,true);
if(!isset($result['media_id'])){
return false;
}
return $result;
以上感谢https://blog.csdn.net/cheers_bin/article/details/114363573
我们通过以下代码即可获得自定义菜单中使用的media_id
$appid=config("wxconfig.appMpId");
$appSecret=config("wxconfig.appMpSecret");
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appSecret;
$res = HttpCurl::get($url, 'json');
$access_token = $res['access_token'];
$url="https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=$access_token";
$menudata=array();
$menudataarrdata["title"]="兴顺服务";
$menudataarrdata["thumb_media_id"]="Vrc-oxIbMiuH7tKrQUf7mSPGSxw6Pc1i1xNsPGQVb7Q";
$menudataarrdata["show_cover_pic"]=1;
$menudataarrdata["content"]="********";
array_push($menudata,$menudataarrdata);
$data = [
'articles'=>$menudata
];
//dd($menudata);
$postjson = json_encode($data, JSON_UNESCAPED_UNICODE);
//dd($postjson);
$res = HttpCurl::post($url, $postjson, 'json');
dd($res);
这个时候,才算是最终完美!
最后再此感谢
https://www.cnblogs.com/txw1958/p/weixin80-upload-download-media-file.html
https://blog.csdn.net/cheers_bin/article/details/114363573
https://jingyan.baidu.com/article/ff42efa92916c8c19e220224.html
https://www.cnblogs.com/cssfirefly/p/4503663.html
https://www.cnblogs.com/kingyifan/p/11721452.html
https://www.cnblogs.com/txw1958/p/weixin-97-news.html
图文消息参考
https://www.karlew.com/archives/349
java
https://blog.csdn.net/yongbutingxide/article/details/85372190
有好的文章希望朋友们帮助分享推广,猛戳这里河洛伊哥