小程序登录后端实现
小程序登录后端实现
技术概述
- 学习该技术的原因:本次软工实践,我们小组的项目是微信小程序,因此特地学习了小程序登录相关的技术
- 难点:没什么难点
技术详述
登录流程描述
- 调用 wx.login()获取 临时登录凭证code ,并回传到后端。
- 后端调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
- 后端将获取的OpenID和数据库中的字段进行比对,若数据库中存在该OpenID,表示该用户不是首次登录,则从数据库中取出该用户相关信息,存入session中,并在后端的权限框架中予以授权认证。
- 若数据库中不存在该OpenID,则该用户为首次登录,前端再调用授权方法,将所需的用户信息(如微信头像、微信号等)传回后端,后端将其存入数据库并完成登录操作。
代码
-
登录工具类(用来模拟http请求以调用 auth.code2Session 接口)
/** * 登录工具类 */ public class LoginUtil { public final static String APP_ID="wxdb41305d2e277130"; public final static String SECRET="fe8f2cfceccab6110f2c4f0913a803e9"; public static String httpRequest(String requestUrl,String requestMethod,String output){ try{ URL url = new URL(requestUrl); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setRequestMethod(requestMethod); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); if(null != output){ OutputStream outputStream = connection.getOutputStream(); outputStream.write(output.getBytes("utf-8")); outputStream.close(); } // 从输入流读取返回内容 InputStream inputStream = connection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null){ buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; connection.disconnect(); return buffer.toString(); }catch(Exception e){ e.printStackTrace(); } return ""; } }
-
auth.code2Session 接口返回结果类
/** * 结果类 * @author 11313 */ @Data @AllArgsConstructor @NoArgsConstructor public class LoginResult { /** * 用户唯一标识 */ private String openid; /** * 会话密钥 */ private String session_key; /** * 用户在开放平台的唯一标识符 */ private String unionid; /** * 错误码 */ private Integer errcode; /** * 错误信息 */ private String errmsg; }
-
登录接口
@PostMapping("/loginRequest") public String loginRequest(@RequestParam("code") String code, HttpSession session) { UserBO userBO=loginService.loginRequest(code); session.setAttribute("user",userBO); String token=TokenUtil.getToken(userBO); PersonVO personVO=new PersonVO(); personVO.setId(userBO.getId()); personVO.setPortrait(userBO.getPortrait()); personVO.setQq(userBO.getQq()); personVO.setTel(userBO.getTelephone()); personVO.setUsername(userBO.getUsername()); CreditVO creditVO=new CreditVO(); if(userBO.getCredit()!=null) { creditVO.setCreditScore(userBO.getCredit().getCreditScore()); creditVO.setLikeNum(userBO.getCredit().getLikeNum()); creditVO.setDislikeNum(userBO.getCredit().getDislikeNum()); } personVO.setCredit(creditVO); return JSON.toJSONString(Result.successResult(new LoginVO(personVO,token))); }
-
授权接口
@UserLoginToken @PostMapping("/userAuth") public String userAuth(@RequestParam("nickname") String wechatAccount,@RequestParam("avatar_url") String portrait,HttpSession session) { UserBO user= (UserBO) session.getAttribute("user"); UserBO newUser=loginService.userAuth(user.getId(),wechatAccount,portrait); session.setAttribute("user",newUser); PersonVO personVO=new PersonVO(); personVO.setId(newUser.getId()); personVO.setPortrait(newUser.getPortrait()); personVO.setQq(newUser.getQq()); personVO.setTel(newUser.getTelephone()); personVO.setUsername(newUser.getUsername()); CreditVO creditVO=new CreditVO(); if(newUser.getCredit()!=null) { creditVO.setCreditScore(newUser.getCredit().getCreditScore()); creditVO.setLikeNum(newUser.getCredit().getLikeNum()); creditVO.setDislikeNum(newUser.getCredit().getDislikeNum()); } personVO.setCredit(creditVO); return JSON.toJSONString(Result.successResult(personVO)); }
技术使用中遇到的问题和解决过程
无