ASP.NET WEBAPI实现微信JS-SDK接口注入权限验证配置
2016-03-18 14:29
1141 查看
ASP.NET WEBAPI实现微信JS-SDK接口注入权限验证配置
我们的客户端是一个HTML5客户端,我们计划采用微信提供的JS-SDK,但是所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用,配置的代码如wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见附录1 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 });
当我们使用JS-SDK的时候,微信会将以上的参数进行加密和验算是否正确,所以我们需要提供一个正确的签名值。
需要获得这个签名必须要完成两步,下面的UML描述了这个过程
Created with Raphaël 2.1.0微信客户端微信客户端WebAPIWebAPI微信服务器微信服务器appid/timestamp/nonceStrgrant_type/appid/secretaccess_tokenaccess_token/jsapijsapi_ticketsignaturesignature
第一步:获取access token
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
微信提供接口为
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
if (HttpRuntime.Cache["access_token"] == null) { var queryString = HttpUtility.ParseQueryString(string.Empty); queryString["grant_type"] = "client_credential"; queryString["appid"] = APPID; queryString["secret"] = APPSECRET; var uri = "https://api.weixin.qq.com/cgi-bin/token?" + queryString; HttpResponseMessage response; response = await client.GetAsync(uri); var msg = await response.Content.ReadAsStringAsync(); var jsonobj = Newtonsoft.Json.Linq.JObject.Parse(msg); HttpRuntime.Cache.Add("access_token", (string)jsonobj["access_token"], null, DateTime.Now.AddMinutes((int)jsonobj["expires_in"]), new TimeSpan(0, 0, 0), System.Web.Caching.CacheItemPriority.AboveNormal, null ); }
为了遵循微信关于缓存的要求,我们采用了HttpRuntime.Cache来保存token。正确获取到access token后,我们需要以此来获取jsapi_ticket
第二步:获取jsapi_ticket
jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
我们用于获取jsapi_ticket的代码为
if (HttpRuntime.Cache["jsapi_ticket"] == null) { var queryString = HttpUtility.ParseQueryString(string.Empty); queryString["access_token"] = (string)HttpRuntime.Cache["access_token"]; queryString["type"] = "jsapi"; var uri = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?" + queryString; HttpResponseMessage response; response = await client.GetAsync(uri); var msg = await response.Content.ReadAsStringAsync(); var jsonobj = Newtonsoft.Json.Linq.JObject.Parse(msg); HttpRuntime.Cache.Add("jsapi_ticket", (string)jsonobj["ticket"], null, DateTime.Now.AddMinutes((int)jsonobj["expires_in"]), new TimeSpan(0, 0, 0), System.Web.Caching.CacheItemPriority.AboveNormal, null ); }
同样是为了遵循信关于缓存的要求,我们采用了HttpRuntime.Cache来保存jsapi_ticket。现在,我们用于签名的素材都到齐了,我们要实现签名算法了。先看下微信关于签名算法的要求:
步骤1. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:
步骤2. 对string1进行sha1签名,得到signature:
这个步骤1的排序其实是可以忽略的,签名字段的排序其实是:jsapi_ticket、noncestr、timestamp、url就可以了,实现的代码如下
var pwd = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", (string)HttpRuntime.Cache["jsapi_ticket"], noncestr, timestamp, url ); var tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "SHA1"); return Request.CreateResponse(HttpStatusCode.OK, tmpStr);
这时候我们前端的HTML5就可以正确的采用JS-SDK了。
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 分享微信开发Html5轻游戏中的几个坑
- 微信悄悄升级群聊功能:个人微信营销号的福音
- 突击部队拼多多
- 我是运营,我没有假期
- 如何做到日消息量100万的微信公众号?
- 论微信取消推送功能的可能性(原创)
- 微信的成功,靠的是QQ导流吗?
- 「Linux 中国」2018 微信文章排行榜
- 一个微信群的兴亡
- 星外ASP.Net的安全设置相关说明
- C#、ASP.NET通用扩展工具类之TypeParse
- 微信服务号推送模板消息接口
- 实现ASP.NET无刷新下载并提示下载完成的开发思路
- C#、ASP.NET通用扩展工具类之LogicSugar
- C#、ASP.NET通用工具类IsWhat?(可以判断数字、身份证、数据类型等等)
- 程序中常用的种代码