微信小程序-獲取OPENID做為用戶的唯一標識


需求-獲取openId做為用戶的唯一標識

以下內容基於UNI-APP+SPRINGBOOT

1 分析需求

獲取openId需要調用調用 auth.code2Session接口(GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code),該接口需要3+1個參數,這里的3是:appid+secret+js_code。

3個參數的獲取方法

  1. js_code需要通過調用 wx.login() 獲取臨時登錄憑證code ,而小程序插件中使用時,需要在用戶信息功能頁中獲得用戶授權之后調用。否則將返回 fail, 這時候如果打印wx.login的返回值res,那么code是“the code is a mock one”。因此,我們還需要先獲得授權,然后使用wx.login獲得code
  2. 可以通過下述步驟找到appid,secret

微信公眾平台 > > > 左側菜單欄- - -開發- - -開發管理 > > > 開發設置

在這里插入圖片描述

請求參數和返回值詳見官網:HTTPS://DEVELOPERS.WEIXIN.QQ.COM/MINIPROGRAM/DEV/API-BACKEND/OPEN-API/LOGIN/AUTH.CODE2SESSION.HTML

為優化用戶體驗,使用 WX.GETUSERINFO 接口直接彈出授權框的開發方式將逐步不再支持。從2018年4月30日開始,小程序與小游戲的體驗版、開發版調用 WX.GETUSERINFO 接口,將無法彈出授權詢問框,默認調用失敗。正式版暫不受影響。開發者可使用以下方式獲取或展示用戶信息

2 解決思路

  1. 獲得授權
  2. 通過WX.LOGIN()獲得CODE
  3. 在微信開發平台獲取APPID,SECRET
  4. 調用AUTH.CODE2SESSION(GET HTTPS://API.WEIXIN.QQ.COM/SNS/JSCODE2SESSION?APPID=APPID&SECRET=SECRET&JS_CODE=JSCODE&GRANT_TYPE=AUTHORIZATION_CODE)接口獲得OPENID,

3 獲得授權

調用WX.GETUSERPROFILE可彈出確認授權框,建議事件驅動

代碼示例如下:

getUserInfo:function(){ wx.getUserProfile({ desc: '用於完善會員資料', // 聲明獲取用戶個人信息后的用途,后續會展示在彈窗中,請謹慎填寫 success: (res) => { console.log(res); console.log(res.userInfo); // 獲取code this.getCode(); }, fail: (res)=>{ console.log(res) } }) }, 

4 獲得code

getCode(){ let _this = this; wx.login({ success (res) { console.log(res); let code=res.code; if (code) { //發起網絡請求,_this.request是我基於wx.request做的封裝,后附着代碼 _this.request({ // url 自己的服務器或者后端的請求路徑 url: 'http://localhost:8010/weixin/login', data: {code:code} }).then(res => { console.log(res); }) } else { console.log('登錄失敗!' + res.errMsg) } } }) } 

這里我是封裝的WX.REQUEST,路徑SRC/UTILS/REQUEST.JS,

export default (params) => { return new Promise((resolve, reject) => { // 加載中 uni.showLoading({ title: "加載中" }) wx.request({ ...params, success(res) { resolve(res.data); }, fail(err) { reject(err); }, complete() { uni.hideLoading(); } }) }) } 

在MAIN.JS中全局引入REQUEST,

import request from "./utils/request"; Vue.prototype.request = request; 

5 后端接收code,返回openId

后端通過CODE向HTTPS://API.WEIXIN.QQ.COM/SNS/JSCODE2SESSION?APPID=APPID&SECRET=SECRET&JS_CODE=JSCODE&GRANT_TYPE=AUTHORIZATION_CODE發送請求,獲得OPENID,並返回

后端參考原文:https://blog.csdn.net/mengdi_cao/article/details/109717187

5.1 封裝請求參數

@Getter public class WeixinLoginParams { private String secret="b1d3de815c086fcc88f0fe06d4dc7da9"; private String appid = "wx753dc3d18bcd580e"; private final String grantType="authorization_code"; } 

5.2 封裝返回值

@Data @ToString public class WXloginRes { private String openid; private String sessionKey; private String errcode; private String errmsg; } 

5.3 封裝工具類用於向接口發起請求

import com.alibaba.fastjson.JSONObject; import com.restaurant.order.vo.WXloginRes; import com.restaurant.order.vo.WeixinLoginParams; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; public class WeiXinLoginUtils { public static WXloginRes getLoginResult(String code){ RestTemplate restTemplate = new RestTemplate(); WeixinLoginParams loginParams = new WeixinLoginParams(); WXloginRes wXloginRes = new WXloginRes(); // 封裝請求參數 String url = "https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type={grantType}"; Map<String, String> requestMap = new HashMap<>(); requestMap.put("appid", loginParams.getAppid()); requestMap.put("secret", loginParams.getSecret()); requestMap.put("grantType", loginParams.getGrantType()); requestMap.put("code", code); // 發送請求,獲得返回值 ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class,requestMap); // 轉換成json對象 JSONObject jsonObject=JSONObject.parseObject(responseEntity.getBody()); String openId=jsonObject.getString("openid"); String sessionKey=jsonObject.getString("session_key"); String errcode = jsonObject.getString("errcode"); String errmsg = jsonObject.getString("errmsg"); // 給返回對象wXloginRes賦值 wXloginRes.setOpenid(openId); wXloginRes.setOpenid(sessionKey); wXloginRes.setErrcode(errcode); wXloginRes.setErrmsg(errmsg); return wXloginRes; } } 

5.4 書寫接口

這里的Result是我自己封裝的統一返回對象,詳見:https://blog.csdn.net/qq_43644923/article/details/116507939?spm=1001.2014.3001.5501

@GetMapping("/login") public Result login(String code){ if (code==null){ return Result.error("錯誤,請重新授權"); }else { return Result.success(WeiXinLoginUtils.getLoginResult(code)); } } 

d);
wXloginRes.setOpenid(sessionKey);
wXloginRes.setErrcode(errcode);
wXloginRes.setErrmsg(errmsg);

    return wXloginRes;
    
}

}




##### 4.5.4 書寫接口

這里的Result是我自己封裝的統一返回對象,詳見:https://blog.csdn.net/qq_43644923/article/details/116507939?spm=1001.2014.3001.5501

```java
@GetMapping("/login")
public Result login(String code){
    if (code==null){
        return Result.error("錯誤,請重新授權");
    }else {

        return Result.success(WeiXinLoginUtils.getLoginResult(code));
    }
}
http://www.jnnr.cn/news_show_409.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM