1.需求来源
最近工作上安排了一个停车场的小程序开发工作,甲方提出了这样一个需求,如果用户关注了某个公众号(甲方自己的公众号),就给用户增加一小时的免费停车时长。听起来是不是很扯淡,但确实是实际生活中会遇到的问题(合情合理)。小程序和公众号的用户怎么打通呢?怎么判断小程序的用户关注过公众号呢?我刚开始也是一头雾水,慢慢摸索之后,豁然开朗,下面讲一下我的解决思路。
2.解决方案
2.1.思路
1.首先小程序用户和公众号用户打通需要使用到微信的UnionID机制,简单解释一下,这是微信给我们的唯一标识,在一个微信开放平台下绑定所有应用的用户都有一个唯一标识,那我们首先第一步,先将小程序和公众号绑定到一个微信开放平台下。
微信开放平台地址如下:微信开放平台
如何判断用户有没有关注公众号呢?我总结了两种办法
2.2方法一
先读文档
微信开发文档:接入概述 | 微信开放文档
先配置好公众开的开发配置
配置好之后就可以接入开发了
1.先获取到access_token
2.在获取这个公众号关注用户列表
这里一次最多拿到一万条数据,如果用户数据量大的情况下需要遍历调用拿到所有数据
3.在通过拿到的openId查用户详情
这里接口有调用频次限制,每日最大五千万,绝大多数情况下都是够用的。但是性能确实不好,比如我有二十万用户,这个地方我就得调用二十万次。。。。。。
4把用户详情中的UnionID存在一个集合里
5.然后判断用户登录的时候返回的UnionID是否在这个集合里,如果在就是关注了,不在就是没关注
看到这里估计兄弟们都说这个方法太笨了,愚蠢,我们一起来看看这个方法有哪些缺点
1.步骤繁琐,还需要遍历集合,但是没办法呀,微信只提供了用openId得到UnionID的api,没有办法能通过UnionID查对应某个应用的用户的openId的api,这就让人很难办。
2.比如我用户关注了,然后我又取消关注了,这种做法就会有弊端。没有办法实时更新,所以招惹中方法只适用于某些特定的场景,比如我要给关注公众号的用户发放奖励这种主动的情景。
2.3方法二
用户关注/取消关注公众号是一个事件,微信会把这个事件推送到开发配置填的地址上,我们需要做对应的逻辑处理就可以了。
为了防止用户信息不同步的问题,我直接把小程序的用户和公众号的关注用户都存在user表里,简单来说就是,用户通过UnionID来区分,同一个用户关注了公众号且登录了小程序,用户信息就只有一条。用一个字段例如follow来区分用户有没有关注公众号。为1就表示关注,0未关注。
为什么这么做呢,因为这个公众号之前就已经关注了好多人,这些人的回调已经没用了,所以我选择把两边的用户都存起来。
这里有个大坑,用户取消关注公众号之后,你在用openid来查用户详细信息,是不会返回用户的UnionID,只会返回用户在公众号的openId