碼迷,mamicode.com
首頁 > 微信 > 詳細

小程序登錄后端實現

時間:2021-06-28 21:00:47      閱讀:0      評論:0      收藏:0      [點我收藏+]

標簽:load   line   _id   on()   cab   method   實現   user   學習   

小程序登錄后端實現

技術概述

  • 學習該技術的原因:本次軟工實踐,我們小組的項目是微信小程序,因此特地學習了小程序登錄相關的技術
  • 難點:沒什么難點

技術詳述

登錄流程描述

  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));
      }
    

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

小程序登錄后端實現

標簽:load   line   _id   on()   cab   method   實現   user   學習   

原文地址:https://www.cnblogs.com/LebronZzhang/p/14944151.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 mamicode.com 版權所有  聯系我們:gaon5@hotmail.com
迷上了代碼!
4399在线看MV_久久99精品久久久久久久久久_成人又黄又爽又刺激视频_能收黄台的app不收费