JS-SDK使⽤权限签名算法的服务端实现(版本)
⼀、概要
此次开放JS接⼝,开放了⼀⼤批api权限,即使在未认证的也可以使⽤图像接⼝,⾳频接⼝,智能接⼝,地理位置,界⾯操作,扫⼀扫等功能。要知道:以前只能接受和被动
回复⽤户消息⽽已。官⽅没有给出版本,有java,node,php和python,唯独没有版本,这是怎么了?本⽂就教你实现版本的JS-SDK权限签名⽣成算法。
这会⼤⼤激发了js前端开发⼈员的热情,可以做更多的事情,不⽤在向以前⼀样⽤破解的weixinbridge狼狈的苟活于⼈世了。
我认为在这个js横⾏霸道的世界,早就应该这么做了。当年就是因为没有js的接⼝,在中⽆法获取⽤户的分享,导致⽤户体验极差,现在这个问题都解决了。
但那是唯⼀的缺憾是没有完全开发分享接⼝,对于未认证的来说还是有些许不便。
不过从最近启⽤的原创申明功能来说,对于未认证的来说,若是开放了分享接⼝,是⽆法保护原创申明的。
如果您想使⽤分享,就赶快认证吧。
防⽌盗链,原⽂地址:wwwblogs/deepleo/p/weixinjssdk.html
⼆、业务逻辑
在调⽤JS接⼝之前需要⽣成JS-SDK使⽤权限签名,这部分逻辑需要⽤户⾃⼰在服务端实现,⽐较不靠谱的是官⽅没有给出版本的demo.
有java,node,php和python,唯独没有版本,你没有看错。
好吧既然如此我们就⾃⼰实现了。
⽣成⽅法如下(⼀下摘⾃官⽅⽂档)
附录1-JS-SDK使⽤权限签名算法
jsapi_ticket
⽣成签名之前必须先了解⼀下jsapi_ticket,jsapi_ticket是⽤于调⽤JS接⼝的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调
⽤次数⾮常有限,频繁刷新jsapi_ticket会导致api调⽤受限,影响⾃⾝业务,开发者必须在⾃⼰的服务全局缓存jsapi_ticket。
1. 参考以下⽂档获取access_token(有效期7200秒,开发者必须在⾃⼰的服务全局缓存access_token):
2. ⽤第⼀步拿到的access_token 采⽤http GET⽅式请求获得jsapi_ticket(有效期7200秒,开发者必须在⾃⼰的服务全局缓存jsapi_ticket):
成功返回如下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=
步骤1. 对所有待签名参数按照字段名的ASCII 码从⼩到⼤排序(字典序)后,使⽤URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=mp.weixin.qq?params=
步骤2. 对string1进⾏sha1签名,得到signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed
注意事项
1. 签名⽤的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2. 签名⽤的url必须是调⽤JS接⼝页⾯的完整URL。
3. 出于安全考虑,开发者必须在服务器端实现签名的逻辑。
三、代码实现
1.获取jsapi_ticket
// <summary>
///获取jsapi_ticket
/// jsapi_ticket是⽤于调⽤JS接⼝的临时票据。
///正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。
///由于获取jsapi_ticket的api调⽤次数⾮常有限,频繁刷新jsapi_ticket会导致api调⽤受限,影响⾃⾝业务,开发者必须在⾃⼰的服务全局缓存jsapi_ticket 。
///本代码来⾃开源SDK项⽬:github/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("api.weixin.qq/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项⽬:github/night-king/weixinSDK
javascript说明///</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 时间戳
时间戳的参考了这个:tool.chinaz/Tools/unixtime.aspx
///<summary>
///创建时间戳
///本代码来⾃开源SDK项⽬:github/night-king/weixinSDK
///</summary>
/
//<returns></returns>
public static long CreatenTimestamp()
{
return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
2.3 签名算法如下:
///<summary>
///签名算法
///本代码来⾃开源SDK项⽬:github/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);
}
获取全部代码请点击:github/night-king/weixinSDK/blob/master/Deepleo.Weixin.SDK/JSSDK/JSAPI.cs
在线演⽰:
说明:本代码来⾃开源SDK项⽬:github/night-king/weixinSDK
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论