using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;namespace Web
{
public partial class Test : System.Web.UI.Page
{
//用户id
public string openid = ""; //公众号信息部分
public string appid = ConfigurationManager.AppSettings["AppId"];
public string appsecret = ConfigurationManager.AppSettings["AppSecret"]; public string redirect_uri = HttpUtility.UrlEncode("需返回的URL"); #region 显示页面
public string accesstoken;
public string nickname;
public string sex;
public string headimgurl;
public string province;
public string country;
public string language;
public string city; public string privilege = ""; public string errorMsg = "";
public string errorUrl = "";
#endregion protected void Page_Load(object sender, EventArgs e)
{
// 微信官方文档
// https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
// /* *微信认证获取openid部分: *临时认证code */
string code = Request["code"];
if (string.IsNullOrEmpty(code))
{
//判断session不存在
if (Session["openid"] == null)
{
//认证第一步:重定向跳转至认证网址
// 1.snsapi_base 不弹出授权页面,直接跳转,只能获取用户openid
string urlbase = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state=123#wechat_redirect", appid, redirect_uri);
// 2.snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
string usrinfo = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect", appid, redirect_uri); Response.Redirect(urlbase);
}
//判断session存在
else
{
//跳转到前端页面.aspx
Response.Redirect(Request.Url.ToString());
}
return;
}
//第三步 获得openid
string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, appsecret, code);
string result = HttpHelper.GetResponse(url);
Log.Instance.SaveLog(result);
JObject outputObj = JObject.Parse(result);
if (outputObj["errmsg"] != null)
{
errorMsg = outputObj["errmsg"].ToString();
errorUrl = url;
return;
}
accesstoken = outputObj["access_token"].ToString();
openid = outputObj["openid"].ToString(); GetUserInfo(openid);//通过基础接口获取数据, 不弹出授权页面
GetUserInfo(accesstoken, openid);//通过授权页面获取信息, 会弹出确认页面,需要第一步传入userinfo
} /// <summary>
/// 通过基础接口获取用户信息
/// </summary>
public void GetUserInfo( string openid )
{
//第一步 获取基础支持access_token
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, appsecret);
string result = HttpHelper.GetResponse(url);
Log.Instance.SaveLog(result);
JObject outputObj = JObject.Parse(result);
if (outputObj["errmsg"] != null)
{
errorMsg = outputObj["errmsg"].ToString();
errorUrl = url;
return;
}
string token = outputObj["access_token"].ToString(); //第二步 获取用户基本信息
url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}", token, openid);
result = HttpHelper.GetResponse(url);
Log.Instance.SaveLog(result);
outputObj = JObject.Parse(result);
if (outputObj["errmsg"] != null)
{
errorMsg = outputObj["errmsg"].ToString();
errorUrl = url;
return;
} //以下是第四步获得的信息:
nickname = outputObj["nickname"].ToString(); //昵称
sex = outputObj["sex"].ToString()==""?"男":"女"; //性别什么的
headimgurl = outputObj["headimgurl"].ToString(); //头像url
province = outputObj["province"].ToString();
country = outputObj["country"].ToString(); ;
language = outputObj["language"].ToString(); ;
city = outputObj["city"].ToString(); ;
//将获得的用户信息填入到session中
Session["openid"] = outputObj["openid"];
} /// <summary>
/// 通过网页授权方式获取用户信息
/// </summary>
public void GetUserInfo(string token, string openid)
{
//微信认证部分:第四步 获得更多信息
string url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", accesstoken, openid);
string result = HttpHelper.GetResponse(url);
Log.Instance.SaveLog(result);
JObject outputObj = JObject.Parse(result);//将json转为数组 if (outputObj["errmsg"] != null)
{
errorMsg = outputObj["errmsg"].ToString();
errorUrl = url;
return;
} //以下是第四步获得的信息:
nickname = outputObj["nickname"].ToString(); //昵称
sex = outputObj["sex"].ToString(); //性别什么的
headimgurl = outputObj["headimgurl"].ToString(); //头像url
province = outputObj["province"].ToString(); ;
country = outputObj["country"].ToString(); ;
language = outputObj["language"].ToString(); ;
city = outputObj["city"].ToString(); ;
//将获得的用户信息填入到session中
Session["openid"] = outputObj["openid"];
//转向回入口
//OpenAccess();
} } }

C# 微信公众号的更多相关文章

  1. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...

  2. 快递Api接口 & 微信公众号开发流程

    之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...

  3. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

  4. NodeJs 开发微信公众号(五)真实环境部署

    在测试环境下开发完成代表着你离正式上线的目标不远了.接下来本章就主要谈一谈把测试环境的公众号升级为正式的公众号. 服务器和域名 目前为止我们只是在自己的电脑上完成了测试环境.真实的线上环境当然需要自己 ...

  5. NodeJs 开发微信公众号(四)微信网页授权

    微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...

  6. NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...

  7. 用java开发微信公众号:接收和被动回复普通消息(三)

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本 ...

  8. 用java开发微信公众号:公众号接入和access_token管理(二)

    本文为原创,原始地址为http://www.cnblogs.com/fengzheng/p/5027630.html 上一篇说了微信开发的准备工作,准备工作完成之后,就要开始步入正题了.其实微信公众号 ...

  9. 基于NodeJS微信公众号

    最近重新研究了微信公众号的高级接口,原来也利用C#或JAVA写过微信公众号,主要是消息的基础接口. 由于当时不知道微信公众号可以申请测试公众号,微信测试公众号基本上没有任何限制,对于开发来说是一个不错 ...

  10. C#开发微信门户及应用(37)--微信公众号标签管理功能

    微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...

随机推荐

  1. linux系统下将php和mysql命令加入到环境变量中的方法

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行 “php -v”命令查看当前php版本信息时时 ...

  2. jquery中选择ID以什么字符开头的匹配主要用于多个上传控件的时候,id无法使用,而且class不起作用的时候

    $("[id^=remark]")选择ID以remark开头的所有数据进行匹配

  3. C# @Page指令中的AutoEventWireup,CodeBehind,Inherits

    AutoEventWireup 如果 Page 指令的 AutoEventWireup 属性被设置为 true(或者如果缺少此属性,因为它默认为 true) ,该页框架将自动调用页事件,即 Page_ ...

  4. MVC5 Identity 用用户名登录而不用电子邮件

    1.修改AccountViewModels ·修改RegisterViewModel public class RegisterViewModel { [Required] [Display(Name ...

  5. Win7下 httpRequest带证书请求https网站

    常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...

  6. php时间转换unix时间戳

    本文介绍了php编程中unix时间戳转换的小例子,有关php时间转换.php时间戳的实例代码,有需要的朋友参考下. 第一部分,php 时间转换unix 时间戳实现代码. 复制代码代码示例: <? ...

  7. web.xml中常见配置解读

    文章转自:http://blog.csdn.net/sdyy321/article/details/5838791 有一般XML都必须有的版本.编码.DTD <web-app>下子元素&l ...

  8. DevExpress汉化(WinForm)

    /* *隔壁老王原创,2013-09-21,转载请保留本人信息及本文地址. *本文地址:http://wallimn.iteye.com/blog/1944191 */ 最简单的方式就是使用汉化资源, ...

  9. 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件

    编译错误              说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码.             编译器错误消息: CS0016: 未 ...

  10. LaTeX插入jpg图片: 使用graphicx

    首先要包含宏包 \usepackage{graphicx} \begin{figure}[ht!] \centering \includegraphics[width=90mm]{fixed_dome ...