C#微信公众号开发实践--通过控制台程序发布图文消息(2020/8/4实测可用)
前言
最近在做融媒体开发的项目时,涉及到了微信公众号图文消息发布等功能,预计后期还会有抖音视频发布,微博分享等内容,下面是实践。
准备
有自己的微信公众号,就用自己的,没有的可以到https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login申请一个测试账号进行测试,该测试账号有如下两个坑
(1)群发接口不能发布文字消息
(2)群发接口发布图文消息返回-1(应该是一个bug...)
我用的我们公司的账号进行测试的,开通了以后,会得到一如下两个身份凭证,这个图以测试号为例
总流程
我把大概的流程简略画了一下
(1)获取Acess_token
参数这块我直接贴文档
接口调用请求说明
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
下面是关键的后端服务端代码,直接复制填入id以及密匙就可获取access_token
public string GetToken(){string grant_type = "client_credential";string appid = "你的公众号id";string secret = "密匙";string tokenUrl = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", grant_type, appid, secret);//创建HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(tokenUrl);//设置请求方法httpWebRequest.Method = "post";httpWebRequest.Timeout = 20000;HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8);string responseContent = streamReader.ReadToEnd();streamReader.Close();httpWebResponse.Close();JObject jsonresult = (JObject)JsonConvert.DeserializeObject(responseContent);Console.WriteLine(responseContent);string newToken = jsonresult["access_token"].ToString();if (!string.IsNullOrWhiteSpace(newToken)){Console.WriteLine(newToken);return newToken;}return "nul";}
(2)上传图文消息缩略图:注意这里是通过素材管理--新增临时素材上传的!!
提醒下,这里不一定非要上传缩略图,上传普通图片回发的id同样可以作为下文中上传图文素材中的thumb_media_id来使用
注意点:
1、临时素材media_id是可复用的。
2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。(失效的意思不是图片没了,只是这个id没用了)
3、上传临时素材的格式、大小限制与公众平台官网一致。
图片(image): 10M,支持PNG\JPEG\JPG\GIF格式
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式,png行不行没试过,建议直接上传image作为下文的缩略图,还省事
4、需使用https调用本接口。
接口调用请求说明
http请求方式: POST,需使用https https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
type | 是 | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) |
media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
服务端代码
/// <summary>/// 服务号:上传多媒体文件/// </summary>/// <param name="accesstoken">调用接口凭据</param>/// <param name="filename">文件路径</param>/// <param name="contenttype">文件Content-Type类型(例如:image/jpeg、audio/mpeg)</param>///<param name="mediaType">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>/// <returns></returns>public void UploadFile(string token, string path, string contenttype, string mediaType){FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);byte[] bArr = new byte[fs.Length];fs.Read(bArr, 0, bArr.Length);string url = string.Format("https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=={0}&type={1}", token, mediaType);// 设置参数HttpWebRequest httpWebRequest = WebRequest.Create(url) as HttpWebRequest;CookieContainer cookieContainer = new CookieContainer();httpWebRequest.CookieContainer = cookieContainer;httpWebRequest.AllowAutoRedirect = true;httpWebRequest.Method = "POST";string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线httpWebRequest.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");int pos = path.LastIndexOf("\\");string fileName = path.Substring(pos + 1);//组织表单数据StringBuilder sbHeader = new StringBuilder();sbHeader.Append("--" + boundary + "\r\n");sbHeader.Append("Content-Disposition: form-data; name=\"media\"; filename=\"" + path + "\"; filelength=\"" + fs.Length + "\"");sbHeader.Append("\r\n");sbHeader.Append("Content-Type: " + contenttype);sbHeader.Append("\r\n\r\n");//请求头部信息//StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());Stream postStream = httpWebRequest.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();fs.Close();fs.Dispose();HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8);string responseContent = streamReader.ReadToEnd();JObject jsonresult = JsonConvert.DeserializeObject<JObject>(responseContent);streamReader.Close();httpWebResponse.Close();httpWebRequest.Abort();Console.WriteLine(jsonresult);}
(3)上传图文素材内的图片获取URL
口调用请求说明
http请求方式: POST https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
media | 是 | form-data中媒体文件标识,有filename、filelength、content-type等信息 |
返回说明 正常情况下的返回结果为:
{"url":"http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
}
(4)上传图文素材
这里先说明,群发接口中》》上传图文消息素材中的thumb_media_id是通过第二步中通过调用临时素材上传接口返回的id,可以是缩略图也可以是图片,最重要的要区分素材管理》》新增永久图文素材中的humb_media_id,该id是通过上传永久素材接口获得的,与这里的不同
接口调用请求说明
http请求方式: POST https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN
POST数据说明
POST数据示例如下:
{"articles": [ {"thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p","author":"xxx", "title":"Happy Day", "content_source_url":"www.qq.com", "content":"content", "digest":"digest","show_cover_pic":1,"need_open_comment":1,"only_fans_can_comment":1}]
}
参数 | 是否必须 | 说明 |
---|---|---|
Articles | 是 | 图文消息,一个图文消息支持1到8条图文 |
thumb_media_id | 是 | 图文消息缩略图的media_id,可以在素材管理-新增素材中获得(特别注意是临时素材上传,并且不一定非得是缩略图ID) |
author | 否 | 图文消息的作者 |
title | 是 | 图文消息的标题 |
content_source_url | 否 | 在图文消息页面点击“阅读原文”后的页面,受安全限制,如需跳转Appstore,可以使用itun.es或appsto.re的短链服务,并在短链后增加 #wechat_redirect 后缀。 |
content | 是 | 图文消息页面的内容,支持HTML标签。具备微信支付权限的公众号,可以使用a标签,其他公众号不能使用,如需插入小程序卡片,可参考下文。 |
digest | 否 | 图文消息的描述,如本字段为空,则默认抓取正文前64个字 |
show_cover_pic | 否 | 是否显示封面,1为显示,0为不显示 |
need_open_comment | 否 | Uint32 是否打开评论,0不打开,1打开 |
only_fans_can_comment | 否 | Uint32 是否粉丝才可评论,0所有人可评论,1粉丝才可评论 |
后端代码
public void PostMethod(string token){string requestUrl = string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", token);StreamReader file = File.OpenText(@"C:\Users\kobe24\source\repos\WeChatTest\json3.json");JsonTextReader reader = new JsonTextReader(file);JObject jsonObject = (JObject)JToken.ReadFrom(reader);Console.WriteLine(jsonObject);HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(requestUrl); byte[] bs = Encoding.UTF8.GetBytes(jsonObject.ToString());httpWebRequest.ContentType = "application/json";httpWebRequest.ContentLength = bs.Length;httpWebRequest.Method = "POST";httpWebRequest.Timeout = 20000;httpWebRequest.GetRequestStream().Write(bs, 0, bs.Length);HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8);string responseContent = streamReader.ReadToEnd();JObject jsonresult = (JObject)JsonConvert.DeserializeObject(responseContent);streamReader.Close();httpWebResponse.Close();httpWebRequest.Abort();Console.WriteLine(jsonresult);Console.ReadKey();}
Json3请求示例
这里即使你只有一条消息,消息体也得是数组的形式,也就是 [ ] 不能少,否则会提示44003,消息体为空,这是很坑的一个地方。。。。
{"articles": [{"title": "xxx公司简介","thumb_media_id": "缩略图或者图片id,通过临时素材接口上传获得","author": "David Qin","show_cover_pic": 1,"content": "<img src='http://mmbiz.qpic.cn/mmbiz_jpg/TAjhMibjxIr3y8Qkbzup1EwKwWfHOIgthYYTQvPnY4JyZtRbmEkMkjU0ttGfb7TynAl03Gjbf7XqF7gialrfa8Iw/0?wx_fmt=jpeg'> 点击连接跳转至官网<a href='http://www.xxx.com.cn/'>xxx软件服务</a> xx软件技术有限公司是一家集软件开发、系统集成及IT产品销售为一体的高科技公司公司面向制造业生产企业定制开发各种管理软件已有十多年历史,积累了大量的定制开发与项目实施经验在设备管理、制造过程管理、工艺管理以及全资产管理等方面形成了成熟而独特的解决方案及项目实施策略公司拥有优秀稳定的员工队伍,具有硕士学位(及以上)的人员占总人数的80%以上其中包含具有博士学位的核心技术人员4人.\"","content_source_url": "CONTENT_SOURCE_URL","need_open_comment": 1,"only_fans_can_comment": 1}]
}
这里注意,自己有开通了微信支付功能的公众号才能在content中加入<a>标签跳转至外部网站
返回数据示例(正确时的JSON返回结果):
{"type":"news","media_id":"CsEf3ldqkAYJAU6EJeIkStVDSvffUJ54vqbThMgplD-VJXXof6ctX5fI6-aYyUiQ","created_at":1391857799
}
(5)发布图文消息
接口调用请求说明
http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN
POST数据说明
POST数据示例如下:
图文消息(注意图文消息的media_id需要通过上述方法来得到):
{"filter":{"is_to_all":false,"tag_id":2},"mpnews":{"media_id":"第四步回发的media_id"},"msgtype":"mpnews","send_ignore_reprint":0
}
后端代码跟第四步差不多,只需要把requestUrl改成https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={0},token即可,以及把请求体的json改成上述的即可。
返回数据示例(正确时的JSON返回结果):
{"errcode":0,"errmsg":"send job submission success","msg_id":34182, "msg_data_id": 206227730
}
(6)发布成功
C#微信公众号开发实践--通过控制台程序发布图文消息(2020/8/4实测可用)相关推荐
- 微信公众号开发(七)发送客服消息
微信公众号开发(七)发送客服消息 当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST ...
- php app 推送原理,微信公众号开发的那点事第一篇——消息推送原理
微信公众平台从诞生开始到现在已经积累了海量的公众号,这其中有大量的个人运营者.为了让公众号更好滴为粉丝们服务,微信官方提供了很多接口,使用这些接口来丰富公众号的功能对于有些个人运营者来说可能并不熟悉. ...
- 微信公众号开发之客服功能的群发消息功能
本周我们做了一个有技术含量的一个新功能:客服功能的群发消息功能.此功能主要用于微信公众号客服群发提醒,比如客户的商家认证审核通过,用户购买商品成功等功能提醒,可以有效减少网站项目开发所必要的资金节约. ...
- 微信公众号开发笔记(九)发送语音消息
上一篇我们用代码实现发送图片消息,接下来我们来实现发送语音消息功能 发送语音消息 代码实现 1.在Message.util工具类中新增 buildVoiceMessag方法 /** * 构造语音消息 ...
- 微信公众号开发笔记(八)发送图片消息
发送图片消息 上一篇我们已经上传一个图片素材,并且微信服务器也返回给我们一个media_id,接下来我们使用media_id来构造图片消息 代码实现功能 在Message.Util工具类添加代码 1. ...
- JAVA微信公众号开发第5篇菜单发布
说明 菜单数据库表设计 菜单数据拼装与发布 数据拼装和接口调用 Mapper设计 效果展示 说明 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能.开启自定义菜单后,公众号界面如图所 ...
- 微信公众号开发-对指定用户发送客服消息
流程 获取到用户openid 调用api就可发送消息 代码 消息发送页面 <?phpinclude './wxz.php';if($_POST['msg']){$openid = $_POST[ ...
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...
- C#微信公众号开发系列教程二(新手接入指南)
此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教 ...
- 微信公众号开发系列教程一(调试环境部署续:vs远程调试)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
最新文章
- c语言运行时显示内存不足,请问:c或c++运行时 遇到虚拟内存不足时咋办,帮优化下代码...
- Pytorch使用CPU运行“Torch not compiled with CUDA enabled”
- Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道
- 通过游戏的方式与陌生人聊天,破冰是如何做到的?
- 安卓imageView加载MYSQL图片_Android调用相机拍摄照片并显示到 ImageView控件中
- zookeeper可视化监控工具_Redis 的可视化监控工具 Redislive 简单使用教程
- Cheat_Sheet ---Keras、Matlab、Matplotlib、Numpy、Pandas、Scikit-Learn、SciPy
- pip show pip可以查看pip的版本以及升级pip到最新版本
- selinux= 为 disabled_Selinux安全加固
- Xcode7 无账号真机测试!!
- 团队-团队编程项目作业-开发环境搭建过程
- OpenGL基础53:阴影映射(下)
- Ajax学习笔记-客户端模板引擎-9
- C#人脸识别入门篇-STEP BY STEP人脸识别—静态照片人脸检测
- rar linux下载64位下载地址,Linux中下载WinRAR并使用它解压rar文件
- 四川师范大学大学计算机基础,大学计算机基础课程教学改革探索——以四川师范大学为例...
- 叉乘与空间曲线的切向量
- 网站cdn加速哪个好,10个免费网站cdn加速推荐
- Paypal移动快速支付流程
- Learning Git Branching 题解(基础、高级、Git远程仓库)
热门文章
- pythonround18.67 1,Python语句 print(pow(-3,2), round(18.67,1), round(...
- 学习Nginx这一篇就够了(非本人原创文章)
- 人员离职it检查_员工离职的IT流程
- 计算机科学与技术陈梦如,淮南师范学院马克思主义学院文件.doc
- 音频3A测试 NS降噪测试
- bootstrap table设置列宽
- 拼多多顶级佣金助手-微信群自动发单
- V831——人脸性别年龄检测
- 手机怎样设置垃圾短信拦截?
- linux系统时间编程(2) 各种时间标准GMT、UTC、世界时、TAI