企业微信创建自建应用

创建完成后,点击创建的应用,点击网页授权及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;}//传入创建的应用程序的SecretgetQyWxTokenFromServer('自建应用的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}&timestamp=${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}&timestamp=${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});});});
}

配置自建应用到客户联系调用应用里面

效果

使用JS-JDK 开发企业微信第三方页面应用相关推荐

  1. nodejs 开发企业微信第三方应用入门教程

    最近公司要开发企业微信端的 Worktile,以前做的是企业微信内部应用,所以只适用于私有部署客户,而对于公有云客户就无法使用.所有本文就准备开发企业微信的第三方应用,主要介绍在调研阶段遇到的山珍海味 ...

  2. 如何通过js关闭微信浏览器页面

    最近在项目开发中,有一个支付页面当用户支付成功的时候需要通过js主动关闭这个页面.这个在其他浏览器比较好实现直接用window对象中的api就可以 如何通过js关闭微信浏览器页面 最近在项目开发中,有 ...

  3. 通过js sdk 来进行第三方登录及授权(微博,微信,qq)

    微博第三方登录及授权 注册申请appkey 1.打开微博开发者平台http://open.weibo.com/development 2.点击创建微链接 3.选择类型(选择网站接入) 4.填写各项信息 ...

  4. 微信h5页面调用第三方位置导航

    微信h5页面拉起第三方导航应用 需要准备的: 通过微信认证的公众号 有备案过的域名 背景:微信公众号点击菜单栏跳到h5页面,需要用到导航功能 需求:当用户点击导航按钮时,跳转到第三方app进行导航 参 ...

  5. H5 -- 自定义微信分享第三方页面链接的标题和小缩略图

    需求:自定义微信分享第三方页面链接的标题和小缩略图(如图) 2018.6.4更新线 - - - - - - - - - - - - - - - - - - 更新:微信6.5.5版本以后调整了分享规则, ...

  6. H5 -- 微信h5页面中下载第三方app的方法

    需求:在微信h5页面中下载第三方app -- 安卓, 直接下载apk文件包:iphone,跳转AppStore 分析:微信不支持,在微信中屏蔽了apk文件的下载以及AppStore的跳转(且除非和TX ...

  7. js微信h5页面背景音乐

    微信H5页面 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...

  8. AWS Lambda 开发企业微信消息机器人

    AWS Lambda 开发企业微信消息机器人 实验介绍 本次实验中,我们将了解 AWS Lambda 的常见应用场景,并使用 AWS Lambda 构建能够定时将空气质量数据推送到企业微信的消息机器人 ...

  9. 微信公众平台开发(31)微信第三方登录接口

    原文: http://www.cnblogs.com/imaker/p/5491433.html 第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请) 第二步:生成扫描二维码 ...

最新文章

  1. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(下)
  2. 创建github账号
  3. hadoop 实战练习_hadoop入门到实战(2)hive经典练习题
  4. window.onload 不执行
  5. Numpy中array和matrix转换
  6. Elasticsearch搜索引擎:ES的segment段合并原理
  7. Android JNI开发流程介绍
  8. amos看拟合度在哪里看_哪里可以看亲爱的热爱的电视剧全集
  9. mysql中union 查询
  10. 深度学习优化算法实现(Momentum, Adam)
  11. 【译】响应式CSS动画
  12. 浅入浅出数据结构(18)——希尔排序
  13. 在Windows平台使用IIS部署Flask网站
  14. rss订阅_RSS订阅
  15. php汽车保养oa,汽车行业oa管理系统
  16. 效率最高的两种项目沟通方式
  17. Docker提交天池比赛代码流程(windows10环境下)
  18. C/C++实现简单打飞机小游戏【初版】
  19. js数组查找最接近_js 2种方法从数组里面找到最接近某个数值的值(小于该指定值,并且大于其他值)...
  20. BSN应用案例精选【1】:全链通“铭镜”农产品溯源平台

热门文章

  1. 学习String类和日期Date类,看这一篇就够了
  2. 护肤品微商如何通过公众号引流?如何吸引粉丝裂变?
  3. 回归方法(二):多项式回归告诉你身高和体重的关系
  4. java《集团客运系统》项目总结
  5. linux中内核4c,Linux内核编译
  6. Windows部署SMTP邮件服务器
  7. .Core 项目运行提示 似乎未安装在 IIS 中承载 .NET Core 项目所需的 AspNetCoreModule
  8. 排名前十的时序数据库
  9. VR晕动症出现的原因
  10. 手机玩exe游戏的模拟器_使命召唤手游模拟器和手机一起玩怎么样 拟器和手机一览_使命召唤手游...