微信JS-SDK 权限签名算法 C#版
来源:互联网 发布:上海数据港 待遇 编辑:程序博客网 时间:2024/06/07 06:19
开通黄钻
微信JS-SDK签名算法 官方文档
jsapi_ticket
生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket。
- 参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
- 用第一步拿到的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权限验证的签名了。
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转义。
即signature=sha1(string1)。 示例:
- noncestr=Wm3WZYTPz0wzccnW
- jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
- timestamp=1414587457
- url=http://mp.weixin.qq.com
步骤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
注意事项
- 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
- 签名用的url必须是调用JS接口页面的完整URL。
- 出于安全考虑,开发者必须在服务器端实现签名的逻辑。
——————————————————————————————————————————-
C# 版实现签名
1首先要获得jsapi_ticket
通过 accessToken,get请求 https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
得到jsapi_ticket
{
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#版
- 微信JS SDK使用权限签名算法 jsapi_ticket
- 微信JS SDK使用权限签名算法 jsapi_ticket
- 微信JS SDK使用权限签名算法
- 微信JS-SDK使用权限签名算法example
- 微信JS SDK使用权限签名算法 jsapi_ticket
- 微信js-sdk签名算法
- 微信JS-SDK使用权限签名算法的服务端实现(.net版本)
- 微信JS-SDK使用权限签名算法的服务端实现(.net版本)
- JS-SDK使用权限签名算法
- JS-SDK使用权限签名算法
- PHP+TP框架实现获取微信JS-SDK使用权限签名算法需要的jsapi_ticket,并全局缓存
- java微信js SDK页面签名
- 微信js-sdk config JavaScript签名
- 微信企业号开发之获取jsapi_ticket并生成JS-SDK权限验证签名
- JS-SDK使用权限签名算法----调用c++后台服务进行签名认证
- 微信js sdk invalid signature签名错误 问题解决。
- 微信js sdk invalid signature签名错误
- VS2013使用EF6与mysql数据库
- Entity Framework6 with Oracle(可实现code first)
- C#各种数据技术大数据查询性能对比
- C# Excel操作
- SQL Server 2008 R2开启数据库的远程连接
- 微信JS-SDK 权限签名算法 C#版
- 使用Myeclipse 8.5开发基于JAX-WS的Web service实例
- (java)maven安装及maven项目导入流程
- 使用maven新建项目
- HTML5开发移动web应用——SAP UI5篇(2)
- GIS+=地理信息+容器技术(8)——Docker1.10新特性介绍
- 【3-6】mapreduce执行过程【未完成,7弃】
- Android开发笔记(五十九)巧用传感器
- Android.mk结构