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. JS常用的设计模式(14)—— 备忘录模式

    备忘录模式在js中经常用于数据缓存. 比如一个分页控件, 从服务器获得某一页的数据后可以存入缓存.以后再翻回这一页的时候,可以直接使用缓存里的数据而无需再次请求服务器. 实现比较简单,伪代码: var ...

  2. leetcode 27

    27. Remove Element Given an array and a value, remove all instances of that value in place and retur ...

  3. EasyUI datagrid 复杂表头处理

    1:表头固定(前台写) 参照官方:http://www.jeasyui.net/demo/334.html 效果图: 源代码如下: <!DOCTYPE html> <html> ...

  4. hbase与Hadoop

    Hbase是一种低延迟的在线系统,Hadoop是优化吞吐量的离线系统.这种互补关系造就了一种强大的.灵活的数据平台,可以用来搭建水平扩展的数据应用.

  5. markdown文档编写

    (这里面的符号都是英文的:回车是需要:空格 空格 回车) # markdown练习---1.引入图片(1和4只差!) ![周杰伦](http://p3.so.qhimg.com/bdr/_240_/t ...

  6. [.ashx檔?泛型处理例程?]基础入门#1....能否用中文教会我?别说火星文?

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_01.aspx [.ashx檔?泛型处理例程? ...

  7. [转]命令行 Subversion 入门

    http://omyyal.iteye.com/blog/1762831 命令行 Subversion 入门 如果您参与的项目正在使用 Subversion 进行版本控制,您将需要使用 Subvers ...

  8. Web Design:给实验室UI们的一堂课(下)

    [讲稿]From top to down,自顶向下哈,首部栏.导航栏之后一般是页面的主模块,也就是Body部分,这一块儿才是你网站的核心内容,文章.新闻.动态.数据.图表.相册等都是在这儿体现出来.在 ...

  9. WPF Canvas 画区域

    有时候需要实现类似于QQ截图那样的选择区域功能,这里的区域可以是一条线,圆,矩形等等 实现原理就是一个Canvas做蒙板,然后canvas的三个事件,MouseLeftButtonDown,Mouse ...

  10. VMware-workstation-full-9.0.0-812388+汉化补丁+有效密钥

    更新内容:https://www.vmware.com/support/ws90/doc/workstation-90-release-notes.html 官网下载地址:https://my.vmw ...