微信生态圈开发涉及的太多,公众号,微信支付,小程序,小游戏,微信网页,微信授权登录等等,之前也零零星星的进行过一些微信开发,不过都不是很系统,就是需要什么去找什么,用的不多也慢慢忘记了,这次从头开始研究一下微信开发,做一下笔迹。
说一下微信公众号,公众号分订阅号和服务号,文字上的区别我就不说了,对于开发者来说,服务号的几乎拥有所有接口权限,而订阅号没有微信支付以及网页端调取用户信息的接口。这两个接口恰恰是最重要的。所以做开发的话尽量还是注册服务号吧。
每个公众号都必须有一个主体,也就是公众号的拥有者,如果是个人只能拥有一个公众号,如果是企业可以拥有两个公众号。服务号只能是企业用户注册,而且注册后需要30天内认证,即需要支付300元。
另外每个公众号都可以设置N个运营者,也就是说可以管理这个公众号,但是同一个微信只能成为五个公众号的管理员,这点就非常麻烦,往往都是不够用的。因为一个开发人员,很多情况下都会管理超过5个公众号,那么就只能自我斟酌了。
好了,说回开发了,后台语言node+ts+express。
进入后台后,第一步,左侧菜单设置与开发->基本配置
URL:非常重要,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
Token:自己随便填写,保存在本地,是用来签证签名是否正确的必须要字段。
EncodingAESKey:暂时还不清楚,等明白了,我再回来完善,是不是和第四项有关?
消息加解密方式:先选择明文了,有时间再研究安全模式,可能安全模式就需要上面的密钥
首先你要先搭建好后台,才能提交,也就是说URL中的地址必须是有效的,当点击提交按钮后,微信会发一个携带四个参数的GET请求到这个url,分别是signature、timestamp、nonce,echostr然后该url必须返回正确的值,才能生效,具体说明可以看一下官方的接入指南。
文档中要求对各类参数进行排序加密等,实际上服务端只要返回参数中的echostr值即可,代码如下:
import { Response, NextFunction } from 'express'
import { IRequest } from '@/types/common'
import express from 'express'
const Router = express.Router()
const check = async (req: IRequest, res: Response, next: NextFunction) => {
const { signature, timestamp, nonce, echostr } = req.query
res.send(echostr)//输出这段即可
}
Router.get('/', check)
export default Router
这样就能提交成功了。
当然这个仅仅是方便尽快提交通过,实际开发中肯定要实现签名验证的,否则谁都可以发送请求到这个URL了,怎么判断请求是否是微信发来的呢?
很简单改一下check函数就行了,对query参数和token进行排序,然后进行sha1加密,与signature对比一下即可,对了先要npm一下sha1模块哦。
import sha1 from 'sha1'
const Router = express.Router()
const check = async (req: IRequest, res: Response, next: NextFunction) => {
const { signature, timestamp, nonce, echostr } = req.query
const arr = [timestamp, nonce, global.CONFIG.WX.Token].sort()
const word = sha1(arr.join(''))
if (word === signature) { // 验证成功
return res.send(echostr)
}
else {
return res.send('fail')
}
}
global.CONFIG.WX.Token是我将基本配置中的token保存到了config文件中了,至此第一步验证URL实现了。