1. 数据表准备
开发小程序时需要先规划好数据表结构。主要涉及用户信息表、会话状态表等核心数据表。用户信息表应包含openid、unionid、昵称、头像等字段。会话状态表用于存储用户登录状态,包含session_key、过期时间等字段。
2. 反向生成工具使用
可以使用mybatis-generator等工具反向生成数据访问层代码。配置好数据库连接信息后,工具会自动根据表结构生成对应的实体类、Mapper接口和XML映射文件,大幅提高开发效率。
3. 前端数据封装
小程序端提交的数据需要经过封装处理。建议统一使用JSON格式传输数据,前后端约定好字段命名规范。对于用户信息等敏感数据,需要进行加密处理后再传输。
4. 服务器配置
小程序服务器需要配置HTTPS协议,这是微信小程序的强制要求。同时需要配置好域名白名单,只有经过验证的域名才能访问后端接口。建议使用Nginx做反向代理,配置合理的超时时间和连接数。
5. 微信SDK集成
后端需要集成微信小程序SDK来处理登录、支付等功能。主要包含以下步骤:
引入官方提供的SDK依赖
配置appid和appsecret
实现签名校验方法
配置消息加解密方式
6. 用户信息获取流程
获取用户信息的基本流程如下:
1. 小程序端调用wx.login获取code
2. 将code发送到开发者服务器
3. 服务器用code向微信服务器换取session_key和openid
4. 服务器保存session_key并生成自己的sessionid返回给客户端
5. 客户端后续请求携带sessionid进行身份验证
7. 登录状态维护
登录状态维护需要注意:
DROP TABLE IF EXISTS `wx_user`; CREATE TABLE `wx_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名称', `password` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码', `gender` tinyint(3) NOT NULL DEFAULT 0 COMMENT '性别:0 未知, 1男, 1 女', `birthday` date NULL DEFAULT NULL COMMENT '生日', `last_login_time` datetime(0) NULL DEFAULT NULL COMMENT '最近一次登录时间', `last_login_ip` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最近一次登录IP地址', `user_level` tinyint(3) NULL DEFAULT 0 COMMENT '用户层级 0 普通用户,1 VIP用户,2 区域代理用户', `nickname` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称或网络名称', `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户手机号码', `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户头像图片', `weixin_openid` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '微信登录openid', `status` tinyint(3) NOT NULL DEFAULT 0 COMMENT '0 可用, 1 禁用, 2 注销', `add_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除', `share_user_id` int(11) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `user_name`(`username`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Compact;
session_key有效期通常为30天
需要定期检查登录状态是否过期
com.github.binarywang weixin-java-miniapp3.3.0
过期后需要客户端重新发起登录
oa: wx: app-id: wxf23b28b5e4ea4d6aapp-secret: 212621faa31cdf0691367ea45b2b6041 msgDataFormat: JSON
服务器要妥善保管session_key,不能泄露给客户端
8. 数据安全注意事项
@Data @Configuration @ConfigurationProperties(prefix = "oa.wx") public class WxProperties { /** * 设置微信小程序的appId */ private String appId; /** * 设置微信小程序的Secret */ private String appSecret; /** * 消息数据格式 */ private String msgDataFormat; }
会话密钥session_key绝不下发到小程序端
临时登录凭证code只能使用一次
@Configuration public class WxConfig { @Autowired private WxProperties properties; @Bean public WxMaConfig wxMaConfig() { WxMaInMemoryConfig config = new WxMaInMemoryConfig(); config.setAppid(properties.getAppId()); config.setSecret(properties.getAppSecret()); config.setMsgDataFormat(properties.getMsgDataFormat()); return config; } @Bean public WxMaService wxMaService(WxMaConfig maConfig) { WxMaService service = new WxMaServiceImpl(); service.setWxMaConfig(maConfig); return service; } }
用户敏感数据需要进行加密传输
@RequestMapping("/wx/auth") public class WxAuthController { @Autowired private WxMaService wxService; @PostMapping("login_by_weixin") public Object loginByWeixin(@RequestBody WxLoginInfo wxLoginInfo, HttpServletRequest request) { //客户端需携带code与userInfo信息 String code = wxLoginInfo.getCode(); UserInfo userInfo = wxLoginInfo.getUserInfo(); if (code == null || userInfo == null) { return ResponseUtil.badArgument(); }//调用微信sdk获取openId及sessionKey String sessionKey = null; String openId = null; try { WxMaJscode2SessionResult result = this.wxService.getUserService().getSessionInfo(code); sessionKey = result.getSessionKey();//session id openId = result.getOpenid();//用户唯一标识 OpenID } catch (Exception e) { e.printStackTrace(); } if (sessionKey == null || openId == null) { log.error("微信登录,调用官方接口失败:{}", code); return ResponseUtil.fail(); }else{ log.info("openId={},sessionKey={}",openId,sessionKey); } //根据openId查询wx_user表 //如果不存在,初始化wx_user,并保存到数据库中 //如果存在,更新最后登录时间 //.... // token UserToken userToken = null; try { userToken = UserTokenManager.generateToken(user.getId()); } catch (Exception e) { log.error("微信登录失败,生成token失败:{}", user.getId()); e.printStackTrace(); return ResponseUtil.fail(); } userToken.setSessionKey(sessionKey); log.info("SessionKey={}",UserTokenManager.getSessionKey(user.getId())); Map
接口调用需要做好签名校验
用户信息存储要考虑字符编码问题,推荐使用utf8mb4支持emoji
9. 配置文件管理
小程序开发涉及多个配置文件:
小程序项目配置文件project.config.json
服务器配置文件如application.properties
数据库配置文件如my.ini
建议将敏感配置信息与代码分离,使用环境变量或配置中心管理。
user.loginByWeixin(res.userInfo).then(res => { app.globalData.hasLogin = true; wx.navigateBack({ delta: 1 }) })
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态