企业微信创建自建应用
创建完成后,点击创建的应用,点击网页授权及JS-SDK,按照提示设置可信域名
设置将应用页面设置到菜单栏
编写应用页面,并且引入微信JS-JDK
- 配置config
- 配置agentConfig 【config注入的是企业的身份与权限,而agentConfig注入的是应用的身份与权限。尤其是当调用者为第三方服务商时,通过config无法准确区分出调用者是哪个第三方应用,而在部分场景下,又必须严谨区分出第三方应用的身份,此时即需要通过agentConfig来注入应用的身份信息。】
应用页面编写
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" type="text/css" href="https://at.alicdn.com/t/font_486881_al5z5esj4ph.css">
<script src="https://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 src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$(function(){
initWx();
})
function initWx() {
wx.config({
beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: 'xx',
timestamp: '<%=qy.timestamp%>',
nonceStr: '<%=qy.noncestr%>',
signature: '<%=qy.signature%>',
jsApiList: ["chooseImage"],
})
wx.ready(function(){
wx.agentConfig({
corpid: 'xxx', // 必填,企业微信的corpid,必须与当前登录的企业一致
agentid: 'xxx', // 必填,企业微信的应用id (e.g. 1000247)
timestamp: '<%=qyac.timestamp%>', // 必填,生成签名的时间戳
nonceStr: '<%=qyac.noncestr%>', // 必填,生成签名的随机串
signature: '<%=qyac.signature%>',// 必填,签名,见附录-JS-SDK使用权限签名算法
jsApiList: ["getContext","getCurExternalContact"], //必填
success: function(res) {
/*wx.checkJsApi({
jsApiList: ["getContext","getCurExternalContact"], // 需要检测的JS接口列表,所有JS接口列表见附录2,
success: function(res) {
// 以键值对的形式返回,可用的api值true,不可用为false
// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
}
});*/
// 回调
/*wx.invoke('getCurExternalContact', {
}, function(res){
alert("信息"+JSON.stringify(res))
if(res.err_msg == "getCurExternalContact:ok"){
userId = res.userId ; //返回当前外部联系人userId
}else {
//错误处理
}
});*/
},
fail: function(res) {
if(res.errMsg.indexOf('function not exist') > -1){
alert('版本过低请升级')
}
}
});
})
wx.error(function(res){
console.log(res)
});
}
function getCurExternalContact() {
wx.invoke('getCurExternalContact', {
}, function(res){
alert(JSON.stringify(res))
if(res.err_msg == "getCurExternalContact:ok"){
userId = res.userId ; //返回当前外部联系人userId
}else {
//错误处理
}
});
}
</script>
<style>
</style>
</head>
<body>
<p><%=qy.timestamp%></p>
<p><%=qy.noncestr%></p>
<p><%=qy.signature%></p>
</hr>
<p><%=qyac.timestamp%></p>
<p><%=qyac.noncestr%></p>
<p><%=qyac.signature%></p>
<button onclick="getCurExternalContact()">测试获取用户信息</button>
</body>
</html>
后台签名编写 -后台nodejs
**需要注意的是:**JS-SDK使用权限签名算法,需要的ACCESS_TOKEN是需要 自建 应用Secret
qyweixin.js
var qyWeixinTool = require('../common/qyWeixinTool');
exports.qyWeixinIndex = function(req, res, next) {
var url = 'https://' + req.hostname + req.url;
console.log("URL:"+url);
qyWeixinTool.getQySignature(url,function (err,data) {
if(err){
return res.render('qyWeixin/error', err);
}
console.log("signature"+JSON.stringify(data));
qyWeixinTool.getQyAgentConfigSignature(url,function (err,acData) {
if(err){
return res.render('qyWeixin/error', err);
}
return res.render('qyWeixin/index', {"qy":data,"qyac":acData});
});
});
};
exports.readTxt= function (req, res, next) {
return res.send("m44ynbFMUIb9R0mf");
}
qyWeixinTool.js
/**
* 企业微信工具包
*/
var config = require('../config');
var uuid = require('node-uuid');
var crypto = require('crypto');
var request = require("superagent");
var redis = require("redis"),
client_redis = redis.createClient(
config.redis_port,
config.redis_host);
function sent_get(url,key,callback){
request.get(url)
.end(function(err, res, body) {
if(err){
callback(err);
return;
}
var json = JSON.parse(res.text);
if(json.errcode===0){
var token = "";
if(key==="ent_wechat_token_crm"){
token = json.access_token;
}else {
token=json.ticket;
}
client_redis.set(key, token, "EX", 7200);
callback(null,token);
}else{
callback("empty!!!", null);
}
});
}
/**
* 获取企业微信token,从微信服务器
* @param callback
*/
function getQyWxTokenFromServer(corpsecret,callback) {
var url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwfe29b03ec4880d5b&corpsecret=${corpsecret}`;
sent_get(url,"ent_wechat_token_crm",callback);
}
/**
* 从服务器获取 企业jsapi_ticket
* @param qyToken
* @param callback
*/
function getQyWxTicketFromServer(qyToken,callback){
var url = `https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=${qyToken}`;
sent_get(url,"ent_wechat_ticket",callback);
}
/**
* 从服务器获取 获取应用的jsapi_ticket
* @param qyToken
* @param callback
*/
function getQyWxAgentConfigTicketFromServer(qyToken,callback){
var url = `https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=${qyToken}&type=agent_config`;
sent_get(url,"ent_wechat_ticket_agent_config",callback);
}
/**
* 从redis或者微信微信服务器获取token
* @param callback
*/
function getEnterpriseWeChatToken(callback){
client_redis.get("ent_wechat_token_crm",function (err,token) {
if(!err && token){
callback(null,token);
return;
}
//传入创建的应用程序的Secret
getQyWxTokenFromServer('自建应用的Secret',callback);
});
}
exports.getEnterpriseWeChatToken = getEnterpriseWeChatToken;
/**
* 从redis或者微信微信服务器获取Ticket
* @param callback
*/
function getEnterpriseWeChatTicket(qyToken,callback){
client_redis.get("ent_wechat_ticket",function (err,token) {
if(!err && token){
callback(null,token);
return;
}
getQyWxTicketFromServer(qyToken,callback);
});
}
exports.getEnterpriseWeChatTicket = getEnterpriseWeChatTicket;
/**
* 从redis或者微信微信服务器获取应用Ticket
* @param callback
*/
function getEnterpriseWeChatAgentConfigTicket(qyToken,callback){
client_redis.get("ent_wechat_ticket_agent_config",function (err,token) {
if(!err && token){
callback(null,token);
return;
}
getQyWxAgentConfigTicketFromServer(qyToken,callback);
});
}
exports.getEnterpriseWeChatAgentConfigTicket = getEnterpriseWeChatAgentConfigTicket;
/**
* 获取企业签名信息
* @param url
* @param callback
*/
exports.getQySignature = function(url,callback) {
getEnterpriseWeChatToken(function (err,token) {
if(err){
callback(err);
return;
}
getEnterpriseWeChatTicket(token,function (err,ticket) {
if(err){
callback(err);
return;
}
var noncestr = uuid.v4();
var timestamp = parseInt(new Date().getTime() / 1000);
// var tmp = ['jsapi_ticket=' + ticket, 'timestamp=' + timestamp, 'noncestr=' + noncestr, 'url=' + url].sort().join("&");
var tmp =`jsapi_ticket=${ticket}&noncestr=${noncestr}×tamp=${timestamp}&url=${url}`;
console.log("加密串"+tmp);
var signature = crypto.createHash("sha1").update(tmp).digest("hex");
return callback(null, {
timestamp: timestamp,
noncestr: noncestr,
signature: signature
});
});
});
}
/**
* 获取企业应用签名信息
* @param url
* @param callback
*/
exports.getQyAgentConfigSignature = function(url,callback) {
getEnterpriseWeChatToken(function (err,token) {
if(err){
callback(err);
return;
}
getEnterpriseWeChatAgentConfigTicket(token,function (err,ticket) {
if(err){
callback(err);
return;
}
var noncestr = uuid.v4();
var timestamp = parseInt(new Date().getTime() / 1000);
// var tmp = ['jsapi_ticket=' + ticket, 'timestamp=' + timestamp, 'noncestr=' + noncestr, 'url=' + url].sort().join("&");
var tmp =`jsapi_ticket=${ticket}&noncestr=${noncestr}×tamp=${timestamp}&url=${url}`;
console.log("加密串ac"+tmp);
var signature = crypto.createHash("sha1").update(tmp).digest("hex");
return callback(null, {
timestamp: timestamp,
noncestr: noncestr,
signature: signature
});
});
});
}