日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

企业微信小程序_授权登录接口获取用户userid

發布時間:2024/9/27 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 企业微信小程序_授权登录接口获取用户userid 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


文章目錄

          • 一、前置知識
            • 1. 閱讀 企業微信小程序開發文檔
            • 2. 企業微信小程序登錄流程
            • 3. 微信小程序區別
          • 二、前端部分
            • 2.1. 調用登錄接口
            • 2.2. 請求后端接口
            • 2.3. 項目源碼
          • 三、后端部分
            • 3.1. yml配置
            • 3.2. 獲取用戶信息接口
            • 3.3. 獲取token
            • 3.4. 工具類
            • 3.5. vo對象
          • 四、調試部分
            • 4.1. 模式切換
            • 4.2. api執行流程
            • 4.3. 報文賞評

一、前置知識
1. 閱讀 企業微信小程序開發文檔

https://developer.work.weixin.qq.com/document/path/92426

2. 企業微信小程序登錄流程

企業微信小程序獲取access_token文檔

3. 微信小程序區別

區分企業微信小程序登錄流程和微信小程序登錄流程不同點。

不同點:
1.企業微信小程序登錄流程和微信小程序登錄流程不一樣,獲取的用戶信息也不一樣。
2.企業微信小程序登錄流程需要將企業微信小程序先發布上傳嗎,審核通過后,將企業微信小程序與企業應用進行綁定后,獲取該應用的agentSecret和corpId去獲取AccessToken,然后,通過AccessToken和code獲取用戶信息,最后通過獲取的userid在調用通訊錄接口獲取該用戶的詳細信息。
3.開發階段:可以使用企業微信提供的測試應用的agentSecret和corpId

二、前端部分
2.1. 調用登錄接口

執行流程會從前端到后端:
前端調用騰訊企業微信登錄接口api
登錄api開發文檔:https://developer.work.weixin.qq.com/document/path/91506
uniapp項目小程序項目寫法:

// 企業微信下程序登錄的方法login() {wx.qy.login({success: function(res) {// 調用成功,會返回codeconsole.log("res", res)}})},

返回的報文:

{code: "VFUfreDIauQszKQy5mZgRC3aaMijd7DM-xnOcZW3LVE", errMsg: "qy__login:ok"}

小程序項目寫法:

//app.js App({onLaunch: function() {wx.qy.login({success: function(res) {if (res.code) {//發起網絡請求wx.request({url: 'https://test.com/onLogin',data: {code: res.code}})} else {console.log('登錄失敗!' + res.errMsg)}}});} })
2.2. 請求后端接口

攜帶code調用后端接口
這里使用封裝好的axios和user接口api,直接使用即可
utils/request.js,這個js主要封裝了axios,對請求統一管理,請求url以及數據拼接以及響應處理(這個工具類需要和后端的返回對象JsonData.java對上,下面會貼出來代碼)。

const BASE_URL = 'http://api.ant-qywx.com:9900'; function request({ url, data, method }) {return new Promise((resolve, reject) => {// 發起網絡請求uni.request({url: BASE_URL + url,data,method,success: ({ data }) => {console.log("data",data)// 響應成功,獲取數據,解析數據if (data.success) {resolve(data);} else {// 響應失敗,給用戶提示uni.showToast({title: data.message,icon: 'none',mask: true,duration: 3000,});reject(data.message);}},fail: (error) => {reject(error);},complete: () => {// 關閉加載uni.hideLoading();},});}); }export default request;

引入api

<script>// 引用用戶接口api 調用后端登錄接口import {loginAuth} from '../../api/user.js'; </script>

編寫登錄方法調用企業微信登錄接口

methods: { // 企業微信下程序登錄的方法login() {wx.qy.login({success: function(res) {console.log("res", res)loginAuth(res).then((response) => {console.log("response", response)});}})} }

api/user.js這里js,作用是管理用戶相關接口api

import request from '../utils/request';/*** 微信用戶授權登錄,攜帶appid和code參數,調用后端接口獲取Openid*/ export function loginAuth(data) {return request({url: '/mini/login',data: {code: data.code,},}); }
2.3. 項目源碼

https://gitee.com/gblfy/qywx-inner-java-api

三、后端部分
3.1. yml配置

application.yml

server:port: 9900qywx:mini:agentSecret: i5t-rh8bXeNCgihcYPrG9ZPpWkivzPJ69sv570osk6IcorpId: ww17f8d10783494584
3.2. 獲取用戶信息接口

Controller

package com.gblfy.qywxin.controller;import com.gblfy.qywxin.service.QywxInnerMiniService; import com.gblfy.qywxin.utils.JWTUtils; import com.gblfy.qywxin.vo.JsonData; import com.gblfy.qywxin.vo.QywxInnerUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController @RequestMapping("/mini") public class QywxMiniController {private static final Logger logger = LoggerFactory.getLogger(QywxMiniController.class);@Value("${qywx.mini.corpId}")private String corpId;@Autowiredprivate QywxInnerMiniService qywxInnerMiniService;@GetMapping("/login")public JsonData login(@RequestParam(value = "code", required = false) String code) {logger.info("accept code->{}", code);Map result = qywxInnerMiniService.getOauthUser(corpId, code);logger.info("accept result->{}", result);//本案例僅從企業微信接口獲取未從數據表中獲取QywxInnerUser user = new QywxInnerUser();user.setCorpId(corpId);user.setUserId((String) result.get("userId"));String token = JWTUtils.geneJsonWebToken(user);result.put("token", token);return JsonData.buildSuccess(result);} }
3.3. 獲取token

service

package com.gblfy.qywxin.service;import com.gblfy.qywxin.config.QywxInnerConfig; import com.gblfy.qywxin.utils.RestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;import java.util.Map;@Service public class QywxInnerMiniService {private static final Logger logger = LoggerFactory.getLogger(QywxInnerMiniService.class);@Value("${qywx.mini.agentSecret}")private String AGENT_SECRET;public Map getOauthUser(String corpId, String code) {// 1.通過corpId獲取AccessTokenString accessToken = getAccessToken(corpId);String getOauthUrl = String.format(QywxInnerConfig.MINI_OAUTH_USER_URL, accessToken, code);Map response = RestUtils.get(getOauthUrl);if (response.containsKey("errcode") && (Integer) response.get("errcode") != 0) {logger.error(response.toString());return response;}System.out.println("response->" + response);// 目前已經獲取到userid了// return response;//根據用戶UserId->獲取通訊錄用戶詳情getString userId = (String) response.get("userid");String url = String.format(QywxInnerConfig.USER_DETAIL_URL, accessToken, userId);Map detaiResponse = RestUtils.get(url);//獲取錯誤日志if (detaiResponse.containsKey("errcode") && (Integer) detaiResponse.get("errcode") != 0) {logger.error(detaiResponse.toString());}return detaiResponse;}/*** 通過corpId獲取AccessToken** @param corpId 企業ID* @return*/public String getAccessToken(String corpId) {String result = "";String accessTokenUrl = String.format(QywxInnerConfig.MINI_ACCESS_TOKEN_URL, corpId, AGENT_SECRET);Map response = RestUtils.get(accessTokenUrl);//獲取錯誤日志if (response.containsKey("errcode") && (Integer) response.get("errcode") != 0) {logger.error(response.toString());} else {result = (String) response.get("access_token");}return result;} }
3.4. 工具類

RestUtils

package com.gblfy.qywxin.utils;import com.alibaba.fastjson.JSONObject; import org.springframework.context.annotation.Configuration; import org.springframework.http.*; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder;import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Map; import java.util.Objects;@Configuration public class RestUtils {private static final RestTemplate restTemplate = new RestTemplate();public static JSONObject get(String url, Map<String,String> urlParams){return get(urlToUri(url,urlParams));}//在處理企業微信某些參數時有問題public static JSONObject get(String url){return get(URI.create(url));}private static JSONObject get(URI uri){ResponseEntity<JSONObject> responseEntity =restTemplate.getForEntity(uri,JSONObject.class);serverIsRight(responseEntity); //判斷服務器返回狀態碼return responseEntity.getBody();}public static JSONObject post(String url,Map<String,String> urlParams,JSONObject json){//組裝urlreturn post(urlToUri(url,urlParams),json);}public static JSONObject post(String url,JSONObject json){//組裝urLreturn post(URI.create(url),json);}private static JSONObject post(URI uri,JSONObject json){//組裝url//設置提交json格式數據HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<JSONObject> request = new HttpEntity(json, headers);ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(uri,request,JSONObject.class);serverIsRight(responseEntity); //判斷服務器返回狀態碼return responseEntity.getBody();}private static URI urlToUri(String url,Map<String,String> urlParams){//設置提交json格式數據UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url);for(Map.Entry<String,String> entry : urlParams.entrySet()) {uriBuilder.queryParam((String)entry.getKey(), (String) entry.getValue()) ;}return uriBuilder.build(true).toUri();}public static JSONObject upload(String url,MultiValueMap formParams){//設置表單提交HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formParams, headers);ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(url,request,JSONObject.class);serverIsRight(responseEntity); //判斷服務器返回狀態碼return responseEntity.getBody();}public static String download(String url,String targetPath) throws IOException {ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class);if(rsp.getStatusCode() != HttpStatus.OK){System.out.println("文件下載請求結果狀態碼:" + rsp.getStatusCode());}// 將下載下來的文件內容保存到本地Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody()));return targetPath;}public static byte[] dowload(String url){ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class);return rsp.getBody();}private static void serverIsRight(ResponseEntity responseEntity){if(responseEntity.getStatusCodeValue()==200){ // System.out.println("服務器請求成功:{}"+responseEntity.getStatusCodeValue());}else {System.out.println("服務器請求異常:{}"+responseEntity.getStatusCodeValue());}}}

JWTUtils

package com.gblfy.qywxin.utils;import com.gblfy.qywxin.vo.QywxInnerUser; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;public class JWTUtils {private static final long EXPIRE = 60000 * 60 * 24 * 7;private static final String SECRET = "tobdev.com";private static final String TOKEN_PREFIX = "tobdev";private static final String SUBJECT = "tobdev";/*** 生成jwt token** @param user* @return*/public static String geneJsonWebToken(QywxInnerUser user) {String token = Jwts.builder().setSubject(SUBJECT).claim("corp_id", user.getCorpId()).claim("user_id", user.getUserId()).claim("user_name", user.getName()).claim("mobile", user.getMobile()).claim("qr_code", user.getQrCode()).claim("user_type", user.getUserType()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRE)).signWith(SignatureAlgorithm.HS256, SECRET).compact();token = TOKEN_PREFIX + token;return token;}/*** 校驗token是否合法** @param token* @return*/public static Claims checkJWT(String token) {try {final Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();return claims;} catch (Exception e) {return null;}} }
3.5. vo對象
package com.gblfy.qywxin.vo;/*** 返回封裝對象** @author gblfy* @date 2022-01-12*/ public class JsonData {/*** 業務上的成功或失敗*/private boolean success = true;private Integer code;private String msg;private Object data;public JsonData() {}public JsonData(Integer code, Object data, String msg,boolean success) {this.code = code;this.data = data;this.msg = msg;this.success = success;}public static JsonData buildSuccess() {return new JsonData(0, null, null,true);}public static JsonData buildSuccess(Object data) {return new JsonData(0, data, null,true);}public static JsonData buildError(String msg) {return new JsonData(-1, null, msg,false);}public static JsonData buildError(Integer code, String msg) {return new JsonData(code, null, msg,false);}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public boolean getSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;} }

其他相關類,小伙伴們看源碼吧,見2.3小節

四、調試部分
4.1. 模式切換

4.2. api執行流程

4.3. 報文賞評

調用login的api返回報文

{"code": "uXGXKHjUcNLbtO0sBNylDpOHmpgmXTnNkDLVMYWu7MQ" }

調用后端獲取用戶信息接口返回的報文

{"success": true,"code": 0,"msg": null,"data": {"corpid": "wwea98220fdcd8a38d","deviceid": "","errcode": 0,"errmsg": "ok","session_key": "qz2VF4V3RTagW+awOAZdpA==","token": "tobdeveyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0b2JkZXYiLCJjb3JwX2lkIjoid3cxN2Y4ZDEwNzgzNDk0NTg0IiwiaWF0IjoxNjQyNDI3ODUyLCJleHAiOjE2NDMwMzI2NTJ9.965kwCYUt6h-BeCA-WUaf20LrHpMvzX8WYigNlkJJIQ","userid": "ZeXin"} }

總結

以上是生活随笔為你收集整理的企业微信小程序_授权登录接口获取用户userid的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。