初尝微信云托管

2022-06-17 08:16:47 浏览数 (1)

前言

最近微信给我派发了 10000 个微信红包封面,但是由于我的操作失误,派发方式选择了唯一链接,所以微信直接给我生成了 10000 个红包封面链接,对,就是 10000 个。

给我 10000 个红包封面没有问题,问题是我怎么把这些发给别人呢?

最初的想法

因为我有一台 1C1G 的云服务器,我就想着是不是可以写个分发服务,将链接存到一个列表中,在用户请求链接的时候从中拿出一个返回,同时将其从列表中删除,但是这样会存在很多问题,比如单个用户多次调用就有可能将列表清空,而且无法让每个用户只获取一次,而且 10000 个数据存到列表中也是太 low

灵光一现

因为我曾很多次尝试想对公众号做二次开发,想着做一个自己的服务端来接管公众号的用户消息。但是由于工作太忙(自己太懒),一直没能开始。接着这次 10000 个红包封面的问题,我又蠢蠢欲动,可惜做这样一个服务端没有几天半个月是不可能做完的(我是菜鸡,做的慢)。无意间,我在公众号的开发者工具页找到了微信云托管这个产品,声称和微信用户体系天然打通,这岂不是正如了我的意。

我计划选择使用微信云托管来实现一个红包链接分发服务,而且微信云托管自带数据库,支持多种后端框架,支持公网域名访问,因为我的公众号是未经认证的,所以无法使用微信用户体系,只能选择公网域名这种方式。

几个难点

如何保存封面链接

通过上面的介绍,我们知道微信云托管为我们提供数据库服务,我们可以直接使用自带的数据库来保存我们的封面链接。

在导入数据之前,我们要创建表和初始化表结构。本次我们直接使用主键 ID,封面链接,封面状态三个字段即可。

我们选择使用 csv 文件进行导入。

如何让被领取的封面不再被领

上面初始化表的时候,我们已经设置了封面链接的状态,做法就是当链接被领取后直接在视图中调用 dao 方法将封面链接的状态改为已领取即可。(PS:用户请求的时候,dao 只会去处查询未被领取的封面链接)

如何让每个用户都只能领一次

这个问题算是这其中耗费我时间最多的一个问题了,从起初的计划用 Remote_Ip(只能拿到云托管内网 IP),源 IPheaders 的属性 X-Real-IpX-Forwarded-For)来唯一确定领取者身份,但是同一个人的多次访问可能存在出口 IP 变化的情况,所以用这个办法也是不行的。

最后,我还是选择了最简单的 cookie 来做唯一检查,原理就是当用户来获取封面链接的时候,我会给客户端下发一个 cookie,然后在收到请求的最开始去判断客户端是否携带了 cookie,如果携带则直接返回“请勿重复领取!”

用户第一次来请求的时候是不带 cookie 的,第二次就会自动携带。

如何让用户一步领到封面

这个问题相对比较简单,公众号支持 html 内嵌,所以直接将我服务器的域名内嵌到一个 a 标签中,然后根据关键词返回这个 a 标签(可点击的文字)即可。

这个方案存在的问题

当然对于大多数的用户都是没问题的,怕就怕个别同学好奇心泛滥。简单的对比第一和第二次的请求头就能发现问题,通过删除客户端的 cookie 就能够实现多次获取封面链接,从而起到破解的目的。但是同一个封面一个人只能领取一次,多了也没意义。

谨以此文记录我的 10000 封红包分发过程。

0 人点赞