国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

微信JS-SDK使用權(quán)限簽名算法的服務(wù)端實(shí)現(xiàn)(.net版本)

2019-11-17 01:59:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

微信JS-SDK使用權(quán)限簽名算法的服務(wù)端實(shí)現(xiàn)(.net版本)

一、概要

微信此次開(kāi)放JS接口,開(kāi)放了一大批api權(quán)限,即使在未認(rèn)證的訂閱號(hào)也可以使用圖像接口,音頻接口,智能接口,地理位置,界面操作,微信掃一掃等功能。要知道:以前訂閱號(hào)只能接受和被動(dòng)回復(fù)用戶消息而已。微信官方?jīng)]有給出.net版本,java,node,php和python,唯獨(dú)沒(méi)有.net版本,這是怎么了?本文就教你實(shí)現(xiàn).net版本的微信JS-SDK權(quán)限簽名生成算法。

這會(huì)大大激發(fā)了js前端開(kāi)發(fā)人員的熱情,可以做更多的事情,不用在向以前一樣用破解微信的weixinbridge狼狽的茍活于人世了。我認(rèn)為在這個(gè)js橫行霸道的世界,微信早就應(yīng)該這么做了。當(dāng)年就是因?yàn)闆](méi)有js的接口,在微信中無(wú)法獲取用戶的分享,導(dǎo)致用戶體驗(yàn)極差,現(xiàn)在這個(gè)問(wèn)題都解決了。但那是唯一的缺憾是沒(méi)有完全開(kāi)發(fā)分享接口,對(duì)于未認(rèn)證的訂閱號(hào)來(lái)說(shuō)還是有些許不便。不過(guò)從微信最近啟用的原創(chuàng)申明功能來(lái)說(shuō),對(duì)于未認(rèn)證的公眾號(hào)來(lái)說(shuō),若是開(kāi)放了分享接口,是無(wú)法保護(hù)原創(chuàng)申明的。如果您想使用分享,就趕快認(rèn)證吧。

防止盜鏈,原文地址:www.survivalescaperooms.com/deepleo/p/weixinjssdk.html

二、業(yè)務(wù)邏輯

公眾號(hào)在調(diào)用JS接口之前需要生成JS-SDK使用權(quán)限簽名,這部分邏輯需要用戶自己在服務(wù)端實(shí)現(xiàn),比較不靠譜的是微信官方?jīng)]有給出.net版本的demo.

有java,node,php和python,唯獨(dú)沒(méi)有.net版本,你沒(méi)有看錯(cuò)。

好吧既然如此我們就自己實(shí)現(xiàn)了。

生成方法如下(一下摘自微信官方文檔)

附錄1-JS-SDK使用權(quán)限簽名算法

jsapi_ticket

生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公眾號(hào)用于調(diào)用微信JS接口的臨時(shí)票據(jù)。正常情況下,jsapi_ticket的有效期為7200秒,通過(guò)access_token來(lái)獲取。由于獲取jsapi_ticket的api調(diào)用次數(shù)非常有限,頻繁刷新jsapi_ticket會(huì)導(dǎo)致api調(diào)用受限,影響自身業(yè)務(wù),開(kāi)發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket。

  1. 參考以下文檔獲取access_token(有效期7200秒,開(kāi)發(fā)者必須在自己的服務(wù)全局緩存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
  2. 用第一步拿到的access_token 采用http GET方式請(qǐng)求獲得jsapi_ticket(有效期7200秒,開(kāi)發(fā)者必須在自己的服務(wù)全局緩存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權(quán)限驗(yàn)證的簽名了。

簽名算法

簽名生成規(guī)則如下:參與簽名的字段包括noncestr(隨機(jī)字符串), 有效的jsapi_ticket, timestamp(時(shí)間戳), url(當(dāng)前網(wǎng)頁(yè)的URL,不包含#及其后面部分) 。對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫(xiě)字符。對(duì)string1作sha1加密,字段名和字段值都采用原始值,不進(jìn)行URL 轉(zhuǎn)義。

即signature=sha1(string1)。 示例:

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

步驟1. 對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1:

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

步驟2. 對(duì)string1進(jìn)行sha1簽名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

注意事項(xiàng)

  1. 簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
  2. 簽名用的url必須是調(diào)用JS接口頁(yè)面的完整URL。
  3. 出于安全考慮,開(kāi)發(fā)者必須在服務(wù)器端實(shí)現(xiàn)簽名的邏輯。

三、代碼實(shí)現(xiàn)

1.獲取jsapi_ticket

// <summary>        /// 獲取jsapi_ticket        /// jsapi_ticket是公眾號(hào)用于調(diào)用微信JS接口的臨時(shí)票據(jù)。        /// 正常情況下,jsapi_ticket的有效期為7200秒,通過(guò)access_token來(lái)獲取。        /// 由于獲取jsapi_ticket的api調(diào)用次數(shù)非常有限,頻繁刷新jsapi_ticket會(huì)導(dǎo)致api調(diào)用受限,影響自身業(yè)務(wù),開(kāi)發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket 。        ///本代碼來(lái)自開(kāi)源微信SDK項(xiàng)目:https://github.com/night-king/weixinSDK        /// </summary>        /// <param name="access_token">BasicAPI獲取的access_token,也可以通過(guò)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.簽名算法

簽名之前我們需要解決隨機(jī)字符串和時(shí)間戳的問(wèn)題,

2.1隨機(jī)字符串生成算法

  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>        /// 創(chuàng)建隨機(jī)字符串        ///本代碼來(lái)自開(kāi)源微信SDK項(xiàng)目: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時(shí)間戳

時(shí)間戳的參考了這個(gè):http://tool.chinaz.com/Tools/unixtime.aspx

/// <summary>        /// 創(chuàng)建時(shí)間戳        ///本代碼來(lái)自開(kāi)源微信SDK項(xiàng)目:https://github.com/night-king/weixinSDK        /// </summary>        /// <returns></returns>        public static long CreatenTimestamp()        {            return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;        }

2.3 簽名算法如下:

/// <summary>        /// 簽名算法        ///本代碼來(lái)自開(kāi)源微信SDK項(xiàng)目:https://github.com/night-king/weixinSDK        /// </summary>        /// <param name="jsapi_ticket">jsapi_ticket</param>        /// <param name="noncestr">隨機(jī)字符串(必須與wx.config中的nonceStr相同)</param>        /// <param name="timestamp">時(shí)間戳(必須與wx.config中的timestamp相同)</param>        /// <param name="url">當(dāng)前網(wǎng)頁(yè)的URL,不包含#及其后面部分(必須是調(diào)用JS接口頁(yè)面的完整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);        }

獲取全部代碼請(qǐng)點(diǎn)擊:https://github.com/night-king/weixinSDK/blob/master/Deepleo.Weixin.SDK/JSSDK/JSAPI.cs

在線演示:http://weixinsdk.deepleo.com/jssdk或者直接掃描二維碼在微信中查看:

說(shuō)明:本代碼來(lái)自開(kāi)源微信SDK項(xiàng)目:https://github.com/night-king/weixinSDK


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丰城市| 墨玉县| 喜德县| 双城市| 怀化市| 讷河市| 建阳市| 芮城县| 温宿县| 庆云县| 双江| 武冈市| 鄂托克前旗| 乐陵市| 平武县| 洞头县| 那坡县| 武宣县| 枣阳市| 德昌县| 永平县| 潜山县| 蚌埠市| 多伦县| 五常市| 甘德县| 鹤山市| 精河县| 阳朔县| 台江县| 广西| 塘沽区| 六安市| 吴旗县| 新河县| 阿瓦提县| 库伦旗| 满城县| 曲阜市| 宜丰县| 绵阳市|