手机版

NET C#使用微信微信官方账号登录网站

时间:2021-09-08 来源:互联网 编辑:宝哥软件园 浏览:

适用对象:本文适用于有一定微信开发基础的用户

导读:花300元申请微信公众平台后,发现无法使用微信微信官方账号登录网站(非微信开通)获取微信账号。仔细研究后发现,申请微信开放平台访问网站还需要300大洋。所以作为一个屌丝程序员,我想到了自己做一个登录界面。

工具和环境:1。vs2013.net4.0c # mvc4.0razor2 .插件a .微软。信号员;不时获取后台数据B . Gma . qrcode net . encoding;文本生成二维码

实现目标1。在电脑上打开网站登录页面,提示用户使用微信扫描登录确认。2.用户通过微信扫描确认后,电脑自动收到确认消息,跳转到网站首页。

原理分析1。Signaler是一个神奇的工具,可以将信息从浏览器A发送到服务器,服务器自动将信息推送到指定的浏览器b,然后我的计划是用电脑的浏览器打开登录页面,生成一个二维码(内容是微信公众平台用户授权的网址),用微信的追踪功能打开这个网站。通过SignalR将获取的微信用户OPENID发送到电脑浏览器,实现登录功能

实施过程:1。微信公从平台注册及权限(跳过.) 2.在2中构建MVC网站。VS2013,我的环境是。NET4.0 C# MVC4.0 Razor引擎(个人习惯)。

3.安装信号2013点击工具==库包管理器==包管理控制台

输入以下命令:安装包微软。aspnet . signal er-版本1.1.4

建议在中安装1.1.4更高版本。net4.0 Mvc4环境,但无法安装。

SingnalR安装成功

设置信号

var config=新微软。AspNet . signal r . Hubconfiguration();配置。EnableCrossDomain=true可路由。Routes.MapHubs(配置);

创建一个新类PushHub.cs

使用微软。信号员;使用微软。信号中枢;使用系统;使用系统。集合。通用;使用系统。Linq使用系统。Web命名空间wd . c . utility {///summary///标记要连接的Single javascription的名称////summary[hub name(' push hub ')]公共类push hub : hub {///summary///临时保存请求的用户////summary静态字典字符串,string rlist=新字典字符串,string();///summary////请求登录的用户;打开登录页面执行此方法,用于记录浏览器连接////summary public void user connected(){ if(!rlist。ContainsKey(上下文。ConnectionId)) rlist。添加(上下文。ConnectionId,字符串。空的);//Client是指向指定ID的浏览器发送getuserID方法,浏览器获取context . connectionidclients . Client(context . connectionid)。通过javascrip方法GetUserId(字符串)从后台发送的GetUserId(context . connectionid);}///summary////实际登录用户////summary//param name=' ruser '请求的用户id/param///param name=' logUserID '微信OPENID/param public void loguserConnected(字符串ruser,字符串logUserID) { if (rlist。ContainsKey(ruser)) { rlist。移除(诡计);//Client是指将getuserID方法发送给指定ID的浏览器,浏览器通过javascrip方法userloginssuccessful(bool,string),微信openidclients.client (ruser)从后台获取登录成功。userloginsuccessful (true,loguserid);}}}}创建一个新的MVC控制器‘logincontroller . cs’,其他教程中不会读到;

使用系统;使用系统。集合。通用;使用系统Linq .使用系统网络.使用系统网络。手动音量调节命名空间WD .c。控制器{公共类LoginController :控制器{////GET :/登录////摘要///登录主页,电脑端打开////summary////returns/returns公共行动结果索引(){/*参考https://mp.weixin.qq.com/wiki?t=resource/RES _ mainid=MP 1421140842 token=lang=zh _ CN * 1 .统一资源定位器用于生成二维码给微信扫描*2.格式参考微信公从平台帮助* https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPIDredirect _ uri=REDIRECT _ URIresponse _ type=codescope=scope estate=STATE #微信重定向(_ r)若提示"该链接无法访问",请检查参数是否填写错误,是否拥有范围参数对应的授权作用域权限。 *3.重定向_URI内容为返回地址,需要开发者需要先到公众平台官网中的"开发-接口权限-网页服务-网页帐号-网页授权获取用户基本信息"的配置选项中,修改授权回调域名*4.重定向_URI应回调到WxLog页并进行URLEncode编码,如: redirect _ uri=geturlenode(' http://你的网站/Login/WxLog?ruser=');诡计为PushHub中的语境连接标识.到视角中配置* */viewpag .Url=字符串。格式(' https://打开。微信。QQ。com/connect/oauth 2/authorize?appid={ 0 } redirect _ uri={ 1 } response _ type=code scope=SNS API _ base state={ 2 } #微信_重定向',B.Helper.AppID,geturlenode(' http://你的网站/Login/WxLog?鲁塞尔='),Guid .NewGuid());返回视图();} ///摘要///登录确认页,微信端打开////summary////param name=' ruser '/param////returns/returns public action result WxLog(字符串ruser) { //使用微信登录if(!字符串IsNullOrEmpty(代码)){ string loguser=B . helper。getopenidbycode(代码);session[' LogUserID ']=loguser;视图包LogUserID=loguser } viewpag . ruser=ruser返回视图();} }}控制器' QRController.cs '用于文本生成二维码

使用系统;使用系统。集合。通用;使用系统Linq .使用系统网络.使用系统网络。手动音量调节命名空间WD .控制器公共类QR控制器:控制器{////GET:/QR/公共动作结果索引(){ return View();} ///摘要///获得2维码图片////summary////param name=' str '/param////returns/returns public action result getqrcode img(string str){ 0使用(var ms=新系统.IO。memory stream()){ string string test=str;GetQRCode(stringtest,ms);回应内容类型=' image/Png ';回应。输出流。写入(毫秒GetBuffer(),0,(整数)毫秒长度);系统。绘图。位图img=新系统。绘图。位图(100,100);img .保存(毫秒,系统绘图。成像。imageformat。JPEG);回应end();返回文件(ms.ToArray(),@ ' image/JPEG ');} }私有静态bool GetQRCode(字符串系统内容.IO。MemoryStream ms) { Gma .二维码网。编码。errorcorrectionlevel Ecl=Gma .编码。编码。错误更正级别误差校正水平字符串内容=strContent//待编码内容Gma .二维码网。编码。窗户。渲染。安静区模块安静区=Gma .二维码网。编码。窗户。渲染。安静区域模块。两个;//空白区域int ModuleSize=12//大小定义变量编码器=新Gma .二维码网。编码。QR编码器(Ecl);Gma .二维码网。编码。二维码QR;如果(编码器。尝试编码(内容,输出qr))//对内容进行编码,并保存生成的矩阵{ var render=new Gma .二维码网。编码。窗户。渲染。图形渲染器(新Gma .二维码网。编码。窗户。渲染。固定模块大小(模块大小,安静区域));渲染WriteToStream(qr).矩阵,系统。drawing . imaging . imageformat . Png,ms);} else { return false}返回true} }}视图开启var先生聊天=$。连接。PushHub$.connection.hub.start().done(function(){ chat。服务器。ruser connected();});

$.connection.pushHub对应

聊天。服务器。ruser connected();对应

表示调用“pushHub”运行后执行runserConnected方法,在临时表中增加当前浏览器的ConnectionID

聊天。客户。getuserid=function(ruserid){//二维码生成的文本$('#loga ').attr('src ',' @ ViewBag .URL ' ruse rid);}

表示台后数据收到数据后返回到游览器

聊天。客户。userloginsuccessful=function(r,userid) { if (r) { $ .post('/Login/AddSession/',{ userid: userid },function(R2){ if(R2){ location。href='/Home/';} }) } };用户通过微信登录后

接收微信OpenID$ .post('/Login/AddSession/',{ userid: userid },function(R2){ if(R2){ location。href='/Home/';}})

执行邮政到后台增加登录信息,成功后转到/Home/主页

///摘要///保存微信确认登录后返回的OPENID,做为网站的session[' LogUserID ']////summary///param name=' userid '/param///returns/returns public JsonResult AddSession(字符串userid){ Session[' LogUserID ']=userid;返回Json(真);}Login/WxLog.cshtml本页在微信上打开

@{ ViewBag .title=' WxLog } script src=' http : ~/Scripts/jquery。信号-1。1 .4 .量滴js '/script script src=' http : ~/signal/hubs '/script script $(function(){//连接signor push hab var chat=$。连接。推轮毂;//启动$.connection.hub.start().done();$('#btnLog ').单击(函数(){ //登录,发送信息到服务器聊天。服务器。loguserConnected(' @ viewpag。“诡计”,@ viewpag .LogUserID ';});});/script H2 wxlog/h2a href=' # ' id=' btnLog '登录/a @ { viewpag .标题="索引";} @脚本渲染(' ~/bundle/jquery ')脚本src=' http : ~/Scripts/jquery。先生-1。1 .4 .量滴js '/脚本脚本src=' http : ~/signor/hubs '/脚本脚本类型=' text/JavaScript ' $(function(){ var chat=$。连接。pushhub$.connection.hub.start().done(function(){ chat。服务器。ruser connected();});聊天。客户。getuserid=function(ruse rid){ $(' # loga ').attr('src ',' @ ViewBag .URL ' ruse rid);}聊天。客户。userloginsuccessful=function(r,userid){ if(r){ location。href='/Home/';}) } };});/脚本标题a href=' ~/Home/' class='图标字体后退图标'/a h1用户登录/h1/header div style=' height :1 rem;'/div请使用微信登录扫描以下二维码生产图片div img id=' loga ' src=' http : # ' width=' 90% '//div(9507 . 163.com)

GetOpenIDByCode(代码)方法

参考https://mp.weixin.qq.com/wiki?t=resource/RES _ mainid=MP 1421140842 token=lang=zh _ CN

对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是范围为snsapi_userinfo,也是静默授权,用户无感知。

具体而言,网页授权流程分为四步:1、引导用户进入授权页面同意授权,获取代码2、通过密码换取网页授权access_token(与基础支持中的访问令牌不同)3、如果需要,开发者可以刷新网页授权访问令牌,避免过期4、通过网页授权访问令牌和openid获取用户基本信息(支持UnionID机制)

公共静态字符串GetOpenIDByCode(字符串代码){字符串url=字符串.格式(' https://API . weixin . QQ.com/SNS/oauth 2/access _ token?appid={ 0 } secret={ 1 } code={ 2 } grant _ type=authorization _ code ',AppID,AppSecret,code);使用(系统。网络客户端=新系统净。WebClient()){ string tempstr=client .下载字符串(网址);新regex(@'\''openid\'':\''[^\''】?\ ' ',',正则表达式.忽略大小写);字符串tempstr2=regex .匹配(tempstr).价值;返回温度2 .子串(10,温度2 .长度-12);} }精彩专题分享:ASP .网微信开发教程汇总,欢迎大家学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:NET C#使用微信微信官方账号登录网站是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。