C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权
通俗來講VIEW其實就是我們在C#中常用的a標簽,可以直接在自定義菜單URL的屬性里面寫上需要跳轉的鏈接,也即為單純的跳轉。
但更多的情況下,我們是想通過VIEW來進入指定的頁面并進行操作。
舉一個簡單的例子,假如我們的后臺需要記錄有哪些用戶在什么時間訪問了哪個網頁,那么這就需要當用戶點擊VIEW的時候我們程序記錄
所以微信官方提供了一個很好的解決方案,那就是將VIEW與網頁授權獲取用戶信息相結合來實現
我們以建好的自定義菜單中的"搜索"VIEW為例,來簡單的時候上面的操作。
首先將自定義菜單重新URL重新重新寫入網頁授權的鏈接,以及新建一個網頁授權的頁面OAuthRedirectUrl.aspx。
{"button":[{ "type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC"},{"type":"click","name":"歌手簡介","key":"V1001_TODAY_SINGER"},{"name":"菜單","sub_button":[{ "type":"view","name":"搜索","url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的微信公眾號appid&redirect_uri=http://xxx.com/WeiXin/OAuthRedirectUrl.aspx?reurl=so&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"},{"type":"view","name":"視頻","url":"http://v.qq.com/"},{"type":"click","name":"贊一下我們","key":"V1001_GOOD"}]}]}來看一下微信官方對這一串URL的參數解釋:
?
| appid | 是 | 公眾號的唯一標識 |
| redirect_uri | 是 | 授權后重定向的回調鏈接地址,請使用urlencode對鏈接進行處理 |
| response_type | 是 | 返回類型,請填寫code |
| scope | 是 | 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關注的情況下,只要用戶授權,也能獲取其信息) |
| state | 否 | 重定向后會帶上state參數,開發者可以填寫a-zA-Z0-9的參數值,最多128字節 |
| #wechat_redirect | 是 | 無論直接打開還是做頁面302重定向時候,必須帶此參數 |
其中參數redirect_uri也就是上面提到新建的頁面OAuthRedirectUrl.aspx,也就是說在跳轉到想要的頁面之前,先要到OAuthRedirectUrl.aspx去進行授權并獲取用戶基本信息,從而供自己使用。
OAuthRedirectUrl.aspx要做的操作其實也是很簡單,完成微信指定的授權。
private string _appid = "你的微信公眾號appid";private string _appsecret = "你的微信公眾號appsecret";private string reurl = "";protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){//獲取傳過來的值if (Request.QueryString["reurl"] != null && Request.QueryString["reurl"].ToString() != ""){reurl = Request.QueryString["reurl"].ToString();}string code = "";if (Request.QueryString["code"] != null && Request.QueryString["code"] != ""){code = Request.QueryString["code"].ToString();OAuth_Token Model = Get_token(code);OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);//"http://xx.com/" + reurl + ".aspx?openid=" + OAuthUser_Model.openid;string strurl = "";switch (reurl){case "so":strurl = "http://www.cnblogs.com/HappyAnt/";break;}Response.Redirect(strurl);//Response.Write("reurl:" + reurl + ",code:" + code + ",openid:" + OAuthUser_Model.openid); }}}//獲得Tokenprotected OAuth_Token Get_token(string Code){string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + _appid + "&secret=" + _appsecret + "&code=" + Code + "&grant_type=authorization_code");OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);return Oauth_Token_Model;}//刷新Tokenprotected OAuth_Token refresh_token(string REFRESH_TOKEN){string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + _appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);return Oauth_Token_Model;}//獲得用戶信息protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID){// Response.Write("獲得用戶信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str);return OAuthUser_Model;}protected string GetJson(string url){WebClient wc = new WebClient();wc.Credentials = CredentialCache.DefaultCredentials;wc.Encoding = Encoding.UTF8;string returnText = wc.DownloadString(url);if (returnText.Contains("errcode")){//可能發生錯誤 }//Response.Write(returnText);return returnText;}}public class OAuth_Token{public OAuth_Token(){////TODO: 在此處添加構造函數邏輯// }//access_token 網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同//expires_in access_token接口調用憑證超時時間,單位(秒)//refresh_token 用戶刷新access_token//openid 用戶唯一標識,請注意,在未關注公眾號時,用戶訪問公眾號的網頁,也會產生一個用戶和公眾號唯一的OpenID//scope 用戶授權的作用域,使用逗號(,)分隔public string access_token { get; set; }public string expires_in { get; set; }public string refresh_token { get; set; }public string openid { get; set; }public string scope { get; set; }}public class OAuthUser{public OAuthUser(){ }#region 數據庫字段private string _openID;private string _searchText;private string _nickname;private string _sex;private string _province;private string _city;private string _country;private string _headimgUrl;private string _privilege;#endregion#region 字段屬性/// <summary>/// 用戶的唯一標識/// </summary>public string openid{set { _openID = value; }get { return _openID; }}/// <summary>/// /// </summary>public string SearchText{set { _searchText = value; }get { return _searchText; }}/// <summary>/// 用戶昵稱 /// </summary>public string nickname{set { _nickname = value; }get { return _nickname; }}/// <summary>/// 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知 /// </summary>public string sex{set { _sex = value; }get { return _sex; }}/// <summary>/// 用戶個人資料填寫的省份/// </summary>public string province{set { _province = value; }get { return _province; }}/// <summary>/// 普通用戶個人資料填寫的城市 /// </summary>public string city{set { _city = value; }get { return _city; }}/// <summary>/// 國家,如中國為CN /// </summary>public string country{set { _country = value; }get { return _country; }}/// <summary>/// 用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空/// </summary>public string headimgurl{set { _headimgUrl = value; }get { return _headimgUrl; }}/// <summary>/// 用戶特權信息,json 數組,如微信沃卡用戶為(chinaunicom)其實這個格式稱不上JSON,只是個單純數組/// </summary>public string privilege{set { _privilege = value; }get { return _privilege; }}#endregion}要點:
1:頁面上面必須要有接受code的代碼,因為code要換取一個特殊的網頁授權access_token
2:C#微信公眾號開發 -- (四)獲取API調用所需的全局唯一票據access_token?與這次的網頁授權access_token不是一個值,也不是一個概念。
3:在頁面中需要生成OAuth_Token,OAuthUser兩個類,與微信提供的字段要完全吻合(更好的方式是讓這兩個類進行封裝)
4:strurl中還可以寫上帶參數的鏈接,想獲取的客戶信息只需要在OAuthUser_Model讀取就好了
5:一般的程序開發還暫時用不到“刷新Token”的方法,反正我現在是一直沒用到,這里作為了解就好了
6:如果你這些都配置好后,頁面卻顯示 ”redirect_uri 參數錯誤” ,那么請注意讀微信的開發說明?
“在微信公眾號請求用戶網頁授權之前,開發者需要先到公眾平臺官網中的開發者中心頁配置授權回調域名”
以及檢查你的URL鏈接里面參數有沒有錯誤,參數順序有沒有錯誤。做完這些工作以后,就可以真正意義上的實現跳轉了,也即實現了VIEW它本身應有的價值。
?
轉載于:https://www.cnblogs.com/HappyAnt/p/5277353.html
總結
以上是生活随笔為你收集整理的C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS人脸识别
- 下一篇: VMware8.0虚拟机中安装Ubunt