zoukankan      html  css  js  c++  java
  • 微信开放平台---网站授权微信登录功能(附带源码)

    1 微信开放平台:https://open.weixin.qq.com/

    2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

    3.pc页面显示

    4. 通过官方提供的文档,我们可以看出一共分4个步骤

    第一步:请求CODE
    第二步:通过code获取access_token
    第三步:通过access_token调用接口
    第4步:获取用户个人信息(UnionID机制)

     5.源码下载地址:http://pan.baidu.com/s/1pLyG66J

    因代码加密:现贴出代码如下(下载后替换):

    Controllers--》DefaultController.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Configuration;
      4 using System.Text;
      5 using System.Web;
      6 using System.Web.Mvc;
      7 
      8 using WebWeChat.Models;
      9 
     10 namespace WebWeChat.Controllers
     11 {
     12     public class DefaultController : Controller
     13     {
     14         #region 微信登录
     15 
     16         /// <summary>
     17         /// 微信登录
     18         /// </summary>
     19         public ActionResult WeChat()
     20         {
     21             //获得配置信息
     22             string oauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     23             string redirectUri = ConfigurationManager.AppSettings["Redirect_uri"];
     24             if (oauthAppId == null)
     25             {
     26                 return this.Content("出错了,您尚未配置微信相关的API信息!");
     27             }
     28             string state = Guid.NewGuid().ToString().Replace("-", "");
     29             this.Session["oauth_state"] = state;
     30             string sendUrl =
     31                 "https://open.weixin.qq.com/connect/qrconnect?appid=" + oauthAppId +
     32                 "&redirect_uri=" + HttpUtility.UrlEncode(redirectUri.ToLower()) +
     33                 "&response_type=code&scope=snsapi_login&state=" + state +
     34                 "#wechat_redirect";
     35 
     36             //开始发送
     37             return this.Redirect(sendUrl); //跳转到微信自己 指定的关联登陆页面
     38         }
     39 
     40         /// <summary>
     41         /// 微信登录返回action
     42         /// </summary>
     43         public ActionResult WeChatReturnUrl(string state, string code)
     44         {
     45             //取得返回参数
     46 
     47             if (this.Session["oauth_state"] == null || this.Session["oauth_state"].ToString() == "" ||
     48                 state != this.Session["oauth_state"].ToString() || string.IsNullOrEmpty(code)) //若返回参数中未包含code或者state没有通过验证则提示出错
     49             {
     50                 return this.Content("出错啦,state未初始化!");
     51             }
     52 
     53             //第一步:通过code来获取Access Token以及openid
     54             Dictionary<string, object> dic1 = WeixinHelper.get_access_token(code, state);
     55             if (dic1 == null || !dic1.ContainsKey("access_token"))
     56             {
     57                 return this.Content("错误代码:,无法获取Access Token,请检查App Key是否正确!");
     58             }
     59             if (!dic1.ContainsKey("openid"))
     60             {
     61                 return dic1.ContainsKey("errmsg")
     62                     ? this.Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"])
     63                     : this.Content("出错啦,无法获取用户授权Openid!");
     64             }
     65 
     66             var accessToken = dic1["access_token"].ToString();
     67             var refreshToken = dic1["refresh_token"].ToString();
     68             var openid = dic1["openid"].ToString();
     69 
     70             //储存获取数据用到的信息
     71             this.Session["oauth_name"] = "webchat";
     72             this.Session["oauth_access_token"] = accessToken;
     73             this.Session["oauth_openid"] = openid;
     74             this.Session["oauth_refresh_token"] = refreshToken;
     75 
     76             #region todo 将获取到的用户信息保存到数据库中
     77 
     78             #endregion
     79 
     80             //第二步:通过Access Token以及openid来获取用户的基本信息
     81             //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);
     82 
     83             //第三步:跳转到指定页面
     84             return this.Content(this.WeChatResultJson());
     85         }
     86 
     87         /// <summary>
     88         /// 微信登录返回action, 处理用户信息
     89         /// </summary>
     90         public string WeChatResultJson()
     91         {
     92             if (this.Session["oauth_name"] == null || this.Session["oauth_access_token"] == null ||
     93                 this.Session["oauth_openid"] == null)
     94             {
     95                 return "{"ret":"1", "msg":"出错啦,Access Token已过期或不存在!"}";
     96             }
     97             var oauthName = this.Session["oauth_name"].ToString();
     98             var oauthAccessToken = this.Session["oauth_access_token"].ToString();
     99             var oauthOpenid = this.Session["oauth_openid"].ToString();
    100             var oauthRefreshToken = this.Session["oauth_refresh_token"].ToString();
    101 
    102             if (!WeixinHelper.check_access_token(oauthAccessToken)) //调用access_token前需判断是否过期
    103             {
    104                 Dictionary<string, object> dic1 = WeixinHelper.get_refresh_token(oauthRefreshToken); //如果已过期则重新换取新的access_token
    105                 if (dic1 == null || !dic1.ContainsKey("access_token"))
    106                 {
    107                     return "{"openid":"0", "msg":"出错啦,无法获取access_token!"}";
    108                 }
    109                 oauthAccessToken = dic1["access_token"].ToString();
    110             }
    111 
    112             Dictionary<string, object> dic = WeixinHelper.get_user_info(oauthAccessToken, oauthOpenid);
    113             if (dic == null)
    114             {
    115                 return "{"openid":"0", "msg":"出错啦,无法获取授权用户信息!"}";
    116             }
    117             try
    118             {
    119                 StringBuilder str = new StringBuilder();
    120                 str.Append("{");
    121                 str.Append(""openid": "" + dic["openid"] + "", ");
    122                 str.Append(""nickname": "" + dic["nickname"] + "", ");
    123                 str.Append(""sex": "" + dic["sex"] + "", ");
    124                 str.Append(""province": "" + dic["province"] + "", ");
    125                 str.Append(""city": "" + dic["city"] + "", ");
    126                 str.Append(""country": "" + dic["country"] + "", ");
    127                 str.Append(""headimgurl": "" + dic["headimgurl"] + "", ");
    128                 str.Append(""privilege": "" + dic["privilege"] + "", ");
    129                 str.Append(""unionid": "" + dic["unionid"] + """);
    130                 str.Append(""oauth_name": "" + oauthName + """);
    131                 str.Append(""oauth_access_token": "" + oauthAccessToken + """);
    132                 str.Append(""oauth_openid": "" + oauthOpenid + """);
    133                 str.Append("}");
    134                 return str.ToString();
    135             }
    136             catch
    137             {
    138                 return "{"ret":"0", "msg":"出错啦,无法获取授权用户信息!"}";
    139             }
    140         }
    141 
    142         #endregion
    143     }
    144 }

    Models---》HttpMethods

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Net;
      5 using System.Text;
      6 
      7 namespace WebWeChat.Models
      8 {
      9     ////////////////////////////////////////////////////////////////////////////////////////////////////
     10     /// <summary>   A HTTP methods. </summary>
     11     ///
     12     /// <remarks>   xiaop, 2014/12/16. </remarks>
     13     ////////////////////////////////////////////////////////////////////////////////////////////////////
     14     public static class HttpMethods
     15     {
     16         #region POST
     17 
     18         /// <summary>
     19         /// HTTP POST方式请求数据
     20         /// </summary>
     21         /// <param name="url">URL.</param>
     22         /// <param name="param">POST的数据</param>
     23         /// <returns></returns>
     24         public static string HttpPost(string url, string param)
     25         {
     26             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     27             request.Method = "POST";
     28             request.ContentType = "application/x-www-form-urlencoded";
     29             request.Accept = "*/*";
     30             request.Timeout = 15000;
     31             request.AllowAutoRedirect = false;
     32 
     33             string responseStr;
     34 
     35             var requestStream = new StreamWriter(request.GetRequestStream());
     36             requestStream.Write(param);
     37             requestStream.Close();
     38 
     39             var response = request.GetResponse();
     40             {
     41                 // ReSharper disable once AssignNullToNotNullAttribute
     42                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     43                 responseStr = reader.ReadToEnd();
     44                 reader.Close();
     45             }
     46 
     47             return responseStr;
     48         }
     49 
     50         #endregion
     51 
     52         #region Get
     53 
     54         /// <summary>
     55         /// HTTP GET方式请求数据.
     56         /// </summary>
     57         /// <param name="url">URL.</param>
     58         /// <returns></returns>
     59         public static string HttpGet(string url)
     60         {
     61             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     62             request.Method = "GET";
     63 
     64             //request.ContentType = "application/x-www-form-urlencoded";
     65             request.Accept = "*/*";
     66             request.Timeout = 15000;
     67             request.AllowAutoRedirect = false;
     68 
     69             string responseStr;
     70 
     71             var response = request.GetResponse();
     72 
     73             {
     74                 // ReSharper disable once AssignNullToNotNullAttribute
     75                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     76                 responseStr = reader.ReadToEnd();
     77                 reader.Close();
     78             }
     79 
     80             return responseStr;
     81         }
     82 
     83         #endregion
     84 
     85         #region Post With Pic
     86 
     87         public static string HttpPost(string url, IDictionary<object, object> param, string filePath)
     88         {
     89             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
     90             byte[] boundarybytes = Encoding.ASCII.GetBytes("
    --" + boundary + "
    ");
     91 
     92             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
     93             wr.ContentType = "multipart/form-data; boundary=" + boundary;
     94             wr.Method = "POST";
     95             wr.KeepAlive = true;
     96             wr.Credentials = CredentialCache.DefaultCredentials;
     97 
     98             Stream rs = wr.GetRequestStream();
     99             string responseStr = null;
    100 
    101             string formdataTemplate = "Content-Disposition: form-data; name="{0}"
    
    {1}";
    102             foreach (string key in param.Keys)
    103             {
    104                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    105                 string formitem = string.Format(formdataTemplate, key, param[key]);
    106                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    107                 rs.Write(formitembytes, 0, formitembytes.Length);
    108             }
    109             rs.Write(boundarybytes, 0, boundarybytes.Length);
    110 
    111             string headerTemplate = "Content-Disposition: form-data; name="{0}"; filename="{1}"
    Content-Type: {2}
    
    ";
    112             string header = string.Format(headerTemplate, "pic", filePath, "text/plain");
    113             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    114             rs.Write(headerbytes, 0, headerbytes.Length);
    115 
    116             FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    117             byte[] buffer = new byte[4096];
    118             int bytesRead;
    119             while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    120             {
    121                 rs.Write(buffer, 0, bytesRead);
    122             }
    123             fileStream.Close();
    124 
    125             byte[] trailer = Encoding.ASCII.GetBytes("
    --" + boundary + "--
    ");
    126             rs.Write(trailer, 0, trailer.Length);
    127             rs.Close();
    128 
    129             WebResponse wresp = null;
    130             try
    131             {
    132                 wresp = wr.GetResponse();
    133                 Stream stream2 = wresp.GetResponseStream();
    134                 if (stream2 != null)
    135                 {
    136                     StreamReader reader2 = new StreamReader(stream2);
    137                     responseStr = reader2.ReadToEnd();
    138                 }
    139 
    140                 //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
    141             }
    142             catch (Exception)
    143             {
    144                 //logger.Error("Error uploading file", ex);
    145                 if (wresp != null)
    146                 {
    147                     wresp.Close();
    148                 }
    149             }
    150             return responseStr;
    151         }
    152 
    153         #endregion
    154 
    155         #region Post With Pic
    156 
    157         /// <summary>
    158         /// HTTP POST方式请求数据(带图片)
    159         /// </summary>
    160         /// <param name="url">URL</param>        
    161         /// <param name="param">POST的数据</param>
    162         /// <param name="fileByte">图片</param>
    163         /// <returns></returns>
    164         public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
    165         {
    166             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    167             byte[] boundarybytes = Encoding.ASCII.GetBytes("
    --" + boundary + "
    ");
    168 
    169             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
    170             wr.ContentType = "multipart/form-data; boundary=" + boundary;
    171             wr.Method = "POST";
    172             wr.KeepAlive = true;
    173             wr.Credentials = CredentialCache.DefaultCredentials;
    174 
    175             Stream rs = wr.GetRequestStream();
    176             string responseStr = null;
    177 
    178             string formdataTemplate = "Content-Disposition: form-data; name="{0}"
    
    {1}";
    179             foreach (string key in param.Keys)
    180             {
    181                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    182                 string formitem = string.Format(formdataTemplate, key, param[key]);
    183                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    184                 rs.Write(formitembytes, 0, formitembytes.Length);
    185             }
    186             rs.Write(boundarybytes, 0, boundarybytes.Length);
    187 
    188             string headerTemplate = "Content-Disposition: form-data; name="{0}"; filename="{1}"
    Content-Type: {2}
    
    ";
    189             string header = string.Format(headerTemplate, "pic", fileByte, "text/plain"); //image/jpeg
    190             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    191             rs.Write(headerbytes, 0, headerbytes.Length);
    192 
    193             rs.Write(fileByte, 0, fileByte.Length);
    194 
    195             byte[] trailer = Encoding.ASCII.GetBytes("
    --" + boundary + "--
    ");
    196             rs.Write(trailer, 0, trailer.Length);
    197             rs.Close();
    198 
    199             WebResponse wresp = null;
    200             try
    201             {
    202                 wresp = wr.GetResponse();
    203                 Stream stream2 = wresp.GetResponseStream();
    204                 if (stream2 != null)
    205                 {
    206                     StreamReader reader2 = new StreamReader(stream2);
    207                     responseStr = reader2.ReadToEnd();
    208                 }
    209 
    210                 // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
    211             }
    212             catch (Exception)
    213             {
    214                 //logger.Error("Error uploading file", ex);
    215                 if (wresp != null)
    216                 {
    217                     wresp.Close();
    218                 }
    219             }
    220             return responseStr;
    221         }
    222 
    223         #endregion
    224     }
    225 }

    Models---》WeixinHelper

      1 using System.Collections.Generic;
      2 using System.Configuration;
      3 
      4 using Newtonsoft.Json;
      5 
      6 namespace WebWeChat.Models
      7 {
      8     public static class WeixinHelper
      9     {
     10         #region 获得配置信息
     11 
     12         private static readonly string OauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     13         private static readonly string OauthAppKey = ConfigurationManager.AppSettings["oauth_app_key"];
     14 
     15         #endregion
     16 
     17         /// <summary>
     18         /// 根据AppID和AppSecret获得access token(默认过期时间为2小时)
     19         /// </summary>
     20         /// <returns>Dictionary</returns>
     21         public static Dictionary<string, object> get_access_token()
     22         {
     23             string sendUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
     24                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "";
     25 
     26             //发送并接受返回值
     27             string result = HttpMethods.HttpGet(sendUrl);
     28             if (result.Contains("errmsg"))
     29             {
     30                 return null;
     31             }
     32             try
     33             {
     34                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     35                 return dic;
     36             }
     37             catch
     38             {
     39                 return null;
     40             }
     41         }
     42 
     43         /// <summary>
     44         /// 取得临时的Access Token(默认过期时间为2小时)
     45         /// </summary>
     46         /// <param name="code">临时Authorization Code</param>
     47         /// <param name="state">防止CSRF攻击,成功授权后回调时会原样带回</param>
     48         /// <returns>Dictionary</returns>
     49         public static Dictionary<string, object> get_access_token(string code, string state)
     50         {
     51             string sendUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +
     52                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "&code=" + code +
     53                              "&grant_type=authorization_code";
     54 
     55             //发送并接受返回值
     56             string result = HttpMethods.HttpGet(sendUrl);
     57             if (result.Contains("errmsg"))
     58             {
     59                 return null;
     60             }
     61             try
     62             {
     63                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     64                 return dic;
     65             }
     66             catch
     67             {
     68                 return null;
     69             }
     70         }
     71 
     72         /// <summary>
     73         /// 根据access_token判断access_token是否过期
     74         /// </summary>
     75         /// <param name="accessToken"></param>
     76         /// <returns>true表示未失效</returns>
     77         public static bool check_access_token(string accessToken)
     78         {
     79             string sendUrl = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + WeixinHelper.OauthAppId;
     80 
     81             //发送并接受返回值
     82             string result = HttpMethods.HttpGet(sendUrl);
     83             try
     84             {
     85                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     86                 if (dic.ContainsKey("errmsg"))
     87                 {
     88                     return dic["errmsg"].ToString() == "ok";
     89                 }
     90                 return false;
     91             }
     92             catch
     93             {
     94                 return false;
     95             }
     96         }
     97 
     98         /// <summary>
     99         /// 若fresh_token已过期则根据refresh_token取得新的refresh_token
    100         /// </summary>
    101         /// <param name="refreshToken">refresh_token</param>
    102         /// <returns>Dictionary</returns>
    103         public static Dictionary<string, object> get_refresh_token(string refreshToken)
    104         {
    105             string sendUrl =
    106                 "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" +
    107                 WeixinHelper.OauthAppId + "&grant_type=refresh_token&refresh_token=" + refreshToken;
    108 
    109             //发送并接受返回值
    110             string result = HttpMethods.HttpGet(sendUrl);
    111             if (result.Contains("errmsg"))
    112             {
    113                 return null;
    114             }
    115             try
    116             {
    117                 return JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    118             }
    119             catch
    120             {
    121                 return null;
    122             }
    123         }
    124 
    125         /// <summary>
    126         /// 获取登录用户自己的基本资料
    127         /// </summary>
    128         /// <param name="accessToken">临时的Access Token</param>
    129         /// <param name="openId">用户openid</param>
    130         /// <returns>Dictionary</returns>
    131         public static Dictionary<string, object> get_user_info(string accessToken, string openId)
    132         {
    133             //发送并接受返回值   
    134             string sendUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
    135 
    136             //发送并接受返回值
    137             string result = HttpMethods.HttpGet(sendUrl);
    138             if (result.Contains("errmsg"))
    139             {
    140                 return null;
    141             }
    142 
    143             //反序列化JSON
    144             Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    145             return dic;
    146         }
    147     }
    148 }

    我的签名:坚持赚钱,顺便理想

  • 相关阅读:
    更改ubuntu的官方镜像源
    python中的decorator的作用
    thunderbird 设置 邮件回复时内容在上方显示
    Sapnco3 RfcTable Structure
    DbEntry 访问Access2010数据库
    DbEntry 默认 主键ID为long
    DbEntry 简单实现
    nginx学习时使用EditPuls编辑conf.xml
    java的集合类面试题
    tomcat组成介绍和调优方案
  • 原文地址:https://www.cnblogs.com/xxpeng/p/4832051.html
Copyright © 2011-2022 走看看