首先关注公众号的时候,公众号会发送一条 post 请求到 nodejs 服务器,这条消息是 xml 数据类型,这里就用到 xml 解析,demo 里用的是 fast-xml-parser@3.12.16
demo 用的 express 脚手架生成的【express 生成项目】
直接看 demo ,写的比较 low 大神请飘过~
创建的 demo 直接将代码复制粘贴到 routes/index.js 里边就行

var express = require('express');
var router = express.Router();var url = require('url');
var qs = require('qs');
var cy = require('crypto');
var TOKEN = 'demo_reply';
var fxp = require('fast-xml-parser');//这个是验证签名,公众号后台配置路由的时候用的,公众号配置服务器路由的时候会发送 get 请求到这个接口 接口进行 sha1 加密并验证就行了
router.get('/', function (req, res, next) {let query = url.parse(req.url).query;let params = qs.parse(query);if (!checkSignature(params, TOKEN)) {//如果签名不对,结束请求并返回res.end('signature fail');} else {res.end(params.echostr);}
});
function checkSignature(params, token) {let key = [token, params.timestamp, params.nonce].sort().join('');let sha1 = cy.createHash('sha1');sha1.update(key);//将加密后的字符串与signature进行对比,若成功,返回echostrreturn sha1.digest('hex') == params.signature;
}//这是验证之后其他的事件都走的 post 同样的接口,只是接收方式和接收到的东西不同罢了,分开写没毛病 老铁们~
router.post('/', function (req, res, next) {let postdata = ''; //预定义一个变量用来接收 post 过来的 xml 字符串req.addListener("data", function (postchunk) {postdata += postchunk;});//获取到了 post 的 xml 数据req.addListener("end", function () {let str = checkMsg(postdata); //检查到底是什么类型的消息,分 event 和 其他类型 ,并根据消息类型返回不同的消息res.end(str);});
})//将接收到的 xml 字符串传递过来并解析成 json 方便调用
function checkMsg(xmlStr) {let formatMsg = fxp.parse(xmlStr).xml;let resStr = ""; //预定义的返回值消息if (formatMsg.MsgType == "event") {resStr = eventMsg({ event: formatMsg.Event, formatMsg });} else {resStr = otherMsg({ MsgType: formatMsg.MsgType, formatMsg })}return resStr;
}//event 事件类型处理函数
function eventMsg({ event, formatMsg }) {let resStr = '';switch (event) {case "subscribe": //关注公众号回复的第一条消息resStr = `<xml><ToUserName><![CDATA[${formatMsg.FromUserName}]]></ToUserName><FromUserName><![CDATA[${formatMsg.ToUserName}]]></FromUserName><CreateTime>${new Date().getTime()}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[关注自动回复的第一条消息]]></Content></xml>`;break;case "unsubscribe": //取消关注直接回复成功就OK了,也可以真如手册上说的,去数据库里面把用户相关信息删掉,不过不知道有没有人会干这事儿resStr = 'success';break;default:resStr = 'success';}return resStr;
}//other 事件类型处理函数,比如在公众号页面直接输入文字给公众号发送消息,走的就是 other 类型
function otherMsg({ MsgType, formatMsg }) {let answer = "";switch (MsgType) {case "text": //这里可以使用正则做一个模糊查询来确定回复的消息到底是啥,暂时直接写死了if (formatMsg.Content == '你好') {answer = '我不好';} else if (formatMsg.Content == '你叫什么') {answer = '你脸这么大啊,还问我叫什么,你叫啥';} else {answer = '让你调戏我,滚蛋,哥是个纯爷们儿,只喜欢御姐萝莉';}break;default:answer = "不好意西,俺不认西~~~~~,攻城狮木给俺设置对应的回复";}resStr = `<xml><ToUserName><![CDATA[${formatMsg.FromUserName}]]></ToUserName><FromUserName><![CDATA[${formatMsg.ToUserName}]]></FromUserName><CreateTime>${new Date().getTime()}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[${answer}]]></Content></xml>`;return resStr;
}module.exports = router;

公众号测试地址:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 【GO>>>】


这里的服务器 URL 用的内网穿透工具做的,将 127.0.0.1:80 映射到外网上,直接访问映射出去的域名就可以访问到接口了,方便本地调试,不用一遍遍的往服务器上部署代码了,调消息回复的时候不需要调用微信的sdk接口,所以JS安全域名和网页授权回调域名配不配之无所谓

没有用过内网穿透工具的小伙伴可以看这里 【GO>>>】 自家写的,漂不漂亮无所谓,重点是实用就行

nodejs实现公众号服务URL绑定验证,nodejs实现公众号关注并回发送一条消息,以及关注之后的聊天自动回复消息相关推荐

  1. 【Insights直播】华为帐号服务,打造全场景安全帐号体系

    在App运营过程中,如何保持用户增长和提升用户体验始终是开发者关注的问题,而作为用户使用体验感知的第一环节--帐号注册登录环节是不可忽视,且有很大提升空间的.如何提升帐号的注册登录体验?如何保证用户在 ...

  2. 公众号服务器配置url证书问题,公众号服务器配置url,验证token一直出错,为什么?...

    详细日志: org.xml.sax.SAXParseException: 文件提前结束. at com.sun.org.apache.xerces.internal.util.ErrorHandler ...

  3. Insights直播回顾| 华为帐号服务,打造全场景安全帐号体系

    了解更多相关内容>> 访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:GitHub.Gitee 关注我们,第一时间了解 HMS Core 最新技术资讯~

  4. 微信公众号修改服务器配置token验证失败

    @微信公众号修改服务器配置token验证失败 微信公众号修改服务器配置token验证失败 新建SignUtil类 public class SignUtil {// 与接口配置信息中的 Token 要 ...

  5. 白杨SEO:公众号为什么会增加视频/视频号和服务?公众号视频号如何互相绑定?视频号公众号又如何互相解绑?启发是什么?

    公众号为什么会增加视频/视频号和服务? 如果要看图片,请在微信搜索白杨SEO公众号,里面可以看到. 如果你是公众号自媒体或者小编,你应该知道公众号以前的历史消息是没有视频/视频号和服务栏的,以前是公众 ...

  6. 阿里云服务器+微信公众号配置(Token验证不通过)

    推荐使用CentOS操作系统,本人在使用Ubuntu操作系统时安装第三方软件不是很顺利,导致在微信公众号服务器配置的Token验证失败不通过上浪费大量时间. 以下是 CentOS 和 Ubuntu的介 ...

  7. 微信公众号(一) --- 开启微信公众号服务

    开启微信公众号服务 注:1.以测试号(权限开发比较多)完成大部分微信功能,正式环境上类似配置开发即可.测试号不能开发支付交易,必须公众号验证和支付验证的公众号. 2.主要开发 公众号设置服务.获取用户 ...

  8. 微信公众号开发教程(一) 验证接入

    作者:陈惠,叩丁狼教育高级讲师.原创文章,转载请注明出处. 微信公众号开发教程(一)验证接入 本篇文章主要介绍了微信公众号开发接入详细流程,希望对刚接触公众号开发的同学有所帮助,有兴趣的同学可多多关注 ...

  9. springboot连接微信公众号服务以及给前端签名

    首先阅读文档 1.这个是什么意思呢,就是需要判断这个东西是不是来自于微信的,所以你需要填写你的请求的url和token(也就是密码,可以自定义的) 2.但是你保存配置肯定是失败的,因为你还需要写一个专 ...

最新文章

  1. C语言------运算符和表达式
  2. algorithm头文件下的常用函数--习题
  3. OpenCV制作自己的线性滤波器
  4. ubuntu开启SSH服务和允许root远程SSH登录
  5. 他95年出生,却拥有10年编程经验
  6. P5268-[SNOI2017]一个简单的询问【莫队】
  7. Java web后端2 Servlet Maven HttpServlet ServletConfig ServletContext HTTP协议
  8. python编辑器中文字体倒立的_如何用Python+人工识别处理知乎的倒立汉字验证码...
  9. DHCP服务器控制企业成本
  10. java读取文件封装的一个类(有部分代码借鉴别人的)
  11. 《实用软件工程》复习知识点
  12. 51单片机语音跳绳计播报跳绳数目
  13. 再谈PHP从入门到精通需要几年
  14. Linux 之 vim 使用
  15. lwip---(五)以太网数据接收
  16. 几个简约Jekyll主题推荐
  17. 红蜘蛛 v6.2.1160解除键鼠屏蔽以及实现窗口化
  18. day13-搜索过滤
  19. 如何把数字金额转换成中文大写
  20. java葱_Java程序设计_网课答案

热门文章

  1. 【iOS】—— 懒加载
  2. Faraday:微博广告分层实验平台架构
  3. Creator打android包时报Could not resolve all files for configuration ':jcore-react-native:lintClassPath'异
  4. python matlab 普朗克公式黑体光谱辐射出射度 绘图
  5. Vulnhub--bulldog
  6. 第四章:软件总体设计(4)此章结完
  7. 模型推荐丨政务大数据项目案例模型分享
  8. goaheadlinux移植_goahead(嵌入式Web服务器)之交叉编译、移植篇
  9. 【拔刀吧 TensorFlow】TensorFlow学习笔记八——何为卷积神经网络
  10. HBuilderX 详细安装教程