Практический обмен: Мини-программа Облачная разработка Веселая подписка Новости

Апплет WeChat
Практический обмен: Мини-программа Облачная разработка Веселая подписка Новости

Чтобы улучшить опыт использования возможности сообщения шаблона небольшой программы, официальные лица WeChat скорректировали условия доставки сообщений шаблона. Исходный интерфейс сообщений шаблона мини-программы будет отключен 10 января 2020 г. В это время будет невозможно использовать старый интерфейс шаблона сообщений мини-программы для отправки шаблонных сообщений, но будут использоваться новые сообщения с одноразовой подпиской и долгосрочные вместо этого будут использоваться сообщения подписки.

Сообщения о подписке расширяют возможности доступа к пользователям для разработчиков небольших программ.В конкретном процессе реализации, как разработчики могут заменить шаблонные сообщения новыми сообщениями о подписке, нужно ли им приобретать сервер для аутентификации сервера и как отправлять длинные сообщение о подписке на срок или разовое сообщение пользователю по истечении определенного периода времени после подписки пользователя?

Облачная разработка мини-программы недавно поддержала отправку сообщений о подписке через облачные вызовы без access_token, а также добавила поддержку реализации облачных вызовов в синхронизированных триггерах.Эти возможности могут помочь разработчикам легко играть с сообщениями о подписке в мини-программе.

Сегодня мы будем использовать облачную разработку мини-программы, чтобы провести практическую битву за реализацию напоминаний о подписке в мини-программе, чтобы помочь вам понять, как быстро получить доступ к сообщениям о подписке на мини-программу на основе разработки мини-программы в облаке.

开课提醒小程序界面

Общая временная диаграмма

开课提醒订阅消息时序图

Подготовка окружающей среды

Получить идентификатор шаблона сообщения о подписке

В фоновом режиме управления апплетом WeChat добавлен новый шаблон для сообщений о подписке Здесь мы добавили новый шаблон для напоминаний о начале занятий.

新增模板

Направляйте пользователей к подписке

Апплет WeChat обеспечиваетwx.requestSubscribeMessageИнтерфейс для запуска приложения для интерфейса разрешений на подписку.

微信申请订阅权限界面

Привяжите событие касания к кнопке «Подписаться на напоминание о классе», обработчику события, который мы используем здесь.onSubscribe

index.wxml

<button
  class="btn"
  data-item="{{ item }}"
  bindtap="onSubscribe"
  hover-class="btn-hover"
>
  订阅开课提醒
</button>

существуетonSubscribeВнутри функции мы будем вызывать WeChat APIwx.requestSubscribeMessageПодать заявку на получение разрешения на отправку подписных сообщений.Когда пользователь согласится подписаться во всплывающем окне, мы получимsuccessОбратный вызов, вызов облачной функции с информацией о подписанном курсеsubscribeХранится в базе данных облачной разработки, облачная функцияsubscribeРеализация будет рассмотрена ниже.

index.js

onSubscribe: function(e) {
    // 获取课程信息
    const item = e.currentTarget.dataset.item;

    // 调用微信 API 申请发送订阅消息
    wx.requestSubscribeMessage({
      // 传入订阅消息的模板id,模板 id 可在小程序管理后台申请
      tmplIds: [lessonTmplId],
      success(res) {
        // 申请订阅成功
        if (res.errMsg === 'requestSubscribeMessage:ok') {
          // 这里将订阅的课程信息调用云函数存入云开发数据
          wx.cloud
            .callFunction({
              name: 'subscribe',
              data: {
                data: item,
                templateId: lessonTmplId,
              },
            })
            .then(() => {
              wx.showToast({
                title: '订阅成功',
                icon: 'success',
                duration: 2000,
              });
            })
            .catch(() => {
              wx.showToast({
                title: '订阅失败',
                icon: 'success',
                duration: 2000,
              });
            });
        }
      },
    });
  },

Хранить сообщения о подписке в базе данных облачной разработки

Далее мы создаем облачную функциюsubscribe, функция этой облачной функции состоит в том, чтобы хранить информацию о подписке пользователя в наборе облачных баз данных разработки.messages, вызываемый, когда пользователь должен быть уведомлен в будущем.

Создайте коллекцию баз данных на панели облачной разработки инструментов разработчика WeChat.messages

微信开发者工具新增数据库集合

СоздаватьsubscribeОблачная функция, в облачной функции мы храним информацию о подписке на курс, отправленную из апплета, в коллекции базы данных облачной разработки.После завершения разработки щелкните правой кнопкой мыши в инструменте разработчика WeChat, чтобы загрузить и развернуть облачную функцию.

cloudfunctions/subscribe/index.js

const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();

exports.main = async (event, context) => {
  try {
    const {OPENID} = cloud.getWXContext();
    // 在云开发数据库中存储用户订阅的课程
    const result = await db.collection('messages').add({
      data: {
        touser: OPENID, // 订阅者的openid
        page: 'index', // 订阅消息卡片点击后会打开小程序的哪个页面
        data: event.data, // 订阅消息的数据
        templateId: event.templateId, // 订阅消息模板ID
        done: false, // 消息发送状态设置为 false
      },
    });
    return result;
  } catch (err) {
    console.log(err);
    return err;
  }
};

Используйте синхронизированные триггеры для периодической отправки сообщений о подписке

Далее нам нужно реализовать облачную функцию, которая выполняется периодически.send, чтобы проверить, есть ли в базе сообщения о подписке, которые необходимо отправить пользователю. Если есть сообщение о подписке, которое необходимо отправить, оно будет вызвано через облакоcloud.openapi.subscribeMessage.sendОтправьте пользователю сообщение о подписке.

Создатьsendоблачная функция, сначала настройте облачную функцию, вconfig.jsonизpermissionsновое вsubscribeMessage.send, а затем добавить новыйsendMessagerTimerТриггер синхронизации, синтаксис триггера синхронизации иlinuxизcrontabАналогично, например, настраиваем"0 * * * * * *"Представляет облачную функцию, выполняемую каждую минуту.

cloudfunctions/send/config.json

{
  "permissions": {
    "openapi": ["subscribeMessage.send"]
  },
  "triggers": [
    {
      "name": "sendMessagerTimer",
      "type": "timer",
      "config": "0 * * * * * *"
    }
  ]
}

Следующим шагом является реализация облачной функции, которая отправляет сообщения подписки.Эта облачная функция создаст коллекцию баз данных из облака.messagesЗапросите список сообщений, ожидающих отправки, проверьте, есть ли в базе данных подписные сообщения, которые необходимо отправить пользователям, и условия отправки могут быть реализованы в соответствии с вашим бизнесом.Упрощено в примере кода, только условие фильтра проверяет, что статус не отправлен.

После запроса списка сообщений для отправки мы зациклим список сообщений, отправим каждое сообщение о подписке по очереди и изменим статус сообщения в базе данных на отправленное после успешной отправки.

cloudfunctions/send/index.js

const cloud = require('wx-server-sdk');

exports.main = async (event, context) => {
  cloud.init();
  const db = cloud.database();

  try {
    // 从云开发数据库中查询等待发送的消息列表
    const messages = await db
      .collection('messages')
      // 查询条件这里做了简化,只查找了状态为未发送的消息
      // 在真正的生产环境,可以根据开课日期等条件筛选应该发送哪些消息
      .where({
        done: false,
      })
      .get();

    // 循环消息列表
    const sendPromises = messages.data.map(async message => {
      try {
        // 发送订阅消息
        await cloud.openapi.subscribeMessage.send({
          touser: message.touser,
          page: message.page,
          data: message.data,
          templateId: message.templateId,
        });
        // 发送成功后将消息的状态改为已发送
        return db
          .collection('messages')
          .doc(message._id)
          .update({
            data: {
              done: true,
            },
          });
      } catch (e) {
        return e;
      }
    });

    return Promise.all(sendPromises);
  } catch (err) {
    console.log(err);
    return err;
  }
};

окончательный эффект

开课提醒订阅消息截图

исходный код

GitHub.com/Brother Bing/Tang Can by-…


обо мне

binggg(Booker Zhao) @腾讯

- 先后就职于迅雷、腾讯等,个人开源项目有 mrn.js 等
- 创办了迅雷内部组件仓库 XNPM ,参与几个迅雷前端开源项目的开发
- 热衷于优化和提效,是一个奉行“懒惰使人进步”的懒人工程师

социальные профили

Публичный аккаунт WeChatbinggg_net, добро пожаловать, чтобы следовать