微信開放平臺---網站應用開發---微信登陸功能 簡介

1 微信開放平臺:https://open.weixin.qq.com/web

2 開通流程:數據庫

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

4 效果展現:微信

點擊微信圖標跳轉到https://open.weixin.qq.com/connect/.....頁面app

使用我的微信掃描後,點擊「確認登陸」ui

這時候,pc頁面上就會有變化:url

而後頁面就直接跳轉到1好店的首頁,而且將微信用戶的信息傳過去了。spa

 

5 經過官方提供的文檔,咱們能夠看出一共分4個步驟code

第一步:請求CODE
第二步:經過code獲取access_token
第三步:經過access_token調用接口
第4步:獲取用戶我的信息(UnionID機制)

咱們寫一個api代碼:  blog

public class weixin_helper
    {
        public weixin_helper()
        {
        }
        /// <summary>
        /// 根據AppID和AppSecret得到access token(默認過時時間爲2小時)
        /// </summary>
        /// <returns>Dictionary</returns>
        public static Dictionary<string, object> get_access_token()
        {
            //得到配置信息
            oauth_config config = oauth_helper.get_config(2);
            string send_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
                              config.oauth_app_id + "&secret=" + config.oauth_app_key + "";
            //發送並接受返回值
            string result = Utils.HttpGet(send_url);
            if (result.Contains("errmsg"))
            {
                return null;
            }
            try
            {
                Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
                return dic;
            }
            catch
            {
                return null;
            }
        } /// <summary>
        /// 取得臨時的Access Token(默認過時時間爲2小時)
        /// </summary>
        /// <param name="code">臨時Authorization Code</param>
        /// <param name="state">防止CSRF攻擊,成功受權後回調時會原樣帶回</param>
        /// <returns>Dictionary</returns>
        public static Dictionary<string, object> get_access_token(string code, string state)
        {
            //得到配置信息
            oauth_config config = oauth_helper.get_config(2);
            string send_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +
                              config.oauth_app_id + "&secret=" + config.oauth_app_key + "&code="+code+"&grant_type=authorization_code";
            //發送並接受返回值
            string result = Utils.HttpGet(send_url);
            if (result.Contains("errmsg"))
            {
                return null;
            }
            try
            {
                Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
                return dic;
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 根據access_token判斷access_token是否過時
        /// </summary>
        /// <param name="access_token"></param>
        /// <returns>true表示未失效</returns>
        public static bool check_access_token(string access_token)
        {
            //得到配置信息
            oauth_config config = oauth_helper.get_config(2);
            string send_url = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + config.oauth_app_id;
            //發送並接受返回值
            string result = Utils.HttpGet(send_url);
            try
            {
                Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
                if (dic.ContainsKey("errmsg"))
                {
                    if (dic["errmsg"].ToString()=="ok")
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                    
                }
                return false;

            }
            catch
            {
                return false;
            }
        }


      /// <summary>
        /// 若fresh_token已過時則根據refresh_token取得新的refresh_token
      /// </summary>
        /// <param name="refresh_token">refresh_token</param>
        /// <returns>Dictionary</returns>
        public static Dictionary<string, object> get_refresh_token(string refresh_token)
        {
            //得到配置信息
            oauth_config config = oauth_helper.get_config(2);
            string send_url =
                "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" +
                              config.oauth_app_id + "&grant_type=refresh_token&refresh_token=" + refresh_token;
            //發送並接受返回值
            string result = Utils.HttpGet(send_url);
            if (result.Contains("errmsg"))
            {
                return null;
            }
            try
            {
                Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
                return dic;
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 獲取登陸用戶本身的基本資料
        /// </summary>
        /// <param name="access_token">臨時的Access Token</param>
        /// <param name="open_id">用戶openid</param>
        /// <returns>Dictionary</returns>
        public static Dictionary<string, object> get_user_info(string access_token, string open_id)
        {
            //得到配置信息
            oauth_config config = oauth_helper.get_config(2);
            //發送並接受返回值   
            string send_url = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+open_id;
            //發送並接受返回值
            string result = Utils.HttpGet(send_url);
            if (result.Contains("errmsg"))
            {
                return null;
            }
            //反序列化JSON
            Dictionary<string, object> dic = JsonHelper.DataRowFromJSON(result);
            return dic;
        }
    }

 

控制器的核心代碼:

#region 微信登陸

        /// <summary>
        /// 微信登陸
        /// </summary>
        public ActionResult WeChat()
        {
            //得到配置信息
            oauth_config config = oauth_helper.get_config(2); //主鍵id
            if (config == null)
            {
                return Content("出錯了,您還沒有配置微信相關的API信息!");
            }
            string state = Guid.NewGuid().ToString().Replace("-", "");
            Session["oauth_state"] = state;
            string send_url =
                "https://open.weixin.qq.com/connect/qrconnect?appid=" + config.oauth_app_id +
                              "&redirect_uri=" + Utils.UrlEncode(config.return_uri.ToLower()) +
                              "&response_type=code&scope=snsapi_login&state=" + state +
                              "#wechat_redirect";
            //開始發送
            return Redirect(send_url); //跳轉到微信本身 指定的關聯登錄頁面
        }

        /// <summary>
        /// 微信登陸返回action
        /// </summary>
        public ActionResult WeChatReturnUrl(string state, string code)
        {
            //取得返回參數
            string access_token = string.Empty;
            string expires_in = string.Empty;
            string client_id = string.Empty;
            string openid = string.Empty;
            string refresh_token = string.Empty;

            if (Session["oauth_state"] == null || Session["oauth_state"].ToString() == "" ||
                state != Session["oauth_state"].ToString() || string.IsNullOrEmpty(code))//若返回參數中未包含code或者state沒有經過驗證則提示出錯
            {
                return Content("出錯啦,state未初始化!");
            }

            //第一步:經過code來獲取Access Token以及openid
            Dictionary<string, object> dic1 = weixin_helper.get_access_token(code, state);
            if (dic1 == null || !dic1.ContainsKey("access_token"))
            {
                return Content("錯誤代碼:,沒法獲取Access Token,請檢查App Key是否正確!");
            }
            if (dic1 == null || !dic1.ContainsKey("openid"))
            {
                if (dic1.ContainsKey("errmsg"))
                {
                    return Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"]);
                }
                else
                {
                    return Content("出錯啦,沒法獲取用戶受權Openid!");
                }
            }

            access_token = dic1["access_token"].ToString();//獲取access_token
            expires_in = dic1["expires_in"].ToString();//獲取過時時間
            refresh_token = dic1["refresh_token"].ToString();//獲取用於從新刷新access_token的憑證
            openid = dic1["openid"].ToString();//用戶惟一標示openid

            //儲存獲取數據用到的信息
            Session["oauth_name"] = "webchat";
            Session["oauth_access_token"] = access_token;
            Session["oauth_openid"] = openid;
            Session["oauth_refresh_token"] = refresh_token;
            #region todo 將獲取到的用戶信息保存到數據庫中

            #endregion
            //第二步:經過Access Token以及openid來獲取用戶的基本信息
            //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);


            //第三步:跳轉到指定頁面
            return Content(WeChatResultJson());

        }

        /// <summary>
        /// 微信登陸返回action, 處理用戶信息
        /// </summary>
        public string WeChatResultJson()
        {
            string oauth_access_token = string.Empty;
            string oauth_openid = string.Empty;
            string oauth_name = string.Empty;
            string oauth_refresh_token = string.Empty;

            if (Session["oauth_name"] == null || Session["oauth_access_token"] == null ||
                Session["oauth_openid"] == null)
            {
                return "{\"ret\":\"1\", \"msg\":\"出錯啦,Access Token已過時或不存在!\"}";
            }
            oauth_name = Session["oauth_name"].ToString();
            oauth_access_token = Session["oauth_access_token"].ToString();
            oauth_openid = Session["oauth_openid"].ToString();
            oauth_refresh_token = Session["oauth_refresh_token"].ToString();

            if (!weixin_helper.check_access_token(oauth_access_token)) //調用access_token前需判斷是否過時
            {
                Dictionary<string, object> dic1 = weixin_helper.get_refresh_token(oauth_refresh_token);//若是已過時則從新換取新的access_token
                if (dic1 == null || !dic1.ContainsKey("access_token"))
                {
                    return "{\"openid\":\"0\", \"msg\":\"出錯啦,沒法獲取access_token!\"}";
                }
                oauth_access_token = dic1["access_token"].ToString();
            }

            Dictionary<string, object> dic = weixin_helper.get_user_info(oauth_access_token, oauth_openid);
            if (dic == null)
            {
                return "{\"openid\":\"0\", \"msg\":\"出錯啦,沒法獲取受權用戶信息!\"}";
            }
            try
            {
                StringBuilder str = new StringBuilder();
                str.Append("{");
                str.Append("\"openid\": \"" + dic["openid"].ToString() + "\", ");
                str.Append("\"nickname\": \"" + dic["nickname"].ToString() + "\", ");
                str.Append("\"sex\": \"" + dic["sex"].ToString() + "\", ");
                str.Append("\"province\": \"" + dic["province"].ToString() + "\", ");
                str.Append("\"city\": \"" + dic["city"].ToString() + "\", ");
                str.Append("\"country\": \"" + dic["country"].ToString() + "\", ");
                str.Append("\"headimgurl\": \"" + dic["headimgurl"].ToString() + "\", ");
                str.Append("\"privilege\": \"" + dic["privilege"].ToString() + "\", ");
                str.Append("\"unionid\": \"" + dic["unionid"].ToString() + "\"");
                str.Append("\"oauth_name\": \"" + oauth_name + "\"");
                str.Append("\"oauth_access_token\": \"" + oauth_access_token + "\"");
                str.Append("\"oauth_openid\": \"" + oauth_openid + "\"");
                str.Append("}");
                return str.ToString();
            }
            catch
            {
                return "{\"ret\":\"0\", \"msg\":\"出錯啦,沒法獲取受權用戶信息!\"}";
            }

        }
        #endregion

 

核心代碼已經寫好了。

這裏要感謝小亞同窗辛苦寫的代碼。我直接拿過來使用了。

面對新的知識和技能,咱們首先要仔細看官方的說明,再理清楚思路,一步一步跟着開發就好了。

小亞同窗是去年剛畢業,也能把這些代碼寫的很好,難能難得。

相關文章
相關標籤/搜索