文档章节

微信订阅后台自动回复功能的实现

龙马行空
 龙马行空
发布于 2016/11/29 23:28
字数 911
阅读 113
收藏 1
点赞 0
评论 0

3.1. 订阅号后台自动回复功能的实现

3.1.1. 官网文档地址

3.1.2. 订阅号管理平台的配置

  • 因为微信只支持80端口,所以通过ittun.com搭建模拟80端口的服务器

    • ittun官网网址:http://www.ittun.com/
    • 下载客户端文件并解压缩

    • 修改startup.bat文件的内容如下

    • 双击启动startup.bat文件

  • 来到订阅号后台并进入开发-基本配置页面进行配置

3.1.3. node后端接入

3.1.3.1. 原生代码实现

// 使用原生模块的写法
const express = require("express");
const {parseString} = require("xml2js");
const app = express();

// 接收微信服务器发过来的消息
app.post("/wx", (req, res, next) => {
    // 微信订阅号传过来的数据都是xml格式
    req.on("data", (buffer)=> {
        let msg = buffer.toString();
        //console.log(buffer.toString());
        //<xml><ToUserName><![CDATA[gh_fdfc0bf0bb5a]]></ToUserName>
        //<FromUserName><![CDATA[oryIWwNJ0Sgn8LyyxHsD6OLGxR9g]]></FromUserName>
        //<CreateTime>1479613848</CreateTime>
        //<MsgType><![CDATA[text]]></MsgType>
        //<Content><![CDATA[大好河山]]></Content>
        //<MsgId>6354893088312947331</MsgId>
        //</xml>


        //解析xml
        parseString(msg, (err, result) => {
            //console.log(result);

            //console.log(result.xml.Content[0]);
            //{ xml:
            //{ ToUserName: [ 'gh_fdfc0bf0bb5a' ],
            //    FromUserName: [ 'oryIWwAKciQIskVv3TCcI6LsY8kY' ],
            //    CreateTime: [ '1479613991' ],
            //    MsgType: [ 'text' ],
            //    Content: [ '你那了' ],
            //    MsgId: [ '6354893702493270691' ] } }


            let touser = result.xml.FromUserName[0];
            let fromuser = result.xml.ToUserName[0];
            //如果收到的是文本消息
            if (result.xml.MsgType[0] === "text") {
                if (result.xml.Content[0] === "你好") {
                    let txt = "你也好";

                    let sendmsg = `
                                    <xml>
                                        <ToUserName><![CDATA[${touser}]]></ToUserName>
                                        <FromUserName><![CDATA[${fromuser}]]></FromUserName>
                                        <CreateTime>${Date.now()}</CreateTime>
                                        <MsgType><![CDATA[text]]></MsgType>
                                        <Content><![CDATA[${txt}]]></Content>
                                    </xml>
                                `;
                    res.send(sendmsg);
                } else if (result.xml.Content[0] === "吃了么") {
                    let txt = "没吃呢,走一起食堂";

                    let sendmsg = `
                                    <xml>
                                        <ToUserName><![CDATA[${touser}]]></ToUserName>
                                        <FromUserName><![CDATA[${fromuser}]]></FromUserName>
                                        <CreateTime>${Date.now()}</CreateTime>
                                        <MsgType><![CDATA[text]]></MsgType>
                                        <Content><![CDATA[${txt}]]></Content>
                                    </xml>
                                  `;
                    res.send(sendmsg);
                } else if (result.xml.Content[0] === "看牙") {
                    //发送图文消息

                    let sendmsg = `
                                    <xml>
                                        <ToUserName><![CDATA[${touser}]]></ToUserName>
                                        <FromUserName><![CDATA[${fromuser}]]></FromUserName>
                                        <CreateTime>${Date.now()}</CreateTime>
                                        <MsgType><![CDATA[news]]></MsgType>
                                        <ArticleCount>1</ArticleCount>
                                        <Articles>
                                        <item>
                                        <Title><![CDATA[预约看牙]]></Title>
                                        <Description><![CDATA[我们一起看牙去吧]]></Description>
                                        <PicUrl><![CDATA[http://wx001.ittun.com/img/logo.png]]></PicUrl>
                                        <Url><![CDATA[http://wx001.ittun.com/order.html]]></Url>
                                        </item>
                                        </Articles>
                                    </xml>
                                   `;

                    res.send(sendmsg);
                } else {
                    // 不符合条件的回复
                    let txt = "滚蛋";

                    let sendmsg = `
                                    <xml>
                                        <ToUserName><![CDATA[${touser}]]></ToUserName>
                                        <FromUserName><![CDATA[${fromuser}]]></FromUserName>
                                        <CreateTime>${Date.now()}</CreateTime>
                                        <MsgType><![CDATA[text]]></MsgType>
                                        <Content><![CDATA[${txt}]]></Content>
                                    </xml>
                                   `;
                    res.send(sendmsg);
                }

            }
            else if (result.xml.MsgType[0] === "event") {
                //是点击事件click
                if (result.xml.Event[0] === "CLICK") {
                    if (result.xml.EventKey[0] === "V1001_TODAY_MUSIC") {
                        let txt = "收到今日歌曲";

                        let sendmsg = `
                                        <xml>
                                            <ToUserName><![CDATA[${touser}]]></ToUserName>
                                            <FromUserName><![CDATA[${fromuser}]]></FromUserName>
                                            <CreateTime>${Date.now()}</CreateTime>
                                            <MsgType><![CDATA[text]]></MsgType>
                                            <Content><![CDATA[${txt}]]></Content>
                                        </xml>
                                       `
                        res.send(sendmsg);
                    }
                }
            }

        });
    });
})

// 启动server
const server = app.listen(3002, function () {
    const host = server.address().address;
    const port = server.address().port;
    console.log('Example app listening at http://%s:%s', host, port);
});

3.1.3.2. wechat模块的实现

// 使用wechat模块的写法
const wechat = require('wechat');
const express = require("express");

const app = express();
const config = {
    token: 'dingyuehaohoutai',
    appid: 'wx263a41ae72347',
    encodingAESKey: 'T5766o1ql3lXrPIN0C4Tv1Udf3CkHhzFG'
};

app.use('/wx', wechat(config, function (req, res, next) {
    // 微信输入信息都在req.weixin上
    const message = req.weixin;
    console.log(message.Content);
   // {
   //      ToUserName: 'gh_dbd933de052c',
   //      FromUserName: 'oB3MDvytZho2Xs6ed-U5-QEeDJ3o',
   //      CreateTime: '1479632080',
   //      MsgType: 'text',
   //      Content: 'hehe',
   //      MsgId: '6354971394159447836'
   //  }


    if (message.Content === 'diaosi') {
        // 回复屌丝(普通回复)
        res.reply('hehe');
    } else if (message.Content === 'text') {
        //你也可以这样回复text类型的信息
        res.reply({
            content: 'text object',
            type: 'text'
        });
    } else if (message.Content === 'hehe') {
        // 回复一段音乐
        res.reply({
            type: "music",
            content: {
                title: "来段音乐吧",
                description: "一无所有",
                musicUrl: "http://m5.file.xiami.com/884/884/1706253944/1773374767_15591128_l.mp3?auth_key=d26a837c4b087ee74ec512b8206d9dc1-1479870000-0-null",
                hqMusicUrl: "http://m5.file.xiami.com/884/884/1706253944/1773374767_15591128_l.mp3?auth_key=d26a837c4b087ee74ec512b8206d9dc1-1479870000-0-null"

            }
        });
    } else {
        // 回复高富帅(图文回复)
        res.reply([
            {
                title: '你来我家接我吧',
                description: '这是女神与高富帅之间的对话',
                picurl: 'http://nodeapi.cloudfoundry.com/qrcode.jpg',
                url: 'http://nodeapi.cloudfoundry.com/'
            }
        ]);
    }
}));

// 启动server
const server = app.listen(3002, function () {
    const host = server.address().address;
    const port = server.address().port;
    console.log('Example app listening at http://%s:%s', host, port);
});

3.1.3.3. 其他第三方模块的实现

免责说明

  1. 本博客中的文章摘自网上的众多博客,仅作为自己知识的补充和整理,并分享给其他需要的coder,不会用于商用。
  2. 因为很多博客的地址看完没有及时做保存,所以很多不会在这里标明出处,非常感谢各位大牛的分享,也希望大家理解。

 

 

 

© 著作权归作者所有

共有 人打赏支持
龙马行空
粉丝 385
博文 127
码字总数 119251
作品 0
房山
前端工程师
蝉知企业门户系统 2.2 版本发布,全面集成微信

大家好,蝉知企业门户系统2.2正式版正式发布了!这次升级集成了微信公众号的应用,主要功能有:公众号接入、公众号菜单定义、关键字自动回复设置、二维码显示、粉丝消息获取和回复、粉丝管理...

炒蚕豆吃蹦豆
2014/03/27
4.5K
45
微信接口及权限

不同的公众号类型具备不同的接口权限,具体如下表: 请注意: 1、微博认证视作未认证,因此微博认证的公众号不会拥有微信认证公众号特有的接口。 2、微信认证分为资质认证和名称认证两部分,只...

meibug
2016/10/25
170
0
蝉知 6.1 发布,新增订单退款 图片水印功能

大家好,蝉知企业门户系统开源版6.1正式发布了。 本次升级新增了订单退款,facebook、github 登录,图片水印等功能,同时修复了之前版本的一些bug,欢迎大家下载使用。 关于蝉知 蝉知企业门户...

炒蚕豆吃蹦豆
2017/04/12
2.9K
6
Node.js 微信后台搭建系列 - 微信集成

Contents 1. 接入验证 2. 接收消息 3. 发送消息 终于基本到了最后的一步了。微信集成主要包含三个部分: 接入验证,让微信确认你的服务器,就是你公众号的拥有人。 接收微信给你服务器的消息...

鹄思乱想
2017/07/30
0
0
微信接入流程

注册企业服务号并认证,注意:订阅号不支持第三方开发。 登录微信管理后台,在设置》基本配置中绑定开发的网站信息。(注意:接入微信只支持80和443端口,带有端口号的外网地址是不可以接入的...

bluecoffee
2016/04/25
242
0
关于微信公众号运营你要知道的24件小事

如需转载请点此查看转载须知。 基础内容 1 | 如何申请微信公众号 进入官网 mp.weixin.qq.com 即可根据提示进行注册申请。 2 | 服务号与订阅号的差别 服务号只有组织或者公司才可以进行申请...

04/19
0
0
JEECMS v7 版发布,国产 Java 开源 CMS 系统

JEECMSv7是一款支持栏目模型、内容模型交叉自定义的CMS: 对于不懂技术的用户来说,只要通过后台的简单设置即可自定义出集新闻管理、图库管理、视频管理、下载系统、文库管理、政务公开、作品...

jeecms
2015/11/03
7.1K
14
微信公众平台回复链接可以直接访问,但不能是锚文字链接标签

  最近在学习微信公众平台开发,由于编辑模式和开发模式不可同时开启,在开发模式下如果访客发送关键字过来暂时无法实现关键词自动回复,客服人员先用链接网址直接回复订阅用户,但请注意不...

ytkahcom
2014/03/27
0
0
微信公众号流量变现的六大技巧

     此篇是第一篇的补充。   近年,很多初创企业或者个人利用微信公众平台赚了不少钱。那么,这些利用微信公众平台创业的企业或者个人在起初是如何积累粉丝?又是如何将流量变现的呢?...

公众开发运营官网
2017/11/24
0
0
WordPress 插件--WeChat Subscribers Lite

这是一个简单通用的微信(weixin)公众平台订阅号专用WordPress插件。现在这个版本的插件只支持普通订阅号,任何人只要以个人身份免费注册微信公众平台就可以足以使用这个插件的全部功能。 这个...

windfarer
2015/03/13
790
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

什么是Base64

一、什么是Base64? 百度百科中对Base64有一个很好的解释:“Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。 什么是...

Jack088
5分钟前
0
0
SQL多表联查leftjoin左边加表单

SELECT IFNULL(u.USER_ACCOUNT, o.USER_ACCOUNT) u.USER_ACCOUNT, o.* FROM gh_orders o LEFT JOIN gh_user u ON o.PARENT_ID = u.ROW_ID 1.假如u.USER_ACCOUNT不空返回u.USER_ACCOUNT,否则返......

森火
9分钟前
0
0
expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统

expect脚本同步文件 更改权限 执行脚本 查看执行结果 expect eof需要加上,作用是等脚本命令执行完再进行退出 expect脚本指定host和要同步的文件 更改权限,执行脚本 构建文件分发系统 需求背...

Zhouliang6
47分钟前
1
0
Hive应用:外部分区表

Hive应用:外部分区表 介绍 Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示...

星汉
57分钟前
3
0
点击Enter登录

1. 效果 2. 实现过程(记得引入jq文件) //6.回车事件 登录 $(function() { document.onkeydown = function(event) { var e = event || window.event || arguments.callee.caller.arguments......

Lucky_Me
今天
1
0
点击菜单内容切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .mao{ ......

南桥北木
今天
1
0
OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
今天
591
8
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
10
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
1
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部