微信JS-SDK使用权限签名算法的服务端实现(.net版本)

原文: 微信JS-SDK使用权限签名算法的服务端实现(.net版本)

1、概要php

微信这次开放JS接口,开放了一大批api权限,即便在未认证的订阅号也可使用图像接口,音频接口,智能接口,地理位置,界面操做,微信扫一扫等功能。要知道:之前订阅号只能接受和被动回复用户消息而已。微信官方没有给出.net版本,有java,node,php和python,惟独没有.net版本,这是怎么了?本文就教你实现.net版本的微信JS-SDK权限签名生成算法。html


这会大大激发了js前端开发人员的热情,能够作更多的事情,不用在向之前同样用破解微信的weixinbridge狼狈的苟活于人世了。
我认为在这个js横行霸道的世界,微信早就应该这么作了。当年就是由于没有js的接口,在微信中没法获取用户的分享,致使用户体验极差,如今这个问题都解决了。

但那是惟一的缺憾是没有彻底开发分享接口,对于未认证的订阅号来讲仍是有些许不便。
不过从微信最近启用的原创申明功能来讲,对于未认证的公众号来讲,如果开放了分享接口,是没法保护原创申明的。
若是您想使用分享,就赶快认证吧。
前端

 

2、业务逻辑java

公众号在调用JS接口以前须要生成JS-SDK使用权限签名,这部分逻辑须要用户本身在服务端实现,比较不靠谱的是微信官方没有给出.net版本的demo.node

有java,node,php和python,惟独没有.net版本,你没有看错。python

好吧既然如此咱们就本身实现了。git

 

生成方法以下(一下摘自微信官方文档)github

附录1-JS-SDK使用权限签名算法

jsapi_ticket算法

生成签名以前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常状况下,jsapi_ticket的有效期为7200秒,经过access_token来获取。因为获取jsapi_ticket的api调用次数很是有限,频繁刷新jsapi_ticket会致使api调用受限,影响自身业务,开发者必须在本身的服务全局缓存jsapi_ticket 。api

  1. 参考如下文档获取access_token(有效期7200秒,开发者必须在本身的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
  2. 用第一步拿到的access_token 采用http GET方式请求得到jsapi_ticket(有效期7200秒,开发者必须在本身的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

成功返回以下JSON:

{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}

得到jsapi_ticket以后,就能够生成JS-SDK权限验证的签名了。

 

签名算法

签名生成规则以下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对全部待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里须要注意的是全部参数名均为小写字符。对string1做sha1加密,字段名和字段值都采用原始值,不进行URL 转义。


即signature=sha1(string1)。 示例:

  • noncestr=Wm3WZYTPz0wzccnW
  • jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
  • timestamp=1414587457
  • url=http://mp.weixin.qq.com?params=value


步骤1. 对全部待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value


步骤2. 对string1进行sha1签名,获得signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事项

  1. 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
  2. 签名用的url必须是调用JS接口页面的完整URL。
  3. 出于安全考虑,开发者必须在服务器端实现签名的逻辑

3、代码实现

1.获取jsapi_ticket

// <summary>
        /// 获取jsapi_ticket
        /// jsapi_ticket是公众号用于调用微信JS接口的临时票据。
        /// 正常状况下,jsapi_ticket的有效期为7200秒,经过access_token来获取。
        /// 因为获取jsapi_ticket的api调用次数很是有限,频繁刷新jsapi_ticket会致使api调用受限,影响自身业务,开发者必须在本身的服务全局缓存jsapi_ticket 。
///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK
/// </summary> /// <param name="access_token">BasicAPI获取的access_token,也能够经过TokenHelper获取</param> /// <returns></returns> public static dynamic GetTickect(string access_token) { var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token); var client = new HttpClient(); var result = client.GetAsync(url).Result; if (!result.IsSuccessStatusCode) return string.Empty; var jsTicket = DynamicJson.Parse(result.Content.ReadAsStringAsync().Result); return jsTicket; }

 

2.签名算法

签名以前咱们须要解决随机字符串和时间戳的问题,

2.1随机字符串生成算法

  private static string[] strs = new string[]
                                 {
                                  "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                                  "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
                                 };
        /// <summary>
        /// 建立随机字符串
///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK
/// </summary> /// <returns></returns> public static string CreatenNonce_str() { Random r = new Random(); var sb = new StringBuilder(); var length = strs.Length; for (int i = 0; i < 15; i++) { sb.Append(strs[r.Next(length - 1)]); } return sb.ToString(); }

2.2 时间戳

时间戳的参考了这个:http://tool.chinaz.com/Tools/unixtime.aspx

/// <summary>
        /// 建立时间戳
///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK
/// </summary> /// <returns></returns> public static long CreatenTimestamp() { return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; }

2.3 签名算法以下:

/// <summary>
        /// 签名算法
///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK
/// </summary> /// <param name="jsapi_ticket">jsapi_ticket</param> /// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param> /// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param> /// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param> /// <returns></returns> public static string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url, out string string1) { var string1Builder = new StringBuilder(); string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&") .Append("noncestr=").Append(noncestr).Append("&") .Append("timestamp=").Append(timestamp).Append("&") .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url); string1 = string1Builder.ToString(); return Util.Sha1(string1); }

 

获取所有代码请点击:https://github.com/night-king/weixinSDK/blob/master/Deepleo.Weixin.SDK/JSSDK/JSAPI.cs

 

在线演示:http://weixinsdk.deepleo.com/jssdk
或者直接扫描二维码在微信中查看:

说明:本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK

相关文章
相关标签/搜索