微信公共服務平臺開發(.Net 的實現)13-------網頁授權(下 :C#代碼的實現 )

接着上次的理論,我們這次來研究用代碼實現“網頁授權獲取用戶基本信息”,首先我們需要一個鏈接指向微信的授權頁面,在微信開發平臺中已經說了,這個鏈接必須在微信客戶端中打開,那麼我們就乾脆使用文本消息來完成吧,也就是說當我們發送“授權”兩個字的時候,微信給我們一個鏈接,我們點擊這個鏈接然後進入“授權頁面”。首先改造一下我們OnLoad函數:

if (wx.MsgType == "text" && wx.Content == "你好")
             {
                
                 res = sendTextMessage(wx, "你好,歡迎使用北京永傑友信科技有限公司公共微信平臺!");
             }
             else if (wx.MsgType == "text" && wx.Content == "授權")
             {
                 string MyAppid = "wx043225275885dafd";
                 string RedirectUri = "http://wx.4ugood.net/OAuthRedirectUri.aspx";
                 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" ;   
                 string Str = "<a href='" + URL + "'>授權頁面</a>";
                 res = sendTextMessage(wx, Str);
             }
             else if (wx.MsgType == "voice")
             {
                 res = sendTextMessage(wx, wx.Recognition);
             }
             else if (wx.MsgType == "location")
             {
                 res = sendTextMessage(wx, "您發送的位置是:" + wx.Label + ";緯度是:" + wx.Location_X + ";經度是:" + wx.Location_Y + ";縮放比例爲:" + wx.Scale);
             }
             else
             {
                 res = sendTextMessage(wx, "你好,未能識別消息!");
             }

其中,MyAppid不用說了,RedirectUri 是我們跳轉後的網頁,等會兒就會看到代碼,URL是微信給出的格式,我們直接使用就OK了。這樣就會反饋一個鏈接,點擊就可以進入授權的頁面了。
下面我們來看看RedirectUri參數的OAuthRedirectUri.aspx頁面的源碼吧,因爲是講解的例子,以說明問題爲主,我就簡化了其中也佈局,OAuthRedirectUri.aspx.cs的內容如下:
首先我們用到了兩個類:OAuth_Token和OAuthUser

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
}
然後是OAuthRedirectUri.aspx.cs的全部內容:

public partial class OAuthRedirectUri : System.Web.UI.Page
{

    string Appid = "wx043225275885dafd";
    string appsecret = "cb4425b24ab79ef875029cf0bf326ae9";
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (!string.IsNullOrEmpty(Request.QueryString["code"]))
            {
                string Code = Request.QueryString["code"].ToString();
                //獲得Token
                OAuth_Token Model = Get_token(Code);
                //Response.Write(Model.access_token);
                OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);
                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);
                
            }
        }
    }

    //獲得Token
    protected 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;
    }
    //刷新Token
    protected 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;
    }
}

其中用到的JsonHelper類在 微信公共服務平臺開發(.Net 的實現)5-------解決access_token過期的問題  也提到過,不再粘貼了。

這樣我們就實現了授權到拉取用戶信息的功能了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章