1.最近新申请的公众号需要用到一个功能:微信群发消息。
2.按照自己的习惯,首先去官网看文档:群发接口。
我截取官网的关键几句话:
这几句话,字面意思应该是:1.上传图文消息内图片接口
2.上传图文素材
3.群发接口
4.预览接口 【根据文档描述,此接口一个月只能调用四次,所以我首先选择预览接口】
3.正常情况下,看完文档后就可以开始着手码字了。
首先是第一个接口:上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】
根据此接口说明,请求的时候需要access_token,这个就不介绍了,基本操作。第二个参数是media,字面意思就是接口小括号里面的文字(使用curl命令,用form表单模拟上传图片),参考网站:如何使用multipart/form-data格式上传文件
代码如下:
/// <summary>
///
/// </summary>
/// <param name="imgPath">文件路径</param>
/// <param name="imgName">文件名</param>
/// <param name="url">接口地址</param>
/// <returns></returns>
private string GetImageMediaByCURL(string imgPath, string imgName, string url)
{
string Result = string.Empty;
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = true;
request.Method = "POST";
string splitline = DateTime.Now.Ticks.ToString("X");
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + splitline;
byte[] startSplitBytes = Encoding.UTF8.GetBytes("\r\n--" + splitline + "\r\n");
byte[] endSplitBytes = Encoding.UTF8.GetBytes("\r\n--" + splitline + "--\r\n");
string header = "Content-Disposition:form-data;name=\"file\";filename=\"" + imgName + "\"\r\nContent-Type:application/octet-stream\r\n\r\n";
byte[] headerBytes = Encoding.UTF8.GetBytes(header);
FileStream fs = new FileStream(imgPath, FileMode.Open, FileAccess.Read);
byte[] imgArr = new byte[fs.Length];
fs.Read(imgArr, 0, imgArr.Length);
fs.Close();
Stream postStream = request.GetRequestStream();
//开始发送
postStream.Write(startSplitBytes, 0, startSplitBytes.Length);
postStream.Write(headerBytes, 0, headerBytes.Length);
postStream.Write(imgArr, 0, imgArr.Length);
postStream.Write(endSplitBytes, 0, endSplitBytes.Length);
postStream.Close();
//开始接收
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream instream = response.GetResponseStream();
StreamReader reader = new StreamReader(instream, Encoding.UTF8);
Result = reader.ReadToEnd();
}
catch (Exception ex)
{
//记录日志
}
return Result;
}
经过验证,这一步是可以正确接收到数据
4.正常情况下,按照文档描述的步骤,应该就是上传图文消息素材了,接口为:https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN
如下图所示:按照文档描述,当我拼接JSON字符串的时候,发现其中有一个字段:thumb_media_id。最开始,我用的是素材库里面的永久素材,结果就是凉凉。此时我又去看了一遍文档描述,发现了一种一个关键词:缩略图。然后开始百度查询资料,最后还是在官网文档中不小心翻到了一个接口:新增临时素材。在这个接口中我发现了一个字段描述如下图所示:
于是我就用这个接口上传了两个图片试试,然后通过上面的代码成功接收到了返回的数据。返回数据日志如下:。
于是乎,我把这里获取到的thumb_media_id拿去进行图文素材上传,最后成功收到了正确的返回数据,上传代码如下:
/// <summary>
/// POST发送数据
/// </summary>
/// <param name="url"></param>
/// <param name="sendmsg"></param>
/// <returns></returns>
public string PostSend(string url, string sendmsg, bool IsResponse)
{
string result = string.Empty;
//处理请求数据
Encoding myenc = Encoding.GetEncoding("UTF-8");
byte[] postBytes = Encoding.UTF8.GetBytes(sendmsg);
HttpWebRequest hwr = (HttpWebRequest)HttpWebRequest.Create(url);
hwr.Method = "POST";
hwr.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
hwr.ContentLength = postBytes.Length;
try
{
using (Stream requestStream = hwr.GetRequestStream())
{
//发送
requestStream.Write(postBytes, 0, postBytes.Length);
}
if (IsResponse)
{
//接收
using (WebResponse webres = hwr.GetResponse())
{
using (StreamReader sr = new StreamReader(webres.GetResponseStream(), myenc))
{
result = System.Web.HttpUtility.UrlDecode(sr.ReadToEnd());
}
}
}
}
catch (Exception ex)
{
//记录日志
//XiaoRanRecord.WriteTextRecordByTime(string.Empty, "XiaoRanHttpHelper", "PostSend:" + ex.Message.ToString());
}
return result;
}
5.群发数据,由于群发每月四次限制,所以我首先用了预览接口:https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN。拼接好数据后,发送过去,我是给我自己的微信和另一个开发者的微信发送的,均能正常收到图文消息。
6.接下来的图文消息群发亦是如此,能正常使用的
7.总结下我最终正常流程:上传图片素材:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
上传缩略图素材:https https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE 注意type=thumb。此接口返回的media_id为图文消息素材的thumb_media_id
上传图文消息素材:https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN
群发图文消息/预览图文消息: