企业微信H5获取外部联系人unionid

企业微信H5获取外部联系人unionid关联小程序获取同一用户在小程序中的数据信息

使用企业微信获取外部联系人unionid关联小程序,优先需要知道的是,企业微信可以通过用户userid获取到unionid,小程序可以通过openid,获取unionid,但是无法获取userid或者openid,两者只能通过统一unionid来关联。
特别需要注意的是,如果开发者拥有多个移动应用、网站应用,可通过获取用户的unionID来区分用户的唯一性,因为只要是同一QQ互联平台下的不同应用,unionID是相同的。换句话说,同一用户,对同一个QQ互联平台下的不同应用,unionID是相同的

关联绑定微信开放平台

我们首先需要做的前置步骤为关联微信开放平台——关联小程序;小程序中关联企业微信;

如果在关联小程序的时候提示未认证,那么就需要去认证,当然这不是免费的

认证完后就可以继续关联小程序,然后到微信公众平台登录小程序,去关联企业微信,并且你能在这里看见已经关联的开放平台

进入 设置——关联设置;拉倒最底下,开始关联企业微信

然后我们再到企业微信后台注意这里,要进入企业微信后台需要管理员权限
企业微信后台地址:https://work.weixin.qq.com/
首先第一步,进入【客户上下游】选择 客户——点击打开API——进行微信开发者ID绑定,绑定你需要操作的小程序还是需要管理员权限,绑定好后,记得点击 可调用应用,将权限给到你创建好的应用上面。如果还没有创建,就先创建。

创建应用

同样,在企业微信后台管理界面,打开应用管理



填写基本信息床架即可,创建好后可以打开进入应用继续配置信息。进入后需要留意,Agentid和Secret这两个数据要极好后期要用。

配置应用主页,应用负责人,可见范围这块随便鼓捣几下就行,主要还是应用主页。选择网页,填写网页域名例如: http://www.baidu.com 即可。然后保存

配置可信域名;填写例如 www.baidu.com 且该域名要与当前企业主体相关或有联系,记得下载提示中的txt文件,要放到配置域名的根目录下,且保证能够访问得到。

配置白名单 例如 127.0.0.1 如果有多个,记得用 “ ;” 符号分开,符号为英文符号。

代码部分

 // 我所使用的后台为 JFinal你们可以根据自己的框架进行改动/*** 获取企业微信token 企业ticket 应用ticket* */public void getToken() {String corpId = "此处为企业微信的corpid"; // 到企业微信管理后台 我的企业 拉到最下面就有String corpSerect = "此处为上面创建的应用的serect";try {String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpId + "&corpsecret=" + corpSerect;URL u = new URL(url);HttpsURLConnection huconn = (HttpsURLConnection) u.openConnection();BufferedReader in = null;StringBuilder result = new StringBuilder();huconn.connect();in = new BufferedReader(new InputStreamReader(huconn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {result.append(line);}if (in != null) {in.close();}// 打印返回结果System.out.println("获取token----" + result);// 返回结果为JSONObject格式,需要再做一步操作获取tokenJSONObject myJsonObject = new JSONObject();myJsonObject = JSONObject.parseObject(result.toString());String token = myJsonObject.getString("access_token");/* 成功获取到token,继续获取 企业所对应的ticket和应用所对应的ticket记得要保存token和两个ticket且时效为7200秒,*/String qyTicket = getqyTicket(token);String yyTicket = getyyTicket(token);// 封装数据返回results.set("qyTicket",qyTicket);results.set("yyTicket",yyTicket);System.out.println(results);rsPara("获取成功", results);} catch (Exception e) {e.printStackTrace();}}}// 获取企业 ticketpublic String getqyTicket(String token) {String ticket = "";try {            //https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=String url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token="+token;URL u = new URL(url);HttpsURLConnection huconn = (HttpsURLConnection) u.openConnection();BufferedReader in = null;StringBuilder result = new StringBuilder();huconn.connect();in = new BufferedReader(new InputStreamReader(huconn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {result.append(line);}if (in != null) {in.close();}// 打印返回结果System.out.println("获取qyTicket----" + result);// 返回结果为JSONObject格式,需要再做一步操作获取ticketJSONObject myJsonObject = new JSONObject();myJsonObject = JSONObject.parseObject(result.toString());ticket = myJsonObject.getString("ticket");// 打印ticketSystem.out.println("qyTicket----" + ticket);} catch (Exception e) {e.printStackTrace();}return ticket;}//获取应用ticketpublic String getyyTicket(String token) {String ticket = "";try {String url = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token="+token+"&type=agent_config";URL u = new URL(url);HttpsURLConnection huconn = (HttpsURLConnection) u.openConnection();BufferedReader in = null;StringBuilder result = new StringBuilder();huconn.connect();in = new BufferedReader(new InputStreamReader(huconn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {result.append(line);}if (in != null) {in.close();}// 打印返回结果System.out.println("获取yyTicket----" + result);// 返回结果为JSONObject格式,需要再做一步操作获取ticketJSONObject myJsonObject = new JSONObject();myJsonObject = JSONObject.parseObject(result.toString());ticket = myJsonObject.getString("ticket");// 打印ticketSystem.out.println("yyTicket----" + ticket);} catch (Exception e) {e.printStackTrace();}return ticket;}// 获取用户unionidpublic void getUnionid() {Kv results = new Kv();String userid = get("userid");Dctionaries dction = Dctionaries.dao.template("dctionaries.findByName",Kv.by("sys_name","qywx_token")).findFirst();String token = dction.getSysValue();try {             //https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list?access_token=ACCESS_TOKEN&userid=USERIDString url =  "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token="+token+"&external_userid="+userid;URL u = new URL(url);HttpsURLConnection huconn = (HttpsURLConnection) u.openConnection();BufferedReader in = null;StringBuilder result = new StringBuilder();huconn.connect();in = new BufferedReader(new InputStreamReader(huconn.getInputStream(), "UTF-8"));String line;while ((line = in.readLine()) != null) {result.append(line);}if (in != null) {in.close();}// 打印返回结果System.out.println("获取yyTicket----" + result);// 返回结果为JSONObject格式,需要再做一步操作获取unionidJSONObject myJsonObject = new JSONObject();myJsonObject = JSONObject.parseObject(result.toString());results.set("union",myJsonObject);rsPara("获取成功", results);} catch (Exception e) {e.printStackTrace();}}

前端代码,需要提醒的是wx.config 和 wx.agentConfig二者使用的ticket不一样,但是生成签名的方式是一样的,并且内部条件中对应的时间戳、随机数要和生成签名的时间戳、随机数要一致
wx.agentConfig中的agentid便是刚刚自建应用中的AgentId
生成签名的方式如下链接: https://developer.work.weixin.qq.com/document/path/90506
需要注意的是,使用sha1算法,最好还是在后台全部生成,然后返回前台。我只是偷了个懒。

         async getConfig() {const res = await Api.getToken();let qyticket = res.qyTicket //获取后台返回的企业ticketlet yyticket = res.yyTicket //获取后台返回的应用ticketlet nonceStr = util.randomString() //获取随机数let timestamp = util.getTime() //获取时间戳// 动态获取当前访问域名,一定要动态!!!const  curRoute = location.href.split('#')[0];var qySig = util.getSignature(qyticket, nonceStr, timestamp, curRoute) //生成企业签名var yySig = util.getSignature(yyticket, nonceStr, timestamp, curRoute) //生成应用签名let that = thiswx.config({beta: true, // 必须这么写,否则wx.invoke调用形式的jsapi会有问题appId: util.corpid, // 必填,企业微信的corpIDtimestamp: timestamp, // 必填,生成签名的时间戳nonceStr: nonceStr, // 必填,生成签名的随机串signature: qySig, // 必填,签名,见 附录-JS-SDK使用权限签名算法jsApiList: ['getContext', 'getCurExternalContact'], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来});wx.ready(function() {console.log("wx.config验证成功")// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。wx.agentConfig({corpid: util.corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致agentid: util.agentid, // 必填,企业微信的应用id (e.g. 1000247)timestamp: timestamp, // 必填,生成签名的时间戳nonceStr: nonceStr, // 必填,生成签名的随机串signature: yySig, // 必填,签名,见附录-JS-SDK使用权限签名算法jsApiList: ['getContext', 'getCurExternalContact'], //必填,传入需要使用的接口名称success: function(res) {console.log("wx.agentConfit验证成功")// 验证,获取外部联系人useridwx.invoke('getContext', {}, function(res) {if (res.err_msg == "getContext:ok" && res.entry == "single_chat_tools") {let entry = res.entry; //返回进入H5页面的入口类型,目前有normal、contact_profile、single_chat_tools、group_chat_tools、chat_attachmentwx.invoke('getCurExternalContact', {}, function(res) {if (res.err_msg == "getCurExternalContact:ok") {that.userId = res.userId; //返回当前外部联系人userIdthat.selectCustomer(res.userId)} else {console.log('错误信息', res) //错误处理}});} else {that.flag = falseuni.showModal({title: '提示',content: '请在聊天工具栏打开该菜单',})}})// 回调},fail: function(res) {console.log("错误:", res);if (res.errMsg.indexOf("function not exist") > -1) {alert("版本过低请升级");}},});});//   return;},async selectCustomer(userid) {// 然后通过企业微信拿到的外部联系人userid 发送到后台const res1 = await Api.getUnionid({'userid':userid});console.log("查看是否获取id:",res1.union.external_contact.unionid)//就能成功取到unionid了!!!let unionid = res1.union.external_contact.unionid},

然后就成功拿到unionid了
本记录为 企业微信开发H5页面,创建自建应用,配置工具栏获取当前外部联系人(也可以说客户)的unionid然后获取阿巴阿巴其他信息。

企业微信工具栏获取外部联系人unionid相关推荐

  1. 企业微信创建应用和开发应用的相关问题,获取外部联系人信息,聊天工具栏配置

    企业微信创建应用,h5页面,获取外部联系人信息,聊天工具栏 创建 进入企业微信后台管理,应用管理 >应用 >自建 -> 创建应用 可见范围是该应用授权可见部门(人员) 配置 1.点开 ...

  2. 企业微信hook接口,网络获取外部联系人

    简要描述 网络获取外部联系人 简要描述 102026 请求说明 参数名 必选 类型 说明 syncKey 是 string 同步key 请求示例 { "type": 102026, ...

  3. 企业微信授权获取access_token

    @Slf4j public class QiYeWeChatUtil {/*** 缓存企业微信accessToken*/public static final String QY_WX_TOKEN_k ...

  4. 微信小程序中企业微信获取外部联系人信息

    需求:企业微信聊天页面,点击可跳转微信小程序的用户详情页. 本质就是在企业微信端拿到当前联系人的unionid,然后去用户服务里找到对应的用户userid,进入用户的详情页面. 流程:后端写一个从un ...

  5. 企业微信_获取access_token

    文章目录 一.快速入门 1. 开发文档 2. 管控台 3. 接口文档 4. 参数获取 5. api调试 二.java实战 2.1. 入口 2.2. 核心方法 2.3. 核心配置 2.3. RestUt ...

  6. pywinauto WXWork(企业微信) 获取工作台中的信息

    需求1:家里有一个小店,需要订烟,中秋节前夕订烟日期调整,业务经理提前3天通知了,但是忘记了,然后就错过了,所以我要获取订烟时间,然后通过腾讯的sms,发送到几部手机上 需求2:某丝丽企业微信群需要每 ...

  7. 【企业微信】获取token 发送应用消息

    企业微信获取token 存入redis 设置时长2小时 && 发送企业应用消息接口 1.常量类 package com.ruoyi.common.constant;/*** 微信常用常 ...

  8. 微信平台或者企业微信平台打开外部图片失败解决以及优化

    先说下我这个打开失败的现象 我有十多张图片,每次打开总是能打开一部分,一部分打不开 打开图片和没打开图片是随机的 初步排除配置问题,那就是需要优化了 1.添加加载动画 不能是白对吧 我用了有赞组件,里 ...

  9. VBA实现企业微信API获取考勤数据,解析JSON数据格式。

    '通过微信API接口发送和获取数据 Function weixinAPI(starttime As String, endtime As String) As StringDim access_tok ...

  10. java调用企业微信接口---获取考勤数据

    Static和new的区别? static : 不需要创建实例可直接使用, 会直到程序关闭才会释放资源,类的一个成员被static修饰后,该成员就属于类的成员了,被所有对象共享. new 对象: 每次 ...

最新文章

  1. MIT机器狗再进化,碎石冰面上跑也不打滑,这次真的稳如狗了
  2. ES6--基础语法(一)
  3. 介绍两款Docker可视化工具
  4. 视频教程-带你入门matlab小波分析-Matlab
  5. STM32: HAL库开发概览
  6. MATLAB带通滤波器开始端和结尾端数据异常(解决的小技巧)
  7. AMEsim:车辆动力经济性建模分析三个分享点
  8. 制图中比例尺的一些问题
  9. methodsignature java_Java MethodSignature.getMethod方法代碼示例
  10. 无法打开匿名级安全令牌解决方法
  11. Google浏览器被劫持解决方法
  12. 云服务器一直显示关机中,云服务器一直处于关机状态
  13. 为什么目前的串行比并行传输快
  14. 超文本传输协议版本 2 [http/2 spec]
  15. 5059页,Python3.x最新版「官方中文教程」已经发布,内含教程、标准库、语言参考,及新版本特性!...
  16. 亚信大数据平台产品经理 杨晋:大数据是怎么应用于技术方面的
  17. 自定义控件其实很简单2/12
  18. 为什么TFN F1和F7光时域反射仪市占率那么高,为什么?
  19. 国外常用的软件测试网站
  20. HTML+CSS+JavaScript

热门文章

  1. iOS 9 真机调试
  2. linux如何快速入门
  3. CSS 实现文字头像(圆角头像文字内容)
  4. iOS Xcode12安装P12证书问题
  5. python实现图书借阅管理系统
  6. 我的世界如何安装java环境变量_JDK安装与环境变量配置方法
  7. 进销存excel_excel进销存仓库表格同步手机操作
  8. 【Altium Designer】如何导出gerber文件
  9. 模拟鼠标移动、点击,双击,键盘输入,鼠标滚轮滚动
  10. XRD测试常见问题及解答(一)