業務操作最基礎的一個功能是獲取訪客的身份,傳統的獲取方式是提供一個登錄頁面用以訪客登錄。
在微信企業號中,用戶在微信中訪問頁面時,可以根據相關API獲取此用戶的微信賬號信息,以此來匹配業務服務器存儲的相關用戶信息。
1. 介紹
2. 代碼示例
企業號的網頁開發,說白了就是移動端web開發,特殊點在於如何獲取微信用戶的身份信息。
在企業號中可以進行如下步驟獲取微信用戶信息:
訪問一個業務頁面時,可通過OAuth驗證接口獲取此用戶信息 → 根據code獲取userId → 根據userId獲取微信信息。
API:http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3#.E4.BC.81.E4.B8.9A.E8.8E.B7.E5.8F.96code
說明:網頁經過OAuth2.0驗證後,重定向到原來網頁並在url後面添加code信息。
如:http://akmsg.com/a.html => OAhth2.0 => http://akmsg.com/a.html?code=CODE&state=STATE
API:http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3#.E6.A0.B9.E6.8D.AEcode.E8.8E.B7.E5.8F.96.E6.88.90.E5.91.98.E4.BF.A1.E6.81.AF
說明:調用此接口後將會獲得 userId;注:userId為加密後的微信賬號。
API:http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E6%88%90%E5%91%98#.E8.8E.B7.E5.8F.96.E6.88.90.E5.91.98
說明:調用此接口後將會獲得此訪問者在企業號登記的具體信息;如:姓名、微信號、手機號、郵箱、職位等等。
說明:從上一步驟獲取的微信信息,可以用來跟業務邏輯進行匹配獲取此用戶在業務層中的用戶信息。
邏輯:Asp.net對客戶端發送的請求進行判斷,符合微信企業號頁面規則的將進行微信企業號用戶身份認證操作。
此功能對訪問請求的三種情況進行分別判斷:
1.第一次訪問,沒code :進行OAuth驗證
2.有code,沒cookie :獲取code對應的信息
3.有code,有cookie :驗證cookie
/// <summary> /// 驗證微信訪問 /// </summary> public static void Auth(HttpContext webContext) { string requestURL = webContext.Request.Url.AbsoluteUri; try { // 用戶訪問微信頁面有3種情況: // 1.第一次訪問,沒code // 2.有code,沒cookie; // 3.有code,有cookie // 1.第一次訪問,沒code,沒cookie:跳轉到Oauth2.0認證 if (string.IsNullOrEmpty(webContext.Request["code"])) { string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect", CORPID, webContext.Server.UrlEncode(requestURL)); webContext.Response.Redirect(url, false); } else if (!string.IsNullOrEmpty(webContext.Request["code"]) && string.IsNullOrEmpty(CookieHelper.GetCookie("WXToken"))) { // 2.有code,沒cookie:根據code獲取userID string code = webContext.Request["code"]; string userId = ""; string userInfo = ""; #region 1)根據code獲取userId string url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token={0}&code={1}", GetAccessToken(), code); string responseText = HttpHelper.Instance.get(url); /* API:http://qydev.weixin.qq.com/wiki/index.php?title=OAuth%E9%AA%8C%E8%AF%81%E6%8E%A5%E5%8F%A3#.E6.A0.B9.E6.8D.AEcode.E8.8E.B7.E5.8F.96.E6.88.90.E5.91.98.E4.BF.A1.E6.81.AF 正確的Json返回示例: { "UserId":"USERID", "DeviceId":"DEVICEID" } 未關注企業號時返回: { "OpenId":"OPENID", "DeviceId":"DEVICEID" } 錯誤的Json返回示例: { "errcode": "40029", "errmsg": "invalid code" } */ WeChatUserCodeEntity codeEn = JsonHelper.GetEntity<WeChatUserCodeEntity>(responseText); if (codeEn.errcode > 0) { throw new Exception(codeEn.errmsg); } else if (string.IsNullOrEmpty(codeEn.UserId)) { throw new Exception("請先關注企業號!"); } userId = codeEn.UserId; #endregion #region 2)根據userId獲取用戶信息 url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={0}&userid={1}", GetAccessToken(), userId); responseText = HttpHelper.Instance.get(url); /* API:http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E6%88%90%E5%91%98#.E8.8E.B7.E5.8F.96.E6.88.90.E5.91.98 正確的Json返回示例: { "errcode": 0, "errmsg": "ok", "userid": "zhangsan", "name": "李四", "department": [1, 2], "position": "後台工程師", "mobile": "15913215421", "gender": "1", "email": "[email protected]", "weixinid": "lisifordev", "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0", "status": 1, "extattr": {"attrs":[{"name":"愛好","value":"旅游"},{"name":"卡號","value":"1234567234"}]} } 錯誤的Json返回示例: { "errcode": "40029", "errmsg": "invalid code" } */ WeChatUserInfoEntity userInfoEn = JsonHelper.GetEntity<WeChatUserInfoEntity>(responseText); if (userInfoEn.errcode > 0) { throw new Exception(userInfoEn.errmsg); } userInfo = responseText; #endregion // 3.把userInfo傳入到cookie裡 CookieHelper.SetCookie("WXToken", userInfo, -1); } else if (!string.IsNullOrEmpty(webContext.Request["code"]) && !string.IsNullOrEmpty(CookieHelper.GetCookie("WXToken"))) { #region 3.有code,有cookie:校驗cookie // TODO:在上面進行存入cookie時可采用AES加密,在這部進行解密校驗 // CookieHelper.SetCookie("WXToken", "", -1); #endregion } else { throw new Exception("非授權訪問!"); } } catch (Exception ex) { throw ex; } }
下載地址:http://files.cnblogs.com/files/polk6/Wechat.QYH.zip
==================================系列文章==========================================
本篇文章:1.3 微信企業號 獲取用戶信息
微信開發文章導航