本文将介绍基于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. 9.S5PV210的时钟系统

    1.时钟域:MSYS.DSYS.PSYS(1)因为S5PV210的时钟体系比较复杂,内部外设模块太多,因此把整个内部的时钟划分为3大块,叫做3个域.(2)MSYS: CPU(Cortex-A8内核). ...

  2. UICollectionView布局功能

    UIConllectionView和UITableView类似,也是展示数据,但不同于UITableView那种规则的布局,UICollectionView可以实现不规则的布局,即瀑布流. 创建UIC ...

  3. C#之Winform中treeview控件绑定数据库

    private DataSet ds; private SqlDataAdapter sqlDataAdapter1; private int maxnodeid; private void Form ...

  4. C++STL算法速查

      非变易算法 /* 第21章 非变易算法 Non-modifying sequence operations 21.0 advance, distance 为了了解模板,先了解一下这两个迭代器操作函 ...

  5. Web前端之CSS_day3-4

    1.行高 1.1 初始行高 行高=文字大小+上间距+下间距 默认文字大小:16px 默认文字行高:18px 注意:行高=盒子的高度,可以让文字垂直居中显示 1.2 行高单位 a. px 行高设置多少就 ...

  6. 项目Windows服务安装命令:

    sc create YY.SmsPlatform.RemoteDataCenter binPath= "E:\YY.SmsPlatform\YY.SmsPlatform.RemoteData ...

  7. JavaScript小功能

    1. JS判断是否为一个有效日期 1 2 3 4 function check(date){     return (new Date(date).getDate()==date.substring( ...

  8. echo颜色显示

    echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033 ...

  9. 【随笔】ssh登录时如何直接在参数中加入登录密码

    如同apt-get安装程序时会有-y参数来避免交互输入一样,我也希望在ssh登录时能够直接附加登录密码以避免交互式输入密码这一步,网上找了找,方法很多. 比如直接通过密钥免密码登录,不过需要改动很多, ...

  10. Confluence部署攻略 [转]

    一.软件介绍 AtlassianConfluence(简称Confluence)是一个专业的wiki程序.它是一个知识管理的工具,通过它可以实现团队成员之间的协作和知识共享.Confluence不是一 ...