企业微信JS-SDK开发(地理位置)

  • 业务场景
    • 开发文档
  • 解决方案
    • A.获取access_token
    • B.获取企业的jsapi_ticket
    • C.获取时间戳
    • D.获取随机字符串
    • E.生成签名
    • F.加密签名
    • G.生成JsSDK信息
  • 前端代码
    • A.引入JS文件
    • B.请求JsSDK信息
    • C.通过config接口注入权限验证配置并调用地理位置接口
    • 扩展(模拟环境)
    • B.将企业微信应用设置成可信域名
      • 结果请登录企业微信访问应用

业务场景

由于项目要根据地理位置知道周边有哪些商店;但Web网址又是到企业微信第三方应用开发的,所以这里只能使用企业微信APP的设置来获取经纬度

开发文档

文档:链接地址

解决方案

为了安全性这里去取access_token、jsapi_ticket、生成签名全部在后台实现

A.获取access_token

   public class EnterpriseWeChatToken{private string Corpid = ConfigHelper.GetConfigStr("Corpid");private string Secret = ConfigHelper.GetConfigStr("Secret");/// <summary>/// 请求企业微信Token/// </summary>/// <returns></returns>public string ResultAccess_token(){try{string url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?";StringBuilder str = new StringBuilder();str.Append(url);str.Append("corpid=" + Corpid + "&corpsecret=" + Secret + "");string Tokes = HttpUtils.DoGet(str.ToString(), null).ToString();dynamic jsonToken = JToken.Parse(Tokes) as dynamic;if (jsonToken["errcode"] == 0){return jsonToken["access_token"];}else{return "";}}catch (Exception ex){Log.CreateLogManager().Error("请求token异常:" + ex);return "";}}}

B.获取企业的jsapi_ticket

        /// <summary>/// 获取企业的jsapi_ticket/// </summary>/// <param name="access_token">调用接口凭证:access_token</param>/// <returns></returns>private string GetResultJsapi_ticket(string access_token){string url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?";StringBuilder str = new StringBuilder();str.Append(url);str.Append("access_token=" + access_token);string Tokes = HttpUtils.DoGet(str.ToString(), null).ToString();dynamic jsonToken = JToken.Parse(Tokes) as dynamic;if (jsonToken["errcode"] == 0){return jsonToken["ticket"];}else{return "";}}

C.获取时间戳

        /// <summary>/// 获取时间戳/// </summary>/// <returns></returns>public string GetTimestam(){TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);return Convert.ToUInt64(ts.TotalSeconds).ToString();}

D.获取随机字符串

        /// <summary>/// 获取随机字符串/// </summary>/// <param name="codeCount">多少位的随机字符串</param>/// <returns></returns>public string GetNoncestr(int codeCount){int rep = 0;string str = string.Empty;long num2 = DateTime.Now.Ticks + rep;rep++;Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> rep)));for (int i = 0; i < codeCount; i++){char ch;int num = random.Next();if ((num % 2) == 0){ch = (char)(0x30 + ((ushort)(num % 10)));}else{ch = (char)(0x41 + ((ushort)(num % 0x1a)));}str = str + ch.ToString();}return str;}

E.生成签名

        /// <summary>/// 生成签名/// </summary>/// <param name="Jsapi_ticket"></param>/// <param name="Noncestr">随机字符串</param>/// <param name="Timestam">时间戳</param>/// <param name="Url">请求地址</param>/// <returns></returns>public string GetSignature(string Jsapi_ticket, string Noncestr, string Timestam, string Url){string str = string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", Jsapi_ticket, Noncestr, Timestam, Url);return SHA1HASH(str);}

F.加密签名

        /// <summary>/// 加密签名/// </summary>/// <param name="Value"></param>/// <returns></returns>public string SHA1HASH(string Value){SHA1 sha1 = new SHA1CryptoServiceProvider();byte[] bytes_sha1_in = UTF8Encoding.Default.GetBytes(Value);byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);string str_sha1_out = BitConverter.ToString(bytes_sha1_out);str_sha1_out = str_sha1_out.Replace("-", "");return str_sha1_out;}

G.生成JsSDK信息

        /// <summary>/// 生成JsSDK信息/// </summary>/// <returns></returns>public object GetJsSDK(){object json = new { };try{string Jsapi_ticket = GetResultJsapi_ticket(new EnterpriseWeChatToken().ResultAccess_token());if (!string.IsNullOrEmpty(Jsapi_ticket)){string Url = "http://23005732cx.51mypc.cn/test.html"; //必须自己前网页地址JsSDK sdk = new JsSDK();sdk.Corpid = Corpid;sdk.Agentid = AgentId;sdk.Timestamp = GetTimestam();sdk.NonceStr = GetNoncestr(16);sdk.Signature = GetSignature(Jsapi_ticket, sdk.NonceStr, sdk.Timestamp, Url);json = new{code = 1,data = sdk,msg = "请求成功"};}else{json = new{code = 0,data = "",msg = "请求失败,Jsapi_ticket获取失败"};}}catch (Exception ex) {json = new{code = 0,data = "",msg = "请求失败,出现异常"};}return json;}

前端代码

验证域名归属的方法在企业微信的管理后台“我的应用”里,进入应用,设置应用可信域名。

A.引入JS文件

B.请求JsSDK信息

    $.ajax({url: "/api/EnterpriseWeChatJsSDK/GetResultJsSDK",type:"post",success: function (result){if (result.code == 1){alert("Corpid:" + result.data.Corpid + ",Timestamp:" + result.data.Timestamp + ",NonceStr:" + result.data.NonceStr + ",Signature:" + result.data.Signature + "");sdk(result.data.Corpid, result.data.Timestamp, result.data.NonceStr, result.data.Signature);}}});

C.通过config接口注入权限验证配置并调用地理位置接口

function sdk(Corpid, timestamp, nonceStr, signature) {//1.注入权限验证配置wx.config({beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: Corpid, // 必填,企业微信的corpIDtimestamp: timestamp, // 必填,生成签名的时间戳nonceStr: nonceStr, // 必填,生成签名的随机串signature: signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来});//2.调用地理位置接口wx.getLocation({type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'success: function (res) {alert("latitude:" + res.latitude);alert("longitude:" + res.longitude);alert("speed:" + res.speed);alert("accuracy:" + res.accuracy);var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。var speed = res.speed; // 速度,以米/每秒计var accuracy = res.accuracy; // 位置精度}});
}

扩展(模拟环境)

A.将代码发布到自己电脑上的IIS站点

B.将企业微信应用设置成可信域名

结果请登录企业微信访问应用

Asp.Net 企业微信JS-SDK开发(随手笔记)相关推荐

  1. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

  2. 微信JS SDK开发 共享问题小结

    首先,我要吐槽一下这个SDK,看了第一遍,完全不知所云,一会获取这个,一会获取那个,也没确切的告诉怎么获取. 和腾讯客服(拿钱不干事的好工作)讨教,人家不懂技术,不知道怎么解决,也没有相关技术人员对应 ...

  3. 实战微信JS SDK开发:贺卡制作与播放(2)

    最近同事用CanTK开发了一个基于微信的贺卡制作APP,我虽然没有参与开发,但是提供CanTK和GameBuilder的技术支持,觉得有些东西比较有意思,写几篇博客和大家分享吧.这个贺卡APP完全开源 ...

  4. ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境

    首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...

  5. 微信JS SDK开放,前端开发者“鸡冻”了!

    HTML5又一次逆袭了,其实之前微信也是有一些JS API的,比如分享.但这次一股脑开放了拍摄.录音.语音识别.二维码.地图.支付.分享.卡券等几十个API,这条消息不需宣传,瞬间就占满了HTML5从 ...

  6. 使用微信js sdk关于选择及上传图片至腾讯云COS

    使用微信js sdk关于选择及上传图片至腾讯云COS 使用微信js sdk关于选择及上传图片至腾讯云COS 背景 名词 参考 效果图展示 开发步骤 1:概要步骤 2:上代码 结束: 使用微信js sd ...

  7. Java企业微信会话存档开发(从跳坑到爬坑)

    Java企业微信会话存档开发(从跳坑到爬坑) 本文仅作为方便首次开发企业微信使用 文章目录 Java企业微信会话存档开发(从跳坑到爬坑) 前言 一.开发准备 1.企业微信后台配置 2.sdk下载 3. ...

  8. 微信-js sdk invalid signature签名错误 问题解决

    微信-js sdk invalid signature签名错误 问题解决 参考文章: (1)微信-js sdk invalid signature签名错误 问题解决 (2)https://www.cn ...

  9. 微信js sdk 分享 失败 有时候好 有时候坏

    微信js sdk 分享 失败  有时候好 有时候坏 用了一个www开头的域名 和一个xx.com的域名 两个在解析上有问题. 实践是www.xx.com的比较 稳定 转载于:https://www.c ...

  10. ASP.NET MVC4 微信公众平台开发测试一: 验证

    ASP.NET MVC4 微信公众平台开发测试一: 验证 背景,想做一个微信公众号的自动回复系统,于是想动手写一下.记录这些,是一边写程序一边写在这里,也是记录一下自己的思路. 微信公众平台开发时,需 ...

最新文章

  1. CRichEdit小记
  2. Java注解和xml_Spring注解配置和xml配置优缺点比较
  3. 2020中国Ray技术峰会丨取代Spark,Michael Jordan和Ion Stoica提出下一代分布式实时机器学习框架...
  4. [三个版本]自定义int()函数(Python实现)
  5. LeetCode_108.将有序数组转换为二叉搜索树
  6. C语言和设计模式(抽象工厂模式)
  7. 《数学建模与数学实验》第5版 插值与拟合 习题7.6
  8. java 正则 连续换行_Java正则表达式匹配回车换行多行
  9. python3将网页保存为pdf
  10. 《阿里巴巴JAVA开发手册》超过三张表禁止join
  11. AH快递单打印软件3.82免费版
  12. Spark与大数据处理技术实践
  13. Android App Shortcuts
  14. 【阿里云天池大赛赛题解析】 刷书笔记 Lesson 1 数据探索基础知识
  15. 《剑指offter》第十九题(js)
  16. Tkinter 组件详解(七):Entry
  17. 【luoguP5550】Chino的数列
  18. D3 JS study notes
  19. skywalking
  20. Sqli-labs之Less-11和Less-12

热门文章

  1. 输入求闰年c语言程序,C语言计算闰年程序
  2. C语言-基础入门-学习笔记(13):结构体
  3. (啤酒,红酒,白酒,料酒)豆瓣(剁椒)鲫鱼做法记录
  4. 2.cycloneIII系列FPGA下载模式的配置
  5. 【竞品分析】腾讯QQ手机浏览器与UC手机浏览器产品对比
  6. 水晶易表 oracle,水晶易表和水晶报表的区别
  7. vue面试五之vue修饰符中 .lazy 等用法、Vue v2.4中新增的$attrs及$listeners属性的使用、v-once 的使用场景、vue组件里的定时器该如何销毁、vue海量数据优化等
  8. 淘宝天猫评论爬取,简单的办法完成滑动验证
  9. 输入qq号强制进空间_除了QQ号一键登录,迷你世界QQ版还有哪些神奇之处?
  10. PHP 梯形图,PLC梯形图程序设计