程序员思语的小程序开发经验分享(三)订阅消息与小程序分享禁区 …

程序员思语的小程序开发经验分享(三)订阅消息与小程序分享禁区 …

2021-08-19 403
下载不了?请联系网站客服提交链接错误!
增值服务:
程序员思语的小程序开发经验分享(三)订阅消息与小程序分享禁区 …
最近更新 2021年08月19日
资源编号 105659

程序员思语的小程序开发经验分享(三)订阅消息与小程序分享禁区 …

2021-08-19 小程序教程 0 403 百度已收录
限时活动VIP只需20元
增值服务:
¥ 0 钻石 开通VIP尊享优惠特权
立即下载 升级会员
详情介绍

前言

提高小程序的留存率,一般有2种方式:小程序分享、订阅消息。以及在实际产品运营中不应该触及的分享禁区。

一、订阅消息

订阅消息一般流程:

  • 获得用户授权,由用户点击页面触发tap事件弹出订阅消息卡片。

  • 用户授权之后,记录授权信息。

  • 发放订阅消息,触发点可以是用户的某个行为比如预约拼团活动,也可以是小程序主动触发,比如定时发送。

这三个步骤是小程序订阅消息的基本流程,在这个流程中,有一个没有覆盖的必要步骤:先配置订阅消息的模板。

配置消息模板

登录微信公众平台之后,消息模板的配置入口在小程序管理后台中的“功能”-“订阅消息”里,你会看到下面这张图展示的内容:

点击“添加”就可以配置消息模板了,微信官方提供了一些常用的模板类型,上图中有一个“一次性订阅”的提醒,说明这些模板库提供的都是一次性订阅消息。而小程序的订阅消息分为:一次性订阅消息和长期订阅消息。一次性你可以简单理解成得到用户的授权之后只能发送一条消息,如果再有发送需求还要再次申请用户的授权。
长期订阅消息可以得到用户授权后发送多条消息。不过目前长期订阅消息只向政务民生、医疗、交通、金融、教育等线下公共服务开放。
按照上述流程配置完消息模板后,你会得到一个模板 ID,这是和用户订阅的契约,一个模板对应一种订阅消息,用户的一次授权,不会触发对整个小程序所有订阅消息的同意。

获取用户授权

微信小程序获取用户授权订阅消息的API:wx.requestSubscribeMessage 。(模板消息功能已下线,现在都是订阅消息,地址是 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html )你要用这个 API 为每一个模板 ID 授权,调用方式如下:

wx.requestSubscribeMessage({
  tmplIds: [\'tmplId_1\',\'tmplId_2\',\'tmplId_3\'],
  success (res) {
    console.log(res)
    / **
    {
      errMsg: \'requestSubscribeMessage:ok\'
      tmplId_1: \'accept\',
      tmplId_2\'reject\',
      tmplId_3\'ban\' 
    }
    */
  }
})
// 在写法上,一般我会定义变量subscribePromise,防止重复触发订阅,影响用户体验
subscribeMsg(tmpIds: AnyArray) {
const that = this
if (that.data.subscribePromise === null) {
    that.data.subscribePromise = new Promise((resolve) => {
        wx.requestSubscribeMessage({tmplIds: tmpIds, 
            success(res) {
                if (res[Object.keys(res)[0]] == \'accept\') {
                    resolve(true)
                } else {
                    resolve(false)
                }
                that.data.subscribePromise = null
            },
            fail(err: any) {
                console.log(err)
                resolve(true)
                that.data.subscribePromise = null
            }
        })
    })}
    return that.data.subscribePromise
},
其中参数 tmplIds 是一个字符串数组,里面是消息模板 ID ,如果你需要一次性获取多个模板的用户授权就在 tmplIds 数组里写入多个元素(每次触发最多3个)。调用wx.requestSubscribeMessage 之后,用户会在小程序端收到一个弹窗:

可以对弹出的订阅卡片列表中的每个订阅分别授权,点击允许后会触发 wx.requestSubscribeMessage 的 success 回调函数,在API返回值里,accept 代表得到授权、reject 代表未获得授权、ban 代表被后台封禁。下图是平常在触发订阅小时fail里面的一些情况。

根据以往经验,如果拒绝了,我们肯定是使用直接使用 openSetting, 手动引导用户点击按钮,去设置页开启。需要注意的是,getSetting里给requestSubscribeMessage的相关状态,openSetting里又压根没有,然后又把它的引导开启逻辑UI也放在设置页里面。

在微信提供的 wx.getSetting 里有这么一个属性:subscriptionsSetting,官方示例

//官方示例
wx.getSetting({
  withSubscriptions: true,
  success (res) {
    console.log(res.authSetting)
    // res.authSetting = {
    //   \"scope.userInfo\": true,
    //   \"scope.userLocation\": true
    // }
    console.log(res.subscriptionsSetting)
    // res.subscriptionsSetting = {
    //   mainSwitch: true, // 订阅消息总开关
    //   itemSettings: {   // 每一项开关
    //     SYS_MSG_TYPE_INTERACTIVE: \'accept\', // 小游戏系统订阅消息
    //     SYS_MSG_TYPE_RANK: \'accept\'
    //     zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: \'reject\', // 普通一次性订阅消息
    //     ke_OZC_66gZxALLcsuI7ilCJSP2OJ2vWo2ooUPpkWrw: \'ban\',
    //   }
    // }
  }
})
在 wx.getSetting 的回调里,有一项 mainSwitch,还有一项withSubscriptions: true,最后回调里还能一项 zun-LzcQyW-edafCVvzPkK4de2Rllr1fFpw2A_x0oXE: \'reject\',到这里,但它也只是在getSetting方法里,跟 openSetting没有任何关系,不过开发者可以在它的回调里,再做一次 getSetting的调用,取getSetting回调里的状态来判断,刚才用户在设置页的行为操作,下面是示例:
//提交订阅消息示例

const pushReservationTmplIds = \'PVC_DBcvvdtffd1fO0vdS8YpSe0c7Br3QW54\';

export default class Sign extends wepy.page {
  config = {
    navigationBarBackgroundColor\'#fff\',
    navigationBarTitleText\'赢积分\',
  };
  submitClock() {
    fetchJson({
      type\'POST\',
      url\'/api/steps/clock\',
      data: {
      },
      successres => {
        wx.showToast({
          title\'预定成功\',
          icon\'success\',
          duration2000
        });
      }
    });
  }
  setClock(e) {
    let that = this;
    if (wx.requestSubscribeMessage) {
      wx.requestSubscribeMessage({
        tmplIds: [pushReservationTmplIds],
        success(res) {
          if (res[pushReservationTmplIds] === \'accept\') {
            that.submitClock();
          } else if (res[pushReservationTmplIds] === \'reject\') {
            // 用户历史操作有设置了拒绝 or 关闭了订阅消息的主(总)开关,导致无法推送
            // console.log(res, \'0 拒绝 or 关闭了订阅消息的主(总)开关---\');
            that.guideOpenSubscribeMessage();
          } else {
            wx.showToast({
              title\'授权订阅消息有误\',
              icon\'none\'
            });
          }
        },
        fail(res) {
          // 20004:用户关闭了主开关,无法进行订阅,引导开启
          if (res.errCode == 20004) {
            // console.log(res, \'fail:用户关闭了主开关,无法进行订阅,引导开启---\');
            that.guideOpenSubscribeMessage();
          }
        }
      });
    } else {
      wx.showToast({
        title\'请更新您微信版本,来获取订阅消息功能\',
        icon\'none\'
      });
    }
  }
  guidSubscribeMessageAuthAfter() {
    //引导用户 开启订阅消息 之后,「openSetting」 接口暂时不会返回,用户手动设置后的状态,所以采用「getSetting」接口重新进行查询
    wx.getSetting({
      withSubscriptionstrue,
      successres => {
        let {
          authSetting = {},
          subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {}
        } = res;

        if (
          (authSetting[\'scope.subscribeMessage\'] || mainSwitch) &&
          itemSettings[pushReservationTmplIds] === \'accept\'
        ) {
          this.submitClock();
          // console.log(\'用户手动开启同意了,订阅消息\');
        } else {
          this.$invoke(\'Toast\'\'__warning__\', [
            `您没有同意授权订阅消息,预约领取失败`
          ]);
        }
      }
    });
  }
  guideOpenSubscribeMessage() {
    //引导用户,手动引导用户去设置页开启,
    this.$invoke(\'Modals\'\'__modalConfirm__\', [
      \'检测到您没有开启订阅消息的权限,是否去设置?\',
      \'openSetting\',
      //用户点击了确定按钮,进入设置页的回调
      res => {
        console.log(\'openSetting的回调数据:\', res);
        this.guidSubscribeMessageAuthAfter();
      },
      //用户点击了取消按钮
      () => {
        // console.log(\"取消了\")
        this.$invoke(\'Toast\'\'__warning__\', [
          `您已拒绝订阅消息授权,无法预约领取`
        ]);
      }
    ]);
  }
}
以上,wx.requestSubscribeMessage 的问题,也就得到了解决。

发送订阅消息的传统调用方式

服务端需要调用微信提供的 subscribeMessage.send 接口向用户发送订阅消息,其中 template_id 是上一步得到用户授权的几个订阅模板 ID 中的一个,这里需要注意,每次调用 subscribeMessage.send 接口只能发送一条消息给用户,而不能同时发送多条,这是微信的限制。touser 参数的值是接收消息的用户 openId,access_token 是临时凭证

发送订阅消息的一般流程:

  • 首先,服务器需要设定一个定时任务,比如每天 10 推送订阅消息,对点击预约拼团活动or签到活动的用户发送订阅消息。

  • 推送后,会先检查本地缓存中的 access_token 是否有效,如果不存在就需要重新请求微信的服务获取一个新的; 如果存在且有效,直接 subscribeMessage.send 接口向微信服务器发送一个请求。

  • 微信服务器收到请求之后,发送一条订阅消息给对于的 openId 对应的用户。

以上就是发送订阅消息的传统调用方式。

发送消息的云调用方式

微信小程序的订阅消息功能提供了云调用的支持,可以不用关注鉴权,也就是不需要关注 access_token,直接在云函数里调用微信 SDK 提供的openapi.subscribeMessage.sendAPI 就行,参数跟 subscribeMessage.send 接口一样,只是不再需要 access_token 了。
const cloud = require(\'wx-server-sdk\')
cloud.init()
exports.main = async (event, context) => {
  try {
    const result = await cloud.openapi.subscribeMessage.send({
        touser\'OPENID\',
        templateId\'TEMPLATE_ID\',
        // ...其他参数
      })
    return result
  } catch (err) {
    return err
  }
}
除了避免管理 access_token 的麻烦以外,在前面传统调用方式中还用到了一项能力:定时任务。这项需求云函数同样可以满足,你可以给云函数配置一个定时触发器,使用简单的 JSON 配置文件就可以设定一个定时任务。
加入这个配置之后,部署一下函数,将定时触发器发布出去。根据我们的配置,每分钟都运行一次 send 函数,在 send 函数中,我们会将消息集合中满足发送条件的订阅消息通过云调用推送出去。比如我刚刚说的每天 10 点触发一次就可以写成下面这种格式的云函数定时触发器:
{
  // triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
  \"triggers\": [
    {
      // name: 触发器的名字,规则见下方说明
      \"name\"\"myTrigger\",
      // type: 触发器类型,目前仅支持 timer (即 定时触发器)
      \"type\"\"timer\",
      // config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见下方说明
      \"config\"\"0 0 9/23 1/1 * * *\"
    }
  ]
}

try {
// 从云开数据库中查询等待发送的消息列表
const messages = await db
    .collection(\'messages\')
    .where({
    donefalse,
    // 每天 10 点发送订阅
    startTime: _.lte(new Date().getTime() + 30 * 60 * 1000),
    })
    .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: {
            donetrue,
        },
        });
    } catch (e) {
        return e;
        }
    );
    return Promise.all(sendPromises);
catch (err) {
    console.log(err);
    return err;
}
通过上面两个步骤就完成了跟传统调用方式一样的功能,而整个发送消息的流程也得到了简化。不过云调用的底层也是类似传统的调用方式,只不过帮你完成了定时任务、缓存管理这些服务端的开发工作。
// 删除订阅的消息
const result = await db
    .collection(\'messages\')
    .where({
        touser: OPENID,
        templateId: event.templateId,
        id: event.id,
    })
    .remove();
return result;
现了对指定用户对某个课程的订阅,定时触发时不会再给该用户发送消息,实现了退订的功能。

二、小程序分享

小程序分享,一般产品会让用户选择带有小程序码的分享海报(参考手淘),或者直接分享到用户朋友圈、通讯录好友。


可以直接分享给好友,或者生成带有小程序码的海报,实现业务裂变,在实际产品运营中,这个分享海报,原则上必须是小程序码,不能是H5的二维码,这将涉及到小程序分享禁区。

小程序分享禁区

小程序活动:
诱导下载行为:https://developers.weixin.qq.com/miniprogram/product/#_5-20-诱导下载行
滥用分享行为:https://developers.weixin.qq.com/miniprogram/product/#_5-1-滥用分享行为
关于小程序内分享行为的进一步规范(重点关注):https://developers.weixin.qq.com/community/operate/doc/0004ea2e624e58b2397b78fe856001
以上是微信活动规范的官方文档,可以全面看下,如违规将封禁小程序分享能力,主要关注以下小程序活动防封关键点:
诱导下载APP:这条是微信底线,任何在小程序跑的原生/H5页面都不允许出现任何方式引导APP,被微信发现会立即封禁整个小程序的分享功能,没有整改时间的余地。要在小程序上线的页面,必须功能完整在小程序支持使用。
1、不允许诱导到APP,除非是APP分享进小程序的场景,使用微信官方方法唤醒APP
小程序打开 App文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/launchApp.html
滥用分享行为:尽量做在规则允许范围内的活动,但为了增长,如果有部分违规可以接受;违规处罚:微信发现会给整改时间,需要能配置立即下线;或者微信会封禁活动页面,但整个小程序不受影响,封禁后更换页面地址重新上线
1、分享助力不能超过5个人,避免滥用社交关系造成骚扰(组队组团类分享活动的参与总人数需限制在5人内;包括自己,最多只能邀请4人)
违规案例:如下小程序组队参与分享活动总人数超过5人,滥用社交关系对用户造成骚扰。
2、收益明确(分享活动需明确告知用户活动完整信息,包括不限于整体规则、活动步骤和活动利益结果。不允许在流程中以概率事件或者不确定的获利结果诱导用户参与;比如:邀请好友助力才能参与抽奖,但抽奖收益是不明确的,属于违规)
违规案例:如下砍价免费拿商品类分享活动,通过获得免费商品的噱头诱导用户分享活动给好友,不同好友助力砍价金额不确定,且活动页面未明确说明需邀请多少好友才能满足活动规则获得收益。导致大部分用户花费大量时间精力参与分享活动却收益微小或根本无法获得收益,破坏用户体验的同时也造成对被分享者的严重骚扰。
3、收益即时(分享活动收益和最终收益获取都需满足即时性要求,不允许要求用户长期参与才可获得)
违规案例:如下种树得水果类分享活动,用户通过分享好友获得的水滴用于种植虚拟果树,当果树达到指定等级可免费获得实物水果,分享者需通过长期分享小程序活动不断获得水滴,累计虚拟果树达到指定等级才能获得收益。最终收益未满足即时性要求。
微信内传播H5活动注意点:
1、宣传海报不能出现H5的二维码(微信机器人会判断有二维码的就封),必须换成小程序码,H5活动兼容小程序环境

2、纯H5环境下的访问,不能出现分享不管是不是诱导),小程序环境下可出非诱导分享
3、微信环境下不能静默唤醒APP,需要用户主动点击才可以唤醒APP
违规处罚:违规将被封业务目录,短期无法解封,只能更换业务目录继续运营,访问老目录的用户就不能正常使用了

最后

本篇主要介绍了小程序订阅消息的基本流程,包括模板配置、用户授权和发送消息;知晓发送消息的传统调用方式,并且能够充分理解每一个步骤的作用;在关注用户留存之外第二种方式,小程序分享的做法,以及需要注意微信对于小程序分享的一些禁区。
资源下载此资源仅限注册用户下载,请先

1、本站赞助VIP,仅需【128】元即可 ! ! ! (赞助后永久享受整站资源全部免费下载)
2、站内资源均可通过签到等任务进行免费兑换。(鼓励大家签到)
3、站内资源均来源于网络公开发表文件或网友投稿发布,如侵犯您的权益,请联系管理员处理。
4、本站所分享的源码、模板、软件工具等其他资源,都不包含技术服务,请大家谅解!
5、所有资源均收集于互联网仅供学习、参考和研究,请理解这个概念,所以不能保证每个细节都符合你的需求,也可能存在未知的BUG与瑕疵,因本站资源均为可复制品,所以不支持任何理由的退款兑现(特殊情况可退积分),请熟知后再赞助下载!收取的费用只为能长期与大家分享学习,本站为非商业性网站,纯属个人爱好!

K4资源 小程序教程 程序员思语的小程序开发经验分享(三)订阅消息与小程序分享禁区 … https://www.k4sc.com/105659.html

相关文章

评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务