
PC端微信扫码注册和登录
⼀、前⾔
先声明⼀下,本⽂所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项⽬切勿照搬。
相信做过微信开发的⼈授权这块都没少做过,但是⼀般来说我们更多的是为移动端的⽹站做授权,确切来说是在微信端下做的⼀个授权。今天
遇到的⼀个问题是,项⽬⽀持微信端以及PC端,并且开放注册。要求做到⽆论在PC端注册或者是在微信端注册之后都可以在另外⼀个端进
⾏登录。也就是说⽆论PC或是微信必须做到"你就是你"(通过某种⽅式关联)。
⼆、寻找解决⽅案
按传统的⽅式来思考,微信端完全可以通过授权进⾏注册,但是PC端呢,传统的⽅式⽆⾮就是填填⼿机号码啊,或者Email等等。如果采⽤这种
⽅式注册,会产⽣下⾯这的问题
1.我先在微信端授权注册,那么如果我要登录PC端还是得进⾏注册。
对此解决⽅案可以为:微信授权注册后“强制”要求⽤户必须填写基本信息,如⼿机号、Email。这样我们可以通过某种⽅式为⽤户⽣成PC
端登录的账号密码.例如以⽤户的nickname为账号,⼿机号码为密码,等等⽅式。
弊端:⽤户体验不好,再者有安全隐患。毕竟你的微信昵称,Email或者⼿机号码都是暴露的。
2.如果我先在PC端注册,我在微信授权的时候怎样关联移动端
当然,凡是问题总会有解决⽅案的。思路如下:
⽅案⼀:当⽤户在PC端注册后,“强制”⽤户必须填写微信昵称。以此作为微信授权时的关联条件。但是很遗憾,微信昵称可以
改,不是唯⼀的怎么可以⽤来做关联?⽅案⼀阵亡。
⽅案⼆:在微信端授权后,以及在PC端注册后“强制”要求⽤户填写⼿机号码以此为关联。这样衍⽣出⼀个问题,必须确保⽤户
⼿机的真实信,没问题。这个可以通过⼿机验证码来实现(Email也是⼀样)。但是不妨假设⼀下有下⾯这种情况,如果我有两个⼿
机号码,PC端注册时填⼀个,微信注册时填另⼀个。关联的了吗?答案是很遗憾。再者,我在PC端注册后我就是不填(笔者把强制
打上双引号的原因),然后我⽤微信端授权登录⼀下。好吧,此时将会有两条数据等着你想办法去关联,典型的开发者⾃挖坑。这种
⽅式某种程度上⾏得通,但是严谨程度上是开发者⽆法接受的。
三、回归原点的解决⽅案
分析:既然⽅案上述⽅案都有问题,我们先把它们都抛到⼀边。整理⼀下思路,让我们回到问题的根本。关联的问题,要的是⼀个唯⼀标
识。唯⼀标识正如我们的⾝份证号码,我们办理信⽤卡的时候⾝份证是必须的,实名制下购买号码卡,⾝份证是必须的。假设我们是这系统
管理员,那么我完全可以通过你的⾝份证号码查出你⼿机号码,银⾏卡号码。
有了上⾯的思路之后,我们需要做的就是找到⼀个唯⼀标识来作为关联.微信上有个重要的⾓⾊openid。它跟我们上⾯提到的⾝份证号码有这
共同的作⽤,微信账号对某⼀公众号的唯⼀标识。
微信端的授权拿到openid做过微信开发的⼈都应该没有问题。问题是怎样来实现PC端在注册或者登陆的时候拿到openid。笔者的实现思
路如下。PC端注册,或者登陆时显⽰⼀个⼆维码引导⽤户使⽤微信扫码,使其跳转到授权页⾯。这⼀步有⼀个最为关键的细节,⼆维码请带
上⼀个唯⼀的授权码(authCode)。试想⼀下如果⽤户授权后我们能把openid以及authCode写⼊到数据库。那么我们就可以在PC端通过
某个API获取authCode所关联的这个openid。如果我们做到这点我们就可以知道当前是谁在PC端进⾏扫码注册或登录(没注册的注册,有
注册的直接登录)。是不是突然觉得soeasy.如果觉得⽂字⽐较抽象,请看下⾯图⽰
PC端微信扫码登录流程
核⼼代码
搞清楚了思路和流程接下来我们直接上代码啦.开发思路是共通的,开发语⾔就请各显神通啦。
说明:下⾯代码以C#语⾔为例,采⽤MVC+EF(注:uuid等价于我们上述的authCode)
扫码登录页后台代码
publicActionResultLogin()
{
//如果已登录,直接跳转到⾸页
if(enticated)
returnRedirectToAction("Index","Home");
stringurl=;
stringuuid=d().ToString();
="http://"+url+"/home/loginfor?uuid="+uuid;//构造授权链接
=uuid;//保存uuid
returnView();
}
⽣成⼆维码采⽤插件,想详细了解的朋友请移步。这⾥需要注意的⼀点是,该插件可以指定⼆维码的⽣成⽅式,canvas或者
table请需要⽀持IE的朋友指定使⽤table⽣成
代码如下:
jQuery('#qrcode').qrcode({
render:"table",
text:""
});
回归正题,登录页⾯的主要代码如下
jQuery(function(){
//⽣成⼆维码
jQuery('#qrcode-container').qrcode("@");
//轮询判断⽤户是否授权
varinterval=tInterval(function(){
$.post("@("UrLogin","Home")",{"uuid":"@"},function(data,status){
if("success"==status){
//⽤户成功授权=>跳转
if("success"==data){
='@("Index","Home")';
clearInterval(interval);
}
}
});
},200);
})
轮询判断⽤户是否授权API代码
publicstringUrLogin(stringuuid)
{
//验证参数是否合法
if(OrEmpty(uuid))
return"param_error";
WX_UrRecordur=_(u=>==uuid).FirstOrDefault();
if(ur==null)
return"not_authcode";
//写⼊cookie
hCookie(,fal);
//清空uuid
=null;
anges();
return"success";
}
微信端授权Action
publicActionResultLoginfor(stringuuid)
{
#region获取基本信息-snsapi_urinfo
/*
* 创建微信通⽤类-这⾥代码⽐较复杂不在这⾥贴出
* 迟点我会将整个Demo稍微整理放上Github
*/
WechatUrContextwxcontext=newWechatUrContext(t,uuid);
//使⽤微信通⽤类获取⽤户基本信息
rInfo();
if(!OrEmpty())
{
uuid=Request["state"];
//判断数据库是否存在
WX_UrRecordur=_(u=>==).FirstOrDefault();
if(null==ur)
{
ur=newWX_UrRecord();
=;
=;
y=y;
Time=;
gUrl=gurl;
me=me;
ce=ce;
=;
d=d;
=uuid;
_(ur);
}
=uuid;
anges();
}
#endregion
returnView();
}
最后附上数据库表设计
没什么特殊的,就是微信返回的各个参数加多⼀个我们⾃定义的uuId
微信参数说明详情请见
运⾏效果
1.扫码登录页⾯
2.请求⽤户授权
3.⽤户确认授权
端登录完成
项⽬DEMO已上传⾄
附上两张配置图:
1.开发参数配置
2.公众号配置
⽂章难免有不⾜之处,还请海涵。如有发现错误还望留⾔指出,笔者感激不尽!微信扫码注册登录Demo待笔者整理后放上Github希望帮到
更多的朋友,请有需要的朋友留意该⽂更新。
本⽂为作者原创,转载请注明出处!
本文发布于:2023-03-10 12:42:05,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678423326204115.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:注册微信.doc
本文 PDF 下载地址:注册微信.pdf
| 留言与评论(共有 0 条评论) |