Uso de node.js para el desarrollo de cuentas públicas de WeChat: acceso

Este artículo participa en la convocatoria de temas técnicos para el camino avanzado de Node.js, haga clic para ver los detalles

prefacio

Hace un tiempo comencé una cuenta pública y también entré en contacto con el desarrollo de la cuenta pública durante el período de exploración. Registraré la experiencia durante el proceso de exploración y la compartiré con ustedes. Ya que no he experimentado la parte posterior -Aprendizaje final del sistema, los siguientes pasos e ideas son todos personales en línea. Se basa en la exploración y el pensamiento. No garantiza la autoridad. Es solo para referencia.

Proceso de acceso - lado WeChat

Primero, iniciamos sesión en el fondo de la cuenta oficial y encontramos la configuración básica en el menú de la izquierda

imagen.png

Luego de hacer clic en Modificar Configuración, ingresaremos a la página de llenado de parámetros

imagen.png

A continuación analizamos cada parámetro.

Descripción de parámetros

URL

Debe comenzar con http://o https://para admitir el puerto 80 y el puerto 443 respectivamente. Aquí debemos completar nuestra dirección de back-end, la solicitud de operación del usuario WeChat se reenviará a esta dirección, debe tenerse en cuenta que esta dirección solo admite el puerto 80 y el puerto 443, por lo que tenemos dos métodos

  • Se asignará un nombre de subdominio separado (tanto secundario como terciario) al servicio de backend, que es el método adoptado en este artículo.
  • Use Nginx para el proxy.Si su servicio de backend no usa el puerto 80 o 443, puede usar Nginx para reenviar la solicitud a la dirección donde se encuentra el backend.

Simbólico

Nosotros podemos completar el token, que se usa principalmente para generar una firma. Cuando accedemos por primera vez, WeChat usará el token para generar una clave secreta y enviarla al servidor. El servidor verifica la clave secreta. Si la verificación es exitosa, el acceso será exitoso.

CodificaciónAESKey

La codificación AESKey puede ser generada por nuestra escritura a mano o haciendo clic en el botón de generación aleatoria.Este es el cifrado y descifrado del cuerpo del mensaje enviado por WeChat al servidor en el período posterior del usuario principal, del que hablaremos más adelante.

cifrado y descifrado de mensajes

  • Modo de texto sin formato: sin cifrado
  • Modo de compatibilidad: Coexistencia de cifrado sin cifrado
  • Modo de seguridad: encriptado

Dado que este artículo no implica el procesamiento posterior de mensajes, no hablaremos de ello por el momento. Cuando hablemos sobre el procesamiento de mensajes más adelante, hablaremos de ello. Podemos elegir el modo de compatibilidad durante el desarrollo.

Proceso de acceso: lado del servidor

Autenticación del servidor

Todos están completos, hacemos clic en enviar, encontraremos que el sistema muestra una ventana emergente de error que nos dice que la verificación del token falló

3.png

Esto se debe a que solo lo configuramos en el lado de WeChat, pero no respondimos en el lado del servidor. Primero veamos si el servidor ha recibido el mensaje.

imagen.png

可以看到我们已经收到了微信的验证消息,下面我们只要对微信进行正确的回应就好了。

首先我们要知道微信发送的这串消息都涵盖了哪些参数,都是什么意思,我们需要怎么回应。

微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

signature有我们之前填写的token和微信get请求中的timestamp、nonce共同组合加密而成,我们收到之后需要对signature进行解码,然后对解码出来的token进行验证 ,验证完成之后返回echostr参数给微信即可完成接入。

signature的加密规则如下:

  1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密

字典序排序其实就是按字母顺序排序,我们使用js中数组的sort方法即可。

接下来我们要在服务端对请求进行处理,来完成接入流程。

因为我们之前在微信填写的服务端地址为域名/wx,所以我们先把/wx这个路由的请求放到白名单中,不进行权限校验。

上面我们说了,signature的加密规则用到了sha1加密,这里我们可以使用node.js自带的方法来实现一个sha1加密

// encryption.js
const crypto = require('crypto')

module.exports = {
  md5: (str) => {
    return crypto.createHash('md5').update(str).digest('hex')
  },
  sha1: (str) => {
    return crypto.createHash('sha1').update(str).digest('hex')
  }
}

复制代码

之后我们就可以对微信的验证消息进行验证并处理了

const encryption = require('../utils/encryption')
class WxController {
  async index(ctx) {
    let {signature = '', timestamp = '', nonce = '', echostr = ''} = ctx.query
    let token = process.env.wx_token

    // 验证token
    let str = [token, timestamp, nonce].sort().join('')
    let sha1 = encryption.sha1(str)
    if (sha1 !== signature) {
      ctx.body = 'token验证失败'
      return
    } else {
      ctx.body = echostr
    }
  }
}

module.exports = new WxController()
复制代码

改完之后我们部署到服务器,然后再去微信侧点击一下提交,可以看到,已经可以提交成功了。

imagen.png

之后我们点击启用按钮,会提示我们启用之后公众平台的自定义菜单和自动回复将会失效,所有的请求都会转发到我们自己的服务端

imagen.png

之后我们去公众号测试一下

4cd526afbbd81fa1cdeaac78d130ae2.jpg

会发现微信提示我们公众号服务故障,这是因为我们还没有对发送的消息做任何处理,然后我们去服务端看看

imagen.png

Se puede ver que hemos recibido con éxito la solicitud reenviada por WeChat, lo que indica que nos hemos conectado con éxito. Solo necesitamos procesar la información de acuerdo con las regulaciones de WeChat, y luego devolver la información necesaria, que se colocará más adelante. dice el artículo.

Por cierto, hay muy pocos permisos para cuentas públicas personales.

Supongo que te gusta

Origin juejin.im/post/7079929519976480799
Recomendado
Clasificación