微信公众号有:企业号、服务号、订阅号
企业号
是为企业或组织提供移动应用入口,帮助企业建立与员工、上下游供应链及企业应用间的连接。
服务号
企业和组织,提供更强大的业务服务与用户管理能力。比如支付,智能接口
订阅号
比较适合于个人,小团队,主要是用于信息传播,帮助管理用户以及和用户互动。比如撰写文章,咨询传播,消息定制等
订阅号和服务号区别
1.出现位置不同
2.单月发送消息数量不同,订阅号可以一天1篇,服务号一个月最多4篇
3.订阅号没有 9 大接口和支付功能
服务号 9 大接口:
1.语音识别:就是能识别你说的话,并翻译成文本内容
2.客服接口:就是公众号可以在你发送过消息的24小时内,向你回复消息
3.OAuth 2.0 网页授权:可以通过这个授权接口,请求用户授权,从而拿到更多的用户的信息
4.生成带参数二维码:公众号可以获得一系列携带不同参数的二维码,在用户扫描关注公众号后,公众号可以根据参数分析各二维码的效果,这些参数可以自己定制,从而可以实现更多分析结果,比如用户从哪来的
5.获取用户地理位置:公众号能够获得用户进入公众号会话时的地理位置。可以做微信导航
6.获取用户基本信息:公众号可以根据加密后的用户OpenID,通过一系列的参数交互,最终拿到用户基础信息,包括头像,名称,性别、地区。
7.获取关注者列表:通过这个接口,可以拿到所有关注者的OpenID,就知道有多少人关注你,是谁在关注你
8.用户分组接口:通过分组接口,可以在后台为用户移动,创建、修改分组,比如把你们班级你们图队分成,男生一组,女生一组
9.上传下载多媒体文件:通过这个接口,公众号可以在需要时在微信服务器上传下载多媒体文件
外网访问你的本机
1.ngrok
1 | ngrok http 3000 |
2.npm i -g localtunnel
1 | lt --port 3000 |
3.PageKite
4.花生壳
验证公众号

1.将tokoen、timestamp、nonce三个参数进行字典序排序
2.将三个参数字符串拼接成一个字符串进行 sha1 加密
3.将加密后的字符串与 signature 对比,如果相同,表示这个请求来源于微信,我们直接原样返回 echostr 参数内容,接入验证就成功了
1 | var Koa = require('Koa') |
2 | var sha1 = require('sha1') |
3 | var config = { |
4 | wechat: { |
5 | appID: 'appid', |
6 | appSecret: 'appSecret', |
7 | token: 'token' |
8 | } |
9 | } |
10 | |
11 | var app = new Koa() |
12 | |
13 | app.use(function* next() { |
14 | var token = config.wechat.token |
15 | var signature = this.query.signature |
16 | var nonce = this.query.nonce |
17 | var timestamp = this.query.timestamp |
18 | var echostr = this.query.echostr |
19 | var str = [token, timestamp, nonce].sort().join('') |
20 | |
21 | var sha = sha1(str) |
22 | if (sha === signature) { |
23 | this.body = echostr + '' |
24 | } else { |
25 | this.body = 'wrong' |
26 | } |
27 | }) |
28 | |
29 | app.listen(3000,()=>{ |
30 | console.log('listen 3000') |
31 | }) |
注意事项
1.微信公众号接口只支持 80 端口
2.微信后台配置的 URL 是唯一能接收到消息,事件的入口,我们在公众号中的所有操作,都是基于这个 url 进行交互
3.调用所有微信接口时几乎全部使用 https 协议
4.用户向公众号发送消息时,回传过来 OpenID, 这个 OpenID 是用户微信号加密后的值,每个用户在每个公众号中 OpenID 是唯一的
5.在开发阶段,要留意报错信息,比如全局返回码,这个非常重要,开发出了问题最终依然是要靠自己动手解决,比如 40003 是开发中经常碰到的错误。
6.我们在和微信服务器交互的时候,需要满足各个接口的规范限制、调用频率限制,也要特别注意模板消息、用户数据等敏感信息的使用规范。比如微信认证分为资质认证和名称认证两部分,只需要资质认证通过,就可获得接口每一个接口的调用次数是有上限的
access_token
1.access_token 每2个小时自动失效,需要重新获取。
2.只要更新了 access_token,之前的那个就不能用了。
解决方案:
1.让我们的系统每隔 2 个小时启动去刷新一个票据,这样无论何时我们内部调用接口,这个票据都是最新的
2.为了方便频繁调用,我们需要把票据存储在一个地方,并且是唯一的一个地方
五个步骤:
1.处理 POST 类型的控制逻辑,接收这个 XML 数据包
2.解析这个数据包(获得数据包的消息类型或者事件类型)
3.拼装我们定义好的消息
4.包装成 XML 的格式
5.在5秒钟内返回回去