用c#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)
本文将介绍基于Senparc.Weixin微信开发框架来实现网页授权来获取用户基本信息。先生成包含授权及回调url信息的二维码;用户用微信扫描之后,被要求授权以获取Ta的用户基本信息;用户授权后,通过回调url页面获取并显示用户的基本信息;在这个页面上加一个按钮,点点击按钮后,把用户的基本信息保存到数据库。
下面介绍详细的步骤:
1. 生成二维码
下面这个url是一个授权页面,包含了回调的url参数redirect_uri:
注意,要把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#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)的更多相关文章
- 微信中扫描二维码自动打开手机系统默认浏览器下载APP(APK)
很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 功能目的 生成微信跳转链接,实现微信内置浏览 ...
- 微信JSSDK 扫描二维码
<?php require_once('wxjssdk.class.php'); $weixin = new class_weixin(); $signPackage = $weixin-> ...
- Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)
二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...
- Win10 UWP开发:摄像头扫描二维码/一维码功能
这个示例演示整合了Aran和微软的示例,无需修改即可运行. 支持识别,二维码/一维码,需要在包清单管理器勾选摄像头权限. 首先右键项目引用,打开Nuget包管理器搜索安装:ZXing.Net.Mobi ...
- android开发修改相机扫描二维码框的高宽
我用的是网上一个现成的例子,可以直接用,但是高宽不合适,现在主流都是大屏幕手机了,所以需要更改. 找到CameraManager 类,更改下面的方法 public Rect getFramingRec ...
- 用c#开发微信 (20) 微信登录网站 - 扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 1 创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- Asp.Net微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- C#微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- php微信开发之带参数二维码的使用
最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把 ...
随机推荐
- winform.布局
布局:默认布局:自己拖动进行布局,工具栏里对齐方式 右键,锁定.##随容器拉动变化属性:Anchor:上下左右,固定的设置 panel的排列 1.Dock属性:(顺序填充)Top:靠上,高度不变,左右 ...
- java中Thread的 interrupt异常处理
http://blog.csdn.net/srzhz/article/details/6804756
- HIS与CIS的区别与联系
医院的医疗信息系统总体可以分为两类:一类是关于医院管理运作的,另一类是关于临床医疗护理的,即面向医院管理和病人管理,前者被称为HIS(医院信息系统),后者被称为CIS(临床信息系统).HIS是以经济核 ...
- C# 集合与泛型
一.古典集合方式 在C#2.0的时候集合主要通过两种方式实现: 1.使用ArrayList实现 新建ArrayList,然后将所有对象放入该数组中,简单直接,但缺点是该数组什么类型的元素都能接收,在实 ...
- MC java 远程调试 plugin 开发
@ECHO OFF SET CATALINA_OPTS= -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,se ...
- 使用Aspose插件将程序中的表格,导出生成excel表格
http://www.cnblogs.com/lanyue52011/p/3372452.html这个是原文地址 /// <summary> /// 点击按钮,将内存表导出excel表格! ...
- Hibernate学习笔记
一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...
- winform-全局异常捕获作用
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using Jxs ...
- AsyncTask的缺陷以及解决方法
1.AsyncTask常用于进行耗时操作,完成后更新主线程的UI. 2.缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程 ...
- Trie树:POJ2001
这是一道最简单的trie树的题 有趣的是这道题的测试用例无法在VS上调试,只能在框框里不断提交测试了,哈哈 最基本的Trie树,插入和查找操作没什么好说的 注意节点添加一个count变量作为附加条件, ...