1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/szxio-weChatServer

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для backend-сервера официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для backend-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для后台服务器微信官方账号 позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Исправленный текст: Использование Node.js в качестве сервера для бэкенд-сервера WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для WeChat официального аккаунта позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.

Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена, а также ответ на сообщения WeChat.Использование Node.js в качестве сервера для официального аккаунта WeChat позволяет реализовать следующие функции: проверку токена, получение и регулярное обновление токена,## Запрос тестового аккаунта

Сначала войдите в WeChat Public Platform, выберите свой аккаунт и войдите в систему. После успешного входа нажмите на инструменты разработчика и выберите тестовый аккаунт публичной платформы.

После входа вы можете запросить тестовый аккаунт, который позволяет использовать все продвинутые интерфейсы. Здесь вам нужно настроить адрес интерфейса для онлайн использования. В процессе проверки токена и отправки/получения сообщений WeChat будет обращаться к указанному адресу. Здесь рекомендуется использовать удобный инструмент проброса внутренней сети, который позволяет отображать локальный адрес проекта на внешнем IP-адресе, что облегчает отладку.Маленький шарик внутреннего проброса

Здесь я сгенерировал онлайн-адрес http://songzx.ngrok2.xiaomiqiu.cn/, далее мы будем использовать этот адрес как адрес конфигурации интерфейса для публичного аккаунта

image-20210518191538886

Реализация проверки токена

Сначала создаем пустой проект на Node.js

npm init -y

Затем устанавливаем некоторые часто используемые зависимости

npm install express

Затем создаем файл index.js в корневом каталоге проекта, начальный код следующий```js const express = require("express") const app = express()

app.get("/", (req, res) => { res.send('Привет, мир') })

app.listen(8088, () => { console.log("Запущен на 127.0.0.1:8088"); })


Затем запускаем проект и обращаемся к нему через браузер по адресу `127.0.0.1:8088`, можно увидеть следующий результат, что указывает на успешное запуск сервиса

![](https://gitee.com/szxio/weChatServer/raw/master/public/image/3.png)

Теперь мы реализуем логику проверки токена

Сначала установим следующие зависимости для шифрования

```shell
npm install crypto

Затем создаем два файла util и router, которые будут содержать наши общие методы и методы для обычных запросов

Затем создаем файл util -> validateToken.js, код следующий, этот метод специально предназначен для проверки токена, переданного WeChat

var crypto = require("crypto");

// Метод шифрования
function sha1(str) {
  var md5sum = crypto.createHash("sha1");
  md5sum.update(str);
  str = md5sum.digest("hex");
  return str;
}

// Проверка токена
function validateToken(req) {
  return new Promise((resolve, reject) => {
    let query = req.query;
    let signature = query.signature;
    let echostr = query["echostr"];
    let timestamp = query["timestamp"];
    let nonce = query["nonce"];
    let oriArray = new Array();
    oriArray[0] = nonce;
    oriArray[1] = timestamp;
    oriArray[2] = "admin123"; // Это токен, указанный в конфигурации интерфейса публичного аккаунта
    oriArray.sort();
    let original = oriArray.join("");
    let scyptoString = sha1(original);
    if (signature == scyptoString) {
      // Проверка пройдена, возвращаем echostr
      resolve(echostr);
    } else {
      reject(false);
    }
  });
}
// Экспортируем метод проверки токена
module.exports = validateToken;
```Затем создаем файл `router-weChat.js`, этот файл предназначен для обработки запросов, отправленных WeChat. В этом файле пишем следующий код:

```js
const express = require("express");
const router = express.Router(); // Конфигурация модуля маршрутизации
const validateToken = require("../util/validateToken");

// Проверка токена при GET-запросе
router.get("/", (req, res) => {
  validateToken(req).then((t) => {
    res.send(t);
  });
});
// Экспорт маршрута
module.exports = router;

Последнее изменение файла index.js заключается в том, чтобы импортировать новый файл router-weChat.js.

const express = require("express");
const app = express();
const path = require("path");
const weChat = require(path.resolve(__dirname, "./router/weChat"));

app.use(weChat);

app.listen(8088, () => {
  console.log("running 127.0.0.1:8088");
});

Теперь мы можем протестировать это на странице настройки WeChat.

image-20210519162630934

Если на странице появится сообщение "Настройка успешна", это означает, что наша проверка токена завершена.

Получение токена и его периодическое обновление

Для получения токена в WeChat необходимо отправить GET-запрос. Токен имеет срок действия, поэтому нам нужно сохранять его и периодически обновлять, чтобы обеспечить его актуальность.

Описание получения токена от WeChat

Инструкции по вызову интерфейса:

  • Метод запроса: GET
  • Адрес запроса: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETДля выполнения запросов нам потребуется библиотека axios. Установим её:
npm install axios

Затем создадим файл public/token.json в корневом каталоге для хранения полученного токена. Содержимое файла json должно быть пустым.

Создадим файл util/tokenConfig.js с кодом:

const fs = require("fs");
const path = require("path");
const axios = require("axios");
const fileUrl = path.resolve(__dirname, "../public/token.json");
const APPID = "wx2188729b190d357d"; // APPID тестового аккаунта
const APPSECRET = "d976b0e6262b829ba003e9a24032447c"; // APPSECRET тестового аккаунта
let INTERVALTIME = (7200 - 60) * 1000; // Установка интервала для периодического получения токена
// Сохранение токена
function setToken() {
  return new Promise((resolve, reject) => {
    axios
      .get(
        `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`
      )
      .then((res) => {
        // Обновление времени истечения токена, каждый раз обновляем токен через это время
        INTERVALTIME = (res.data.expires_in - 60) * 1000;
        // Сохранение токена в JSON-файле
        fs.writeFile(
          fileUrl,
          JSON.stringify({
            token: res.data.access_token,
          }),
          () => {
            // Уведомление о успешном получении токена
            resolve();
          }
        );
      });
  });
}

Периодическое получение токена

function timingSetToken() {
  // Периодическое обновление токена
  setInterval(() => {
    setToken();
  }, INTERVALTIME);
}

// Получение токена
function getToken() {
  return new Promise((resolve, reject) => {
    // Чтение сохраненного токена из JSON
    fs.readFile(fileUrl, (err, data) => {
      // Возврат полученного токена
      resolve(JSON.parse(data).token);
    });
  });
}
```// Экспорт упакованных методов
module.exports = {
  setToken, // Обновление токена
  getToken, // Возврат полученного токена
  timingSetToken, // Периодическое обновление токена
};

Затем в `router -> weChat.js` импортируем `tokenConfig.js`

```js
const express = require("express");
const router = express.Router(); // Настройка маршрута
const validateToken = require("../util/validateToken");
const { setToken, timingSetToken } = require("../util/tokenConfig");
// При запуске проекта автоматически вызывается метод получения токена
setToken().then(() => {
  // После успешного получения токена начинается периодическое обновление токена
  timingSetToken();
});

// GET запрос для проверки валидности токена
router.get("/", (req, res) => {
  validateToken(req).then((t) => {
    res.send(t);
  });
});
// Экспорт маршрута
module.exports = router;

Теперь при запуске проекта автоматически вызывается метод получения токена, затем из этого токена вычитается 60 секунд для плавного перехода к следующему токену, и каждые INTERTIME секунд токен обновляется.

Токен записывается в JSON файл, и его можно получить из любого файла следующим образом:

const { getToken } = require("./util/tokenConfig");
// Вызов упакованного метода получения токена
getToken().then((token) => {
  console.log(token); // 45_7k55HHRaYxM4MkD4aREraHZpgdjmT......
});

Получение и ответ на сообщения от WeChat

Официальное описание получения сообщенийКратко: при отправке сообщения в WeChat-аккаунт, WeChat отправляет POST-запрос на указанный адрес с параметрами в виде XML-текста. Необходимо распарсить этот XML и ответить XML-строкой в определенном формате, указанным WeChat.Примечание: ответ должен быть в формате XML-строки. Сначала установите зависимости для парсинга параметра xml в запросе post

npm install express-xml-bodyparser

Затем в файле index.js импортируйте и настройте middleware

const express = require("express");
const app = express();
const path = require("path");
const weChat = require(path.resolve(__dirname, "./router/weChat"));
const xmlparser = require('express-xml-bodyparser'); // парсинг xml
app.use(express.json());
app.use(express.urlencoded());
app.use(xmlparser());

app.use(weChat);

app.listen(8088, () => {
  console.log("running 127.0.0.1:8088");
});

Затем в файле weChat.js добавьте обработку запроса post, чтобы вывести, что нам отправляет WeChat

// обработка запроса post для сообщений, отправленных WeChat
router.post("/", (req, res) => {
  console.log(req.body);
  res.send("");
});

Перезапустите проект и отправьте любое сообщение в ваш WeChat-канал

После парсинга параметры будут следующими

{
  xml: {
    tousername: [ 'gh_a0f004c20d2b' ],
    fromusername: [ 'olttN6WJOYe-lTysV8_tsnZ7-HMQ' ],
    createtime: [ '1621416487' ],
    msgtype: [ 'text' ],
    content: [ 'hello' ],
    msgid: [ '23213103466653274' ]
  }
}

Получив параметры, вы можете определить тип сообщения по параметру msgtype, а также content содержит текст сообщения. Получив параметры, следующим шагом будет ответ на сообщение

Официальная документация по ответу на сообщение```js // Ответ текстовым сообщением exports.textMessage = function (message) { var createTime = new Date().getTime(); return <xml> <ToUserName><![CDATA[${message.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${message.ToUserName}]]></FromUserName> <CreateTime>${createTime}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[${message.reply}]]></Content> </xml>; };

// Ответ изображением exports.imageMessage = function (message) { var createTime = new Date().getTime(); return <xml> <ToUserName><![CDATA[${message.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${message.ToUserName}]]></FromUserName> <CreateTime>${createTime}</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[${message.mediaId}]]></MediaId> </Image> </xml>; };

// Ответ голосовым сообщением exports.voiceMessage = function (message) { var createTime = new Date().getTime(); return <xml> <ToUserName><![CDATA[${message.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${message.ToUserName}]]></FromUserName> <CreateTime>${createTime}</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <Voice> <MediaId><![CDATA[${message.mediaId}]]></MediaId> </Voice> </xml>; };

// Ответ видео exports.videoMessage = function (message) { var createTime = new Date().getTime(); return <xml> <ToUserName><![CDATA[${message.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${message.ToUserName}]]></FromUserName> <CreateTime>${createTime}</CreateTime> <MsgType><![CDATA[video]]></MsgType> <Video> <MediaId><![CDATA[${message.mediaId}]]></MediaId> <Title><![CDATA[${message.title}]]></Title> <Description><![CDATA[${message.description}]]></Description> </Video> </xml>; };

// Ответ новостным сообщением exports.articleMessage = function (message) { var createTime = new Date().getTime(); return <xml> <ToUserName><![CDATA[${message.FromUserName}]]></ToUserName> <FromUserName><![CDATA[${message.ToUserName}]]></FromUserName> <CreateTime>${createTime}</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>${message.articles.length}</ArticleCount> <Articles> ${message.articles.map(function (article) { return <Title></Title> ; }).join('')} </Articles> </xml>; };

    <CreateTime>${createTime}</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <ArticleCount>${message.articles.length}</ArticleCount>
    <Articles>
        ${message.articles
          .map(
            (article) =>
              `<item>
                <Title><![CDATA[${article.title}]]></Title>
                <Description><![CDATA[${article.description}]]></Description>
                <PicUrl><![CDATA[${article.picurl}]]></PicUrl>
                <Url><![CDATA[${article.url}]]></Url>
              </item>`
          )
          .join('')}
    </Articles>
  </xml>;
```

```markdown
<title}]]></Title>
<Description><![CDATA[${article.description}]]></Description>
<PicUrl><![CDATA[${article.img}]]></PicUrl>
<Url><![CDATA[${article.url}]]></Url></item>`
).join("")
</Articles>
</xml>;
```Примечание: Исходный текст был в формате JavaScript, но в соответствии с правилами перевода, код и структура остались без изменений. Текстовые описания и комментарии также были переведены на русский язык.

В `weChat.js` включите вышеуказанный шаблон, я поместил код шаблона в `util -> template.js`, а затем изменил только что созданный метод post.

```js
// Включение шаблона сообщений
const template = require("../util/template");

// Обработка POST-запроса для сообщений, отправленных WeChat
router.post("/", (req, res) => {
  let xml = req.body.xml;
  let msgtype = xml.msgtype[0];
  switch (msgtype) {
    case "text":
      // Упаковка параметров ответного сообщения
      let message = {
        FromUserName: xml.fromusername[0],
        ToUserName: xml.tousername[0],
        reply: "Привет, я отвечаю на ваше сообщение через код",
      };
      res.send(template.textMessage(message));
      break;

    default:
      res.send(""); // Для не текстовых сообщений отправляем пустой ответ
      break;
  }
});
```

Теперь попробуем отправить сообщение.

![](https://gitee.com/szxio/weChatServer/raw/master/public/image/6.png)

Мы видим, что публичный аккаунт уже может отвечать на наши сообщения.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Использование Node.js в качестве сервера для后台服务器微信官方账号允许实现以下功能:验证令牌,获取和定期更新令牌,以及回复微信消息。 Использование Node.js в качестве сервера для后台服务器微信官方账号 позволяет реализовать следующие функции: проверку токена, получение и периодическое обновление токена, а также ответ на сообщения WeChat. Использование Node.js в качестве сервера для后台服务器微信官方账号允许实现以... Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/szxio-weChatServer.git
git@api.gitlife.ru:oschina-mirror/szxio-weChatServer.git
oschina-mirror
szxio-weChatServer
szxio-weChatServer
master