微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )

接着上次的理论,我们这次来研究用代码实现“网页授权获取用户基本信息”,首先我们需要一个链接指向微信的授权页面,在微信开发平台中已经说了,这个链接必须在微信客户端中打开,那么我们就干脆使用文本消息来完成吧,也就是说当我们发送“授权”两个字的时候,微信给我们一个链接,我们点击这个链接然后进入“授权页面”。首先改造一下我们OnLoad函数:

[csharp] view plaincopy

  1. if (wx.MsgType == "text" && wx.Content == "你好")
  2. {
  3. res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
  4. }
  5. else if (wx.MsgType == "text" && wx.Content == "授权")
  6. {
  7. string MyAppid = "wx043225275885dafd";
  8. string RedirectUri = "http://wx.4ugood.net/OAuthRedirectUri.aspx";
  9. string URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + MyAppid + "&redirect_uri=" + RedirectUri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect" ;
  10. string Str = "<a href=‘" + URL + "‘>授权页面</a>";
  11. res = sendTextMessage(wx, Str);
  12. }
  13. else if (wx.MsgType == "voice")
  14. {
  15. res = sendTextMessage(wx, wx.Recognition);
  16. }
  17. else if (wx.MsgType == "location")
  18. {
  19. res = sendTextMessage(wx, "您发送的位置是:" + wx.Label + ";纬度是:" + wx.Location_X + ";经度是:" + wx.Location_Y + ";缩放比例为:" + wx.Scale);
  20. }
  21. else
  22. {
  23. res = sendTextMessage(wx, "你好,未能识别消息!");
  24. }

其中,MyAppid不用说了,RedirectUri 是我们跳转后的网页,等会儿就会看到代码,URL是微信给出的格式,我们直接使用就OK了。这样就会反馈一个链接,点击就可以进入授权的页面了。
下面我们来看看RedirectUri参数的OAuthRedirectUri.aspx页面的源码吧,因为是讲解的例子,以说明问题为主,我就简化了其中也布局,OAuthRedirectUri.aspx.cs的内容如下:
首先我们用到了两个类:OAuth_Token和OAuthUser

[csharp] view plaincopy

  1. public class OAuth_Token
  2. {
  3. public OAuth_Token()
  4. {
  5. //
  6. //TODO: 在此处添加构造函数逻辑
  7. //
  8. }
  9. //access_token  网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
  10. //expires_in    access_token接口调用凭证超时时间,单位(秒)
  11. //refresh_token 用户刷新access_token
  12. //openid    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
  13. //scope 用户授权的作用域,使用逗号(,)分隔
  14. public string access_token { get; set; }
  15. public string expires_in { get; set; }
  16. public string refresh_token { get; set; }
  17. public string openid { get; set; }
  18. public string scope { get; set; }
  19. }
  20. public class OAuthUser
  21. {
  22. public OAuthUser()
  23. { }
  24. #region 数据库字段
  25. private string _openID;
  26. private string _searchText;
  27. private string _nickname;
  28. private string _sex;
  29. private string _province;
  30. private string _city;
  31. private string _country;
  32. private string _headimgUrl;
  33. private string _privilege;
  34. #endregion
  35. #region 字段属性
  36. /// <summary>
  37. /// 用户的唯一标识
  38. /// </summary>
  39. public string openid
  40. {
  41. set { _openID = value; }
  42. get { return _openID; }
  43. }
  44. /// <summary>
  45. ///
  46. /// </summary>
  47. public string SearchText
  48. {
  49. set { _searchText = value; }
  50. get { return _searchText; }
  51. }
  52. /// <summary>
  53. /// 用户昵称
  54. /// </summary>
  55. public string nickname
  56. {
  57. set { _nickname = value; }
  58. get { return _nickname; }
  59. }
  60. /// <summary>
  61. /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
  62. /// </summary>
  63. public string sex
  64. {
  65. set { _sex = value; }
  66. get { return _sex; }
  67. }
  68. /// <summary>
  69. /// 用户个人资料填写的省份
  70. /// </summary>
  71. public string province
  72. {
  73. set { _province = value; }
  74. get { return _province; }
  75. }
  76. /// <summary>
  77. /// 普通用户个人资料填写的城市
  78. /// </summary>
  79. public string city
  80. {
  81. set { _city = value; }
  82. get { return _city; }
  83. }
  84. /// <summary>
  85. /// 国家,如中国为CN
  86. /// </summary>
  87. public string country
  88. {
  89. set { _country = value; }
  90. get { return _country; }
  91. }
  92. /// <summary>
  93. /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
  94. /// </summary>
  95. public string headimgurl
  96. {
  97. set { _headimgUrl = value; }
  98. get { return _headimgUrl; }
  99. }
  100. /// <summary>
  101. /// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)其实这个格式称不上JSON,只是个单纯数组
  102. /// </summary>
  103. public string privilege
  104. {
  105. set { _privilege = value; }
  106. get { return _privilege; }
  107. }
  108. #endregion
  109. }

然后是OAuthRedirectUri.aspx.cs的全部内容:

[csharp] view plaincopy

  1. public partial class OAuthRedirectUri : System.Web.UI.Page
  2. {
  3. string Appid = "wx043225275885dafd";
  4. string appsecret = "cb4425b24ab79ef875029cf0bf326ae9";
  5. protected void Page_Load(object sender, EventArgs e)
  6. {
  7. if (!IsPostBack)
  8. {
  9. if (!string.IsNullOrEmpty(Request.QueryString["code"]))
  10. {
  11. string Code = Request.QueryString["code"].ToString();
  12. //获得Token
  13. OAuth_Token Model = Get_token(Code);
  14. //Response.Write(Model.access_token);
  15. OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);
  16. Response.Write("用户OPENID:" + OAuthUser_Model.openid + "<br>用户昵称:" + OAuthUser_Model.nickname + "<br>性别:" + OAuthUser_Model.sex + "<br>所在省:" + OAuthUser_Model.province + "<br>所在市:" + OAuthUser_Model.city + "<br>所在国家:" + OAuthUser_Model.country + "<br>头像地址:" + OAuthUser_Model.headimgurl + "<br>用户特权信息:" + OAuthUser_Model.privilege);
  17. }
  18. }
  19. }
  20. //获得Token
  21. protected OAuth_Token Get_token(string Code)
  22. {
  23. string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");
  24. OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);
  25. return Oauth_Token_Model;
  26. }
  27. //刷新Token
  28. protected OAuth_Token refresh_token(string REFRESH_TOKEN)
  29. {
  30. string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + Appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);
  31. OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);
  32. return Oauth_Token_Model;
  33. }
  34. //获得用户信息
  35. protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID)
  36. {
  37. // Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);
  38. string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);
  39. OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str);
  40. return OAuthUser_Model;
  41. }
  42. protected string GetJson(string url)
  43. {
  44. WebClient wc = new WebClient();
  45. wc.Credentials = CredentialCache.DefaultCredentials;
  46. wc.Encoding = Encoding.UTF8;
  47. string returnText = wc.DownloadString(url);
  48. if (returnText.Contains("errcode"))
  49. {
  50. //可能发生错误
  51. }
  52. //Response.Write(returnText);
  53. return returnText;
  54. }
  55. }

其中用到的JsonHelper类在 《微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题》  也提到过,不再粘贴了。这样我们就实现了授权到拉取用户信息的功能了。

时间: 2024-10-07 01:10:59

微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )的相关文章

微信公共服务平台开发(.Net的实现)1 认证“成为开发者”

http://www.cnblogs.com/freeliver54/p/3725979.html http://www.it165.net/pro/html/201402/9459.html 这些代码也就开始认证的时候用一次,以后就不用了: view sourceprint? 01.const string Token = "XXXXX";//你的token 02.protected void Page_Load(object sender, EventArgs e) 03.{ 04

微信公共服务平台开发(.Net 的实现)9-------处理二维码

今天我们来共同学习一下微信公共服务平台中一个重要内容---二维码扫描.众所周知二维码目前应用范围很广,在这里不再叙述背景了,但是值得一提的是目前大家手机上面应用的二维码扫描工具是支持的都是QR码和PDF417码标准,这就是为什么你用各种扫码工具扫出来的都一样的原因,因为大家都使用了同样的标准. 在微信中的“扫一扫”功能也支持了这种标准,但是我们如果在微信公共服务平台中开发,使用的就不是这种标准了,而是微信自己的标准.也就是说如果你用通用软件生成的二维码“微信”,“我查查”等都可以扫描出来,但是你

微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)

这次我们来一起研究一下“客服消息”,首先明确一下“客服消息”的概念.这不同于之前的“被动响应消息”,也就是说并不是之前“你一言我一语的即时响应”,可能在某种情况下你需要给不同的人主动发送消息,例如你的餐馆推出了新的川菜,那么你需要给喜欢川菜的人发送消息,而并不是等着被人发送“有什么新菜”后,然后反馈给客户,我推出了什么什么的. 说道这里可能有人会问,那不是群发吗?微信不是每天只能发一条吗?服务号每个月发一条吗?答案很明确微信说的是“客服消息”,也不是群发,它跟群发的区别就在于只要关注了我,那么我

微信公共服务平台开发(.Net 的实现)12-------网页授权(上 :更加深入理解OAuth2.0 )

我们首先来认识一下OAuth协议吧,这个东西很早就听说过,总觉得离我很远(我的项目用不到这些),但是最近不得不学习一下了.我在网上找了一些解释,认为解释的最好的是这样说的(出处:http://hi.baidu.com/powerthinks/item/f1cb9b3c7a88251c9dc65efa) 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店后,只需

微信公共服务平台开发(.Net 的实现)6-------自定义菜单

用户自定义菜单制作时,需要用到access_token,我们直接使用前面讲解的IsExistAccess_Token()函数.我理解的微信公共平台里面菜单分为button和sub_button,即菜单和子菜单,这些菜单都有一个name的属性,类别分为click和view,click类有key属性:而view类有url属性,含有子菜单的菜单没有key属性也没有url属性.这些情况可以从下面的例子看出来. [csharp] view plaincopy public void MyMenu() {

微信公共服务平台开发(.Net 的实现)2-------获得ACCESSTOKEN

成为了开发者之后微信平台会给您appid和secret,在订阅号中是没有的,所以因该申请一下服务号 有了ACCESSTOKEN才能做添加菜单,上传/下载图片等功能 [csharp] view plaincopy private string GetToken() { // 也可以这样写: //return  GetPage("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid

微信公共服务平台开发(.Net 的实现)10-------地理位置

微信公共平台中涉及到地理位置的有两种情况:       第一.我发送一个自选的地理位置给微信,然后微信可以自动反馈响应的信息.       第二.让微信获取我们GPS定位地址位置,反馈响应的信息. 首先我们先来看第一种,在微信中除了可以发文本,图片,语音等还有一个信息就是地理位置,按照微信接受地理信息的XML信息,我们需要改造一下之前的wxmessage类加上几个属性: [csharp] view plaincopy class wxmessage { public string FromUse

微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题

因为access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token改造一下.另外需要说明的是access_token是变化的,有自己的周期,官方解释为:"有效期为7200秒",这就要 求我们把获得的access_token存入一个物理文件或者Application中,请求到过期后修改这些内容,需要用的时候读出来.有些人可能想到了,如果过期我就在获得一个就好了,不用物理文件和Application也可以达到同样的效果,但是需要注意了微信

微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)

微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定的模板,每个账号可以使用25个模板,模板消息上线每日10万次,粉丝数上涨到10w/100w/1000w/模板消息的上线次数会自动上调.模板接口调用主要注意事项:模板ID和模板赋值这两点.模板参数内容必须以.DATA结尾,模板保留符号"{{}}".使用步骤如下: 1.设置所属行业,这个可以在