小程式登入後端實現
阿新 • • 發佈:2021-06-28
小程式登入後端實現
技術概述
- 學習該技術的原因:本次軟工實踐,我們小組的專案是微信小程式,因此特地學習了小程式登入相關的技術
- 難點:沒什麼難點
技術詳述
登入流程描述
- 呼叫 wx.login()獲取 臨時登入憑證code ,並回傳到後端。
- 後端呼叫 auth.code2Session 介面,換取 使用者唯一標識 OpenID 、 使用者在微信開放平臺帳號下的唯一標識UnionID(若當前小程式已繫結到微信開放平臺帳號) 和 會話金鑰 session_key。
- 後端將獲取的OpenID和資料庫中的欄位進行比對,若資料庫中存在該OpenID,表示該使用者不是首次登入,則從資料庫中取出該使用者相關資訊
- 若資料庫中不存在該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)); }
技術使用中遇到的問題和解決過程
無