![]()
微信JS-SDK 权限签名算法 C#版
微信JS-SDK签名算法 官方文档 jsapi_ticket 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
成功返回如下JSON: { "errcode":0, "errmsg":"ok", "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in":7200 } 获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。 2015-10-13 更新 Senparc.Weixin.MP 通过使用此组件获取jaspi_ticket var jsticket=AccessTokenContainer.TryGetJsApiTicket(AppId, AppSecret); //这里的两参数是申请微信时给的 签名算法 签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket,timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
步骤1. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1: jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com 步骤2. 对string1进行sha1签名,得到signature: f4d90daf4b3bca3078ab155816175ba34c443a7b 注意事项
C# 版实现签名 1 首先要获得jsapi_ticket 通过 accessToken,get请求 https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi 得到jsapi_ticket
2
具体实现
{ TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); ViewBag.ts = Convert.ToInt64(ts.TotalSeconds).ToString(); varnoncestr="tianpeng"; varjsapi_ticket = "sM4AOVdWfPE4DxkXGEs8VF-YEiVh31f4b2Z4rz5E1kuduFEPIz0RgvSnRKebdULuK-yWvsNB_21vVh3IhyR1yg"; varjmdata = "jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}"; jmdata=string.Format(jmdata, jsapi_ticket, noncestr, ViewBag.ts, "http://www.nsoff.com/video/wx"); ViewBag.signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(jmdata,"SHA1"); ViewBag.noncestr = noncestr; returnView(); } 这是视图文件 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> //通过config接口注入权限验证配置 wx.config({ debug: true,// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'wxc3e8c1a90d0a0f26',// 必填,公众号的唯一标识 timestamp: '@ViewBag.ts', // 必填,生成签名的时间戳 nonceStr:'@ViewBag.noncestr', // 必填,生成签名的随机串 signature: '@ViewBag.signature',// 必填,签名 jsApiList: ['checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem', 'translateVoice', 'startRecord', 'stopRecord', 'onRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'uploadVoice', 'downloadVoice', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getNetworkType', 'openLocation', 'getLocation', 'hideOptionMenu', 'showOptionMenu', 'closeWindow', 'scanQRCode', 'chooseWXPay', 'openProductSpecificView', 'addCard', 'chooseCard', 'openCard']// 必填,需要使用的JS接口列表 }); //通过ready接口处理成功验证 wx.ready(function() { //config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后
varimages = { localId: [], serverId: [] }; document.querySelector('#chooseImage').onclick = function () { wx.chooseImage({ success: function (res) { images.localId = res.localIds; alert('已选择 ' +res.localIds.length + ' 张图片'); } }); }; }); </script> <br> <br><br><br><br> <button class="btn btn_primary" id="chooseImage">chooseImage</button>
就不贴运行截图了。跟微信的官方效果一致。 public static string GetSha1(string str) { //建立SHA1对象 SHA1 sha = new SHA1CryptoServiceProvider(); //将mystr转换成byte[] ASCIIEncoding enc = new ASCIIEncoding(); byte[]dataToHash = enc.GetBytes(str); //Hash运算 byte[]dataHashed = sha.ComputeHash(dataToHash); //将运算结果转换成string stringhash = BitConverter.ToString(dataHashed).Replace("-", ""); returnhash; } 此方法可替换系统方法 System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(jmdata,"SHA1");
效果是一样的。
微信 JS 接口签名校验工具 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 可以用他来跟我们生成的签名比较验证 Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE |
微信JS-SDK 权限签名算法 C#版
最新推荐文章于 2025-02-07 16:07:46 发布