C#微信公众平台开发之高级群发接口

2019-12-30 11:47:44王冬梅
这篇文章主要为大家详细介绍了C#微信公众平台开发之高级群发接口的相关资料,需要的朋友可以参考下  

涉及access_token的获取请参考《C#微信公众平台开发之access_token的获取存储与更新》

一、为了实现高级群发功能,需要解决的问题

1、通过微信接口上传图文消息素材时,Json中的图片不是url而是media_id,如何通过微信接口上传图片并获取图片的media_id?

2、图片存储在什么地方,如何获取?

二、实现步骤,以根据OpenID列表群发图文消息为例

1、准备数据

    我把数据存储在数据库中,ImgUrl字段是图片在服务器上的相对路径(这里的服务器是自己的服务器,不是微信的哦)。

C#,微信公众平台开发

从数据库中获取数据放到DataTable中:

DataTable dt = ImgItemDal.GetImgItemTable(loginUser.OrgID, data);

2、通过微信接口上传图片,返回图片的media_id

 取ImgUrl字段数据,通过MapPath方法获取图片在服务器上的物理地址,用FileStream类读取图片,并上传给微信

HTTP上传文件代码(HttpRequestUtil类):


/// <summary>
/// Http上传文件
/// </summary>
public static string HttpUploadFile(string url, string path)
{
 // 设置参数
 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
 CookieContainer cookieContainer = new CookieContainer();
 request.CookieContainer = cookieContainer;
 request.AllowAutoRedirect = true;
 request.Method = "POST";
 string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
 request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
 byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("rn--" + boundary + "rn");
 byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("rn--" + boundary + "--rn");

 int pos = path.LastIndexOf("");
 string fileName = path.Substring(pos + 1);

 //请求头部信息 
 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}"rnContent-Type:application/octet-streamrnrn", fileName));
 byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());

 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
 byte[] bArr = new byte[fs.Length];
 fs.Read(bArr, 0, bArr.Length);
 fs.Close();

 Stream postStream = request.GetRequestStream();
 postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
 postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
 postStream.Write(bArr, 0, bArr.Length);
 postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
 postStream.Close();

 //发送请求并获取相应回应数据
 HttpWebResponse response = request.GetResponse() as HttpWebResponse;
 //直到request.GetResponse()程序才开始向目标网页发送Post请求
 Stream instream = response.GetResponseStream();
 StreamReader sr = new StreamReader(instream, Encoding.UTF8);
 //返回结果网页(html)代码
 string content = sr.ReadToEnd();
 return content;
}