- 揭秘裂变营销:让1个老用户带来5个新用户
微信小程序自出生就带有“社交基因”,这让裂变营销在微信小程序的效果显得格外之好。云店加小程序新上线的“好友瓜分券”功能,就是一种通过好友分享来获取优惠券的裂变活动,帮助商家可以以老带新,快速、低成本获取新用户。 在刚过去的2019年第二季度,互联网用户增速从22%降至6%,用户市场最大的变化就是从增量市场变为存量市场。面对新形势,商家需要做两件事情:构建私域流量以及从存量用户中寻找增量。 什么是私域流量 不用付费,可以任意时间、任意频次、直接触达到用户的渠道。 比较常见的像商家的公众号、自媒体、自建APP、线上/线下会员等,都是商家的私域流量。而目前获取私域流量效率较高的工具就是小程序。 如何从存量中寻找增量 由于增量用户减少,商家对“流量获取难、成本贵”的感受会格外之深。想要再通过“广而告之”的推广方法获取新用户,会越来越难。这就需要商家对存量用户(老用户)深耕细作,用裂变的眼光去对待老用户运维工作。 商家在构建私域流量和存量用户裂变过程中,具有裂变属性的优惠券是一种基础又很有效果的营销功能。无论是拼多多,还是京东拼团优惠券,都是利用类似的裂变优惠券功能,刺激老用户分享优惠券,从而带来新用户。 好友瓜分券与发券宝的裂变优惠券不同的是,前者是主动领取,后者是用户消费后领取。商家可以通过好友瓜分券,主动发起裂变活动。 [图片] 商家推出好友瓜分券活动,有几个要点要注意: 1面值不宜过低 刺激分享 好友瓜分券的优惠券面值最好高于店铺的普通优惠券,这样老用户才会有分享的动力。 2需要在视觉组件中配置 在云店加小程序后台,配置好友瓜分券是在视觉组件之中,并非是单独的业务组件,这就需要商家事先做好一张海报图或者从功能菜单跳转领取。[图片] 3高客单价商品慎用 并非所有商品都适合通过优惠券刺激消费转化,特别是高客单价的商品,如珠宝首饰、奢侈品等。因为通过优惠券可以转化的用户,是冲动的、感性的;而购买高价值商品的用户往往是冷静的、理性的,且短时间内复购的可能性较低。这类用户用高价值的实物奖励如iPhone、笔记本电脑等来转化反而会更有效。 成本低、效果快、口碑好,这就是裂变营销在小程序中被频繁使用的重要原因。商家在设计营销活动时,应当从用户看到自家品牌后的每一个环节,都尽量融入“裂变”的思维。一生二、二生三、三生万物,让每一个老用户的朋友圈,都成为自家的流量池,为小程序输入源源不断的新用户。
2020-06-04 - 干货|涨粉秘笈:小程序连接公众号,做好7件事就能涨粉
在最新的测试版微信中,小程序发现主入口大变样,新增“大家在用”、“动态”等中心化推荐方式。在最为重要的“动态”流量推荐位中,以图文为主要展现形式的小程序占到了60%左右。云店加预测,商家利用“动态”推荐位从11亿微信公域流量池导流,在利用小程序跳转公众号功能,将用户留存、沉淀到公众号,将成为重要的获客渠道。公众号对于小程序的作用日益重要。 对商家来说,拥有公众号的小程序将如虎添翼,公众号可以成为小程序的消息通知、用户留存、品牌展示和售后服务的基地。结合小程序实际使用场景,云店加就来盘点下公众号对小程序商家都有哪些好处。 一、共用资质 节约认证费 小程序可以单独申请,也可以通过公众号快捷申请。对既没有公众号也没有小程序的商家来说,正确的做法是先申请认证公众号,再通过公众号快捷申请小程序。因为后者可以共用前者的资质。按照企业最多可以申请50个小程序计算,每个小程序都能省下300元认证费。 二、设置自定义菜单 快速进入 刚接触小程序的商家熟悉公众号,但不了解小程序,通常会问公众号与小程序能不能互联互通。答案自然是肯定的。方法有很多,其中之一就是将小程序设置到自定义菜单中,方便用户快速进入。 三、图文消息插入 内容营销 无论是淘宝、头条还是抖音,都在尝试内容营销,而微信的公众号和小程序就是绝佳的内容营销载体。商家在公众号推送商品介绍、评测、导购、营销等内容时,可以直接以文字链接、图片链接、卡片和小程序码的形式插入小程序,让用户直接下单,转化流畅更自然。 四、小程序支付 自动关注公众号 在小程序官方后台的设置菜单中,可以设置用户支付后自动关注公众号,将已付费的老用户沉淀到公众号中,再将优惠信息通过图文消息触达,激发二次消费。 五、添加自动关注公众号模块 想要将小程序的用户留存到公众号,第二个方式就是直接添加“关注公众号”组件。以云店加小程序为例,只要是相同主体的公众号和小程序,就可以调用这个功能。 六、小程序跳转公众号图文消息 从小程序进入公众号的第三方式就是可以直接跳转公众号图文消息。同样以云店加小程序为例,只要在资讯中配置图文消息链接,就可以直接显示公众号图文消息,将公众号与小程序内容打通。 七、公众号小程序落地页广告 公众号和朋友圈广告都支持跳转小程序了,商家可以在小程序后台申请成为广告主,就可以以广告形式推广自己的小程序。 据悉,微信官方正在基于多维度的小程序质量评估机制,给予优质小程序更多的展现入口。对商家而言,越早投入小程序运营、提供越优质的商品和服务,就越有可能获得更多的微信流量支持。小程序已成为企业最重要的获客渠道,目前来看,没有之一。
2020-06-05 - 腾讯在线教育的小程序云开发实践
作者介绍 陈天忱,IMWEB团队成员,腾讯前端开发工程师, 主要负责腾讯课堂小程序,腾讯课堂直播间等业务模块。 首先介绍下腾讯在线教育下的3个主要业务: 针对成人职业化,兴趣化学习的腾讯课堂;针对小学,初高中k12领域的企鹅辅导;针对少儿英语学习的ABCMouse。 这3块业务都在Web端、小程序端和客户端都有落地产品,以满足不同端的用户需求。 [图片] 随着业务的高速发展,在小程序端,我们部门对应的小程序有十几个,而且还可能推出更多工具类、平台类的小程序。众多的小程序业务,意味着频繁的业务需求,为了保障业务的稳定及效率,我们团队在小程序的同构、CI、云开发等领域都进行了积极的尝试,并取得了不错的成果。 面对频繁的业务需求,我们作为一个前端团队,一直在思考否能有更多的发挥空间,而云开发的出现,恰恰助力我们拓展前端的边界。 下面以腾讯课堂小程序为例,为大家介绍我们在小程序云开发上的实践。 如何实现多个小程序,多端共用同一个云开发环境[图片] 2018年,微信小程序和云开发ClouBase两个团队深入合作推出小程序云开发,为每一个小程序都提供了一个非常简洁方便的小程序云开发的入口,弱化后端和运维概念,无需搭建服务器。 但是我们在开始使用云开发的时候遇到了一个问题:我们多个小程序需要使用同一个云开发环境,这样一些通用的平台能力可以复用。但是在小程序云开发中,每个小程序使用内置的sdk只能调用小程序账号自身关联的云开发环境,这样的话,云函数的代码就要维护多套。显然这并不是我们想要的,内置的sdk并不能满足我们的需求。况且我们的H5和PC端要用云开发的话,又得另外维护一个环境。 [图片] 我们有想过通过Node走http调用,但是通过网关-node-具体服务,自行搭建又会面临容灾、运维、扩容,这又失去了云开发的意义。 当然,我们的H5和PC也可以使用小程序账号的云开发环境,但依然不能解决不同小程序之间公用云开发环境的问题。 [图片] 所以在最初,我们尝试用serverless来解决这个问题,即把接入层换成API网关,就可以满足需求。但是,当我们接入API网关来使用云开发的能力时,走网关调用,这时鉴权这一块就得走业务自身鉴权了,无法使用小程序云开发天然免鉴权的便利。 所以我们和云开发团队深度合作,推出了用于小程序端的Web SDK,这样多端调用得以实现。事实上,tcb-js-sdk-mp和内置sdk一样,提供了免鉴权等多种鉴权方式,我们可以像使用内置sdk那样拿到用户的openid,节约开发成本。 [图片] 如果你们的业务也有同样的问题,可以参考下。 这里是我们使用tcb-js-sdk-mp的一部分代码演示: [图片] 初始化略有不同,初始化这里要跟tcb-js-sdk一样,调用对应的api去校验登录态。然后函数调用这里因为不是直接访问内置的环境,还是需要做一个域名限制,防止被刷。封装了云函数调用方法,进行了初始化,后续的操作就跟使用内置的sdk没什么区别了。 通过云开发CLI工具构建函数自动化部署管理(CI)流程[图片] 涉及到一个新的环境,就要面对部署的问题。 常用的云函数部署方式是通过开发者工具,但是通过工具右键部署会有一些问题,比如手动选择环境,容易出错,严重的可能造成现网事故;依赖环境,内网包无法在线安装,本地上传可能有些包有平台特性 ( docker挂在安装特定环境依赖)。 [图片] 不过这些都可以通过一个现有的工具得到解决。云开发提供了CLI工具用于云函数的操作,包括登录、初始化、部署函数、触发函数等,有了这个工具,我们的云函数完全可以另起项目单独开发了,和小程序项目进行分开管理。并且cli提供了灵活的配置,超时时间,环境变量,私有网络,是否安装依赖等功能。 [图片] 我们依赖cloudbase-cli配置了一套云函数部署的CI流程,通过不同的方式来触发CI,就可以将函数部署到不同的环境中来,减少人工手动部署可能带来问题的风险。并且这里可以看到,像我们的业务会希望有一个预发布环境,不使用小程序内置的云开发环境,就可以突破两个环境的限制。 [图片] 运用云开发数据库的事务能力实现以老带新活动[图片] 下面,我就分享一个我们业务中,对于云数据库实际的场景应用。 我们有一个大促的活动,需要学员邀请用户参加,就可以领取一些精品课程,来促使互动的传播,需要用到小程序一个动态消息的能力。每个用户能够邀请的用户有限制,如果活动过期了,将会展示一个已结束的状态。点开可以给活动发起者助力,不能重复,满员时不能继续助力。因为这个页面功能不涉及特别复杂的数据操作,比较简单。我们觉得这个功能就非常适合前端用云开发来实现,可以节省一些后端的人力。 [图片] [图片] 先从建表开始。很简单,一个表,当邀请到用户参加活动时,往goups里面添加一个用户,并更新动态消息,当用户数达到上限时则不再添加。但是这种活动往往会伴随着并发的操作,如何保证并发时数据的准确性,就需要我们对操作的数据上锁,避免同时操作导致被覆盖。 [图片] 所以需要用到云数据库的事务能力。 我们另外又维护了一个表,用于记录被邀请的名额信息,在事务中对名额进行操作,事务完成则去更新状态,否则就可能进行事务的回滚。 [图片] 下面具体看下整个操作的过程 一、在活动页面,用户点击开启活动生成一个活动id。这个生成活动id的方法是小程序端和云开发这边都支持的一个生成动态消息id的方法,可以直接用这个作为一个活动的id了。 [图片] 二、同步创建对应上限人数的人员位,所有的状态都是空的。这样一个活动就创建好了 [图片] 三、如果有人点击进入活动页面,先通过活动id获取到对应的活动数据;然后根据云开发天然无鉴权的特性直接在云函数里面拿到用户的信息,再根据用户的信息及活动数据来判断是否有助力的权限。 比如这是你发起的活动,那么就只会展示已邀请到的人数,如果过期了就展示过期,还有你已经助力过了,或者名额已经满了等等,这个就是具体的业务逻辑了,不细讲,我们就给一个disable的页面。如果有就给一个正常的页面。 [图片] 用户点击助力,则通过事务从对应的活动位取出一个空的活动位,并对活动位进行更新,这时候这个活动位就被上了事务锁。这时,如果有另一个用户同时并发的去修改这个活动位,则会直接失败,那么就可以尝试去占用下一个空位。 [图片] 依次尝试占用所有的空位都失败了,就反馈该活动团已满。 正常的情况下,就可以直接进行更新操作,并将user字段改为此用户的信息,标记为已占用状态。事务跑过后再将用户的信息 push到活动数据的groups字段内,并判断是否已满员。完成更新后就可以结束事务,然后完成后续的动态消息更新的操作。 [图片] 在这个过程中如果出现了错误,我们都可以对事务进行回滚,来保证数据的准确性。 [图片] 小程序云开发的出现,让我们前端团队有了更广阔的发挥空间,也让我们得以更迅速地响应运营推广需求。关于小程序云开发的运用技巧,有许多地方值得我们去挖掘,欢迎大家一起来交流学习。
2020-09-14 - 0代码量让你的小程序出错时发微信消息通知你
昨晚一位给我微信留言碰到类似的问题,我感觉可以用这个方法。 直接入主题: 说的是利用小程序后台的开发->运维中心里面的监控报警功能实现当小程序脚本发生错误时自动发送报警信息到你的微信上的功能 在社区经常看到各位抱怨体验版正常,开发者工具正常,线上版本却没有数据之类的话题,其实这里可能的原因之一就是小程序内部脚本出错了。如果你的小程序编码没有做容错处理(这个要详细说可以说一整天),那就会导致出错后的代码无法正常运行,这样反映在界面上就可能是白屏,没有数据,或者数据不全导致界面错位等等一系列想象不到的问题。 使用本方法生效后小程序运行出错报警到微信的效果截图: [图片] 所以,监控小程序运行过程中运行出错很利于小程序的运维工作。官方早就为我们想好了,提供了一个用来监控错误并报警的平台。只是很多人没有好好利用起来。小编从去年开始接触小程序用了将近1年时间了,老实说为我解决了不少问题。使用教程,如图登陆小程序后台后按1,2,3,4,5,6步就好了: [图片] [图片] 这里有个小技巧,人工制造错误代码来监控后端接口异常报警: 比如有个场景要求后端接口出错时能快速通知到微信上,那就可以在小程序里调用该接口的地方,接口返回数据异常时,故意调用一个不存在的JS函数,比如,下单失败接口出错了,在接口返回fail的情况下写上 throw_NewOrderError();实际上throw_NewOrderError并不存在的,这个时候会让小程序故意产生脚本错误并通知到你的微信。 还有一个业务和性能监控报警也是很有用的,比如监控后端接口性能,数据渲染时间,这个对整个小程序产品的品控很有用,比如要求高频后端接口必须在300ms以下的性能要求,当达不到这个性能的时候就会发送报警。 [图片] 这个大家也可以深挖下功能,除了报警还能提供详细的统计数据。当你的小程序产品日活超过5万时你会发现这个对你整个产品链的性能提升和业务监控是很有用的。这里点到为止。 社区的markDown编辑模式下图片无法上传,所以没用markDown来编辑,各位将就看吧。 PS:鉴于写的文章虽然看的人多但是无法入一些大佬的法眼,认为都是「水文,刷赞」等等一些恶毒字眼(最近多了个职业回复的「雅称」),各种帽子戴得,做一个开发爱好者积极分享和解决各种问题太难了,姑且不论咱写一篇文章需要截图多少,单单排版就得废掉俺多少时间哈,很受伤,所以本人决定在微信开放者社区封笔。你看到是俺最后一篇发表在微信开放社区的文章。如果你想继续查看俺的一些文章可以私聊我。我会在其他平台保持继续创作。bye-bye~
2020-09-04 - 一眼告诉你什么是订阅消息了,看完就懂订阅消息。
消息通知有两种: 一、A的动作后,发消息给A自己,这种容易解决,不多说明; 二、A动作后,发消息给B(比如管理员、店家、楼主),如何保证B收到消息?这种是本方案要解决的问题。 一张图片一眼告诉你什么是订阅消息,产品经理的设计UI居然让人一眼就知道订阅消息是什么玩意。 [图片] 用户 B (管理员、商家、组长、楼主)在知道订阅数不足后,打开小程序来续订阅数,否则没法收到订阅消息。 [图片] 补充一: 关于勾选按钮,请注意话述是:“总是保持以上选择,不再询问”,而不是:“总是同意接收订阅消息”,不要幻想就成了永久性订阅消息; 相当于你打电话订外卖,对店家说“老样子”,店家只会马上送一次外卖,而不是会以后每天自动给你送外卖了。 勾选和不勾选的区别是什么呢? 区别仅仅是:不勾选时,必须点击订阅10次,弹窗10次;勾选后,仍然必须点击订阅10次,但是不弹窗。无论如何“订阅”这个点击n次的动作少不了。 补充二: 一旦勾选后,就不可逆了,没有任何办法恢复或取消勾选了,除非你小程序MP后台换一次消息模板号(删除模板,重新添加一次)。 补充三: 关于如何保存订阅数。 保存在数据库中,笔者用的是云开发,数据库表user结构如下: { _id:'openid1', nickName:'老张', msg:{ "tempId1":5, "tempId2":7, } } 补充四: 关于如何获取订阅数。两种方式: 一、wx.requestSubscribeMessage的回调success里获取; 二、消息推送机制获取;https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push.html
2022-09-21 - 只有三行代码的神奇云函数的功能之一:获取openid
这是一个神奇的网站,哦不,神奇的云函数,它只有三行代码:(真的只有三行哦) 云函数:login index.js: const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event) => { return { ...event, ...cloud.getWXContext() } } 神奇功能之一:获取openid: 任何页面运行下面代码,已解决异步问题。 onLoad: async function (options) { app.globalData.openid=app.globalData.openid||(await wx.cloud.callFunction({name:'login'})).result.OPENID console.log(app.globalData.openid) }, 其他功能: 神奇功能之二:不用授权获取unionid: 不需要弹出授权框,直接获取unionid,但是不保证100%成功获取,有可能unionid为空。 https://developers.weixin.qq.com/community/develop/article/doc/000a0c6b580338e947f9db0c65b813 神奇功能之三:100%成功获取unionid: 保证100%成功获取unionid,需要用户信息授权。 https://developers.weixin.qq.com/community/develop/article/doc/00066a967c4e384949f93fe1151413 神奇功能之四:获取电话号码: 还是这三行代码,获取用户的电话号码。 https://developers.weixin.qq.com/community/develop/article/doc/0006a8ec7ac860c94bf90a34f5d813 神奇功能之五:获取群id: 将小程序分享到某群里,可获得该群的群id, https://developers.weixin.qq.com/community/develop/article/doc/000ea802c00f70894cf9fe72556013 [图片]
2020-10-20 - 小程序API的异步优雅用法
先上代码,写一个全局的 [代码]wx.$promisify()[代码] 方法 [代码]wx.$promisify = (method, opts, ...params) => new Promise((resolve, reject) => wx[method]( { ...opts, success: resolve, fail: reject }, ...params ) ) [代码] 举一个几乎大家都会用到的登录为例(虽然图1我已经改进了很多次,但嵌套问题还是很刺眼) [图片] 改进后,多层嵌套变扁平了 [图片]
2020-05-20 - 订阅信息恶心至极?没有服务器的我们也能直接发消息到微信(公众号)! [即抄即用,拎包入住]
更新时间(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,是为了取出公众号的所有的openidopenid列表在 res.data.openid5.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了,不用浪费时间在上面), 就可以使用只发给商户的模板消息了。 公众号对应文档链接 https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.htmlhttps://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId, -----------------------------------------效果图--------------------------------------- [图片] -------------------------------------------------------------------------------- 哎,差不多了,感觉是有点折腾,如果感觉还是不够直白的,可以指出来我继续补充 。 求点赞,你的评论就是对拎包哥最大的支持。 [图片][图片] ===================更新于2020/10/23======================
2020-12-02 - 借助云开发实现小程序订阅消息和模板消息的推送功能
之前的模板消息推送,将在2020年1月10日下线,所以我们不得不使用订阅消息了。 我们先来看下订阅消息的官方简介。 [图片] 接下来我们就来借助云开发,来快速实现小程序消息推送的功能。 一:获取模板 ID 这一步和我们之前的模板消息推送是一样的,也是先添加模板,然后拿到模板id [图片] 首先是开通订阅消息功能,很简单,如下图 [图片] 由于长期性订阅消息,目前仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。仅就线下公共服务这一点,长期性订阅消息就和大部分开发者无缘了。 所以我们这里只能以使用一次性订阅消息为例。 [图片] 如上图,我们从公共模板库里选择一个一次性订阅的模板。然后编辑模板如下图 [图片] 下图就是我们添加好的模板,下图的模板id就是我们需要的。 [图片] 二,请求用户授权 我们做订阅消息授权时,只能是用户点击或者支付完成后才可以调起来授权弹窗,官方是这么要求的: [图片] 我们这里用到了wx.requestSubscribeMessage这个方法,来获取用户的授权。 1,编写index.wxml代码 [图片] 2,编写index.js代码,实现点击获取授权 [图片] 这一步tmplIds里的一串字符,就是我们自己添加的模板id 3,点击按钮运行效果如下 开发者工具模拟器上点击授权弹窗是这样的: [图片] 手机上的授权弹窗是这样的: [图片] 可以看到,这里显示的就是我们添加的 ‘上课提醒’的模板。 细心的同学可以看到, 真机上多了一个 ‘总是保持以上选择,不再询问’ 其实,你自己仔细多品一些。也能明天,我们正常订阅消息授权时,用户允许的话,你只能推送一次消息。也就是用户允许一次,我们就可以推送一条消息给用户,并且这个允许不存在过期。所以我们可以让用户尽量多的点击允许,这样我们就可以尽量多的给用户发送消息了。 这里用户允许后,我们就可以给用户推送消息了,接下来我们来借助云开发的云函数来实现消息推送功能。 三,获取用户的opneid 先来看官方爸爸是怎么说的。 [图片] 可以看出官方提供了两种方式,我们这里使用云调用。说白了就是在云函数里调用推送功能。 推送所需参数 [图片] 可以看到我这里用来openapi功能,并且需要用到用户的opneid,关于openid的获取,我之前有写过文章,也录过视频的。文章的话,大家去翻下我历史的文章,视频的话,点击这个即可:《借助云函数获取用户openid》 这里的openid的获取我就不再详细讲解了,把对应云函数的代码给大家贴出来。 [图片] 在使用云开发时,有几点需要注意的 1,需要在project.config.json里创建云函数目录如下图 [图片] 2,需要在app.js里初始化云开发环境 [图片] 至于云开发的环境id从哪里拿,我视频里也讲过很多遍了,直接去看我视频或者翻看我历史文章即可。 《零基础入门云开发视频》 四,用云函数实现消息推送 我们只需要创建一个云函数如下,然后填入用户的openid,要跳转的小程序页面链接,模板内容,模板id即可。通常这些数据都应该传进来,简单起见,我就把这里的模板内容写成固定的。 [图片] 注意:我在编写上面的代码时,推送内容的key必须和小程序模板里的key保持一致,否则就会报如下错误。 [图片] 然后看下调用这个云函数的地方 [图片] 如果用户没有授权,我们推送会报如下错误 [图片] 如果用户授权过,我们就可以成功推送了,推送后的打印日志如下 [图片] 还记得我们真机上的授权吗,如果用户只是点击了允许,没有选择一直允许,那我我们在推送成功一次后,如果再次推送,就需要用户重新授权。否则,还是会报这个错误的 [图片] 所以我们用户点击一次允许,我们就可以推送一次消息,比如,我点击了4次允许那么我就可以成功的推送4次 [图片] 效果图 [图片] 可以看到,我们成功的收到 上课提醒的模板消息,点击进去,就是我们具体的推送内容 [图片] 其实我这是连续收到了4条消息,因为我点击了4次允许推送,所以就可以成功的推送4次。 到这里我们就完整的实现模板消息推送功能了,下面我把主要代码贴给大家,大家也可以私信我获取完整源码。 index.wxml [代码]<button bindtap="shouquan" type='primary'>获取订阅消息授权</button> <button bindtap="getOpenid">获取用户的openid并推送消息</button> [代码] index.js [代码]//编程小石头wechat:2501902696 Page({ //获取授权的点击事件 shouquan() { wx.requestSubscribeMessage({ tmplIds: ['CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU'], //这里填入我们生成的模板id success(res) { console.log('授权成功', res) }, fail(res) { console.log('授权失败', res) } }) }, //获取用户的openid getOpenid() { wx.cloud.callFunction({ name: "getopenid" }).then(res => { let openid = res.result.openid console.log("获取openid成功", openid) this.send(openid) }).catch(res => { console.log("获取openid失败", res) }) }, //发送模板消息到指定用户,推送之前要先获取用户的openid send(openid) { wx.cloud.callFunction({ name: "sendMsg", data: { openid: openid } }).then(res => { console.log("推送消息成功", res) }).catch(res => { console.log("推送消息失败", res) }) } }) [代码] 推送对应的云函数 [代码]//编程小石头wechat:2501902696 const cloud = require('wx-server-sdk') cloud.init() exports.main = async(event, context) => { try { const result = await cloud.openapi.subscribeMessage.send({ touser: event.openid, //要推送给那个用户 page: 'pages/index/index', //要跳转到那个小程序页面 data: {//推送的内容 thing1: { value: '小程序入门课程' }, thing6: { value: '杭州浙江大学' }, thing7: { value: '第一章第一节' } }, templateId: 'CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU' //模板id }) console.log(result) return result } catch (err) { console.log(err) return err } } [代码] 后面我会分享更多小程序相关的知识出来,请持续关注。 相关视频讲解:https://edu.csdn.net/course/detail/26572
2020-03-04 - 业务数据怎么查,我用云开发高级日志服务
业务错误怎么查,我用云开发高级日志服务 小程序·云开发作为小程序原生的后台开发能力,一直致力于可以更高效地帮助开发者构建性能更好的小程序。而云函数作为云开发的一项基础能力,承载着小程序所有的后台运算逻辑,它就像小程序的大脑一样,每天繁忙地工作着。 而对于开发者而言,如何尽快地定位和排查云函数使用过程中的问题,也成为保障小程序质量的必备功能。而有一部分开发者并不担心这个问题,因为他们选择了一种能力,只要通过简单的开启就可以高效且准确地定位到云函数中的问题。 这就是云开发提供的高级日志服务。那什么是高级日志服务,它又能做什么呢?接下来就让我们一探究竟。 什么是高级日志服务 很多开发者可能都会遇到这样一些问题: [代码]线上的小程序运行地好好的突然出问题了,怎么知道是哪里有异常呢? 根据线上表现大概猜到是哪个功能模块出现了异常,但是不知道上下文调用信息,要如何准确定位问题? [代码] 如果你恰巧使用的是云开发,那不必担心,因为云函数原生就带有日志服务。但是基于之前提供的旧的日志服务,开发者可能还是会遇到一些问题: [代码]我不知道具体的请求 ID 是什么,但是隐约记得一些关键字,这要怎么查询日志信息啊? 我想自定义一些信息打印到日志中,该怎么办? [代码] 小程序·云开发的高级日志服务就是为解决以上所有开发者遇到的问题应运而生的产品能力。基于高级日志服务提供的日志采集和日志检索功能,开发者可以更加高效地发现和解决云函数运行过程中的问题。 高级日志服务能做什么 让我们通过前端开发小 H 的故事来看看,高级日志服务到底能够做什么。 1. 旧框架下的日志服务 之前小 H 经常会为了做小程序而陷入苦恼当中,比如他需要将用户触发订阅消息时的一些数据存储到数据库中,用于后续的消息下发,这就需要有一个完整的服务端才行。但是作为一个前端开发,小 H 对于后台服务的搭建和部署并不熟悉,因此常常陷入困境。 后来他发现了云开发这样一个神器,一键开通就可以具备后台服务开发的能力了。那么现在当他想要存储相关的数据就变得非常简单了。 首先,他定义一个云函数 [代码]subscribe[代码],并在通过该云函数将用户订阅的消息信息存储到小程序·云开发的数据库中。 [代码]exports.main = async (event, context) => { try { const { OPENID } = cloud.getWXContext(); // 在数据库中记录用户的订阅信息 const result = await db.collection('messages').add({ data: { touser: OPENID, // 用户的openid page: 'index', // 订阅消息的页面路径 templateId: event.templateId, // 订阅消息模板ID }, }); return result; } catch (err) { console.log(err); return err; } } [代码] 然后在小程序端调起订阅消息界面的时候触发这个云函数并将对应的信息存储到数据库中。同时小 H 还可以通过云开发提供的原生的日志功能查看每次的调用是否成功,以及具体的调用信息。 [图片] 但是原生的日志中能够写入的数据是非常有限的。而且检索日志的时候只能通过开始时间、结束时间、状态和 [代码]requestID[代码] 进行检索。可是基于业务需求小 H 需要在 [代码]subscribe[代码] 云函数调用的时候需要再打入一些自定义的信息,而且他希望可以对日志按照 [代码]log[代码] / [代码]info[代码] / [代码]warn[代码] / [代码]error[代码] 进行分级,这样在日志查询的时候也可以快速定位到自己想要关注的日志,这该怎么办呢? 当然,小 H 并不只是一个人,正是看到很多开发者有类似的问题,今年我们推出了云开发高级日志的服务。接下来,让我们看看,小 H 是如何使用高级日志服务的。 2. 高级日志服务 首先,小 H 在定义 [代码]subscribe[代码] 函数的时候可以使用 [代码]wx-server-sdk[代码](1.5.0 或以上版本)提供的方法打入一些自定义的日志内容。具体流程为: 通过 [代码]logger()[代码] 方法取得 [代码]log[代码] 对象 调用 [代码]log[代码] 对象上的 [代码]log[代码] / [代码]info[代码] / [代码]warn[代码] / [代码]error[代码] (对应不同 level 的日志等级)方法,传入一个对象作为参数 对象的每一个 [代码]<key, value>[代码] 对都会成为日志一条记录中的一个可检索的键值对,其中 [代码]value[代码] 不论值是什么都会被转成字符串 按照上述改造后, [代码]subscribe[代码] 变成了下面这样: [代码]exports.main = async (event, context) => { const log = cloud.logger(); try { const { OPENID } = cloud.getWXContext(); // 在数据库中记录用户的订阅信息 const result = await db.collection('messages').add({ data: { touser: OPENID, // 用户的openid page: 'index', // 订阅消息的页面路径 templateId: event.templateId, // 订阅消息模板ID }, }); log.info({ action: 'addMessage', touser: OPENID, templateId: event.templateId, }); return result; } catch (err) { log.error({ type: err.name, message: err.message, }); return err; } } [代码] 此时,当这个 [代码]subscribe[代码] 被触发以后,我们就能在高级日志服务中看到这样一条日志记录: [代码]{ "level": "info", "function": "<function_name>", // 执行的云函数名 "requestId": "<request_id>", // Request ID "action": "addMessage", "touser": "<openid>", "templateId": "<template_id>", "src": "app" // logger 打的日志为 app,系统打的日志为 system } [代码] 有了日志以后,日志检索也会变得非常的简单。高级日志不仅提供了全文检索能力,还提供了通过键值检索约束查询范围,让日志的检索变得更加的简单和快捷。 比如,小 H 想知道 [代码]subscribe[代码] 函数的日志,就可以通过: 全文检索:在搜索框中输入 [代码]subscribe[代码] 键值检索:在搜索框中输入 [代码]function:subscribe[代码] 比如,小 H 想知道 [代码]subscribe[代码] 函数且 OPENID 为 [代码]popo[代码] 的日志,就可以通过: 在搜索框中输入 [代码]function:subscribe and touser:popo[代码] 又如,小 H 想知道 level 为 [代码]error[代码] 且错误信息中含有单词 [代码]defined[代码] 或以 [代码]mem[代码] 打头的单词的日志,就可以通过: 在搜索框中输入 [代码]function:subscribe and level:error and (message:defined or message:mem*)[代码] 当然,高级日志服务还提供丰富的查询语法,大家可通过《小程序·云开发高级日志服务》了解详细内容。 [图片] 除了新增的高级日志外,近期小程序·云开发还更新了—— 小程序·云开发能力更新 除了新增的高级日志外,近期小程序·云开发还更新了: 为帮助企业、政府、媒体及其他组织的小程序开发者在新冠肺炎疫情期间共度难关,小程序·云开发推出特殊类型代金券帮助大家以更低地资源成本完成小程序的功能迭代。详情可参考文档《小程序·云开发特殊代金券》 数据库安全规则:提供精细化的控制集合中所有记录的读、写权限的能力,自动拒绝不符合安全规则的前端数据库请求,保障数据安全 自定义告警:提供更加灵活的告警配置,可以使用告警指标、统计周期、比较条件、持续周期、告警频率等参数自由组合告警条件。如:统计周期 [5 分钟],当 [云函数错误次数] [>] [5 次] 且持续 [1] 个周期时告警,[每小时] 告警一次 数据库事务:可以方便开发者更加灵活地使用数据库能力,满足跨多个记录或跨多集合的原子操作的使用诉求,极大地方便了小程序的功能开发
2020-02-12 - 云函数时区问题解决方案
我在之前写文章整理过关于云函数时区的问题,具体见下面链接,今天不讨论多个方案,只推荐一个亲测可行的稳定方案 https://developers.weixin.qq.com/community/develop/article/doc/000c887a83874009534a4712a5b813 所谓云函数时区问题是指: 云函数中的时区为 UTC+0,不是 UTC+8,在云函数中使用时间时需特别注意。也就是是说,现在是2020-05-25 15:00:00,但是在云函数端new Date()打印的是2020-05-25 07:00:00 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/notice.html 具体解决方案 如果需要默认 UTC+8,可以配置函数的环境变量,设置 TZ 为 Asia/Shanghai。 注意事项 这里需要注意的是:设置环境变量和上传云函数的顺序问题,一定要在设置环境变量之后,重新部署云函数,并且部署完成之后要缓个几分钟测试, 该方案亲测可用
2020-05-25