微信公众号开发教程

本教程为看微信公众号视频做的笔记,原视频链接:尚硅谷公众号开发,微信公众号开发实战_哔哩哔哩_bilibili

平台

微信公众号管理:公众号 (qq.com)

微信公众测试号平台:微信公众平台 (qq.com)

微信公众号开发文档:微信公众平台开发概述 | 微信开放文档 (qq.com)

目录说明:

|_ config 存放配置文件

|_ index.js 配置文件,存放了需要用到的内容

|_ utils 工具

|_ tool.js 存放写的工具类

|_ wechat 存放微信接口

|_ auth.js 微信服务器的有效性验证

|_ accessToken.js 获取微信 access_token(调用微信接口必须携带的参数,是全局的唯一凭证,2小时失效)

|_ app.js 程序入口

接口配置信息

进入微信公众平台 (qq.com),看到如下页面

首先配置接口(接口配置信息),用 js 使用 express 框架编写如下代码:

// 引入express
const express = require('express');
const app = express();
​
app.use((req, res, next) => {console.log(111);res.send(111);
});
app.listen(3000, () => {console.log('Server is running at http://localhost:3000');
});

也就是创建一个运行在 3000 端口的服务器,这里我们 localhost:3000 这个端口并不能用于微信这个配置接口。

URL

打开 ngrok.exe ,目标路径D:\A-study\software\cpolar.exe,进行内网穿透,将本地端口号开启的服务映射外网跨域访问一个网址,输入如下命令:

// 此处 3000 为服务器所在端口号
cpolar http 3000

页面如下:

 

此时访问:http://7ed2c829.r3.cpolar.top即可实现和 localhost:3000 一样的效果。

这个地址可用于微信这个配置接口。复制此路径,粘贴到配置接口中。

ngrok 这个程序不要关闭,关闭此接口无法响应。

Token

这里的 Token 是一个微信签名的一个参数,在这里可以随意填写,越长越好。

配置完如下

 

验证消息来源

这里我们之所以使用 app.use(),原因是可以接受处理所有消息,配置好上两项,点击提交,在app.use()中查看req.query,得到一下结果:

{// 微信的加密签名signature: '0393d4e16dc0cf2c907c6d7d9c6bfdfce4c2efce',// 微信的随机字符串echostr: '4359501947458813682',// 微信的发送请求时间戳timestamp: '1661430480',// 微信的随机数字nonce: '1215363190'
}

我们的目的是要验证消息是否是来自微信服务器的,原理:

计算得出 signature 微信加密签名,和微信传递过来的 signature 进行对比,如果二者相同,则说明消息来自于微信服务器,反之,不是微信服务器发送的消息。

那么怎么进行计算呢,如下是步骤:

  1. 将参与微信加密签名的三个参数(传来的:timestamp、nonce、自己设置的:token),组合到一起,按照字典排序,并组合在一起形成一个数组

  2. 将数组拼接所有项拼接成一个字符串,进行 sha1 加密

  3. 加密完成就生成了一个 signatrue ,和微信发送过来的进行对比

    如果一样,说明消息来自于微信服务器,返回 echostr 给微信服务器

    如果不一样,说明不是微信发送的消息,返回 error

设置一个 config 变量用于储存我们所有需要用到的值:

const config = {token: "VikeyAlvinForever",appID: "wx56e0df28b365f4d2",appsevret: "5b7d5c835c65e984ecb21e0c63864103"
}

安装 sha1 :cnpm i sha1

验证代码如下:

// 引入express
const express = require('express');
const app = express();
// 引入 sha1 模块将计算出的结果加密
const sha1 = require('sha1');
// 配置对象,存我们需要的内容
const config = {token: 'VikeyAlvinForever',appID: 'wx56e0df28b365f4d2',appsevret: '5b7d5c835c65e984ecb21e0c63864103',
};
​
app.use((req, res, next) => {console.log(req.query);// 解构赋值const { signature, echostr, timestamp, nonce } = req.query;const { token } = config;console.log('1232' + echostr);//将参与微信加密签名的三个参数(传来的:timestamp、nonce、自己设置的:token),组合到一起,按照字典排序,并组合在一起形成一个数组const arr = [timestamp, nonce, token];// 排序const arrSort = arr.sort();console.log('arrSort:' + arrSort);// 将数组所有参数拼接const str = arr.join('');console.log('str:' + str);// 加密const sha1Str = sha1(str);console.log('加密后:' + sha1Str);// 判断是否相同if (sha1Str === signature) {res.json(echostr);} else {res.end('error');console.log('error');}
});
app.listen(3000, () => {console.log('Server is running at http://localhost:3000');
});

然后在微信公众平台上点击提交,这里我遇到了一个问题,各种代码都没有问题,然而一直配置失败,是那个 ngrok 不行,换成 cpolar 就好使,气死我了。

如图即为成功。

cploar官网:cpolar - secure introspectable tunnels to localhost

获取access_token

access_token 是微信调用接口的唯一凭证,访问微信的接口必须都携带此凭证。

特点:

  1. 唯一的

  2. 有效期为2小时,最好留出时间来请求,我们一般提前5分钟请求

  3. 接口权限 每天最多 2000 次

请求地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

请求方式:GET

携带参数:

参数是否必须说明
grant_type获取access_token填写client_credential
appid第三方用户唯一凭证
secret第三方用户唯一凭证密钥,即appsecret

设计思路:

  1. 首次本地没有,发送请求获取 access_token,保存下来(本地文件)

  2. 第二次及以后:

  • 先去本地读取文件,判断他是否过期

    • 过期了 -> 重新请求获取 access_token ,保存下来覆盖之前的文件(保证文件唯一)

    • 没有过期 -> 直接使用

整体思路:

读取本地文件(readAccessToken)

  • 本地有文件

    • 判断是否过期(isValidAccessToken)

    • 过期 -> 重新请求获取 access_token(getAccessToken) ,保存下来覆盖之前的文件(保证文件唯一)(saveAccessToken)

    • 没过期 -> 直接使用

  • 本地没有文件

    • 发送请求获取 access_token(getAccessToken),保存下来(本地文件)(saveAccessToken),直接使用

自动回复

接收用户发来的消息

微信服务器会发送两种类型的消息给开发者服务器:

  1. GET 请求 -> 验证服务器的有效性

  2. POST 请求 -> 微信服务器会将用户发送的数据以POST请求的方式转发到开发者服务器上

再 auth.js 中验证微信服务器发送的是 GET请求 还是 POST请求 获取。

使用手机像测试号发送消息,得到如下

{signature: 'bd1ffd2a36fdc44ca5b6b0d45ac3980b78489346',timestamp: '1661772245',nonce: '1886903686',openid: 'o1cZB6SJhrmbTWVCfo6l_rzwrkgY'
}

这个 openid 为用户的微信id。

需要接收请求体中的数据,这是一个流式数据。

请求后获取数据:

<xml>
<ToUserName><![CDATA[gh_5cc210c9b162]]></ToUserName>   // 开发者id
<FromUserName><![CDATA[o1cZB6SJhrmbTWVCfo6l_rzwrkgY]]></FromUserName>   // 用户的openid
<CreateTime>1661773339</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
<MsgId>23790873740096595</MsgId>
</xml>

将xml数据解析为 js 对象

这里我们需要使用一个库:xml2js,使用 xml2js 所提供的 parseString 方法来转换:

parseString(要转换的xml数据,{trim:是否留白},(err,data)=>{})

上文转换成如下:

{xml: {ToUserName: [ 'gh_5cc210c9b162' ],FromUserName: [ 'o1cZB6SJhrmbTWVCfo6l_rzwrkgY' ],CreateTime: [ '1661774019' ],MsgType: [ 'text' ],Content: [ '哈喽' ],MsgId: [ '23790883295887531' ]}
}

回复用户发来的消息

判断用户发送的消息:

全匹配: ===

半匹配:message.Content.match('爱')

const content = '您在说什么,我听不懂'
if(message.MsgType === 'text'){// 全匹配 用户必须发送指定消息才匹配到if(message.Content === "1"){content = "大吉大利,今晚吃鸡"// 半匹配 只要用户发送消息包含 爱 就会匹配}else if(message.Content.match("爱")){content = '我爱你~'}
}
// 这里ju
let reply = `<xml><ToUserName><![CDATA[${message.FromUserName}]]></ToUserName><FromUserName><![CDATA[${message.ToUserName}]]></FromUserName><CreateTime>${Date.now()}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[${content}]]></Content></xml>`;
res.send(reply);

详细请看文档,这里不多赘述。

自定义菜单创建接口

// 自定义菜单
module.exports = {button: [{type: 'click',name: '戳我啊~',key: 'CLICK',},{name: '菜单',sub_button: [{type: 'view',name: '跳转链接',url: 'http://www.baidu.com/',},// {//   // 小程序//   type: 'miniprogram',//   name: 'wxa',//   url: 'http://mp.weixin.qq.com',//   appid: 'wx286b93c14bbf93aa',//   pagepath: 'pages/lunar/index',// },{type: 'click',name: '赞一下我们',key: 'V1001_GOOD',},{type: 'scancode_waitmsg',name: '扫码带提示',key: '扫码带提示',},{type: 'scancode_push',name: '扫码推事件',key: '扫码推事件',},// {//   type: 'media_id',//   name: '点击按钮发送图片',//   media_id: 'MEDIA_ID1',// },// {//   type: 'view_limited',//   name: '图文消息',//   media_id: 'MEDIA_ID2',// },],},{name: '发图',sub_button: [{type: 'pic_sysphoto',// 弹出相机name: '系统拍照发图',key: '系统拍照发图',},{type: 'pic_photo_or_album',// 相册或者拍照name: '拍照或者相册发图',key: '拍照或者相册发图',},{type: 'pic_weixin',// 打开相册name: '微信相册发图',key: '微信相册发图',},{name: '发送位置',type: 'location_select',key: 'rselfmenu_2_0',},],},],
};
​

开发页面

首先安装 ejs,这个ejs,相当于 html 页面,直接可以在 node 中指定跳转

在 app.js 中配置 ejs,配置完才能使用:

// 配置模板资源目录
app.set('views','./views')
// 配置模板引擎
app.set('view engine','ejs')

配置完模板资源以及模板引擎,在day01下创建 views 目录,在此文件夹下创建 search.ejs 文件,编写代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><h1>这是一个搜索页面</h1></body>
</html>

在 app.js 中编写代码:

app.get('/search', (req, res) => {// 渲染页面,把渲染好的页面传给用户res.render('search');
});

这样当访问search 这个路径时,将会渲染出此页面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/47361.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

公众号推文制作及发布保姆级教程

在这个新媒体的时代&#xff0c;无论是我们刚步入大学&#xff0c;加入了部门&#xff0c;做一些宣传方面的工作&#xff0c;还是想在微信公众号平台发布一些自己的日常生活&#xff0c;写一些文章&#xff0c;甚至以后从事一些关于新媒体的工作……推文这个玩意儿确实越来越吃…

Python预测糖尿病

今天给大家讲解一个实战案例:如何根据现有数据预测糖尿病。在这个案例开始之前&#xff0c;希望大家回忆一下大学里讲过的线性回归的知识&#xff0c;这是数据挖掘里非常重要的一部分知识。当然&#xff0c;鉴于大家都学过&#xff0c;本篇就不再赘述。 一. 数据集介绍 diabe…

小组作业:糖尿病预测

提示&#xff1a;该Blog仅用于作业汇报展示&#xff0c;大佬请绕路 文章目录 一、作业介绍二、数据处理三、数据分析四、特征选择五、模型训练与评价六、模型优化七、与原模型进行对比八、作业总结 一、作业介绍 该项目依托于某医院处理好之后的体检数据&#xff0c;首先进行了…

python糖尿病数据挖掘

有人说21世纪&#xff0c;我们的生活越来越便捷&#xff0c;电子通讯越来越发达&#xff0c;美食越来越多。这一点也不假。但现代生活方式也有不利一面&#xff0c;工作越来越忙&#xff0c;身体锻炼越来越少&#xff0c;体重一天一天增加。有一种疾病叫做糖尿病&#xff0c;你…

数据挖掘——糖尿病预测

一、问题描述 糖尿病数据集是Sklearn 提供的数据集。它从442例糖尿病患者的资料中取10个特征&#xff1a;年龄、性别、体重、血压和6个血清测试量值&#xff0c;以及患者在一年后疾病发展的量化值&#xff08;标签&#xff09;。 二、实验目的 根据上述10个特征&#xff0c;预…

基于Python实现的糖尿病预测系统

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86792308 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86792308 基于Python设计的预测糖尿病 摘要和关键词 本次实验的主要内容是使用回归分析和聚类分析来预测某人患糖…

糖尿病预测

人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 https://www.captainai.net/shuai 一、糖尿病预测 1.1问题描述 糖尿病数据集是Sklearn 提供的数据集。它从442例糖尿病患者的资料中取10个特征&#xff1a;年龄…

使用 Python 机器学习的糖尿病预测模型

介绍 在本文中,我们将学习如何使用 Train Test Split 模型将数据集分为四个部分,开发预测模型,并通过用例分析预测和数据集。 用例——问题陈述 我们这篇文章的目标是预测患者是否患有糖尿病。我们所有的患者都是年轻女性,她们提供的数据(即怀孕次数、血糖水平和 BMI)…

FGF21 类似物 PF-05231023 改善糖尿病并发症

光感受器细胞中拥有大量的线粒体&#xff0c;以满足视网膜组织高代谢速率的需求。但是&#xff0c;在糖尿病人体内&#xff0c;高血糖引发的代谢异常会增加机体的氧化压力&#xff0c;从而加速视网膜的微血管病变。因此&#xff0c;增强光感受器细胞内的抗氧化通路可以阻止 DR …

保姆级人工智能学习成长路径

文章目录 0. 前言1. 第一阶段&#xff1a;编程语言学习2. 第二阶段&#xff1a;机器学习基本理论3. 第三阶段&#xff1a;深度学习理论与实战4. 第四阶段&#xff1a;细分领域深入学习5. 第五阶段&#xff1a;集大成者 0. 前言 最近有很多小伙伴想学习人工智能&#xff0c;其中…

图书馆小程序--Alpha迭代--第六周会议记录

1.小组介绍 组长&#xff1a;杨坤 小组成员&#xff1a;杨坤、何一鸣、韦灵雅、吴卿怡、许梦真、严影、林正远 2.流程图&#xff08;分模块&#xff09;&#xff1a; 3. 目前的小组分工&#xff1a; 许梦真&#xff1a;登录&#xff0c;验证用户信息。 1.制定数据库存储用…

【音视频架构演进:边缘计算与云原生】

在过去的一年中&#xff0c;我们可以看到多媒体特别是音视频技术的能力在严峻的挑战下&#xff0c;为各行各业带来了巨大的变化。疫情过后&#xff0c;又会有哪些多媒体新技术、新实践呈现在大众的视野当中&#xff1f;为行业的发展与应用带来哪些新的趋势与机会&#xff1f; 1…

跟一线高手深聊关于边缘计算的一切

这次我们把边缘计算“一线高手”都邀请到了上海&#xff0c;在全球边缘计算大会上海站上&#xff0c;关于边缘计算的一切&#xff0c;你好奇的、想了解的&#xff0c;都可以聊聊&#xff01; 1. 背景 今年三月份&#xff0c;十三届全国人大四次会议表决通过了关于国民经济和社会…

10月23日,相约全球边缘计算大会·上海站

全球边缘计算大会上海站&#xff0c;将于10月23日在上海召开。 本次大会&#xff0c;既有前沿技术研究分享&#xff0c;又有边缘计算落地实践、应用案例&#xff0c;是一次边缘计算领域的大型综合性会议。 早上设置了1个主会场&#xff0c;下午设置3个分会场&#xff0c;主要讨…

倒计时11天!全球边缘计算大会参会指南来啦!

全球边缘计算大会•上海站 参会指南 见证边缘的力量 10月23日&#xff08;周六&#xff09; 上海长宁区天山西路舜元会议中心&#xff08;靠近虹桥&#xff09; 目录 1.大会介绍 2.主办单位 3.峰会议程 4.交通指南 4.1 飞机 4.2 高铁 5.天气指南 6.签到&用餐指南 6.1 签到…

见证边缘的力量!全球边缘计算大会•上海站顺利召开!

2021年10月23日&#xff0c;以“见证边缘的力量”为主题的全球边缘计算大会在上海顺利召开&#xff01;本次大会由边缘计算社区主办&#xff0c;并得到了阿里云、亚马逊云科技、EMQ、PPIO、网宿科技、阿普奇、视美泰、九州云、谐云科技等企业联合支持&#xff0c;共同推动边缘计…

LiveVideoStackCon2021音视频技术大会北京站开幕在即,精彩抢鲜看

10.29-10.30&#xff0c;LiveVideoStackCon 2021音视频技术大会北京站将在北京丽亭华苑酒店举行。16个技术专题&#xff0c;67场技术分享&#xff0c;77位讲师&#xff0c;近500位多媒体生态技术代表将齐聚本届LiveVideoStackCon。本届大会主题为&#xff1a;新技术&#xff0c…

深度好文推荐:互联网厂商,究竟是如何看待5G的?

内容来源&#xff1a;2021年10月23日&#xff0c;由边缘计算社区主办的全球边缘计算大会上海站圆满落幕。会上&#xff0c;虎牙5G首席架构师林正显受邀发表了主题为《浅谈5G及边缘计算接入网络的治理》的演讲。经过整理后&#xff0c;分享给大家。 整理编辑&#xff1a;上海大学…

LiveVideoStack公众号2021年终盘点

在2021年伊始&#xff0c;我们翻译过Tsahi Levent-Levi关于今年WebRTC流行趋势的文章&#xff0c;文中提到2021年将是“还债”的一年&#xff0c;此前所进行的系统设计、软件架构或软件开发都将迎来最终结果&#xff1b;同时它也将是服务及传输质量不断优化的一年。在供给侧长期…

解读李子柒品牌:重新认识IP消费品

NEW 关注Tech逆向思维视频号 最新视频→【日本富翁抵达宇宙还秀了朋友圈&#xff0c;普通人可以吗&#xff1f;】 出品&#xff5c;开菠萝财经 李子柒&#xff08;本名李佳佳&#xff09;与其所属公司微念的诉讼在即&#xff0c;舆论场上围绕双方孰是孰非的讨论已持续了近150天…