Научит вас, как создать общедоступную учетную запись WeChat с помощью node.js (1)

Node.js внешний интерфейс WeChat JavaScript

краткое введение

В этой статье кратко рассказывается, как использоватьnode.jsСоздайте публичный аккаунт WeChat. Основное содержание включает в себя конфигурацию общедоступной платформы WeChat,signatureпроверка и сnode.jsДля обработки инициированного пользователем поведения.

Готов к работе

Его необходимо установить перед разработкойnode.js, потому что я основан наexpressФреймворк был разработан, поэтому я его установилexpress(Фреймворк выбирается в соответствии с вашими потребностями), вам нужна публичная учетная запись WeChat, будь то учетная запись подписки или учетная запись службы (если нет, вы можете использовать тестовую публичную учетную запись), и сервер, к которому можно получить доступ сеть общего пользования. Это базовая конфигурация, и она будет добавлена ​​позже по мере необходимости. Далее поговорим о том, как развиваться.

1. Конфигурация общедоступной платформы WeChat

Войдите на публичную платформу WeChat, если официальной учетной записи нет, зарегистрируйте тестовую официальную учетную запись (не нажимай сюда, сканируйте код, чтобы войти в систему). Вход на публичную платформу вы увидите следующий интерфейс:

базовая конфигурация

При входе на домашнюю страницу общедоступной платформы сначала будет информация о тестовом номере.appID,appsecret;а такжеappIDа такжеappsecretЕго нельзя изменить (зарегистрированный публичный аккаунт самостоятельно)appsecretЕго можно сбросить, операция очень простая, здесь не объясняется);

Конфигурация интерфейса

Модуль информации о конфигурации интерфейса в первый раз пуст, и его необходимо настроить самостоятельно, здесь вам нужно настроить два параметра, один — URL, а другой — адрес.Token;Если вы не знаете, как его настроить, вы можете узнать подробности в WeChat.wikiДокументация, так же расскажу о некоторых ямах, с которыми я столкнулся при его настройке!

Во-первых, когда вы нажмете «Изменить», он станет следующим интерфейсом:

будь осторожен:

  • Описание параметра URL:URL-адрес заполняется адресом интерфейса, развернутого в общедоступной сети (Это реальный интерфейс, который был развернут и может быть запрошен), интерфейс должен начинаться сhttp://илиhttps:// запуск, только поддержка80порт и443порт.
  • Параметры токена: tokenЗаполните логотип, определенный вами. Обратите внимание, что после его настройки логотип вышеurlустановить в интерфейсеtokenЭто должно соответствовать этому, иначе настройка не будет успешной.

Конкретное руководство по настройке нажмите здесь

Когда вы нажимаете отправить,getзапрос к тому, который вы только что заполнилиURLАдрес, и это займет 4 параметра, а именно:signature,timestamp,echostr,nonce, а затем проверьте, передается ли конфигурация на стороне сервера;
Если конфигурация прошла успешно, появится сообщение об успешном завершении, как показано ниже:

Если конфигурация не удалась, появится следующее сообщение об ошибке:

На этом настройка интерфейса завершена.

Имя домена безопасности интерфейса JS

Эта конфигурация в основном предназначена для настройкиjs-sdkЕсли интерфейс настроен, разработчик может вызывать WECHAT только при этом доменном имени.jsИнтерфейсы (такие как вызов QR-кодов, загрузка файлов предварительного просмотра и т. д.) в документации также написаны более подробно, поэтому я не буду здесь слишком много объяснять.

Официальная документация WeChat JS-SDK нажмите здесь

На данный момент конфигурация общедоступной платформы WeChat почти такая же, и тогда вы можете начать разработку сервера.

Во-вторых, конфигурация разработки узла сервера

Не забудьте заполнить конфигурацию общедоступной платформы WeChat.urlа такжеtokenСтоит ли оно того? Используется здесь, посмотрите на следующий код:

const bodyParser = require('body-parser'); //处理请求参数

server.get("/", function (req, res) {
    var token = "xxxx";
    var signature = req.query.signature;
    var timestamp = req.query.timestamp;
    var echostr = req.query.echostr;
    var nonce = req.query.nonce;

    var oriArray = new Array();
    oriArray[0] = nonce;
    oriArray[1] = timestamp;
    oriArray[2] = token;
    oriArray.sort();

    var original = oriArray.join('');
    var sha = sha1(original)

    if (signature === sha) {
        //验证成功
        res.send(echostr)
    } else {
        //验证失败
        res.send({ "message": "error" })
    }

});

Помните приведенное выше утверждение о том, что при нажатии кнопки «Отправить» будет отправлен запрос на получение? Сказал, что принесетsignature,timestamp,echostr,nonceчетыре параметра. Именно в этом интерфейсе можно судить об успешной настройке и посмотреть, что делает запрос на получение.

  1. определитьtokenЗначения, требуемые и настраиваемые публичной платформойtokenбыть последовательным.
  2. пройти черезreq.query.xxxПолучите 4 параметра, переданных запросом.
  3. Пучокnonce,timestamp,tokenдобавить в массив и использоватьsort()sort, затем поместите этот массив сjoin("")объединены в строку.
  4. использоватьsha1Шифрование генерирует ключ, и выносится окончательное решениеsha1Сгенерированоsignatureи параметры приведеныsignatureЕсли они непротиворечивы, конфигурация завершается успешно, если они непротиворечивы, и завершается ошибкой, если они противоречат друг другу.

За подробностями обращайтесь к официальному документу (пример документа — php), адрес документакликните сюда;

На этом настройка общедоступной учетной записи и настройка сервера узлов для разработки WeChat завершена, и теперь вы можете начать счастливую разработку!

3. Обработка информации о пользователях

Сначала задайте вопрос, когда пользователи подписываются на официальный аккаунт и отправляют сообщения, где разработчики могут получить эти сообщения и ответить соответствующим образом?
Ответ настроен на общедоступной платформе WeChatURLизpostЗапрос, если запрос на получение URL-адреса предназначен для настройки, то почтовый запрос предназначен для обработки информации о пользователе.

Посмотрите на следующий фрагмент кода

var parseString = require('xml2js').parseString;

server.post("/", function (req, res) {
    try {
        var buffer = [];
        //监听 data 事件 用于接收数据
        req.on('data', function (data) {
            buffer.push(data);
        });
        //监听 end 事件 用于处理接收完成的数据
        req.on('end', function () {
            //输出接收完成的数据
            parseString(Buffer.concat(buffer).toString('utf-8'), { explicitArray: false }, function (err, result) {
                if (err) {
                    //打印错误信息
                    console.log(err);
                } else {
                    //打印解析结果
                    result = result.xml;
                    var toUser = result.ToUserName; //接收方微信
                    var fromUser = result.FromUserName;//发送仿微信
                    //判断是否是事件类型
                    if (result.Event) {
                        //处理事件类型
                        switch (result.Event) {
                            case "subscribe":
                                //关注公众号
                                break;
                            default:
                                
                        }
                    } else {
                        //处理消息类型
                        switch (result.MsgType) {
                            case "text":
                                //处理文本消息
                                break;
                            case "image":
                                //处理图片消息
                                break;
                            case "voice":
                                //处理语音消息
                                break;
                            case "video":
                                //处理视频消息
                                break;
                            case "shortvideo":
                                //处理小视频消息
                                break;
                            case "location":
                                //处理发送地理位置
                                break;
                            case "link":
                                //处理点击链接消息
                                break;
                            default:
                                
                        }
                    }
                }
            })
        });
    } catch (err) {
        res.send(err);
    }
});

Из приведенного выше кода видно, что вся обработка сообщений происходит вpostОбщий процесс заключается в том, что сервер получает фиксированный форматxmlстрока, конкретный формат выглядит следующим образом:

<xml>
    <ToUserName><![CDATA[${toUser}]]></ToUserName>  //接收方
    <FromUserName><![CDATA[${fromUser}]]></FromUserName>  //发送方
    <CreateTime>${new Date().getTime()}</CreateTime>  //发送时间
    <Event>< ![CDATA[VIEW] ]></Event>    //事件类型
    <MsgType><![CDATA[text]]></MsgType>  //消息类型
    <Content><![CDATA[${content}]]></Content>  //内容
</xml>;

когда получилxmlПосле сообщения используйтеxml2jsРазобратьxml,согласно сEventа такжеMsgTypeСделайте оценку типа события и выполните соответствующую обработку, и, наконец,res.send(xml)При отправке данных также необходимо иметьxmlОтформатируйте данные, обратите внимание на то, чтоToUserNameа такжеFromUserNameНе заблуждайтесь! Конкретный документ имеет подробное объяснение,Документация нажмите здесь;

Хорошо, это все, что касается сегодняшнего контента, есть еще немного контента о создании access_token и о том, как вызывать js-sdk, пожалуйста, обновите его через два дня!

Брат, вот шаблон подмостей для управления фоном реакции, если тебе это нужно, ты можешь подобрать его сам.ткни меня, ткни меня, ткни меня, github

Сфокусируйся на

Привет всем, я Арбуз Таро, небольшой фронтенд, расположенный в Ханчжоу, я сегодня остаюсь в Наггетс и пишу статью в первый раз. Перемещение кирпичей будет более мотивированным!