一种基于邮箱的用户付费系统构想

277 天前
 OneLiteCore

最近在鼓捣国内的付费系统,但是觉得传统的用户注册流程过于繁琐,对于小体量的小项目来说开发和维护一套这样的系统得不偿失。因此构想了一个基于邮箱的用户注册付费流程,大家帮忙看看有什么问题没有。

流程

  1. APP 用户本地生成 UUID 并填写他的邮箱地址

  2. 后台用邮箱地址和 UUID 计算出 MD5 ,并用后台私钥签名 MD5 ,然后发送给用户邮箱

  3. 用户从邮箱中复制数据并回填到 APP 中

  4. APP 本地计算出 MD5 然后和用户从邮箱复制过来的数据验签

  5. 如果验证通过则说明用户确实持有这个邮箱地址,并将这个邮箱地址加密保存到 APP 本地,否则让用户重复上面的流程。

  6. 后台检查数据库是否已存在邮箱对应的购买记录,不存在则生成订单信息并标记邮箱地址

  7. APP 收到订单信息发起支付

  8. 支付成功后,后台收到回调,将该邮箱的购买记录存入数据库

  9. 后台以邮箱、UUID 、时间戳和设备等信息记录已付费邮箱的激活记录

  10. 用户用本地认证的邮箱和 UUID 询问后台,如果激活记录小于 2 条则记录并允许激活

  11. 如果激活记录 >= 2 则阻止激活,除非让旧设备注销,如果旧设备丢失可以以邮箱发送邮件申请人工注销。

可能存在的问题

3003 次点击
所在节点    程序员
36 条回复
OneLiteCore
277 天前
@sampeng 这个经验很有价值,感谢提点!
SenLief
277 天前
@OneLiteCore 用支付凭证就可以了
yuhaofe
277 天前
另外 1~5 的流程是验证邮箱所有权,类似忘记密码,主要逻辑就是发送一封邮件,只有持有邮箱的人能够知道邮件内容
目前绝大部分 app 应该都是发送短的随机验证码或者带着随机码的链接,不太确定 lz 这样做的目的在哪里,无状态不占缓存吗,还是会更安全
OneLiteCore
277 天前
@yuhaofe 为了规避发送短信所需要的成本,短信显然不是免费的,同时也为了规避自己搭建一套账号系统,是出于运行和开发成本的考量。但是按照上面的讨论得出的结果就是,直接上微信登录似乎是一个更好的选择,或者不在乎用户二次交易的话直接用激活码更合适一些。
yueji
277 天前
在本地抓包可以把 smtp server / 账号 / 密码 明文抓包出来。
yuhaofe
277 天前
@OneLiteCore 哦哦,这个我明白,主要不清楚的还是为什么用邮箱地址和 UUID 算 MD5 再签名而不是直接后端生成临时随机码放缓存里,邮件里发随机码不是用户输入更方便吗
OneLiteCore
277 天前
@yueji 是后台通过 smtp 发送邮件到用户的邮箱,抓包没办法抓服务器的包的吧,用户在这个过程中能够看到的是后台用私钥签名的值。这样客户端本地也持有邮箱和 UUID 可以直接算 MD5 并验证签名。
OneLiteCore
277 天前
@yuhaofe 发送随机验证码的话,客户端拿到验证码还是需要去询问后台是不是这个验证码,直接用在客户端用后台的公钥去验证签名可以省略一步。不过看了上面老哥的讨论,觉得要么直接用微信登录,要么就直接激活码更合适点。
baobao1270
277 天前
1. 传统方式过于繁琐:用户需要的是步骤少,步骤越少心智负担越少,大部分人不在乎隐私,输手机号就 2. 能注册是大部分人的认知,如果能一键登录更好
小体量项目开发系统麻烦:推荐一下 logto
3. 怎么避免用户逆向改 asm
4. 怎么避免用户 mitm 改请求
5. 国内用户有没有使用邮箱的习惯?
ysy950803
277 天前
@OneLiteCore #20 发激活码是挺简单的,让用户自己保存激活码,服务器就存激活码的激活次数就行了。可以参考那个通知滤盒的购买方式。
OneLiteCore
276 天前
@baobao1270
1. 这个没毛病,赞同。
2. 小工具品类东西都在客户端上,后台也不提供服务的情况下登录了也没有更多功能,所以才考虑简化的。看了眼 logto 似乎能解决部分问题不过还是感觉略复杂,打算接微信登录算了。
3. Android 开发里面没听说过 ASM ,这个是前端的东西吗?
4. Mitm 也没听说过。
5. 国内基本是微信当邮箱用的,所以直接接入微信生态似乎是一个更好的选择
OneLiteCore
276 天前
@ysy950803 看了眼通知滤盒,这个更简单连激活码都不做,直接用订单号作为激活码了。感谢提点,很有启发!
baobao1270
276 天前
@OneLiteCore asm 就是汇编...
mitm 就是抓包
确实接入微信生态更好
OneLiteCore
276 天前
@baobao1270

1. 小工具基本没办法防止反编译啊,而且用户有这个能力的话那此时也就不是操心账号和付费系统的时候了
2. 抓包的话用 https 里面套了一层 RSA 加密,客户端和服务端互相持有对方的公钥的那种
3. 综合下来就是用微信登录和订单号作为记录最靠谱,还能预防二次转卖的问题
a67793581
276 天前
@OneLiteCore op 可以新开一个贴做一个总结
louzhichen
276 天前
银行 app 的验证码都只是六位数字,我感觉前五步不需要这么复杂,就是正常走生成随机验证码就行了。如果担心碰撞,设置一个有效期即可。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1097019

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX