集智robot微信公众号开发笔记
开发流程
公众号基本配置(首先得有公众平台账号)
- 在开发菜单的基本配置中填写好基本配置项
- 首先配置服务器地址、Token、和消息加密密钥(地址为开发者为微信验证留的接口、token可以随便填写,只要在验证的时候填写一致即可、消息加密三种模式,为了方便开发环境下可使用明文模式。加密项的加密方式可查看微信开发文档消息加说明
- 在配置完后这是提交肯定会出现token验证错误(坑),因为你还没有写验证代码,这是你在自己的服务端开始写验证代码。
*微信会发送一个get请求携带四个参数,根据微信给出的规则进行加密然后验证,验证成功直接返回echostr。详情可查看微信文档验证消息的确来自微信服务器 - 这些都完成之后皆可以进行开发了。当然如果要调用微信的一些接口是需要用到
access_token的。具体回去access_token的方式微信文档也讲得很清楚获取access_token。这次开发的功能是用户消息的接收和被动回复。不需要用到access_token,也不是特别复杂得多功能。主要记录一下这次开发中踩得各种坑
爬坑心路
首先是接收用户发送给供公众号,微信服务器再转发给开发者的
- 微信给开发者填写的
url发送请求,除了公众号基本配置是使用的是get请求,发送用户消息使用的是post请求。所以使用开发的话,需要接收两种方式的请求get和post. - 微信发送的
post请求会携带用户发送的消息。但是发送的是xml格式的数据包,所以这对于node开发者来说是不太友好的。一般nodejs开发接收post请求会使用到body-parser这个包,但是他不支持接收xml格式的数据,所以直接在req的body中是找不到微信发送的数据的,这就必须要自己进行转化了。 //使用req的事件来读取发送的请求信息
req.rawBody = ''// 给req添加一个rawBody属性
req.on('data', (chunk) => {
req.rawBody += chunk;// 将数据保存到req.rawBody中
}) req.on('end', () => { })
- 在请求结束后,使用
xml2js这个包对xml数据进行处理,将xml数据转换成json数据 req.on('end', () => {
//在这里使用xml2js对xml数据进行处理,获取用户发送的信息,然后回复用户信息
})
进行用户信息回复
微信服务器在请求五秒之内没有回复的话,回发起第二次第三次请求。三次都没有响应回给用户报错,所以如果无法再五秒之内回复的话,可以直接回复成功,或者一个空的字符串''.
消息回复最重要的就是回复消息的格式,一定要按微信给出的消息回复的格式来进行回复,不然也会报错,可以参考被动回复用户消息.
注意:如果复制微信给出的消息模板一定要去掉其中的空格,因为不符合xml数据的格式,所以也会报错
<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
比如!和<之间的空格和两个] ]中间的空格一定要去掉。
还有在回复的时候会有
ToUserName和FromUserName两个参数,分别代表要将消息发送给谁(用户的openID),和消息的发送者(开发者公众号微信号).由于接受的微信的xml数据包这两个参数代表是反的ToUserName和FromUserName分别是使用户openID和开发者微信。所以一定不要弄反了。
集智robot微信公众号开发笔记的更多相关文章
- 微信公众号开发笔记(C#)
这篇文章还不错,使用 .net , 对微信用户的想公众号发送的文字进行回复.比较简单,自己可以修改更复杂的回复. 微信公众号开发笔记(C#) 原文地址 需求分析 根据用户在微信上发送至价值中国公众号 ...
- 微信公众号开发笔记1(nodejs开发的)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- 微信公众号开发笔记1(nodejs开发)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- 微信公众号开发笔记-验证token
开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...
- 微信公众号开发笔记2(nodejs)
本篇主要记录调用微信各种api和功能实现 一.始于access_token 无论调用微信的什么api,都需要一个查询参数,就是我们每隔1小时或者2小时获取的access_token,笔记1中已经保证了 ...
- 微信公众号开发笔记3-sdk接入(nodejs)
另一个2小时 access_token是需要2小时更新一次,在这里,又引入了一个2小时获取一次的字段,这个字段是: jsapi_ticket,这个字段是接入sdk的前提.与access_token类似 ...
- 微信公众号开发笔记1-获取Access Token
获取你的Access Token a)可以采用网址的形式: 用appid和appsecert获得access token,接口为https://api.weixin.qq.com/cgi-bin/to ...
- 微信公众号开发C#系列-11、生成带参数二维码应用场景
1.概述 我们在微信公众号开发C#系列-7.消息管理-接收事件推送章节有对扫描带参数二维码事件的处理做了讲解.本篇主要讲解通过微信公众号开发平台提供的接口生成带参数的二维码及应用场景. 微信公众号平台 ...
- 微信公众号开发C#系列-9、多公众号集中管理
1.概述 通过前面8篇关于微信开发相关文章的学习,我们已经对微信常用开发有了一个比较深入的了解.前面的文章都是基于某一特定公众号的,在现实业务中同一单位个体运营着不至一个公众号,此时就需要对多个公众号 ...
随机推荐
- Windows下安装TensorFlow
最近学习TensorFlow,当然前提是装好框架,网上教程很多都是虚拟搭建或者是conda,从我的经验来讲,Windows目前只支持Python3.5版本安装,Python官网上有说明: 本人由于常用 ...
- fastjson从1.1.41升级到1.2.28的坑
最近因为fastjson安全漏洞,升级jar包时,踩了一些坑. 新版本FastJsonHttpMessageConverter初始化,默认设置MediaType为*/* 背景: 使用Spring Re ...
- shell脚本中文件测试
shell脚本中文件测试 author:headsen chen 2017-10-17 14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f filename ] ...
- jni 类初始化失败(nested exception is java.lang.NoClassDefFoundError)
nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.netease.facedetec ...
- 用session做权限控制
一个需要用户进行登录的网站,基本上都会设置用户权限,对不同的用户进行权限控制.例如:一个网站肯定会有一个管理员管理着普通的用户,普通的用户不可能对其他用户有着类似于增删改查等操作,这样网站都乱了--, ...
- Redis TTL命令
Redis TTL 命令以秒为单位返回 key 的剩余过期时间. redis TTL 命令基本语法如下: redis 127.0.0.1:6379> TTL KEY_NAME 当 key 不存在 ...
- 关于 Git使用的全面总结 —— 致敬Git之父Linux
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px ".PingFang SC"; color: #454545 } p.p2 ...
- 在react中引入下拉刷新和上拉加载
1. 首先引入插件 import ReactPullLoad, {STATS} from 'react-pullload' 2. 初始化: constructor(props) { super(pro ...
- C语言描述二叉树的实现及操作(链表实现)
概述 二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...
- java并发编程基础 --- 7章节 java中的13个原子操作类
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量 i=1,A线程更新 i+1,B线程也更新 I+1,经过两个线程的操作之后可能 I不等于3,而是等于2.因为A和B线程更 ...