评论

订阅信息恶心至极?没有服务器的我们也能直接发消息到微信(公众号)! [即抄即用,拎包入住]

在欢声笑语中抛弃订阅消息

更新时间(2020/12/2)

大家好,众所周知,今年左右新出的订阅消息对商家和用户的友好度都极低,少了一个直接发信息到微信的最重要的渠道。

那么我们动动歪心思,直接发消息到公众号(其实这是不是wx的本意???)。

所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,
只有认证后的服务号才可以申请模板消息的使用权限并获得该权限。

为方便公众号用户方便、快捷地接入小程序服务,公众号用户可复用公众号资质创建小程序
当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。
当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升。

这还不美滋滋吗,对于小商家来说等于无限次了。

所以我们一开始最好就在公众号进行微信认证,复用公众号的资质来注册小程序(注意,可以复用5个(好像))。

(我付出了¥300的惨痛代价)。

--------------------------------------------------------------------------------

以上搞定后,流程走起

重点中的重点:为您的函数申请公网固定ip

有了这个ip之后,没有服务器的我们()就能绕过ip白名单,这不正是真正的云开发精神吗?

0.用你的小程序账号登陆腾讯云,并在里面新建一个云函数

>>

选择你要发消息到公众号的小程序

-----------------我是2020/10/23的拎包哥-----------------------

创建并选择角色

记得在

https://console.cloud.tencent.com/cam/role

创建角色

勾选tcb,scf

在搜索框里搜scf,tcb后,有什么策略就勾选什么策略

创建角色名

在云函数启用刚刚新建的角色


ps. 记得做好这一步,不然各种报错

missing authorationo key  // 报错:缺失授权键
you are not authorized to xxx  // 你没有权限去xxx


1.打开 https://cloud.tencent.com/document/product/583/38198 ,申请白名单

2.审核通过后,再跟着步骤走。

最后你的云函数会得到一个公网固定ip

3.开始码云函数的代码

如下,记得把wx-server-sdk和request-promise的包都npm下来。

依赖包可以通过这里上传上来

我的做法

把获取的accessToken储存在云开发的数据库里。这样就不用担心access token的生成次数超过限制了

'use strict';
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const resInfo = db.collection('resInfo')
const appid = '公众号的APPID'; //  APPID
const secret = '公众号的密钥'; // Secret
const rp = require('request-promise')

exports.main_handler = async (event, context, callback) => {
    var that = this
    var options = {
        url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&secret=' + secret,
        json: true
    }
    return await rp(options)
        .then(async res1 => {
            return await resInfo.where({name:'outInfo'}).update({
                data: {
                    access_token: res1.access_token
                }
            }).then(res2 => {
                return res2
            })
        }).catch(err => {
            return err
        })
}


公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,
过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档。

4.设置触发器(触发器偶尔会失灵,所以最好是59min触发一次)


权限设置

由于云函数的访问不存在openid,所以安全规则必须为任何人可读可写。

5.有了可以稳定刷新的access_token后,根据需求挑选你的公众号模板消息,开始你的表演。

例如:做餐饮小程序的朋友都想用户下单后发送订单信息到商户。那么就需要

获取商户的openid

步骤

注:公众号的openid在小程序开发工具就可以查出来

5.1 获取公众号openid列表

https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN
  • 注意我没有加上next_openid = NEXT_OPENID,是为了取出公众号的所有的openid
  • openid列表在 res.data.openid

5.2 for循环openid列表,根据商户的微信信息(nickname,city等等)找出只属于商户的openid

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
---------------------------------------
var openidList = openid列表
for(var i in openidList){
  wx.request({
      url:'https://api.weixin.qq.com/cgi-bin/user/info?access_token='+ openList[i] + '&lang=zh_CN',
      success(){
           console.log(....)
         }
    })
  }

这里就不用unionid了,不用浪费时间在上面), 就可以使用只发给商户的模板消息了。

公众号对应文档链接


-----------------------------------------效果图---------------------------------------

--------------------------------------------------------------------------------

哎,差不多了,感觉是有点折腾,如果感觉还是不够直白的,可以指出来我继续补充 。

求点赞,你的评论就是对拎包哥最大的支持。



===================更新于2020/10/23======================

最后一次编辑于  2020-12-02  
点赞 10
收藏
评论

9 个评论

  • 拎包哥
    拎包哥
    2020-05-21

    这玩意儿有点新手不友好了吗,咋没人看啊。。。

    2020-05-21
    赞同 1
    回复 1
    • less
      less
      2022-01-11
      拎包哥 yyds
      2022-01-11
      回复
  • 车时代大众奥迪奔驰宝马打85190938
    车时代大众奥迪奔驰宝马打85190938
    2021-04-11

    您好,新建函数用的模板还是新建一个空白的呢,我就是小白,有点看不懂,运行环境是Nodejs8.9,还需要别的要求吗

    2021-04-11
    赞同
    回复
  • 大蒙蒙
    大蒙蒙
    2021-03-29

    请问这个有次数限制吗?可以无时间限制无次数限制的给公众号用户发吗?

    2021-03-29
    赞同
    回复
  • Kang
    Kang
    2020-12-01

    谢谢,很有帮助!

    2020-12-01
    赞同
    回复 1
    • 拎包哥
      拎包哥
      2020-12-03
      吴使客气!
      2020-12-03
      回复
  •  自来阿卷
    自来阿卷
    2020-10-22

    collection.update:fail missing authoration key, redeploy the function; at collection.update api;

    运行报错,想知道collection的值哪里错了,resinfo和ourinfo填的是我自己数据库的值

    2020-10-22
    赞同
    回复 1
    • 拎包哥
      拎包哥
      2020-10-30
      你好,我在文章的“创建并选择角色”里有说明哦
      2020-10-30
      回复
  •  自来阿卷
    自来阿卷
    2020-10-22

    这个不需要指定保存的小程序的云环境的IP吗

    2020-10-22
    赞同
    回复 1
    • 拎包哥
      拎包哥
      2020-10-23
      不用的,他会选择默认的云环境(你的原生的),除非你新建一个云环境并需要使用这个云环境
      2020-10-23
      1
      回复
  • 有乐记
    有乐记
    2020-09-05

    感谢您的分享,上面您提到根据https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 获取公众号的openid, 可是这个接口本身就要传递openid啊,难道这里的openid是小程序中用户的openid也可以?

    2020-09-05
    赞同
    回复 5
    • 拎包哥
      拎包哥
      2020-10-23
      你好,不好意思,好久不回社区。这个openid是公众号的openid,不是小程序的。你可以看看公众号的文档了解一下
      2020-10-23
      回复
    • 空白
      空白
      2020-11-30回复拎包哥
      大哥  我也没看懂,就是没有公众号的openid才需要来找openid啊,你贴的那个方法是要传openid才能获取openid,那不多此一举???没有服务器,想做成这种消息模式,难点就在于获取openid这块的,如果有服务器,做一个web页面,让店家进一下页面登陆一下账号就可以把公众号的opendid和小程序的openid都关联到账号上,但是你说的方法是不用服务器,所以还是想问下你,是如何去取店家在公众号上的openid的?
      2020-11-30
      1
      回复
    • 拎包哥
      拎包哥
      2020-12-02回复空白
      hello,我在第五步进行了教程更新。有问题请留言,谢谢。
      2020-12-02
      回复
    • 空白
      空白
      2020-12-02回复拎包哥
      感谢大哥!拉取所有openid再筛选也确实是一个可行的做法,但不知道云函数拉取openid最多100条这个限制会不会针对微信公众号生效,如果生效的话就需要专门申请一个不做日常运维的公众号来用了。
      2020-12-02
      回复
    • 拎包哥
      拎包哥
      2020-12-03
      1. 你注意我用的是“获取用户基本信息”中的 第一条http请求方法,你for循环openid没有限制的,第二条才是批量请求有100条限制的。而且这个不是云函数啊。


      2. 一般来说,这个是在商家起步的时候获取商家openid用的,此时公众号里没有多少openid,很好辨认的。就算此时公众号已经有很多粉丝,你可以根据商家自己微信号的信息做做i f判断 就好了。
      2020-12-03
      回复
  • 银色子弹
    银色子弹
    2020-05-21

    前提是用小程序的人也关注了对应的公众号,这个其实很难做到

    2020-05-21
    赞同
    回复 2
    • 拎包哥
      拎包哥
      2020-05-21
      所以我现在的方案一般是给商家用发订单信息用的。。。
      2020-05-21
      回复
    • 拎包哥
      拎包哥
      2020-05-21
      但是在例如充电桩之类的场景下,绑定公众号用户还是不介意的
      2020-05-21
      回复
  • 猛男陈阔
    猛男陈阔
    2020-05-20

    前排吃瓜

    2020-05-20
    赞同
    回复 1
    • 拎包哥
      拎包哥
      发表于小程序端
      2020-05-20
      感谢xy哥支持
      2020-05-20
      回复
登录 后发表内容