企业微信 创建应用后如何构造网页授权 获取token 获取用户信息

news/2024/11/17 7:19:24/

第一次对接企业微信,上网找了各种方案。

目的是在企业微信中,公司发给员工一个地址,员工点开后打开画面,在这个画面上可以获取到这个员工的userid(后续功能操作就是各自不同的功能了哈,就不详细说了)。

然后根据官网内容,分析了一下,我需要连接官网的【构造网页授权】【获取token】【获取用户信息】。

然后调查了别人怎么写,查来查去除了写内容,还需要一些配置。

前端使用的vue的uniapp框架。后台使用Java。

如果符合你现在的需求,可以参照下面的方法~ ^-^~

1. 企业微信相关官网

先了解企业微信官网介绍 获取access_token - 接口文档 - 企业微信开发者中心

【构造网页授权】【获取token】【获取用户信息】部分的接口介绍。

2. 企业微信创建应用,我参照的是以下文章


http://t.csdn.cn/hUAXz

3. 前端代码
onLoad() {this.getwecom();},methods: {getwecom() {// 当前企业的 corp_idconst corp_id = 'xxxxxxxxxxx企业的corp_id';// 重定向 URL → 最终打开的画面地址,域名是在企业微信上配置好的域名 比如我的域名是https://my.test.com:9999/#/ → #是代表路径结束。这里/和#必须这样子写。const redirect_uri = encodeURI('https://my.test.com:9999/#/');//企业的agentId 每个应用都不一样const agentId = 10000001;//获取当前路径的code(有code代表已经回调过了)let code = this.getUrlCode(); //是否存在codeif(code === undefined || code == null || code === "") {//不存在就打开地址进行授权,这里是默认授权(没写手动授权咋写),授权后直接跳转到redirect_uri 设置的地址,地址后会有回调的code参数值//必须是encodeURIComponent(路径)window.location.href =`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${corp_id}&redirect_uri=${encodeURIComponent(redirect_uri)}&response_type=code&scope=snsapi_base&state=STATE&agentid=${agentId}#wechat_redirect`}//到这里已经是能获取到code了(已经经过了企业微信授权)//获取token和用户信息可以在后台调用,weComAuthorize就是当前框架访问后台的方法。和后台项目配置的返回值。具体企业微信返回内容请参照官网。weComAuthorize(code).then(res => {if (res.code == 200 && res.user.errcode == 0) {console.log(res.user.userid)alert(res.user.userid)}})},getUrlCode() {// 截取url中的code方法let url = new URL(window.location.href)return new URLSearchParams(url.search).get("code");},
}
4.后台代码

import net.sf.json.JSONObject;/*** 前台网页授权后 - 获取企业微信的token  根据token和code得到用户信息** @return 结果*/public AjaxResult getUserInfo(HttpServletRequest request, @PathVariable("code") String code) throws Exception{// 获取token 这里获取token的方案本案例就不详细贴附了,可以参照获取用户信息方式去获取token//corpId等参数值,需要在企业微信查到,传入WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();config.setCorpId(corpId);config.setCorpSecret(corpSecret);config.setAgentId(agentId);WxCpServiceImpl wxCpService = new WxCpServiceImpl();wxCpService.setWxCpConfigStorage(config);WxCpExternalServiceImpl wxCpExternalService = new WxCpExternalServiceImpl(wxCpService);String token = wxCpExternalService.getToken();//根据code获取用户信息,url地址拼接参照官网地址String url = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token="+token+"&code="+code;JSONObject jsonObject = HttpsRequestUtil.httpsRequest(url, "GET", null);System.out.println(jsonObject);AjaxResult ajax = AjaxResult.success();ajax.put("user", jsonObject);return ajax;}
//发送请求的工具类
package com.xxx.xxxx.util;import net.sf.json.JSONObject;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;public class HttpsRequestUtil {/*** 发起https请求并获取结果** @param requestUrl 请求地址* @param requestMethod  请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;HttpsURLConnection conn = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.setConnectTimeout(5000);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = conn.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);}jsonObject = JSONObject.fromObject(buffer.toString());// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();} catch (ConnectException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}return jsonObject;}}

注意:

① https://my.test.com:9999/#/这个域名需要加在企业微信的受信任域名里,配置可以官网找参考

② 本地运行的的时候,需要把当前的公网ip配置在企业微信的应用的白名单ip设置里,配置可以百度参考。不加有可能报ip的错误。

③ 我当前本地没有办法实时运行,我都是改一点发布在环境里去看的。(如果有小可爱知道怎么在本地打开,麻烦留言给我哦)。

④ 如果改一点发布实在麻烦,可以分段代码测试,只要下列过程中,复制后的路径中有code,调用后台的方法返回的是40029错误,就发布到环境上试试对不对就行了。

下载一个pc端的企业微信,可以在HBuilder中,点击运行-运行到浏览器-选择一个浏览器运行,会得到这个画面

 把图片中的路径,复制到企业微信里,在企业微信里点击。能跳转到你最终要的画面就证明没问题了。

 打开之后点击右上角三个点点击复制链接地址。这个地址就是你最终要显示的画面地址啦~(ps:就是配置的redirect_uri 的值,如果这个时候地址打开的不是你想要的,可能就是前台这里的地址配置有问题!)

 

以下是复制后的地址

https://my.test.com:9999?code=CT0Io7SIbcgTTdHYZgYBHcBZe4N8hyBjlQawZRYy7lk&state=STATE#/

⑤ 前端要发布在当前域名的环境中,后台代码要是只在本地的话,需要把本地ip配置在当前域名下,不然打开④的画面是404找不到页面。

⑥ weComAuthorize调用后台的时候,可以在回调④中回调地址中复制code的参数,单独传给后台,测试后台返回的接口内容。如果后台返回的是【{"errcode":40029,"errmsg":"invalid code, hint: [1687329093612132300786691], from ip: 59.xx.xxx.130, more info at https://open.work.weixin.qq.com/devtool/query?e=40029"}】,那其实基本是没问题了。是code已经被使用,只要把前台的代码发布在环境里,在企业微信点击域名,就是能够得到用户id了。


http://www.ppmy.cn/news/502221.html

相关文章

python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)

目录 一、前言二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略三、轨迹图像的处理要点四、本篇部分核心控制策略python代码:五、结论 一、前言 基于最近的测试,得到了一种粗略控制的算法,其控制效果适合单线路和急转弯的情…

【PTA】【C语言】母牛生小牛-递归

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?递归实现。 函数接口定义: int Cow(int n);该函数返回第n年牛的总数量&#xff…

递归案例 ---- 母牛生小牛

项目场景: 提示:这里简述项目相关背景: // 有一头小母牛。从第四年起每年生一头小母牛。 // 生的小母牛也是从第四年起每年生一头小母牛。 // 如此循环。编程求N年后有多少头母牛。。。。。。。 /* * 思路:递归套娃 * Year coun…

母牛生小牛问题递归python实现

#File Name : 母牛问题.py # 开始有一只母牛 母牛每年可以生一只母牛 # 新出生三年后才能每年生一只母牛 假设都不会死 # 第n年有几只def cowNum(N):if N<1:return 1return cowNum(N-1)cowNum(N-3)a cowNum(7) print(a)# f(n) f(n-1) f(n-3) # 今年的牛 去年的牛 三年…

苹果电脑可以进行数据恢复吗

可能对于一个做设计的人来说&#xff0c;拥有一款苹果电脑是一个最大的愿望吧&#xff0c;当然&#xff0c;咱不能跟土豪们对&#xff0c;他们可能还没毕业就有苹果电脑了&#xff0c;咱们一般的工薪族&#xff0c;小白领们&#xff0c;可能现在连ipad都用不上&#xff0c;更别…

小牛马的编程

1 自我介绍 大家好我是来自甘肃兰州&#xff0c;大一的学生&#xff0c;要说我是怎么喜欢上编程的那就要从一部电影说起来了&#xff0c;《没有绝对安全的系统》我就感觉黑客都很厉害&#xff0c;随便就入侵别人的系统&#xff0c;各种攻击&#xff0c;然后我也看了一些关于黑…

Python爬虫小牛翻译

在网上找下牛的爬虫一直没找到&#xff0c;决心自己写一个&#xff0c;打开小牛翻译开放平台&#xff0c;发现小牛有开放的API接口&#xff0c;这样接非常方便啦。 先打开小牛的网页查看它的api接口解析&#xff1a; 再去控制台找到apikey&#xff08;登入才有&#xff09;和po…

母牛生小牛问题(不懂)

有一头母牛,当年年初生一头小母牛,每头小母牛出生第四年年初(算当年,即三年后)也生一头小母牛,问20年后共有多少头母牛? #include <stdio.h> int main() {int i, firstYear, secondYear, thirdYear, forthYear;firstYear 2;secondYear 3;thirdYear 4;for (i 4; i …