官方描述:
微信接口服务:即微信服务器。
具体的流程如下:
1.前端调用wx.login()获取登录凭证code
2.前端请求后端进行认证,发送code
3.后端请求微信获取openid
4.后端生成认证成功凭证返回给前端。
说明
- 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号) 和 会话密钥 session_key。
根据官方的认证流程我们定义本项目小程序认证的交互流程:
customer工程提供认证接口,publics工程作为一个公共服务提供与微信通信的接口。
前端与cutomer交互不与publics交互。
因为还可能有其他服务与微信进行交互,所以把这一块单独抽出来,放到publics里面
步骤说明:
首先微信小程序点击登陆之后,会用wx.login,生成code,把这个code发给我们的后端
调用wechatApi获取到最关键的openid
public LoginResDTO loginForCommonUser(LoginForCustomerReqDTO loginForCustomerReqDTO) {// code换openIdOpenIdResDTO openIdResDTO = wechatApi.getOpenId(loginForCustomerReqDTO.getCode());if(ObjectUtil.isEmpty(openIdResDTO) || ObjectUtil.isEmpty(openIdResDTO.getOpenId())){// openid申请失败throw new CommonException(ErrorInfo.Code.LOGIN_TIMEOUT, ErrorInfo.Msg.REQUEST_FAILD);}CommonUser commonUser = commonUserService.findByOpenId(openIdResDTO.getOpenId());//如果未从数据库查到,需要新增数据if (ObjectUtil.isEmpty(commonUser)) {commonUser = BeanUtil.toBean(loginForCustomerReqDTO, CommonUser.class);long snowflakeNextId = IdUtil.getSnowflakeNextId();commonUser.setId(snowflakeNextId);commonUser.setOpenId(openIdResDTO.getOpenId());commonUser.setNickname("普通用户"+ RandomUtil.randomInt(10000,99999));commonUserService.save(commonUser);}else if(CommonStatusConstants.USER_STATUS_FREEZE == commonUser.getStatus()) {// 被冻结throw new CommonException(ErrorInfo.Code.ACCOUNT_FREEZED, commonUser.getAccountLockReason());}//构建tokenString token = jwtTool.createToken(commonUser.getId(), commonUser.getNickname(), commonUser.getAvatar(), UserType.C_USER);return new LoginResDTO(token);}
点到wechatapi的getopenid
openid是微信用户在家政o2o平台的唯一标识
点到我们的另一个微服务
这块是固定的,不需要搞懂,只需要知道传递什么参数(4个)即可
public String getOpenid(String code) {Map<String, Object> requestUrlParam = this.getAppConfig();requestUrlParam.put("js_code", code);String result = HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code", requestUrlParam);log.info("getOpenid result:{}", result);JSONObject jsonObject = JSONUtil.parseObj(result);if (ObjectUtil.isNotEmpty(jsonObject.getInt("errcode"))) {throw new ServerErrorException(jsonObject.getStr("errmsg"));} else {return jsonObject.getStr("openid");}}
因为有一个参数直接拼接在了请求路径上,所以这个地方传递了三个参数
private Map<String, Object> getAppConfig() {Map<String, Object> requestUrlParam = new HashMap();requestUrlParam.put("appid", this.wechatProperties.getAppId());requestUrlParam.put("secret", this.wechatProperties.getSecret());return requestUrlParam;}
小程序登录 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html 然后从数据中查询是否有返回的openid
不存在就新增数据,最后生成token返回给前端,前端会把这个token保存到storage中