300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 微信公众号测试号接入微信公众平台开发----node.js

微信公众号测试号接入微信公众平台开发----node.js

时间:2022-12-28 00:54:29

相关推荐

微信公众号测试号接入微信公众平台开发----node.js

微信测试号接入微信公众开发,并且在向测试公众号发送消息后,公众号收到之后自动回复功能

创建一个express 项目App.js

/*** express 入门程序*第一个程序,认识express开发步骤*/// 引入expressconst express = require("express");const sha1 = require("sha1");const auths = require("./wechat/auth");const app = express();app.use(express.urlencoded({extended: true }));app.use(auths());// 启动应用app.listen(8052, (err) => {console.log("服务已经在http://localhost:...");});/** 1.* auth.js* 该模块处理请求* 1.验证服务器有效性* 2.获取用户输入信息*//**2* utils.js ,解析收到的数据* // 该模块用于解析数据*//**3* replyCon.js* // 维护一个对象*具体业务逻辑或者说发送消息内容*//**4* replyTem.js* 发送信息*/

新建config/index.js

// 存储开发者机密 信息配置module.exports = {appID: "xxx",appsecret: "xxx",token: "xxx",};// 这里的配置要与公众平台一致

新建wechats/auth.js

安装sha1模块npm安装 我安装的版本–"sha1": "^1.1.1",

/*** 该模块处理请求* 1.验证服务器有效性* 2.获取用户输入信息*/const config = require("../config/index");const sha1 = require("sha1");const {getXmlData, parseXmlData, formattingData } = require("../tools/utils");const {buildRep } = require("../reply/replyCon");const {concreteData } = require("../reply/replyTem");module.exports = () => {return async (req, res, next) => {// 获取参数const {signature, echostr, timestamp, nonce } = req.query;console.log(req.query, "00");const {token } = config;// 排序后// let sortArr = [timestamp, nonce, token].sort();// 拼接字符串let sha1Str = sha1([timestamp, nonce, token].sort().join("").toString());// 校验// 验证服务器有效性if (req.method == "GET") {if (sha1Str === signature) {res.end(echostr);return;} else res.end("111");} else if (req.method == "POST" && sha1Str === signature) {// 普通消息请求// console.log(req.body);const xmlinitData = await getXmlData(req);// 转换jsconst dataJs = parseXmlData(xmlinitData);// console.log(dataJs);// 格式化js数据const formmat = formattingData(dataJs);console.log(formmat, "格式化");const bRep = buildRep(formmat);const finaData = concreteData(bRep);res.end(finaData);

新建tools/utils.js

// 该模块用于解析数据const {parseString } = require("xml2js");module.exports = {// 获取微信服务器的数据/**** @param {*} req* @returns*/getXmlData(req) {return new Promise((resolve, rejext) => {let xmlData = "";req.on("data", (data) => {console.log(data.toString());xmlData += data.toString();});req.on("end", () => {resolve(xmlData);});});},// 解析数据/**** @param {*} xmlData* @returns*/parseXmlData(xmlData) {let initdata = "";parseString(xmlData, {trim: true }, (err, data) => {if (!err) {initdata = data;} else {console.log("解析失败");initdata = "err";}});return initdata;},// 格式化数据/**** @param {*} param0* @returns*/formattingData({xml }) {let mesData = {};for (let key in xml) {const value = xml[key];mesData[key] = value[0];}return mesData;},};

新建reply/replyCon.js模块

// 维护一个对象// 具体业务逻辑/**** @param {*} userData* @returns*/function buildRep(userData) {let obj = {ToUserName: userData.ToUserName,FromUserName: userData.FromUserName,CreateTime: Date.now(),};//解析到'你好'时if (userData.Content == "你好") {obj.MsgType = "text";obj.Content = "你好";return obj;// 解析到'图片'时} else if (userData.MsgType == "image") {obj.MsgType = "image";obj.MediaId = userData.MediaId;return obj;// 语音} else if (userData.MsgType == "voice") {obj.MsgType = "voice";obj.MediaId = userData.MediaId;return obj;// 音乐} else if (userData.Content == "音乐") {obj.MsgType = "music";obj.Title = "麻雀";obj.Description = "李荣浩的歌";obj.MusicUrl = "/#/song?id=1407551413&market=baiduqk";obj.HQMusicUrl ="/#/song?id=1407551413&market=baiduqk";obj.ThumbMediaId ="GWuXUezvYmjWy8L-QGCJ7a7mtu0rT2WDsvSgRs_tAky6ykoQn5Ew_BZJDBcRTTB4";return obj;// 收到图文时} else if (userData.Content == "图文") {obj.MsgType = "news";obj.ArticleCount = 2;obj.item = [];for (var i = 0; i < obj.ArticleCount; i++) {obj.item[i] = {};obj.item[i].Title = "中秋国庆能出游返乡吗?多地明确了!";obj.item[i].Description ="近期,河南多地发布了“致在外老乡的一封信”,倡导中秋假期非必要不返乡。例如,河南邓州就在信中提到,“跨区域往返流动,接触人员复杂,感染风险增大,希望您近期暂缓返乡,尽量留在当地赏月过中秋”。";obj.item[i].PicUrl ="/it/u=1218607176,3524458466&fm=179&app=42&size=w931&n=0&f=PNG?s=55B28A744662E75B1C215C8F0300A0A1&sec=1662310800&t=c8fdbe009358e58a5d3bcecb8988271f";obj.item[i].Url ="/link?url=4Eh_iAY3maG33EwaKPEVzIdKfZ6-6iBXG4RziOTh7uiU8eS5JYRSW6aFpL2T4JXRC1BjCHK6y-Pa6GeufZ9BUK&wd=&eqid=9d31cc3a000bc2a70000000363130430";}return obj;} else {obj.MsgType = "text";obj.Content = userData.Content;return obj;}}exports.buildRep = buildRep;

新建reply/replyTem

// 发送的信息function concreteData(replaObj) {let repStr = `<xml><ToUserName><![CDATA[${replaObj.FromUserName}]]></ToUserName><FromUserName><![CDATA[${replaObj.ToUserName}]]></FromUserName><CreateTime>${Date.now()}</CreateTime><MsgType><![CDATA[${replaObj.MsgType}]]></MsgType>`;if (replaObj.MsgType == "text") {repStr += `<Content><![CDATA[${replaObj.Content}]]></Content></xml>`;} else if (replaObj.MsgType == "image") {repStr += ` <Image><MediaId><![CDATA[${replaObj.MediaId}]]></MediaId></Image></xml>`;} else if (replaObj.MsgType == "voice") {repStr += `<Voice><MediaId><![CDATA[${replaObj.MediaId}]]></MediaId></Voice></xml>`;} else if (replaObj.MsgType == "music") {repStr += `<Music><Title><![CDATA[${replaObj.Title}]]></Title><Description><![CDATA[${replaObj.Description}]]></Description><MusicUrl><![CDATA[${replaObj.MusicUrl}]]></MusicUrl><HQMusicUrl><![CDATA[${replaObj.HQMusicUrl}]]></HQMusicUrl><ThumbMediaId><![CDATA[${replaObj.ThumbMediaId}]]></ThumbMediaId></Music></xml>`;} else if (replaObj.MsgType == "news") {repStr += ` <ArticleCount>${replaObj.ArticleCount}</ArticleCount><Articles>`;for (let i = 0; i < replaObj.item.length; i++) {repStr += `<item><Title><![CDATA[${replaObj.item[i].Title}]]></Title><Description><![CDATA[${replaObj.item[i].Description}]]></Description><PicUrl><![CDATA[${replaObj.item[i].PicUrl}]]></PicUrl><Url><![CDATA[${replaObj.item[i].Url}]]></Url></item>`;}repStr += `</Articles></xml>; `;}return repStr;}exports.concreteData = concreteData;

接口配置信息修改 的url我做了映射和node.js的地址保持一致了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。