微信登入(網站應用)ASP.NET
阿新 • • 發佈:2019-02-15
效果
官方流程圖:
第一步 請求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