本文将介绍基于Senparc.Weixin微信开发框架来实现网页授权来获取用户基本信息。先生成包含授权及回调url信息的二维码;用户用微信扫描之后,被要求授权以获取Ta的用户基本信息;用户授权后,通过回调url页面获取并显示用户的基本信息;在这个页面上加一个按钮,点点击按钮后,把用户的基本信息保存到数据库。

下面介绍详细的步骤:

1. 生成二维码

下面这个url是一个授权页面,包含了回调的url参数redirect_uri:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdbdfwddd272bc&redirect_uri=http%3a%2f%2fwww.gwjg.com%2fwechat%2foauth2%2fUserInfoCallback.aspx&response_type=code&scope=snsapi_userinfo&state=JeffreySu&connect_redirect=1#wechat_redirect

注意,要把appid和redirect_url换成你自己的

打开 http://cli.im/url ,输入上面的url,生成二维码图片

2. 新建一个二维码的页面

<form id="form1" runat="server">

        <div style="align-content:center;align-items:center">

            <h2>OAuth2.0授权测试</h2>

            <img src="../Images/QrCode.png" height="190" width="190" alt="" />

        </div>

    </form>

把上面生成的二维码图片放到页面上。

3. 新建上面提到的回调页面:

前台:

<form id="form1" type="post" runat="server">

       <div>

           <p>下面是通过授权得到的您的部分个人信息:</p>

           <p>

               nickname:

               <label>

                   <%=(ViewState["WeixinUserInfo"] as Youda.ViewEntity.UserInfoEntity).NickName%></label>

           </p>

           <p>

               country:

               <%=(ViewState["WeixinUserInfo"] as Youda.ViewEntity.UserInfoEntity).Country %>

           </p>

           <p>

               province:   

               <%=(ViewState["WeixinUserInfo"] as Youda.ViewEntity.UserInfoEntity).Province %>

           </p>

           <p>

               city:   

               <%= (ViewState["WeixinUserInfo"] as Youda.ViewEntity.UserInfoEntity).City %>

           </p>

           <p>

               sex:

               <%= (ViewState["WeixinUserInfo"] as Youda.ViewEntity.UserInfoEntity).Sex %>

           </p>

           <p>

               头像(直接调用可能看不到,需要抓取):<br />

               <img src="<%=(ViewState["WeixinUserInfo"] as Youda.ViewEntity.UserInfoEntity).HeadImgUrl %>" />

           </p>

           <p>

               <input style="height:50px;width:90px" type="submit" data-theme="b" value="点赞" id="bsubmit" rel="external" />

               </p>

       </div>

   </form>

注意这里的type一定要设成post: <form id="form1" type="post" runat="server"> , 不然页面会多次被调用,以至于下面的用code取access_token时,报40029 invalid code的错误。因为第一次取完之后,立马再去取就会报40029的错误。

后台:

private string appId = ConfigurationManager.AppSettings["appID"];

       private string appSecret = ConfigurationManager.AppSettings["appSecret"];

       ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

 

       protected void Page_Load(object sender, EventArgs e)

       {

           log.Info(Request.HttpMethod);

           if (Page.IsPostBack)

           {

               try

               {

                   if (ViewState["WeixinUserInfo"] == null) Response.End();

                   var userInfo = ViewState["WeixinUserInfo"] as UserInfoEntity;

                   log.Info(userInfo.NickName);

                   new UserInfoBll().Create(userInfo);

 

                   Response.Write("保存成功");

                   Response.End();

 

               }

               catch (Exception ex)

               {

                   log.Error(ex.Message, ex);

                   Response.End();

               }

           }

           else

           {

               if (ViewState["WeixinUserInfo"] == null)

               {

                   log.Info(Request.Url);

 

                   string code = Request["code"];

 

                   if (string.IsNullOrEmpty(code))

                   {

                       Response.Write("您拒绝了授权!");

                       Response.End();

                   }

 

                   log.Info(code);

 

                   OAuthAccessTokenResult result = null;

 

                   //通过,用code换取access_token

                   try

                   {

                       result = result = OAuthApi.GetAccessToken(appId, appSecret, code);

                   }

                   catch (ErrorJsonResultException jex)

                   {

                       log.Error(jex.Message, jex);

                       Response.Write("0 " + " , error: " + jex.Message);

                       Response.End();

                   }

                   catch (Exception ex)

                   {

                       log.Error(ex.Message, ex);

                       Response.Write("1 " + " code: " + code + " , error: " + ex.Message);

                       Response.End();

                   }

                   if (result.errcode != ReturnCode.请求成功)

                   {

                       Response.Write("2 " + result.errmsg);

                       Response.End();

                   }

                   //下面2个数据也可以自己封装成一个类,储存在数据库中(建议结合缓存)

                   //如果可以确保安全,可以将access_token存入用户的cookie中,每一个人的access_token是不一样的

                   //Session["OAuthAccessTokenStartTime"] = DateTime.Now;

                   //Session["OAuthAccessToken"] = result;

 

                   //因为第一步选择的是OAuthScope.snsapi_userinfo,这里可以进一步获取用户详细信息

                   try

                   {

                       OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);

                       var user = new UserInfoEntity()

                       {

                           City = userInfo.city,

                           Province = userInfo.province,

                           Country = userInfo.country,

                           HeadImgUrl = userInfo.headimgurl,

                           //Language = userInfo.language,

                           //Subscribe_time = userInfo.subscribe_time,

                           Sex = (Sex)userInfo.sex,

                           NickName = userInfo.nickname,

                           OpenId = userInfo.openid

 

                       };

                       log.Info(user.NickName);

                       ViewState["WeixinUserInfo"] = user;

 

                       //Response.Write(ViewState["WeixinUserInfo"]);

                       //Response.End();

                   }

                   catch (ErrorJsonResultException ex)

                   {

                       log.Error(ex.Message, ex);

                       Response.Write("3 " + ex.Message);

                       Response.End();

                   }

               }

           }

       }

1) 根据回调url上的code取access_token

result = OAuthApi.GetAccessToken(appId, appSecret, code);

2) 根据access_token取用户信息

OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);

3)在页面上显示用户信息

var user = new UserInfoEntity()

{

    City = userInfo.city,

    Province = userInfo.province,

    Country = userInfo.country,

    HeadImgUrl = userInfo.headimgurl,

    Sex = (Sex)userInfo.sex,

    NickName = userInfo.nickname,

    OpenId = userInfo.openid

 

};

 

ViewState["WeixinUserInfo"] = user;

注意显示到页面上的实体一定要记得序列化,否则显示不出来:

[Serializable]
public class UserInfoEntity : IViewModel<UserInfoEntity, UserInfo>

4) 当点击页面上的 点赞按钮后,保存用户的信息

if (Page.IsPostBack)

{

       var userInfo = ViewState["WeixinUserInfo"] as UserInfoEntity;

        log.Info(userInfo.NickName);

        new UserInfoBll().Insert(userInfo);

 

        Response.Write("保存成功");

        Response.End();

}

数据访问框架层(ORM)采用了.NET平台的Entity Framework来实现;实体数据的转换使用开源的Object-Object Mapping工具Automapper。

4. 下载源码

http://yunpan.cn/cjapF4dFvngiu  访问密码 ca16

使用源码前,要先创建数据库(ORM/db.sql),修改config文件(里面是xxxx的)

用c#开发微信 系列汇总

用c#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)的更多相关文章

  1. 微信中扫描二维码自动打开手机系统默认浏览器下载APP(APK)

    很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 功能目的 生成微信跳转链接,实现微信内置浏览 ...

  2. 微信JSSDK 扫描二维码

    <?php require_once('wxjssdk.class.php'); $weixin = new class_weixin(); $signPackage = $weixin-> ...

  3. Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)

    二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...

  4. Win10 UWP开发:摄像头扫描二维码/一维码功能

    这个示例演示整合了Aran和微软的示例,无需修改即可运行. 支持识别,二维码/一维码,需要在包清单管理器勾选摄像头权限. 首先右键项目引用,打开Nuget包管理器搜索安装:ZXing.Net.Mobi ...

  5. android开发修改相机扫描二维码框的高宽

    我用的是网上一个现成的例子,可以直接用,但是高宽不合适,现在主流都是大屏幕手机了,所以需要更改. 找到CameraManager 类,更改下面的方法 public Rect getFramingRec ...

  6. 用c#开发微信 (20) 微信登录网站 - 扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 1 创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  7. Asp.Net微信登录-电脑版扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  8. C#微信登录-电脑版扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  9. php微信开发之带参数二维码的使用

    最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把 ...

随机推荐

  1. submit异步提交 回调的方法

    背景: mvc模式下,当submit表单的时候,后台Control自动绑定Model类,但是如果不用submit来提交,改用ajax提交的时候,后台Control无法获取前台form表单内相应Name ...

  2. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  3. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  4. Python-dict与set

    dict(字典):用空间换取时间,占据空间大,但查询速度快,键值对(key:value),key唯一 d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} 由于一个k ...

  5. 图解 & 深入浅出 JavaWeb:Servlet必会必知

    从[JavaEE 要懂的小事] Http相关,一直想写点Web开发相关的.最近项目接口开发紧,还有准备新的九月份战斗.JDK IO源码就隔一段落,温故知新看看Servlet & JSP 相关. ...

  6. strace命令介绍(转)

    原文链接:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信 ...

  7. eclipse 相同变量高亮显示 颜色修改 变量着色

    问题描述:      在eclipse中使用快捷键或其他原因,不小心按错了,使得变量的高亮显示没了.   1.简单的办法:  网上搜了一下,原来是Toggle Mark Occurrences (Al ...

  8. WPF中获得控件相对于控件的相对位置

    GeneralTransform generalTransform = lstitem.TransformToAncestor(this.BackStack); Point point = gener ...

  9. ln 软链接与硬链接的区别再次回顾

    以下是整理的笔记 软硬链接区别 硬链接 软链接 文件有相同的 inode 及 data block 是另一个文件 只能对已存在的文件进行创建 可以对不存在的文件进行创建 不能交叉文件系统进行硬链接的创 ...

  10. 遇到的check the manual that corresponds to your MySQL server version for the right syntax错误

    遇到的check the manual that corresponds to your MySQL server version for the right syntax错误. 结果发现是SQL关键 ...