序:
简直了,各种坑,各种报错,各种猜,各种。。。。先说!代开发应用和第三方应用配置那个url回调(httpsget解密明文和httpspost解析xml来获取suite_ticket)是一模一样的!==》node配置企业微信回调配置HttpGet教程 、node配置企业微信回调配置HttpPost你本地的ip和服务器上的ip记得都去配置下白名单!!(服务商信息>基本信息>IP白名单)我知道你很急,但是你先别急,跟着我思路来雪狼用egg.js(node搞的后端),但是你就算是java还是php也没事,你可以看我思路,我顺带连官方文档链接也会一并放博文里。你记得suite_ticket 别写死,你永远都要用最新的suite_ticket来运行!!!!!!!!!!
流程
应用suite_access_token的获取=》获取预授权码=》设置授权配置=》获取授权链接=》用户点击授权链接跳转企业微信扫码授权=》授权成功跳转回业务域名在url会传递auth_code(临时授权码)=》拿预授权码换企业永久授权码(这里有个坑)
正文
一、suite_access_token(第三方应用凭证)
官方文档===》获取第三方应用凭证 - 接口文档 - 企业微信开发者中心
async accessTokenFun(){
let m = this,
{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token', {
method: 'POST',
data: {
"suite_id":this.SuiteID ,
"suite_secret":this.Secret,
"suite_ticket": this.suite_ticket
},
contentType: 'json',
dataType: 'json',
});
m.suite_access_token=result.data.suite_access_token
if(m.suite_access_token==undefined){
alert("需要重新获取suite_ticket")
}else{
await m.get_pre_auth_code()
}
}
参数是否必须说明suite_id是第三方应用id或者代开发应用模板id。第三方应用以ww或wx开头应用id(对应于旧的以tj开头的套件id);代开发应用以dk开头suite_secret是第三方应用secret 或者代开发应用模板secretsuite_ticket是企业微信后台推送的ticket
接口https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token
请求方式post
suite_id和suite_secret 在下图这里获取
https://qyapi.weixin.qq.com/cgi-bin/service/get_suite_token
而suite_ticket是在 Post业务回调里解析xml后解密得到的,不懂的去看教程(再强调一遍第三方应用和代开发应用的http post回调返回字段是一模一样的,实现方式也是一模一样的)===》node配置企业微信回调配置HttpPost
这一步你会拿到suite_access_token(我和你说,这个suite_access_token用的地方很多,你要先全局变量存起来)
然后你要去获取预授权码
二、获取预授权码
官方文档==》获取预授权码 - 接口文档 - 企业微信开发者中心
async get_pre_auth_code() {
let m = this,
{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/service/get_pre_auth_code?suite_access_token='+m.suite_access_token, {
method: 'get',
data: {
},
contentType: 'json',
dataType: 'json',
});
this.pre_auth_code=result.data.pre_auth_code
await m.set_session_info();
}
接口:https://qyapi.weixin.qq.com/cgi-bin/service/get_pre_auth_code?suite_access_token=suite_access_token
请求方式:get
这个就没啥好说的,就是拿预授权码pre_auth_code, 因为我们项目还没上线,所以我们要设置预授权码 的授权配置为测试环境
三、设置授权配置
官方文档=》设置授权配置 - 接口文档 - 企业微信开发者中心
async set_session_info(){
let m = this,
{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/service/set_session_info?suite_access_token='+m.suite_access_token, {
method: 'post',
data: {
suite_access_token:m.suite_access_token,
pre_auth_code:m.pre_auth_code,
session_info:{
auth_type:1,//0 正式授权, 1 测试授权。 默认值为0。
}
},
contentType: 'json',
dataType: 'json',
});
await m.get_auth_Url();
}
参数是否必须说明suite_access_token是第三方应用access_tokenpre_auth_code是预授权码session_info是本次授权过程中需要用到的会话信息appid否允许进行授权的应用id,如1、2、3, 不填或者填空数组都表示允许授权套件内所有应用(仅旧的多应用套件可传此参数,新开发者可忽略)auth_type否授权类型:0 正式授权, 1 测试授权。 默认值为0。注意,请确保应用在正式发布后的授权类型为“正式授权”
请求接口:https://qyapi.weixin.qq.com/cgi-bin/service/set_session_info?suite_access_token=你的suite_access_token
请求方式:post请求。
请求成功后,你也可以判定是不是状态码是不是200。
然后我们要生成下授权链接让用户跳转扫码过去用企业微信扫码安装应用
四、获取授权链接
官方文档==》企业授权应用 - 接口文档 - 企业微信开发者中心
async get_auth_Url() {
let m = this,
{app} = m;
let jumpurl=encodeURIComponent('https://www.****.com/****')
let url='https://open.work.weixin.qq.com/3rdapp/install?suite_id='+this.SuiteID+'&pre_auth_code='+this.pre_auth_code+'&redirect_uri='+jumpurl+'&state='+m.suite_access_token
//下面是eggjs的mvc
await this.ctx.render('qiyelogin',{
auth_code:null,
permanentInfo:null,
url:url
})
}
拼出来一个跳转路径https://open.work.weixin.qq.com/3rdapp/install?suite_id=SUITE_ID&pre_auth_code=PRE_AUTH_CODE&redirect_uri=REDIRECT_URI&state=STATE
redirect_uri 要进行URL编码,前端是用encodeURIComponent,后端你自己看用什么url编码函数
SUITE_ID第三方应用id或者代开发应用模板id。第三方应用以ww或wx开头应用id(对应于旧的以tj开头的套件id);代开发应用以dk开头PRE_AUTH_CODE预授权码REDIRECT_URI 企业微信跳转扫码并添加完应用后,会回跳到你的域名,雪狼生成跳转域名和回跳业务域名是同一个https://www.***.com/***,他扫码成功后调回来是会在url多传一个auth_code(临时授权码,会在授权成功时附加在redirect_uri中跳转回第三方服务商网站,或通过授权成功通知回调推送给服务商。长度为64至512个字节)参数,雪狼通过这个来判断是不是授权成功
statestate可填a-zA-Z0-9的参数值(不超过128个字节),用于第三方自行校验session,防止跨域攻击。
而mvc前端页面部分
<%= auth_code %>
<%= url %>
<%- permanentInfo %>
var url="<%- url %>"
debugger
if(url){
setTimeout(()=>{
window.location.href=url
},5000)
}else{
console.log(<%- permanentInfo %>)
}
其实你就知道url那部分就好,就是跳转,你也可以直接window.location.href=url 完事,其他都不用。
生成链接这有3个坑!!!!!!!
第一个坑:state这个字段很重要!!!我跟你说,你最好把你(一、suite_access_token(第三方应用凭证))这一步里获取的suite_access_token 直接传过去,然后他到时候会传回来!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
不然你在获取永久授权的时候,会报错40014
雪狼试过,就算他企业微信授权安装第三方应用后不是跳回redirect_uri设的业务链接,这时候你再去重新获取一次suite_access_token在加上返回的auth_code(临时授权码)也是会报40014的,所以这里是第一个坑。
第二个坑:
1/你一定要看一遍你生成的完整链接那4个参数一定都要有,
2/你如果是用mvc的,你一定要看清楚,拼接的url是不是有问题
我举个一例子,正常拼接url是http://www.***.com/sss?a=1&b=2,而mvc渲染到页面是以html模板形式渲染"&",就会被被转义成& 你懂吗,他会变成http://www.***.com/sss?a=1&b=2&c=3
上面两点都会导致你出来下图这样的问题。(也可能有其他情况,如果发现的小伙伴,可以评论区发下。雪狼会补充进来博文)
第三个坑 ,他返回的 auth_code(临时授权码) 有效期只有10分钟!!!!!!你要注意,如果超过10分钟,你记得去企业那给他应用先删掉在重新跳转安装第三方应用。(雪狼是用另一个企业微信来扫我这个企业开发的第三方应用!这里注意。自己企业扫自己企业开发的第三方我没试过!)
五、获取企业永久授权码
官网文档=>获取企业永久授权码 - 接口文档 - 企业微信开发者中心
前面扫码成功后,会顺着redirect_uri调回来你的业务域名,会在路径带上 auth_code(临时授权码)和state(你跳转时候带过去的suite_access_token)
所以你要先有一个页面用来获取他的auth_code和state,
雪狼是跳转和会跳同一个页面,所以直接判断有auth_code参数就是回调,然后进获取永久授权接口的流程
async index() {
let m = this,
{app} = m;
let urlQuery = this.ctx.request.query
if(urlQuery.auth_code){//临时授权码跳转回来 有效期只有10分钟
this.auth_code=urlQuery.auth_code
m.suite_access_token=urlQuery.state
await m.get_permanent_code()
// await m.accessTokenFun(()=>m.get_permanent_code());
// let sUrl=this.comsys().sUrl
// await this.ctx.render('qiyelogin',{
// auth_code:urlQuery.auth_code,
// url:null
// })
}else{
await this.accessTokenFun();
}
}
下面就是永久授权的接口了
async get_permanent_code() {
let m = this,
{app} = m;
const result = await app.curl('https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token='+m.suite_access_token, {
method: 'post',
data: {
auth_code:m.auth_code
},
contentType: 'json',
dataType: 'json',
});
this.permanent_code=result.data.permanent_code //永久授权码
result.data.auth_corp_info.corpid//授权方企业id
//到上面这部就可以了。
let sUrl=this.comsys().sUrl
await this.ctx.render('qiyelogin',{
auth_code:m.auth_code,
permanentInfo:JSON.stringify(result.data),
url:null
})
}
接口:https://qyapi.weixin.qq.com/cgi-bin/service/get_permanent_code?suite_access_token=回传回来的suite_access_token
请求:post
你拿到permanent_code就是永久授权码了,还有对方企业微信id(授权方企业corpid,后面接口你会用到)你记得把他存起来。
企业授权完你可能会想着要 个人授权===》企业微信成员授权(个人授权)oauth2全流程教程
文章原创,雪狼原创表情包在最底下,欢迎下载。
扩展阅读
1、小程序手机号授权登录(图文教程) 2、短信验证码收不到-解决方案 3、vue3ts的透传$attrs用法 4、vue3 清空/重置reactive 5、vite打包可视化工具rollup-plugin-visualizer图文教程 6、vue3 h函数使用图文教程 7、抖音跳微信小程序(抖音分享卡片和链接)图文教程 8、pinia 持久化插件pinia-plugin-persistedstate 安装、使用(图文详解) 9、uni-app 生成安卓证书 10、uniapp小程序限制微信群访问(图文教程) 11、前端常见4种缓存方式(图文教程) 12、es6~es13 新增数组遍历一览 13、禁debugger调试网页,禁F12(完整教程) 14、常用的19个正则-表单验证 15、报错状态码 200 300 400 500 16、周公解梦功能(附数据) 17、node开发微信群聊机器人第⑮章 18、node开发微信群聊机器人第⑭章 19、node开发微信群聊机器人第⑬章 20、Linux安装node18完整图文教程 21、VMware虚拟机、linux安装图文教程 22、我把微信群聊机器人项目开源 23、node开发微信群聊机器人第⑫章 24、node开发微信群聊机器人第⑪章 25、node开发微信群聊机器人第⑩章 26、node开发微信群聊机器人第⑨章 27、node开发微信群聊机器人第⑧章 28、node开发微信群聊机器人第⑦章 29、node开发微信群聊机器人第⑥章 30、公众号涨粉攻略(阳谋) 31、公众号涨粉攻略(阴谋) 32、node开发微信群聊机器人第⑤章 33、node开发微信群聊机器人第④章 34、node开发微信群聊机器人第③章 35、用node开发微信群聊机器人第②章 36、用node开发微信群聊机器人第①章
雪狼原创表情包
1、【我很凶】微信表情 - 来自微信表情商店,扫二维码下载表情
2、【程序员雪狼】微信表情 - 来自微信表情商店,扫二维码下载表情
3、【web前端雪狼】微信表情 - 来自微信表情商店,扫二维码下载表情