1. 程式人生 > 其它 >小程式登入後端實現

小程式登入後端實現

小程式登入後端實現

技術概述

  • 學習該技術的原因:本次軟工實踐,我們小組的專案是微信小程式,因此特地學習了小程式登入相關的技術
  • 難點:沒什麼難點

技術詳述

登入流程描述

  1. 呼叫 wx.login()獲取 臨時登入憑證code ,並回傳到後端。
  2. 後端呼叫 auth.code2Session 介面,換取 使用者唯一標識 OpenID 、 使用者在微信開放平臺帳號下的唯一標識UnionID(若當前小程式已繫結到微信開放平臺帳號) 和 會話金鑰 session_key
  3. 後端將獲取的OpenID和資料庫中的欄位進行比對,若資料庫中存在該OpenID,表示該使用者不是首次登入,則從資料庫中取出該使用者相關資訊
    ,存入session中,並在後端的許可權框架中予以授權認證。
  4. 若資料庫中不存在該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));
      }
    

技術使用中遇到的問題和解決過程