</pre>     搞了两天jsapi ,小有感觉,给童鞋们分享下</p><p></p><p></p><p></p><p>首先是后台需要向前台传递<span style="font-size:24px;color:#ff0000;">两个ticket</span>一个是jsapi的一个是groupticket.废话不说上代码</p><p></p><pre class="java" name="code">/*** 获取管理组jsapi临时票据接口地址(GET)   */public final static String GET_JS_GROUP_TICKET_URL = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=ACCESS_TOKEN&type=contact";/*** 管理组jsapi临时票据* @param access_token* @return*/public static JsGroupTicket getJsGroupTicket(String access_token){JsGroupTicket jsGroupTicket=null; try {String url = "";url = GET_JS_GROUP_TICKET_URL.replace("ACCESS_TOKEN", access_token);JSONObject jsonObject  = HttpRequest(url,"GET",null);// 如果请求成功  if (null != jsonObject && jsonObject.containsKey("ticket") ) {  try {  jsGroupTicket = new JsGroupTicket();  jsGroupTicket.setGroupTicket(jsonObject.getString("ticket"));jsGroupTicket.setExpiresIn(jsonObject.getInt("expires_in"));jsGroupTicket.setGroupId(jsonObject.getString("group_id"));System.out.println("获取JsGroupTicket成功:"+jsGroupTicket.getGroupTicket()+"————有效时间:"+jsonObject.getInt("expires_in"));} catch (Exception e) {  jsGroupTicket = null;  // 获取token失败  String error = String.format("获取JsGroupTicket失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));  System.out.println(error);}  }  } catch (Exception e) {e.printStackTrace();}return jsGroupTicket;} 
<pre class="java" name="code">/*** 获取jsapi的临时票据接口地址(GET)   */public final static String GET_JS_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN";/*** 获取jsapiTicket* @param access_token* @return*/public static JsApiTicket getJsapiTicket(String access_token){JsApiTicket jsapiTicket=null; try {String url = "";url = GET_JS_ACCESS_TOKEN_URL.replace("ACCESS_TOKEN", access_token);JSONObject jsonObject  = HttpRequest(url,"GET",null);// 如果请求成功  if (null != jsonObject && jsonObject.containsKey("ticket") ) {  try {  jsapiTicket = new JsApiTicket();  jsapiTicket.setJsapiTicket(jsonObject.getString("ticket"));jsapiTicket.setExpiresIn(jsonObject.getInt("expires_in"));System.out.println("获取JsapiTicket成功:"+jsapiTicket.getJsapiTicket()+"————有效时间:"+jsonObject.getInt("expires_in"));} catch (Exception e) {  jsapiTicket = null;  // 获取token失败  String error = String.format("获取JsapiTicket失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));  System.out.println(error);}  }  } catch (Exception e) {e.printStackTrace();}return jsapiTicket;} 
<pre class="java" name="code">public class JsApiTicket {//临时票据private String jsapiTicket;//有效时间private int expiresIn;//签名private String signature;//生成签名的随机串private String nonceStr;//生成签名的时间戳private String timestamp;//企业号corpidprivate String  appId;
public class JsGroupTicket {//管理组临时票据private String groupTicket;//有效时间private int expiresIn;//签名private String signature;//生成签名的随机串private String nonceStr;//生成签名的时间戳private String timestamp;//企业号corpidprivate String  appId;//access_token对应管理组的标识符private String  groupId;}
/*** * @param jsurl 当前网页的URL,不包含#及其后面部分* @return* @throws IOException*/public static JsApiTicket getSignature(String jsurl) throws IOException {/*** 对 jsapi_ticket、 timestamp 和 nonce 按字典排序 对所有待签名参数按照字段名的 ASCII码从小到大排序(字典序)后,* 使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。* 这里需要注意的是所有参数名均为小写字符。 * 接下来对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行URL转义。*  即 signature=sha1(string1)。* 如果没有按照生成的key1=value&key2=value拼接的话会报错*/JsApiTicket ticket=null;String timestamp = null;String jsapiTicket=null;String nonce=null;ticket=getJsapiTicket(access_token){;  jsapiTicket=ticket.getJsapiTicket();nonce=getNonceStr();timestamp = getTimeStamp();//注意这里参数名必须全部小写,且必须有序String[] paramArr = new String[] { "jsapi_ticket=" + jsapiTicket,"timestamp=" + timestamp, "noncestr=" + nonce, "url=" + jsurl };Arrays.sort(paramArr);//将排序后的结果拼接成一个字符串String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2]).concat("&"+paramArr[3]);System.out.println("拼接之后的content为:"+content);String gensignature = null;try {MessageDigest md = MessageDigest.getInstance("SHA-1");// 对拼接后的字符串进行 sha1 加密byte[] digest = md.digest(content.toString().getBytes());gensignature = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}//  将 sha1 加密后的字符串与 signature 进行对比if (gensignature != null) {ticket.setTimestamp(timestamp);ticket.setNonceStr(nonce);ticket.setSignature(gensignature);ticket.setAppId(TokenThread.appid);return ticket;// 返回signature} else {return null;}}/*** @param jsurl 当前网页的URL,不包含#及其后面部分* @return* @throws IOException*/public static JsGroupTicket getGroupSignature(String jsurl) throws IOException {/*** 对 group_ticket、 timestamp 和 nonce 按字典排序 对所有待签名参数按照字段名的 ASCII码从小到大排序(字典序)后,* 使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。* 这里需要注意的是所有参数名均为小写字符。 * 接下来对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行URL转义。*  即 signature=sha1(string1)。* 如果没有按照生成的key1=value&key2=value拼接的话会报错*/JsGroupTicket ticket=null;String timestamp = null;String groupTicket=null;String nonce=null;ticket=getJsGroupTicket(access_token){;  groupTicket=ticket.getGroupTicket();nonce=getNonceStr();timestamp = getTimeStamp();//注意这里参数名必须全部小写,且必须有序String[] paramArr = new String[] { "group_ticket=" + groupTicket,"noncestr=" + nonce, "timestamp=" + timestamp,"url=" + jsurl };Arrays.sort(paramArr);//将排序后的结果拼接成一个字符串String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2]).concat("&"+paramArr[3]);System.out.println("拼接之后的content为:"+content);String signature = null;try {MessageDigest md = MessageDigest.getInstance("SHA-1");// 对拼接后的字符串进行 sha1 加密byte[] digest = md.digest(content.toString().getBytes());signature = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}//  将 sha1 加密后的字符串与 signature 进行对比if (signature != null) {ticket.setTimestamp(timestamp);ticket.setNonceStr(nonce);ticket.setSignature(signature);ticket.setAppId(TokenThread.appid);return ticket;// 返回signature} else {return null;}}/***  将字节数组转换为十六进制字符串** @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串** @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a','b', 'c', 'd', 'e', 'f' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}private static String getNonceStr() {return UUID.randomUUID().toString();}/*** 得到时间戳* @return*/private static String getTimeStamp() {return Long.toString(System.currentTimeMillis() / 1000);}

servlet

 public void jsGroupManager(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException {HttpSession session = request.getSession();String uri=request.getRequestURI();String action = request.getParameter("action");if("group".equals(action)){JsApiTicket ticket=GetJsApiSignature.getSignature("http://*****/testServlet?type=jsGroup&action=group");request.setAttribute("ticket", ticket);JsGroupTicket groupTicket=GetJsApiSignature.getGroupSignature("http://******/testServlet?type=jsGroup&action=group");request.setAttribute("groupTicket", groupTicket);request.getRequestDispatcher("/page/test/jsGroupApi.jsp").forward(request, response);}}

页面

<%@ page language="java" contentType="text/html; charset=utf-8"   pageEncoding="utf-8"  import="java.util.*"%>
<%@ taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<script type="text/javascript" src="<%=path%>/ui/ligerui/lib/jquery/jquery-1.11.1.min.js"></script>
<script src="http://res.wx.qq.com/open/js/<span style="color:#ff0000;">jweixin-1.1.0.js</span>" type="text/javascript"></script>
<html  >
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0"><title>jspGroup</title>
</head>
<script type="text/javascript">  wx.config({debug: true,appId: '${<span style="color:#ff0000;">ticket</span>.appId}',timestamp: '${ticket.timestamp}',nonceStr: '${ticket.nonceStr}',signature: '${ticket.signature}',jsApiList: [// 所有要调用的 API 都要加到这个列表中'openEnterpriseChat','openEnterpriseContact','getNetworkType']});wx.ready(function(){// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。var evalWXjsApi = function(jsApiFun) {if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {jsApiFun();} else {document.attachEvent && document.attachEvent("WeixinJSBridgeReady", jsApiFun);document.addEventListener && document.addEventListener("WeixinJSBridgeReady", jsApiFun);}}document.querySelector('#<span style="color:#ff0000;">openEnterpriseContact_invoke</span>').onclick = function() {evalWXjsApi(function() {WeixinJSBridge.invoke("openEnterpriseContact", {groupId: '${groupTicket.groupId}',    // 必填,管理组权限验证步骤1返回的group_idtimestamp:'${groupTicket.timestamp}',    // 必填,管理组权限验证步骤2使用的时间戳nonceStr: '${groupTicket.nonceStr}',    // 必填,管理组权限验证步骤2使用的随机字符串signature: '${groupTicket.signature}',  // 必填,管理组权限验证步骤2生成的签名params : {departmentIds : [1],    // 非必填,可选部门ID列表(<span style="color:#ff0000;">如果ID为0</span>,表示可选管理组权限下所有部门)tagIds : [],    // 非必填,可选标签ID列表(如果ID为0,表示可选所有标签)userIds : [],    // 非必填,可选用户ID列表mode : 'multi',    // 必填,选择模式,single表示单选,multi表示多选type : ['department','tag','user'],    // 必填,选择限制类型,指定department、tag、user中的一个或者多个selectedDepartmentIds : [],    // 非必填,已选部门ID列表selectedTagIds : [],    // 非必填,已选标签ID列表selectedUserIds : [],    // 非必填,已选用户ID列表},}, function(res) {if (res.err_msg.indexOf('function_not_exist') > 0) {alert('版本过低请升级');} else if (res.err_msg.indexOf('openEnterpriseContact:fail') > 0) {return;}var result = JSON.parse(res.result);    // 返回字符串,开发者需自行调用JSON.parse解析var selectAll = result.selectAll;     // 是否全选(如果是,其余结果不再填充)if (!selectAll){var selectedDepartmentList = result.departmentList;    // 已选的部门列表for (var i = 0; i < selectedDepartmentList.length; i++) {var department = selectedDepartmentList[i];var departmentId = department.id;    // 已选的单个部门IDvar departemntName = department.name;    // 已选的单个部门名称alert("已选的部门名称:" + departemntName);}var selectedTagList = result.tagList;    // 已选的标签列表for (var i = 0; i < selectedTagList.length; i++) {var tag = selectedTagList[i];var tagId = tag.id;    // 已选的单个标签IDvar tagName = tag.name;    // 已选的单个标签名称alert("已选的单个标签名称:" + tagName);}var selectedUserList = result.userList;    // 已选的成员列表for (var i = 0; i < selectedUserList.length; i++) {var user = selectedUserList[i];var userId = user.id;    // 已选的单个成员IDvar userName = user.name;    // 已选的单个成员名称alert("已选的单个成员名称:" + userName+userId);}}});});}$("#openChat").click(function () {wx.openEnterpriseChat({userIds: '***********',    // 必填,参与会话的成员列表。格式为userid1;userid2;...,用分号隔开,最大限制为1000个。userid单个时为单聊,多个时为群聊。groupName: '',  // 必填,会话名称。单聊时该参数传入空字符串""即可。success: function(res) {// 回调alert(res);},fail: function(res) {if(res.errMsg.indexOf('function not exist') > 0){alert('版本过低请升级');}}});});});               </script>
<body >
<form action="<%=basePath%>testServlet" method="post" ><br>    <br>  <input id="openChat" type="button" value="打开会话"><input id="<span style="color:#ff0000;">openEnterpriseContact_invoke</span>" type="button" value="选择通讯录"><br>    <br>  appId:${ticket.appId}<br>timestamp: ${ticket.timestamp}<br>nonceStr: ${ticket.nonceStr}<br>signature: ${ticket.signature}<br>
</form></body>
</html>

页面有几个需要注意的地方,一定要导入1.1.0以后版本,另外童鞋们微信web开发者工具暂时不支持企业会话调试

jweixin-1.0.0.js中没用开启企业会话接口

欢迎大家多提意见,共同进步,微信企业号客服真真的不敢恭维

不说了,只能靠自己

jsapi 调用创建企业会话和企业通讯录相关推荐

  1. 微信企业号已停止提供企业消息会话服务器,企业微信注册时显示会话服务已经被安装了怎么解决 解决攻略教程大全...

    2016年4月18日,腾讯正式发布全平台企业办公工具"企业微信",并通过腾讯应用宝独家首发安卓版."企业微信"的推出将为企业员工提供最基础和最实用的办公服务,并 ...

  2. 对象可以创建数组吗_企业微信活码如何创建?活码可以统计渠道来源吗?

    文丨语鹦企服私域管家原创,未经授权不得转载 在微信上,当我们要举办大型活动引流客户,或想避免所有客户都加到同一个客服号时,需要借助微信活码来实现客户分流.那么在企业微信上有类似的功能吗?企业微信活码如 ...

  3. 企业微信如何设置通讯录权限?

    企业在使用企业微信移动办公时,出于保护公司信息,通常有设置企业通讯录权限的需要,那么该如何设置访问权限呢? 前言 企业在使用企业微信移动办公时,对于企业成员的管理与通讯录密不可分,企业通常有设置查看企 ...

  4. 如何利用LTD营销SaaS成员功能创建数字化在线运营企业?

    在20世纪末,我们做生意只需要选址开店,企业用最传统的方式经营运作: 后来,2010年左右,网站兴起,社交媒体发展,原来越多的生意在虚拟的互联网中进行:如今,大数字化时代,单纯的单个网站已经满足不了企 ...

  5. 当Web2.0进入企业——免费的企业3.0软件3A完全评测

    当Web2.0进入企业--免费的企业3.0软件3A完全评测 导读 当Web 2.0进入企业,并融合了即时通讯等网络工具以及思维导图等知识工具,企业3.0应运而生. 企业3.0是这样一种软件工具:是团队 ...

  6. 系统架构师-基础到企业应用架构-企业应用架构

    为什么80%的码农都做不了架构师?>>>    一.上篇回顾 我们先来回顾下上篇讲解的内容,我们前面的几节分别讲述了,业务逻辑层.数据访问层.服务层.表现层,我们了解了这些分层的职责 ...

  7. 企业画像在企业活动中的价值

    随着大数据信息时代的到来以及大数据处理技术的日益发展,从海量冗杂的企业活动数据中挖掘有价值的数据,帮助政府.银行.券商.会计师.律师.投资方.企业自身等挖掘和计算企业360度全方位的信息,包括发现和挖 ...

  8. 什么是企业中台?企业为什么要建中台?企业如何建设中台?

    一.引言 近期阅读了钟华的有关阿里巴巴中台战略的资料,阿里中台战略中的共享服务的实践对自己有非常大的启发.结合多年建设IT系统的经验,以及目前国内众多企业建设中台的需求,谈一下自己对企业建设中台的思路 ...

  9. 什么是企业中台?企业为什么要建设中台?企业如何建设中台?

    一.引言 近期阅读了钟华的有关阿里巴巴中台战略的资料,阿里中台战略中的共享服务的实践对自己有非常大的启发.结合多年建设IT系统的经验,以及目前国内众多企业建设中台的需求,谈一下自己对企业建设中台的思路 ...

最新文章

  1. ArcMap 通过DEM获取高程值
  2. system()函数实现
  3. matlab光滑曲线连接散点图
  4. Visual studio中编译和使用libpng和zlib
  5. React的核心概念
  6. android问题记录
  7. ipython jupyter区别_ipython jupyter notebook中显示图像和数学公式实例
  8. 2019.3.23 捕获异常
  9. Flowable 数据库表结构 ACT_GE_PROPERTY
  10. css过度效果 从无到有,求教,对于CSS3 transition和transform实现的一个特效原理不是太明白?...
  11. 博客园里写blog可以添加自己的js文件
  12. 数据库工程师基础学习1----计算机硬件基础知识,计算机体系结构与存储系统
  13. pdf复制去掉换行符
  14. pytest_03_pycharm运行pytest (转:上海悠悠)
  15. 我们的青春已落幕,用 Python 分析韦德职业生涯数据
  16. 对国产操作操系统的一点看法
  17. Win11家庭版没有本地组策略编辑器怎么办?
  18. montypython买火柴_python nltk 笔记(持续更新)
  19. iOS安全—防注入hook api “-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null”
  20. 利用WITH AS改写SQL

热门文章

  1. Pixhawk无人机-ArduPilot 软件SITL仿真模拟飞行(SITL+MAVProxy)
  2. 转正小结计算机,计算机实习生转正自我鉴定
  3. 通过LR给男生的照片营造一种“少年感”色调
  4. Python利用Turtle绘制一颗小树
  5. 老Mac电脑安装macOS Ventura实战
  6. iOS使用JSBox实现一键查询公交
  7. 【英语:基础高阶_经典外刊阅读】L1.阅读理解—读题定位法
  8. 大数据时代的跨国比较研究与比较教育学科转型
  9. 十日均线算法oracle,10日均线法的详解
  10. PC端(win10)与机器人端(ubuntu)的远程连接