这边文章是以自己的项目逻辑来整理的文章,可能不符合他人项目;
1、需求是通过用户授权获取微信绑定的手机号,来确定用户的身份权限;
2、同时小程序端又有自己的wx.login 逻辑;虽然现在小程序改版后可以不通过wx.login来获取手机号,但是其他操作必须要session_key ,所以还是利用小程序的wx.login吧;
根据需求如果不管用户是否授权手机号,都需要统计用户信息、数量等,就需要添加额外一张小程序匿名用户的openid 的绑定表;如果仅仅是对授权手机号的用户识别,仅需要一个手机号+openid 的联合表就行了;
注意: 微信换绑手机号,会对小程序用户授权绑定的手机号有影响,必须双重考虑,每次登录都应该重新获取绑定手机号,以获取真实的绑定关系,而不是通过openid就单纯的确定手机号了。
以下两个需求都说明一下:
一:需要记录每位微信小程序的用户数据,
需要两张表,手机号主表+openid 附表
小程序用户表 mp_user
appid | openid | unionid | session_key | access_token | expire_time | user_id |
---|---|---|---|---|---|---|
小程序APPID | 微信用户openid | 微信用户unionid | 登录后session_key | 服务端token | 登录有效期(可不要) | 手机授权user |
用户手机号表: user_phone
以手机号用户标志,方便用户业务脱离小程序
phone | country_code | nickname | head |
---|---|---|---|
手机号 | 区号 | 昵称 | 头像 |
流程说明:
1、小程序登录(静默登录无需界面体现),刷新小程序用户表session_key、access_token等信息
2、授权手机号登录,检查openid+appid 和手机号是否和之前绑定的一致,如果不一致说明用户换绑了手机号,则需要在小程序用户表解除旧的绑定,添加新的绑定关系;
二:仅仅有用户手机号表 user_phone
一张表设计可能存在以下问题:
- 以openid为主要信息,手机号等为附加信息;所有设置以openid为主键;无法扩展到小程序外部,如果要扩展,可能也需要将手机号表独立出来。
- 如果用户换绑微信手机号,则重新登录授权手机号后,会刷掉之前的手机号;从而导致无法找到之前的手机号;
- 经过对比,建议还是使用方式一的设计吧,这样数据分开维护;一张表也会关联session_key、openid等;
根据以上解析,还是建议使用第一种方案,方便拓展用户业务逻辑,独立以手机号为主用户标志的业务。
附加:完善的数据表字段设计
CREATE TABLE `user_phone` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`phone_number` varchar(255) NOT NULL COMMENT '手机号(不带区号)',
`country_code` varchar(255) NOT NULL COMMENT '区号',
`nickname` varchar(255) NOT NULL DEFAULT '' COMMENT '昵称',
`avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '头像地址',
`show_price` tinyint(3) unsigned NOT NULL DEFAULT '0',
`created_at` bigint(20) unsigned NOT NULL,
`updated_at` bigint(20) NOT NULL,
`user_identity` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '用户身份',
PRIMARY KEY (`id`),
UNIQUE KEY `phone_number` (`phone_number`,`country_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='手机号用户表';
CREATE TABLE `wx_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`appid` varchar(255) NOT NULL DEFAULT '',
`openid` varchar(255) NOT NULL DEFAULT '',
`unionid` varchar(255) NOT NULL DEFAULT '',
`session_key` varchar(255) NOT NULL DEFAULT '',
`access_token` varchar(255) NOT NULL DEFAULT '',
`user_id` bigint(20) unsigned DEFAULT NULL,
`created_at` bigint(20) unsigned NOT NULL,
`updated_at` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `openid` (`openid`,`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='小程序-微信openid用户表';
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。