【.NET】.NET MVC4 微信扫一扫功能实现-附全部代码
写在前面的
首先在调用微信的JS-SDK接口的时候需要仔细阅读一下官方的注意事项,否则可能事倍功半。这里先大概概述一下主要的流程,首先,使用微信扫一扫需要一个已经通过认证的公众号;其次,需要知道公众号的APPID以及APPSecrect,以便获取Access_Token和Ticket;再有就是需要了解.NET内部的SHA1的加密类;最后引用官方的JS,就可以了。
VIEW代码
需要注意的是,公众号一定要有域名绑定
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"> </script>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
<script src="~/Script/WxScanQRCode.js"></script>
<script>
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '@ViewBag.appid', // 必填,公众号的唯一标识
timestamp: '@ViewBag.timestamp', // 必填,生成签名的时间戳
nonceStr: '@ViewBag.noncestr', // 必填,生成签名的随机串
signature: '@ViewBag.sinature',// 必填,签名
jsApiList: ['checkJsApi',
//这里的接口在官方文档中都有涉及,我们只需要调用微信扫一扫即可
//'chooseImage',
//'previewImage',
// 'uploadImage',
// 'downloadImage',
// 'getNetworkType',//网络状态接口
// 'openLocation',//使用微信内置地图查看地理位置接口
// 'getLocation', //获取地理位置接口
// 'hideOptionMenu',//界面操作接口1
// 'showOptionMenu',//界面操作接口2
// 'closeWindow', ////界面操作接口3
// 'hideMenuItems',////界面操作接口4
// 'showMenuItems',////界面操作接口5
// 'hideAllNonBaseMenuItem',////界面操作接口6
// 'showAllNonBaseMenuItem',////界面操作接口7
'scanQRCode'// 微信扫一扫接口
]
});
<!--开始扫描-->
function scan(){
wx.ready(function () {
var _scan = document.getElementById("url");
_scan.value = window.location.href;
wx.scanQRCode({
needResult: ,
desc: 'scanQRCode desc',
success: function (res) {
alert(JSON.stringify(res));
}
});
})
}
</script>
</head> <body>
<div>
<input type="text" name ="url" id="url">
<button id="scanbutton" type="button" onclick="scan()">click here to scan</button>
</div>
</body>
</html>
Controller代码
首先,我们需要根据APPID和APPSecrect来获取Access_Token,之后根据AccessToken来获取jsapi_ticket。最后,在Controller内部生成时间戳,随机字符串,之后将ticket以及前两者根据SHA1加密成签名,并发送给微信服务器,通过认证之后,这样就可以调用扫一扫的接口了。
public ActionResult Index()
{
//获取ACCESS_TOKEN
string _url = Request.Url.ToString();
//获取Ticket
string _ticket = Requestjsapi_ticket(Request_Url());
//获取ticket
string _finalticket = _ticket;
//获取noncestr
string _noncestr = CreatenNonce_str();
//获取timestamp
long _timestamp = CreatenTimestamp();
//获取sinature
string _sinature = GetSignature(_finalticket, _noncestr, _timestamp, _url).ToLower(); ViewBag.appid = "这里填写你的APPID";
ViewBag.timestamp = _timestamp;
ViewBag.noncestr = _noncestr;
ViewBag.sinature = _sinature;
return View(); } //获取AccessToken
public static string Request_Url()
{
// 设置参数
string _appid = "这里写入你的APPID";
string _appsecret = "这里写入你的APPSecrect";
string _url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + _appid + "&secret=" + _appsecret;
string method = "GET";
HttpWebRequest request = WebRequest.Create(_url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = method;
request.ContentType = "text/html";
request.Headers.Add("charset", "utf-8"); //发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
//由于微信服务器返回的JSON串中包含了很多信息,我们只需要将AccessToken获取就可以了,需要将JSON拆分
String[] str = content.Split('"');
content = str[];
return content;
} //根据AccessToken来获取jsapi_ticket
public static string Requestjsapi_ticket(string accesstoken)
{ string _accesstoken = accesstoken;
string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + _accesstoken + "&type=jsapi";
string method = "GET";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = method;
request.ContentType = "text/html";
request.Headers.Add("charset", "utf-8");
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
//同样,返回的JSON中只要取出ticket的信息即可
String[] str = content.Split('"');
content = str[];
return content;
} //接下来就是辅助工具类,生成随机字符串
#region 字符串随机 CreatenNonce_str()
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"
};
public static string CreatenNonce_str()
{
Random r = new Random();
var sb = new StringBuilder();
var length = strs.Length;
for (int i = ; i < ; i++)
{
sb.Append(strs[r.Next(length - )]);
}
return sb.ToString();
}
#endregion //生成时间戳,备用
#region 时间戳生成 CreatenTimestamp()
public static long CreatenTimestamp()
{
return (DateTime.Now.ToUniversalTime().Ticks - ) / ;
}
#endregion //获取签名,这里的三个参数分别为前面生成的ticket,随机字符串以及时间戳
#region 获取签名 GetSignature()
public static string GetSignature(string jsapi_ticket, string noncestr, long timestamp,string url)
{ 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("#") >= ? url.Substring(, url.IndexOf("#")) : url);
return SHA1(string1Builder.ToString());
}
#endregion //最后就是SHA1的加密算法工具
#region 加密签名算法 SHA1(content)
//加密签名算法
public static string SHA1(string content)
{
return SHA1(content, Encoding.UTF8); }
//加密签名
public static string SHA1(string content, Encoding encode)
{
try
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_in = encode.GetBytes(content);
byte[] bytes_out = sha1.ComputeHash(bytes_in);
sha1.Dispose();
string result = BitConverter.ToString(bytes_out);
result = result.Replace("-", "");
return result;
}
catch (Exception ex)
{
throw new Exception("SHA1加密出错:" + ex.Message);
}
}
#endregion
总结
代码复制即可使用,需要注意的还是公众号的认证,域名的绑定,以及最后加密算法生成的字符串的正确性,少了哪一步,我们都不会得到一个正确的返回结果。
转载:https://blog.csdn.net/SugaryoTT/article/details/78558105
【.NET】.NET MVC4 微信扫一扫功能实现-附全部代码的更多相关文章
- C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能
前面介绍了很多篇关于使用C#开发微信门户及应用的文章,基本上把当时微信能做的接口都封装差不多了,微信框架也积累了不少模块和用户,最近发现微信公众平台增加了不少内容,特别是在自定义菜单里面增加了扫一扫. ...
- 微信JSSDK使用步骤(用于在微信浏览器中自定义分享,分享到朋友圈,拍照,扫一扫等功能)
一.使用JSSDK需要一个公众号(需要认证!): (1).把自己项目的服务器地址输入. (2).把MP_verify_m7Qp93BAuIGDWRVO.txt 文件下载下来,放到该服务器域名指向的根 ...
- 调用微信的扫一扫功能详解说明---(java 排坑版)
最近碰到了这么一个需求,说是在前端页面调用手机本地的相机,扫描二维码这么一个需求,对于我一个后端来说, 这实在是难,难于上青天,但是决不能说一个不字.我说可以使用微信的扫码工具吗,这样可以方便一点,. ...
- 调用微信扫一扫功能,踩坑'invalid signature'
在vue项目中,调用微信扫一扫功能,在安卓系统下完全正常,ios系统下却报错'invalid signature'的错误,这可能令许多小伙伴困惑,经过查询大量博客相关资料,才找到了解决的方法. 原因: ...
- .Net微信网页开发之使用微信JS-SDK调用微信扫一扫功能
前言: 之前有个项目需要调用微信扫描二维码的功能,通过调用微信扫码二维码功能,然后去获取到系统中生成的二维码信息.正好微信JS-SDK提供了调用微信扫一扫的功能接口,下面让我们来看看是如何实现的吧. ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-2.微信扫一扫功能开发前期准备
笔记 2.微信扫一扫功能开发前期准备 简介:讲解微信扫一扫功能相关开发流程和资料准备 1.微信开放平台介绍(申请里面的网站应用需要企业资料) ...
- C#实现像微信PC版一样的扫码登录功能
现在好些网站都支持扫码登录,感觉上安全了很多,但是本地程序扫码登录的不多,就用C#实现了一下,需要作如下准备 在官网上申请一个企业微信,有条件的话做个企业认证吧,我们的是认证过的,所以账号和本地其他系 ...
- 微信公众平台自定义菜单新增扫一扫、发图片、发位置 LBS运作更便捷
今天微信公众平台发布更新,自定义菜单新增扫一扫.发图片.发送位置等功能,这对于有意挖掘微信LBS服务的运营者来说更便捷了,订阅号不用返回微信界面就能扫图.发送图片.调用地理位置,用户体验更友好,自然也 ...
- DWR实现扫一扫登录功能
前言 <DWR实现后台推送消息到Web页面>一文中已对DWR作了简介,并列出了集成步骤.本文中再一次使用到DWR,用以实现扫一扫登录功能. 业务场景 web端首页点击"登陆&qu ...
随机推荐
- automake - 使用 autotools 工具集
一般而言,对于小项目或玩具程序,手动编写 Makefile 即可.但对于大型项目,手动编写维护 Makefile 成为一件费时费力的无聊工作. 本文介绍 autotools 工具集自动生成符合 Lin ...
- python3 练习题 day04
'''1.整理装饰器的形成过程,背诵装饰器的固定格式''''''开放封闭原则:为了保证程序的稳定性,和功能的可开放性,在不修改目标函数源代码和调用方式的情况下,对目标函数增加新功能'''# def w ...
- fastJson 之 JSONPath使用
1. JSONPath介绍 官网地址: https://github.com/alibaba/fastjson/wiki/JSONPath fastjson 1.2.0之后的版本支持JSONPath. ...
- 项目代码迁移(使用git)
克隆老仓库(裸仓库):git clone --bare git@codehub.devcloud.huaweicloud.com:e2f197xxxxxxx19fc4ae7348b2ed41/Node ...
- 浅谈文件断点续传和WebUploader的基本结合
0.写在前面的话 上篇博客已经是在8月了,期间到底发生了什么,只有我自己知道,反正就是心情特别糟糕,生活状态工作状态学习状态都十分不好,还有心思进取吗,No!现在状态好起来了,生活又充满了希望 :D ...
- C#总结(五)调用C++动态库(类型对照)
函数调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配. 在dllimport中加入CallingConvention参数就行了, [DllImport(PCAP_DL ...
- Java性能优化之编程技巧总结
程序的性能受代码质量的直接影响.在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能. 1.慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获, ...
- Docker入门 第一课 --.Net Core 使用Docker全程记录
微服务架构无疑是当前最火热的开发架构,而Docker作为微服务架构的首选工具,是我们必须要了解掌握的. 我通过一天的时间,网上查文档,了解基础概念,安装Docker,试验Docker命令,通过Dock ...
- React中嵌套组件与被嵌套组件的通信
前言 在React项目的开发中经常会遇到这样一个场景:嵌套组件与被嵌套组件的通信. 比如Tab组件啊,或者下拉框组件. 场景 这里应用一个最简单的Tab组件来呈现这个场景. import React, ...
- 20分钟 看图手写的table
<html><body><table width="100%" border="1" cellspacing="0&qu ...