术语解释
secret
secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏。
目前secret有:
- 自建应用secret。在管理后台->“应用与小程序”->“应用”->“自建”,点进某个应用,即可看到。
- 基础应用secret。某些基础应用(如“审批”“打卡”应用),支持通过API进行操作。在管理后台->“应用与小程序”->“应用->”“基础”,点进某个应用,点开“API”小按钮,即可看到。
- 通讯录管理secret。在“管理工具”-“通讯录同步”里面查看(需开启“API接口同步”)
- 外部联系人管理secret。在“客户联系”栏,点开“API”小按钮,即可看到。---联系人这块如果需要获取外部联系人unionId ,那么就需要绑定公司的公众号了;
access_token
access_token是企业后台去企业微信的后台获取信息时的重要票据,由corpid和secret产生。所有接口在通信时都需要携带此信息用于验证接口的访问权限
以自建应用为例
目前是在自建应用中进行相关功能页面开发,且使用到授权功能,获取jssdk相关权限
test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <%@ include file="../common/taglib.jsp" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="format-detection" content="telephone=no" /> <script src="${imagePath}/static/common/js/jquery-1.7.2.min.js"></script> <link rel="stylesheet" href="${imagePath}/static/common/css/reset.css"> <%-- <link rel="stylesheet" href="https://mfiles.dongao.com/static/public/css/reset.css">--%> <link rel="stylesheet" href="${imagePath}/static/common/css/common.css"> <link rel="stylesheet" href="${imagePath}/static/common/css/signUp.css"> <link rel="stylesheet" href="${imagePath}/static/common/css/wsp_my_order.css"> <style> </style> </head> <body class="lt_my lt_personalData"> <input type="hidden" id="chooseimg" value=""/> <input type="hidden" id="upimg" value=""/> <input type="hidden" id="downimg" value=""/> <div class="top_btn "> <a href="javascript:;"> </a> <p class="user_data">个人资料</p> </div> <div class="personalData_con"> <div class="ge_zi"> <div class="ge_zi_user"> <img src="${imagePath}/static/common/images/img-weidenglu_y.png" alt="" id="avatar" > <span class="user_name" id="name"></span> </div> <div class="ge_zi_title"> <span class="go_app" >查看东奥个人信息</span> <%-- <img src="${imagePath}/static/common/images/right.png" alt="">--%> </div> </div> </div> <div class="section" style="width: 100%;"> <table id="curInfo"> </table> </div> <div class="section m-t-sm"> <div class="o_d_contNum"> <div class="o_d_dNum space_between"> <p class="d_dNum_p"> 联系人userid: <input class="txt_dNum" id="user"/> </p> <%-- <a class="num_copy txt_red">复制</a>--%> </div> </div> </div> <div class="section_t" style="margin-bottom: 0.1rem;"> <div class="sec_ticket" style="padding:0;"> <input type="text" class="sec_input_t" id="random" placeholder="输入自定义内容" /> <img src="${imagePath}/static/common/images/icon_choose_red.png" class="choose_img" /> <a class="active_btn" data-type="sendChatMessage">确认</a> </div> </div> <div class="section" style="margin-bottom: 20px;"> <table> <tr> <td>联系人类型:</td> <td> <select id="userType"> <option value="0">请选择</option> <option value="1">企业成员</option> <option value="2">外部联系人</option> </select> </td> </tr> <tr><td> --- </td><td> --- </td></tr> <tr> <td>信息类型:</td> <td> <select id="sendMsg"> <option value="text">text</option> <option value="image">image</option> <option value="news">news</option> <option value="miniprogram">miniprogram</option> </select> <button class="login_btn" data-type="sendChatMessage" style="float: right;">发送到会话输入框</button> </td> </tr> <tr><td> --- </td><td> --- </td></tr> </table> <img id="preimg" src="https://ecfiles.dongao.com/ec/shop//goods/images/20210910/1631244760976019427.png"> <button class="login_btn" data-type="checkJsApi">checkJsApi</button> <button class="login_btn" data-type="getContext">获取进入H5页面的入口环境</button> <button class="login_btn" data-type="getCurExternalChat">当前客户群的群聊ID</button> <button class="login_btn" data-type="shareToExternalChat">群发消息到客户群</button> <button class="login_btn" data-type="shareToExternalContact">群发消息到客户</button> <button class="login_btn" data-type="selectExternalContact">外部联系人选人接口</button> <button class="login_btn" data-type="openUserProfile">打开个人信息页接口</button> <button class="login_btn" data-type="launchMiniprogram">打开小程序</button> <button class="login_btn" data-type="navigateToAddCustomer">添加客户界面</button> <a class="login_btn" href="javascript:sendUrl();" target="_blank">发送网页</a> <a class="login_btn" href="javascript:authorize();" target="_blank">网页</a> <button class="login_btn" data-type="previewImage">预览</button> <button class="login_btn" data-type="chooseImage">拍照或从手机相册中选图</button> <button class="login_btn" data-type="downloadImage">下载图片</button> <button class="login_btn" data-type="uploadImage">上传图片</button> <br> <br> <textarea cols="20" class="sec_input_t" rows="10" id="biao2">用户定义的代码区域</textarea> <input type="hidden" cols="20" class="sec_input_t" rows="10" id="biao1" value="大神福利跨境电商反用户定义的代码区域<br>得到的的的示范法"/> <input type="button" onClick="copyUrl2()" value="点击复制代码" /> <br> <br> <input type="file" id="chooseimg1" accept="MIME_type" value=""/> <a href="http://vip.admin.test.com/login">全部发送2</a> </div> <input type="hidden" id="jsapi_ticket" value="${jsapi_ticket}" /> <input type="hidden" id="timestamp" value="${timestamp}" /> <input type="hidden" id="signature" value="${signature}" /> <input type="hidden" id="unionId" value="" /> <div class="logon1 clearfix"> <%-- 输入自定义内容:<input type="text" id="random" value=""/><br>--%> </div> </body> <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script> <script> var url = location.href.split('#').toString();//url不能写死 //dongaota var appid = "ww07e5628846641622"; var signature = $("#signature").val(); var timestamp = $("#timestamp").val(); var jsapi_ticket = $("#jsapi_ticket").val(); var signature1 = '${signature1}'; var timestamp1 = '${timestamp1}'; $(function () { $('.go_app').on('click',function () { thirdLogin(); }); }) function authorize() { var _actUrl = "http://23244704iy.51mypc.cn/qywx/authorize" var _url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww07e5628846641622&redirect_uri="+encodeURIComponent(_actUrl)+"&response_type=code&scope=snsapi_base&state=#wechat_redirect"; // window.open(_url); // window.open('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_input_type_file'); window.location.href = 'https://appfront.dongao.com/app/handout/V1.1/handoutInfo?appName=da-cloudclass-app&appVersion=3.1.4&debugMode=0&deviceType=1&lectureId=114473&model=OPPOR11&osType=android&osVersion=8.1.0&sign=1641f0c17735754c4372f1dce166247c&timeStamp=1632985200475&token=02f7743d4ed19223552f3095f7b7d002&uniqueId=dfd3b9c49c8d0317&userId=39119061&versionCode=106'; } function sendUrl() { var _actUrl = "http://23244704iy.51mypc.cn/qywx/authorize" var _url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww07e5628846641622&redirect_uri="+encodeURIComponent(_actUrl)+"&response_type=code&scope=snsapi_base&state=#wechat_redirect"; $('#random').val(_url); } function copyUrl2() { var Url2=document.getElementById("biao1"); Url2.select(); // 选择对象 document.execCommand("Copy"); // 执行浏览器复制命令得到的的的示范法 alert("已复制好,可贴粘。"); } function init() { wx.ready((function() { wx.invoke('getCurExternalContact', { }, function(res){ if(res.err_msg == "getCurExternalContact:ok"){ var userId = res.userId ; //返回当前外部联系人userId $("#user").val(userId) $("#user").html(userId) $.ajax({ url : "/qywx/getUserInfo", type : "get", data : {"externalUserid":userId}, dataType:"json", success : function(data){ console.log(JSON.stringify(data)) $("#avatar").attr("src",data.external_contact.avatar); $("#name").html(data.external_contact.name); $("#unionId").val(data.external_contact.unionid); var gender = data.external_contact.gender == 1 ? '男' : '女'; var type = data.external_contact.type == 1 ? '微信用户' : '企业微信用户'; var followUsers = data.follow_user; var userIds = "" for(var i=0;i<followUsers.length;i++){ userIds += followUsers[i].userid +" "; } var html = ""; html += '<tr><td>性别:</td><td>'+gender+'</tr>'; html += '<tr><td>外部联系人的类型:</td><td>'+type+'</tr>'; html += '<tr><td>添加了此外部联系人的企业成员userId:</td><td>'+userIds+'</tr>'; // <tr><td>性别:</td><td></td></tr> $("#curInfo").html(html); console.log(html) }, error : function(){ $("#memb , #loading").hide(); showErrorDiv("网络不给力,请稍后重试!"); } }); }else { //错误处理 } }); } )), wx.error((function(e) { alert(JSON.stringify(e)) } )); } function thirdLogin() { var _unionId = $("#unionId").val(); if(_unionId == '' || _unionId == null){ alert("未获取到unionId"); return false; } $.ajax({ url : "/userApi/user/V1/thirdLogin", type : "get", data : {"unionId":_unionId}, dataType:"json", success : function(data){ console.log(JSON.stringify(data)) if(data.code == 3){ alert("新用户注册"); return; } alert("东奥用户名:"+data.obj.username+"\n手机号:"+data.obj.mobilePhone) }, error : function(){ } }); } </script> <script type="text/javascript" src="${imagePath}/static/qy/qy.js"></script> </html>
qy.js
wx.config({ beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: appid, // 必填,企业微信的corpID timestamp: timestamp, // 必填,生成签名的时间戳 nonceStr: 'adfqwer', // 必填,生成签名的随机串 signature: signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法 jsApiList: ['checkJsApi'],// 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来 success: function(res) { // 回调 alert('成功config'); // init(); }, fail: function(res) { alert(res.errMsg) } }); wx.ready((function() { wx.checkJsApi({ jsApiList: ['agentConfig'], // 需要检测的JS接口列表,所有JS接口列表见附录2, success: function(res){ // 以键值对的形式返回,可用的api值true,不可用为false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} wx.agentConfig({ corpid: appid, // 必填,企业微信的corpid,必须与当前登录的企业一致 agentid: '1000006', // 必填,企业微信的应用id (e.g. 1000247) timestamp: timestamp1, // 必填,生成签名的时间戳 nonceStr: 'adfqwer', // 必填,生成签名的随机串 signature: signature1,// 必填,签名,见附录-JS-SDK使用权限签名算法 jsApiList: ['chooseImage','downloadImage','uploadImage','previewImage','imagePreview',//媒体图像 'selectExternalContact','getContext','sendChatMessage','getCurExternalChat','shareToExternalChat', 'shareToExternalContact','openUserProfile','getCurExternalContact','launchMiniprogram','navigateToAddCustomer'], //必填,传入需要使用的接口名称 success: function(res) { // 回调 // alert('成功'); init(); }, fail: function(res) { // if(res.errMsg.indexOf('function not exist') > -1){ // alert('版本过低请升级') // } alert(res.errMsg) } }); } }) $("[data-type]").on("click", (function(e) { switch ($(e.target).attr("data-type")) { case "checkJsApi": wx.checkJsApi({ jsApiList: ["getNetworkType", "previewImage", "onHistoryBack"], success: function(e) { // alert(JSON.stringify(e)) } }); break; case "getContext": wx.invoke('getContext', { }, function(res){ if(res.err_msg == "getContext:ok"){ var entry = res.entry ; //返回进入H5页面的入口类型,目前有normal、contact_profile、single_chat_tools、group_chat_tools、chat_attachment alert(entry); }else { //错误处理 } }); break; case "sendChatMessage": var type = $("#sendMsg").val(); var mediaId = $('#upimg').val(); if(type == 'text'){ if($("#random").val() == ""){ alert("请输入具体内容"); return false; } }else if(type == 'image'){ if(mediaId == '' || mediaId == null){ alert("请上传图片素材"); return false; } } wx.invoke('sendChatMessage', { msgtype: type, //消息类型,必填 text: { content:$("#random").val() == "" ? "dddd" : $("#random").val(), //文本内容 }, miniprogram: { appid: "wxd72ee341353ba2db",//小程序的appid title: "这是一道题", //小程序消息的title imgUrl:"https://yd-t-1252590610.cos.ap-beijing.myqcloud.com/zy_test/2.jpg",//小程序消息的封面图。必须带http或者https协议头,否则报错 $apiName$:fail invalid imgUrl page:"pages/index/index.html", //小程序消息打开后的路径,注意要以.html作为后缀,否则在微信端打开会提示找不到页面 }, news: {//{"errcode":0,"errmsg":"ok","url":"https://wework.qpic.cn/wwpic/970933_co_7EaaCQTimBYo_1621497789/0"} link: "https://www.baid.com", //H5消息页面url 必填 title: "葫芦娃", //H5消息标题 desc: "就是测测", //H5消息摘要 imgUrl: "https://wework.qpic.cn/wwpic/970933_co_7EaaCQTimBYo_1621497789/0", //H5消息封面图片URL }, image:{ //{"errcode":0,"errmsg":"ok","type":"image","media_id":"34OtvN1PWj9CkCi84HKhALvwMUJAUqxMUt7ONOL74k94pIb2qNr_C73C3DirFrtpd","created_at":"1621498090"} // mediaid: "34OtvN1PWj9CkCi84HKhALvwMUJAUqxMUt7ONOL74k94pIb2qNr_C73C3DirFrtpd", //图片的素材id mediaid: mediaId, //图片的素材id }, }, function(res) { if (res.err_msg == 'sendChatMessage:ok') { //发送成功 // alert("成功"); } }) break; case "getCurExternalChat": wx.invoke('getCurExternalChat', { }, function(res){ if(res.err_msg == "getCurExternalChat:ok"){ // chatId = res.chatId ; //返回当前客户群的群聊ID $("#random").val(res.chatId) }else { //错误处理 } }); break; case "shareToExternalChat": wx.invoke("shareToExternalChat", { text: { content: $("#random").val() == "" ? "默认" : $("#random").val(), // 文本内容 } },function(res) { if (res.err_msg == "shareToExternalChat:ok") { } } ); break; case "shareToExternalContact": wx.invoke("shareToExternalContact", { text: { content: $("#random").val() == "" ? "默认" : $("#random").val(), // 文本内容 } },function(res) { if (res.err_msg == "shareToExternalChat:ok") { } } ); break; case "selectExternalContact": wx.invoke('selectExternalContact', { "filterType": 0, //0表示展示全部外部联系人列表,1表示仅展示未曾选择过的外部联系人。默认值为0;除了0与1,其他值非法。在企业微信2.4.22及以后版本支持该参数 }, function(res){ if(res.err_msg == "selectExternalContact:ok"){ var userIds = res.userIds ; //返回此次选择的外部联系人userId列表,数组类型 $("#user").val(userIds); }else { //错误处理 } }); break; case "openUserProfile": var type = $("#userType").val(); if(type == 0){ alert("请选择联系人类型"); return false; } wx.invoke('openUserProfile', { "type": type, //1表示该userid是企业成员,2表示该userid是外部联系人 "userid": $("#user").val() //可以是企业成员,也可以是外部联系人 }, function(res){ alert(JSON.stringify(res)) if(res.err_msg != "openUserProfile:ok"){ //错误处理 alert(res.err_msg) } }); break; case "launchMiniprogram": wx.invoke('launchMiniprogram', { "appid" : "wxd72ee341353ba2db", // 需跳转的小程序appid "path" : "pages/index/index.html", // 所需跳转的小程序内页面路径及参数。非必填 }, function(res) { if(res.err_msg == "launchMiniprogram:ok") { // 正常 } else { // 错误处理 } } ); break; case "navigateToAddCustomer": wx.invoke('navigateToAddCustomer', {}, function(res) { }); break; case "previewImage": wx.previewImage({ current: 'http://ecafiles.test.com/ec/shop//goods/images/20210910/1631244760976019427.png', // 当前显示图片的http链接 urls: ['http://ecafiles.test.com/ec/shop//goods/images/20210910/1631244760976019427.png', 'http://ecafiles.test.com/ec/shop//goods/images/20210923/1632376417655087307.jpg'] // 需要预览的图片http链接列表 , success: function (res) { alert(JSON.stringify(res)) }, fail: function(res) { // if(res.errMsg.indexOf('function not exist') > -1){ // alert('版本过低请升级') // } alert(res.errMsg) } }); break; case "chooseImage": wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album'], // 可以指定来源是相册还是相机,默认二者都有 , 'camera' defaultCameraMode: "normal", //表示进入拍照界面的默认模式,目前有normal与batch两种选择,normal表示普通单拍模式,batch表示连拍模式,不传该参数则为normal模式。从3.0.26版本开始支持front和batch_front两种值,其中front表示默认为前置摄像头单拍模式,batch_front表示默认为前置摄像头连拍模式。(注:用户进入拍照界面仍然可自由切换两种模式) isSaveToAlbum: 1, //整型值,0表示拍照时不保存到系统相册,1表示自动保存,默认值是1 success: function (res) { var localIds = res.localIds; // 返回选定照片的本地ID列表, alert(localIds); $('#chooseimg').val(localIds); wx.uploadImage({ localId: $('#chooseimg').val(), // 需要上传的图片的本地ID,由chooseImage接口获得 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var serverId = res.serverId; // 返回图片的服务器端ID $('#upimg').val(serverId); alert('上传成功'); }, fail: function(res) { // if(res.errMsg.indexOf('function not exist') > -1){ // alert('版本过低请升级') // } alert(res.errMsg) } }); // andriod中localId可以作为img标签的src属性显示图片; // iOS应当使用 getLocalImgData 获取图片base64数据,从而用于img标签的显示(在img标签内使用 wx.chooseImage 的 localid 显示可能会不成功) }, fail: function(res) { // if(res.errMsg.indexOf('function not exist') > -1){ // alert('版本过低请升级') // } alert(res.errMsg) } }); break; case "downloadImage": var down = $('#upimg').val(); if(down == '' || down ==null){ alert("请上传图片"); return; } wx.downloadImage({ serverId: down, // 需要下载的图片的服务器端ID,由uploadImage接口获得 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var localId = res.localId; // 返回图片下载后的本地ID } }); break; case "uploadImage": var val = $('#chooseimg').val(); if(val == '' || val ==null){ alert("请选择图片"); return; } wx.uploadImage({ localId: val, // 需要上传的图片的本地ID,由chooseImage接口获得 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var serverId = res.serverId; // 返回图片的服务器端ID $('#upimg').val(serverId); alert('上传成功'); } }); break; } } )); $('#preimg').on("click", function (e) { var attr = $(this).attr('src'); wx.invoke('imagePreview', { "current" : attr, "urls": [attr] }, function(res) { if(res.err_msg == "launchMiniprogram:ok") { // 正常 } else { // 错误处理 // alert(JSON.stringify(res)) } } ); }) } )), wx.error((function(e) { alert(JSON.stringify(e)) } ));
java
packagecom.dongao.api.controller.qywx; importcom.alibaba.fastjson.JSONObject; importcom.dongao.api.common.utils.HttpClientUtil; importcom.dongao.api.controller.BaseController; importcom.dongao.api.service.QywxService; importcom.dongao.phoenix.cache.app.api.AppRedisCacheApi; importcom.dongao.phoenix.cache.yd.api.activity.YdActivityCacheApi; importorg.apache.commons.codec.digest.DigestUtils; importorg.apache.commons.lang3.StringUtils; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.ui.Model; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; importorg.springframework.web.bind.annotation.ResponseBody; importorg.springframework.web.servlet.ModelAndView; importjavax.imageio.ImageIO; importjava.awt.image.BufferedImage; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.math.BigDecimal; importjava.util.HashMap; importjava.util.Map; value="/qywx") (publicclassQyWxTestControllerextendsBaseController { privateAppRedisCacheApiappRedisCacheApi; privateStringcorpid="企业id";//东奥TaprivateStringcorpsecret="联系人secret";//secretprivateStringyysecret="自建应用 secret";//自建应用 secretprivateQywxServiceqywxService; value="test", method=RequestMethod.GET) (publicModelAndViewtest(StringuserId) { ModelAndViewmav=newModelAndView(); //企业级相关参数封装---startStringtoken=qywxService.getToken(corpid, yysecret); StringqyTicket=qywxService.getQyTicket(token); // String jsapi_ticket = "HoagFKDcsGMVCIY2vOjf9jrUNEJNLLR2WPkrgMMDKw74iOsUPpswCqNNxac1LhI_TmA0SfykOWBod3o3a0y4Bg";Stringnoncestr="adfqwer"; Longtimestamp=System.currentTimeMillis()/1000; Stringurl=request.getRequestURL().toString(); Strings1="jsapi_ticket="+qyTicket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url; Stringsignature=DigestUtils.sha1Hex(s1); System.out.println(s1+"---"+signature); mav.addObject("jsapi_ticket",qyTicket); mav.addObject("noncestr",noncestr); mav.addObject("timestamp",timestamp); mav.addObject("signature",signature); //企业级相关参数封装---end//应用级相关参数封装---start// String token2 = qywxService.getToken(corpid, yysecret);StringsmallTicket=qywxService.getSmallTicket(token); // String jsapi_ticket1 = "EdbdhSr1jvTn/2K4zJfjCg==";Stringnoncestr1="adfqwer"; Longtimestamp1=System.currentTimeMillis()/1000; Strings2="jsapi_ticket="+smallTicket+"&noncestr="+noncestr1+"×tamp="+timestamp1+"&url="+url; Stringsignature1=DigestUtils.sha1Hex(s2); System.out.println("s2****"+s2+"-----"+signature1); mav.addObject("noncestr1",noncestr1); mav.addObject("timestamp1",timestamp1); mav.addObject("signature1",signature1); //应用级相关参数封装---endmav.setViewName("qy/test"); returnmav; } "/getUserInfo") (publicStringgetExternalUserInfo(Modelmodel, StringexternalUserid) { Stringtoken=qywxService.getToken(corpid, corpsecret); StringexternalUserInfo=qywxService.getExternalUserInfo(token, externalUserid, null); System.out.println(externalUserInfo); returnexternalUserInfo; } /*** 网页授权* @param code* @return*/value="authorize", method=RequestMethod.GET) (publicModelAndViewauthorize(Stringcode) { ModelAndViewmav=newModelAndView(); StringuserInfo=qywxService.getuserinfoByCode(code, qywxService.getToken(corpid, yysecret)); mav.addObject("user", JSONObject.parse(userInfo)); mav.setViewName("qy/authorize"); returnmav; } }
备注:
获取企业的jsapi_ticket https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket
获取应用的jsapi_ticket https://qyapi.weixin.qq.com/cgi-bin/ticket/get
都可以使用 应用secret 获取的accesstoken 进行获取两个ticket