Node.js を使用して WeChat パブリック アカウント バックエンド サービスを構築する方法の詳細な説明

PHPz
リリース: 2023-04-05 09:27:33
オリジナル
1158 人が閲覧しました

1. はじめに

現在、WeChat は多くの企業や個人にとってセルフメディアを運営するための重要なチャネルとなっており、WeChat パブリック アカウント用の効率的で安定したバックエンド サービスの構築が必要不可欠になっています。 Node.js は、軽量で効率的なバックエンド言語として、その強力な非同期 IO 機能と開発効率により広く注目を集めています。この記事では、Node.jsを使用してWeChat公式アカウントのバックエンドサービスを構築する方法を簡単かつ詳細に紹介します。

2. 準備

開始する前に、次のツールと環境を準備する必要があります:

  • Node.js: Node.js 公式 Web サイトにアクセスしてください。ダウンロードしてインストールするには;
  • WeChat パブリック アカウント: WeChat パブリック プラットフォームにアクセスして登録し、開発者権限を申請してください;
  • ファイル エディター: Visual Studio Code をお勧めします。

3. WeChat パブリック アカウント バックグラウンド サービスの構築

  1. プロジェクトの作成

まず、プロジェクトを保存するフォルダーを作成します。次に、コマンド ラインでフォルダーを入力し、次のコマンドを実行します。

npm init
ログイン後にコピー

実行後、プロンプトに従ってプロジェクト名、バージョン、説明、その他の情報を入力し、プロジェクトの初期化を完了します。

  1. 依存関係のインストール

次のコマンドを実行して、必要な依存関係をインストールします。

npm install express request xml2js
ログイン後にコピー

このうち、express は Node.js で開発された Web フレームワークです。 、request HTTPリクエストをカプセル化するライブラリで、xml2jsはXMLをJSONデータに変換するライブラリです。

  1. ルーティングの構成

プロジェクトのルート ディレクトリに、index.js という名前のファイルを作成し、次の内容をそのファイルに追加します。上記のコードはWeChatパブリックアカウントのアクセス認証を実装しています。具体的な実装方法については、公式Webサイトのドキュメントを参照してください。

WeChat メッセージの処理
  1. プロジェクトのルート ディレクトリに、WeChat メッセージを処理するための message.js という名前のファイルを作成します。次の内容をファイルに追加します。
const express = require('express');
const request = require('request');
const { parseString } = require('xml2js');

const app = express();

app.get('/api/wechat', (req, res) => {
  const { signature, timestamp, nonce, echostr } = req.query;

  //  排序和拼接字符串
  const str = [process.env.TOKEN, timestamp, nonce].sort().join('');
  const sha1 = require('crypto').createHash('sha1');
  sha1.update(str);
  const code = sha1.digest('hex');

  if (code === signature) {
    return res.send(echostr); // 校验成功,原样返回 echostr 参数内容
  }

  res.send(); // 校验失败,返回空响应
});
ログイン後にコピー

上記のコードは、WeChat 公式アカウントからのメッセージを解析し、処理後に対応する応答メッセージを返します。

サービスの開始
  1. index.js に次のコードを追加してサービスを開始します:
/**
 * 解析 XML 数据
 * @param {string} xmlStr XML 字符串
 */
function parseXML(xmlStr) {
  const options = {
    explicitArray: false, // 不将子元素变为数组
    ignoreAttrs: true, // 忽略属性
  };
  return new Promise((resolve, reject) => {
    parseString(xmlStr, options, (err, result) => {
      if (err) {
        return reject(err);
      }
      resolve(result.xml);
    });
  });
}

module.exports = function handleWechatMessage(req, res) {
  let body = '';

  req.on('data', (chunk) => {
    body += chunk;
  });

  req.on('end', async () => {
    const {
      ToUserName,
      FromUserName,
      CreateTime,
      MsgType,
      Event,
      Content,
      EventKey,
    } = await parseXML(body);

    let replyXML;
    switch (MsgType) {
      case 'text':
        // 处理文本消息
        replyXML = `<xml>
          <ToUserName><![CDATA[${FromUserName}]]></ToUserName>
          <FromUserName><![CDATA[${ToUserName}]]></FromUserName>
          <CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
          <MsgType><![CDATA[text]]></MsgType>
          <Content><![CDATA[${Content}]]></Content>
        </xml>`;
        break;
      case 'event':
        // 处理事件消息
        if (Event === 'subscribe') {
          // 处理关注事件
          replyXML = `<xml>
            <ToUserName><![CDATA[${FromUserName}]]></ToUserName>
            <FromUserName><![CDATA[${ToUserName}]]></FromUserName>
            <CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[欢迎关注]]></Content>
          </xml>`;
        } else if (Event === 'unsubscribe') {
          // 处理取消关注事件
          console.log('用户取消关注');
        } else if (Event === 'CLICK' && EventKey === 'test') {
          // 处理菜单点击事件
          replyXML = `<xml>
            <ToUserName><![CDATA[${FromUserName}]]></ToUserName>
            <FromUserName><![CDATA[${ToUserName}]]></FromUserName>
            <CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[点击了测试菜单]]></Content>
          </xml>`;
        }
        break;
      default:
        break;
    }

    if (replyXML) {
      res.setHeader('Content-Type', 'application/xml');
      return res.send(replyXML);
    }

    res.send();
  });
};
ログイン後にコピー

検証サービス
  1. サービス開始後、WeChat公式アカウントのバックグラウンドでサーバーアドレスを設定することで検証できます。検証が成功すると、このアドレスを WeChat 公式アカウントのバックエンド サービス アドレスとして使用できます。同時に、コードをデバッグして、メッセージが正常に配信および応答できることを確認できます。

4. 概要

この記事では、Node.js を使用して WeChat パブリック アカウント バックエンド サービスを構築する方法を紹介し、アクセス検証とメッセージ処理の 2 つの側面をカバーします。この記事を通じて、読者は Node.js を使用して WeChat バックエンド サービスを構築する基本原則と実装方法をすぐに理解し、習得できると思います。

以上がNode.js を使用して WeChat パブリック アカウント バックエンド サービスを構築する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート