目录
一、微信菜单的创建
1、需要注意的地方
2、自定义菜单接口可实现多种类型按钮,如下:
3、创建菜单
4.创建菜单的代码
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
3、scancode_push:扫码推事件用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
5、pic_sysphoto:弹出系统拍照发图用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
6、pic_photo_or_album:弹出拍照或者相册发图用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
7、pic_weixin:弹出微信相册发图器用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
8、location_select:弹出地理位置选择器用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
9、media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
10、view_limited:跳转图文消息URL用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
1.http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
2.post传送一下菜单的json数据----click和view的请求示例
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com",
"appid":"wx286b93c14bbf93aa",
"pagepath":"pages/lunar/index"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
这里就举一个例子,具体的可以参考官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
这里我就简单的写了一个apsx,直接访问网站完成创建,如果想用界面操作的可以自己写一下,因为这里我就是简单的测试一下微信开发的功能,并没有以项目为目标,好了下面就贴了相关的代码,包含了很多测试:创建菜单、发送模板消息、群发文本消息(注:测试号不支持群发图文消息)、分标签发送消息及模板消息。关于代码优化就交给你们了,目前测试工作完成。
using CrystalDecisions.Shared.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class web_WeiXin_Menu : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//读取txt创建菜单
//FileStream fs1 = new FileStream(Server.MapPath(".") + "\\menu.txt", FileMode.Open);
//StreamReader sr = new StreamReader(fs1, Encoding.GetEncoding("GBK"));
//string menu = sr.ReadToEnd();
//sr.Close();
//fs1.Close();
String json = "{\"button\":[{\"name\": \"扫码\","+
"\"sub_button\": [{"+
"\"type\": \"scancode_waitmsg\","+
"\"name\": \"扫码消息\","+
"\"key\": \"rselfmenu_0_0\","+
"\"sub_button\": [ ]},{"+
"\"type\": \"scancode_push\","+
"\"name\": \"扫码结果\", "+
"\"key\": \"rselfmenu_0_1\","+
"\"sub_button\": [ ]},{"+
"\"type\": \"pic_sysphoto\","+
"\"name\": \"拍照发图\","+
"\"key\": \"rselfmenu_1_0\","+
"\"sub_button\": [ ]},{"+
"\"type\": \"pic_photo_or_album\","+
"\"name\": \"发图\","+
"\"key\": \"rselfmenu_1_1\","+
"\"sub_button\": [ ]}]},"
+"{\"type\":\"click\",\"name\":\"四六级查询\",\"key\":\"V1001_TODAY_SINGER\"},{\"name\":\"菜单\",\"sub_button\":[{"
+"\"type\":\"view\",\"name\":\"搜索\",\"url\":\"http://www.soso.com/\"},{\"type\":\"view\",\"name\":\"视频\","
+ "\"url\":\"http://v.qq.com/\"},{\"type\":\"click\",\"name\":\"赞一下我们\",\"key\":\"V1001_GOOD\"}]}]}";
PostMessage("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" +CommonApi.GetAccessToken("wxadf0f", "35e3c8aeaa8c12d2bc76c1c12570bc96")+ "", json);
TemplateMessage mess = new TemplateMessage();
var data = new
{
first=new {
value="车铣",
color="#173177"
},
remark=new {
value="组装",
color="#173177"
}
};
//获取用户openid
CommonApi api = new CommonApi();
// string result=api.GetResult("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + CommonApi.GetAccessToken("wxadf0f0a", "35e3c8aeaa8c12d2bc76c1c12570bc96") + "&next_openid=");
//string openid= api.getValue(result,"微信的nickname");
// mess.SendTemplate(openid, "xuWr3wDclf-Sl60qxlTvhDIBalCdpFZJQ9wNfJ3NX0g", data);
//上传素材图片
// string r= uploadMaterial();
// string thumb_media_id = CommonApi.GetJsonValue(r, "thumb_media_id");
// //上传图文素材
// string articles = "{\"articles\": [{" +
// "\"thumb_media_id\":\""+thumb_media_id+"\"," +
// "\"author\":\"zy\"," +
// "\"title\":\"Happy Day\"," +
// "\"content_source_url\":\"www.qq.com\"," +
// "\"content\":\"震惊!程序名竟然这么做。。。\"," +
// "\"digest\":\"digest\"," +
// "\"show_cover_pic\":1," +
// "\"need_open_comment\":1," +
// "\"only_fans_can_comment\":1}," +
// "{\"thumb_media_id\":\""+thumb_media_id+"\"," +
// "\"author\":\"zy\"," +
// "\"title\":\"Happy Day\"," +
// "\"content_source_url\":\"www.qq.com\"," +
// "\"content\":\"这篇文章是世界上最完美的一篇文章\"," +
// "\"digest\":\"digest\"," +
// "\"show_cover_pic\":0," +
// "\"need_open_comment\":1," +
// "\"only_fans_can_comment\":1}]}";
//string artres=PostMessage("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token="+CommonApi.GetAccessToken("wxadf0f0c801b521fa", "35e3c8aeaa8c12d2bc76c1c12570bc96"),articles);
//string media_id = CommonApi.GetJsonValue(artres, "media_id");
//群发图文,测试号没有该权限。
//string qunfaArticles= "{\"filter\":{\"is_to_all\":true,\"tag_id\":\"\"},"+
//"\"mpnews\":{"+
// "\"media_id\":\""+ media_id + "\"}," +
// "\"msgtype\":\"mpnews\","+
// "\"send_ignore_reprint\":0}";
//设置用户标签
// string tag="{\"tag\":{\"name\":\"最帅的人\"}}";
// string tagid=PostMessage("https://api.weixin.qq.com/cgi-bin/tags/create?access_token=" + CommonApi.GetAccessToken("wxadf0f1fa", "35e3c8aeaa8c12d2bc76c1c12570bc96"), tag);
//string id=CommonApi.GetJsonValue(tagid, "id");
//批量给用户打标签
// string addTag = "{" +
//"\"openid_list\" : [" +
//"\"" + openid + "\"]," +
//"\"tagid\":"+id+"}";
// PostMessage("https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=" + CommonApi.GetAccessToken("wxadf1b521fa", "35e3c8aeaa8c12d2bc76c1c12570bc96"), addTag);
string qunfaText = "{\"filter\":{\"is_to_all\":false,\"tag_id\":\""+1001+"\"}," +
"\"text\":{"+
"\"content\":\"震惊!最帅的人才能收到这条消息哦。。。\"}," +
"\"msgtype\":\"text\""+
"\"send_ignore_reprint\":0}";
// PostMessage("https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=" + CommonApi.GetAccessToken("wxadf21fa", "35e3c8aeaa8c12d2bc76c1c12570bc96"), qunfaText);
//删除群发
// 1、只有已经发送成功的消息才能删除
//2、删除消息是将消息的图文详情页失效,已经收到的用户,还是能在其本地看到消息卡片。
//3、删除群发消息只能删除图文消息和视频消息,其他类型的消息一经发送,无法删除。
//4、如果多次群发发送的是一个图文消息,那么删除其中一次群发,就会删除掉这个图文消息也,导致所有群发都失效
// post数据 {
// "msg_id":30124,
// "article_idx":2
//}
//PostMessage("https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=" + CommonApi.GetAccessToken("wxadf521fa", "35e3c8aeaa8c12d2bc76c1c12570bc96"),"");
}
public string PostMessage(string posturl, string postData)
{
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(postData);
// 准备请求...
try
{
// 设置参数
request = WebRequest.Create(posturl) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
//发送请求并获取相应回应数据
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
string err = string.Empty;
Response.Write(content);
return content;
}
catch (Exception ex)
{
string err = ex.Message;
return string.Empty;
}
}
//上传图片素材
///
/// {"type":"image","media_id":"5fp-YfxKA0FvLHsfK0wVxUOfeEE118avD2XOgj3vSPXRuBdBEFxLS-BY1eQ_1SCw","created_at":1560820683}
///
///
public static string uploadMaterial(){
string imgpath = HttpContext.Current.Server.MapPath("Images\\Closed.png");
//上传临时素材,返回media_id,type:媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
string url2 = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + CommonApi.GetAccessToken("wxadf1fa", "35e3c8aeaa8c12d2bc76c1c12570bc96") + "&type=thumb";
//上传永久图片素材,返回图片url,用于发送文章是的图片地址
// string url2 = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + CommonApi.GetAccessToken("w521fa", "35e3c8aeaa8c12d2bc76c1c12570bc96");
//图片转为流
System.Drawing.Image img = new Bitmap(imgpath);
MemoryStream stream = new MemoryStream();
img.Save(stream, ImageFormat.Png);
BinaryReader br = new BinaryReader(stream);
byte[] data = stream.ToArray();
stream.Close();
var boundary = "fbce142e-4e8e-4bf3-826d-cc3cf506cccc";
var client = new HttpClient();
client.DefaultRequestHeaders.Add("User-Agent", "KnowledgeCenter");
client.DefaultRequestHeaders.Remove("Expect");
client.DefaultRequestHeaders.Remove("Connection");
client.DefaultRequestHeaders.ExpectContinue = false;
client.DefaultRequestHeaders.ConnectionClose = true;
var content = new MultipartFormDataContent(boundary);
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);
var contentByte = new ByteArrayContent(data);
content.Add(contentByte);
contentByte.Headers.Remove("Content-Disposition");
contentByte.Headers.TryAddWithoutValidation("Content-Disposition","form-data; name=\"media\";filename=\"{userid}_2.png\"" + "");
contentByte.Headers.Remove("Content-Type");
contentByte.Headers.TryAddWithoutValidation("Content-Type", "image/png");
try
{
var result2 = client.PostAsync(url2, content);
if (result2.Result.StatusCode != HttpStatusCode.OK)
throw new Exception(result2.Result.Content.ReadAsStringAsync().Result);
string jsonstr = result2.Result.Content.ReadAsStringAsync().Result;
return jsonstr;
}
catch (Exception ex)
{
throw new Exception(ex.Message + ex.InnerException.Message);
}
}
protected void Unnamed_Click(object sender, EventArgs e)
{
}
}
这里再简单提一点,如果想实现机器人聊天的可以注册一下图灵机器人,绑定自己的公众号,或者调用提供的消息接口实现自动聊天功能,个人认证后可以有100次/天的消息回复哦。