1. 程式人生 > >微信登入(網站應用)ASP.NET

微信登入(網站應用)ASP.NET

效果

這裡寫圖片描述

官方流程圖:
這裡寫圖片描述

第一步 請求CODE

這裡寫圖片描述
這裡寫圖片描述

請求示例

第二步 CODE 換取 Token

第三步(Token 調取介面,我呼叫的是獲取個人資訊介面)

獲取使用者個人資訊(UnionID機制)
介面說明
此介面用於獲取使用者個人資訊。開發者可通過OpenID來獲取使用者基本資訊。特別需要注意的是,如果開發者擁有多個移動應用、網站應用和公眾帳號,可通過獲取使用者基本資訊中的unionid來區分使用者的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站應用和公眾帳號,使用者的unionid是唯一的。換句話說,同一使用者,對同一個微信開放平臺下的不同應用,unionid是相同的。請注意,在使用者修改微信頭像後,舊的微信頭像URL將會失效,因此開發者應該自己在獲取使用者資訊後,將頭像圖片儲存下來,避免微信頭像URL失效後的異常情況。
請求說明
http請求方式: GET

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

這裡寫圖片描述

這裡寫圖片描述

程式碼

/// <summary>
/// 轉到微信二維碼登入視窗,拼接URL 進行請求
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public partial class redirectPage : System.Web.UI.Page
{
    string state = WxPayApi.GenerateNonceStr();
    Session["validState"
] = state; //=======【微信開放平臺應用基本資訊設定】 /* 微信登入資訊配置 * L_APPID:微信開放平臺應用的APPID xxxxxxxx * L_QRCONNECTION :請求code 地址 https://open.weixin.qq.com/connect/qrconnect? * L_REDIRECTURL :重定向地址(必須進行UrlEncode) wxLoginRedirectURL.aspx */ StringBuilder sb = new StringBuilder(); sb.Append(WxPayConfig.L_QRCONNECTION); sb.Append("appid="
); sb.Append(WxPayConfig.L_APPID); sb.Append("&redirect_uri="); sb.Append(HttpUtility.UrlEncode(WxPayConfig.L_REDIRECTURL)); sb.Append("&response_type=code&scope=snsapi_login&state="); sb.Append(state); sb.Append("#wechat_redirect"); string wxLoginPage=sb.ToString(); Response.Redirect(wxLoginPage); }

使用者進行掃碼後,重定向到配置的redirect_uri 頁面,此頁面程式碼:

    public partial class wxLoginRedirectURL : System.Web.UI.Page
    {
        private static JavaScriptSerializer jss = null;
        private static BLL.User user = null;
        private static Model.UserEntity uentity = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string code = Request.QueryString["code"] ?? "";
                if (!string.IsNullOrEmpty(code))
                {
                    string state = Request.QueryString["state"] ?? "";//微信回發的上一步設定的state
                    if (!string.IsNullOrEmpty(Session["validState"].ToString()) && !string.IsNullOrEmpty(state))
                    {
                        if (Equals(Session["validState"].ToString(), state))// 校驗是否相等
                        {
                            //域名所屬人ID
                            string duserid = 1;//測試使用者id
                            //拼接獲取access_token的URL(通過code獲取access_token)
                            string getTokenUrl = WxPayConfig.L_ACCESSTOKEN + "appid=" + WxPayConfig.L_APPID + "&secret=" + WxPayConfig.L_APPSECRET + "&code=" + code + "&grant_type=authorization_code";
                            string tokenResult = HttpService.Get(getTokenUrl);//開始請求
                            jss = new JavaScriptSerializer();
                            // 反序列化token 資訊
                            TokenResult obj = jss.Deserialize<TokenResult>(tokenResult);
                            if (string.IsNullOrEmpty(obj.errcode))
                            {
                                user = new BLL.User();
                                //拼接獲取使用者資訊的介面,通過access_token呼叫介面(獲取使用者個人資訊介面(/sns/userinfo))
                                string wxUserInfoUrl = WxPayConfig.L_SNSUSERINFO + "access_token=" + obj.access_token + "&openid=" + obj.openid;
                                string userInfoResult = HttpService.Get(wxUserInfoUrl);
                                // 反序列化使用者資訊
                                UserInfoResult uobj = jss.Deserialize<UserInfoResult>(userInfoResult);
                                //檢查是否資料庫中存在
                                Model.UserEntity IsExistEntity = user.SelectByUserName(uobj.unionid);
                                if (IsExistEntity != null)
                                {
                                    //使用者存在
                                    Session["uid"] = IsExistEntity.Id;
                                   //  Log.Info("使用者存在=", "!=null");
                                    Model.UserEntity pentity = user.Select(Convert.ToInt32(duserid));
                                    Response.Redirect(pentity.DomainLevel);
                                }
                                else
                                {
                                    //使用者不存在
                                    // 儲存資料庫
                                    uentity = new Model.UserEntity();
                                    uentity.Name = uobj.nickname;
                                    uentity.UserName = uobj.unionid;
                                    uentity.Description = uobj.headimgurl;
                                    if (!string.IsNullOrEmpty(duserid))
                                    {
                                        uentity.ParentId = Convert.ToInt32(duserid);
                                    }
                                    int uid = user.Save(uentity);
                                    if (uid > 0)
                                    {//儲存session
                                        Session["uid"] = uid;
                                        //根據Session["pid"] 獲取host
                                        Model.UserEntity pentity = user.Select(Convert.ToInt32(duserid));
                                        if (pentity != null)
                                        {
                                            Response.Redirect("pentity.DomainLevel");
                                        }
                                        else
                                        {
                                            Log.Info("pentity=", "null");
                                            Response.Redirect("~/custompage/err.htm");
                                        }
                                    }
                                }
                            }
                            else
                            {
                                // 失敗
                                Log.Info("反序列化openid", obj.errcode + ":" + obj.errmsg);
                                // 轉走
                                Response.Redirect("~/custompage/err.htm");
                            }

                        }
                        else
                        {
                            //校驗失敗
                            Response.Redirect("~/custompage/err.htm");
                        }
                    }
                    else
                    {
                        //state 或Session["validState"] 為null/空
                        Log.Info("session[validstate]", Session["validState"].ToString());
                    }
                }
                else
                { //使用者禁止授權
                    Response.Redirect("~/main.aspx");
                }
            }
        }
    }

    #region定義的序列化類 
    /// <summary>
    /// 獲取微信使用者資訊
    /// </summary>
    public class UserInfoResult : PubClass
    {
        public string nickname { get; set; }
        public string province { get; set; }
        public string city { get; set; }
        public string country { get; set; }
        public string headimgurl { get; set; }
        public Array[] privilege { get; set; }
        public string language { get; set; }
        public int sex { get; set; }
    }
    /// <summary>
    /// access_token 
    /// </summary>
    public class TokenResult : PubClass
    {
        public string access_token { get; set; }
        public string expires_in { get; set; }
        public string refresh_token { get; set; }

        public string scope { get; set; }

        public string errcode { get; set; }
        public string errmsg { get; set; }
    }
    /// <summary>
    /// 公有欄位
    /// </summary>
    public class PubClass
    {
        public string unionid { get; set; }
        public string openid { get; set; }
    }
    #endregion