微信开放平台---网站应用开发---微信登录功能 简介
生活随笔
收集整理的這篇文章主要介紹了
微信开放平台---网站应用开发---微信登录功能 简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 微信開放平臺:https://open.weixin.qq.com/
2 開通流程:
3 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
4 效果展示:
點擊微信圖標跳轉到https://open.weixin.qq.com/connect/.....頁面
使用個人微信掃描后,點擊“確認登錄”
這時候,pc頁面上就會有變化:
然后頁面就直接跳轉到1好店的首頁,并且將微信用戶的信息傳過去了。
5 通過官方提供的文檔,我們可以看出一共分4個步驟
第一步:請求CODE
第二步:通過code獲取access_token
第三步:通過access_token調用接口
第4步:獲取用戶個人信息(UnionID機制)
我們寫一個api代碼:
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
核心代碼已經寫好了。
這里要感謝小亞同學辛苦寫的代碼。我直接拿過來使用了。
面對新的知識和技能,我們首先要仔細看官方的說明,再理清楚思路,一步一步跟著開發就行了。
小亞同學是去年剛畢業,也能把這些代碼寫的很好,難能可貴。
總結
以上是生活随笔為你收集整理的微信开放平台---网站应用开发---微信登录功能 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse workplace lo
- 下一篇: SAP Fiori issue排查:wh