以微信企業號作為入口的應用,幾乎都會遇到需要應用系統中個人信息和微信用戶關聯問題、從而進行其他業務處理。目前所做項目采取在企業號通訊錄添加自定義字段存入應用系統用戶信息表中唯一標識UserGuid進行關聯。那么如何獲取微信企業號通訊錄存儲的自定義字段、從而實現應用用戶信息和微信賬號關聯?把實現方案大致整理一下,如有不足,還望指出:
1:在企業號通訊錄內添加用戶Guid唯一字段。
2:創建應用並啟用回調模式
3:以微信為入口的應用驗證用戶的方法,首先在用戶訪問應用主頁時判斷Cookie是否有UserGuid信息,如果沒有則調用微信OAuth2認證接口。redirectUrl參數是回調頁面地址,通過認證后會返回redirectUrl?code=XXXX信息。注:RedirectUrl回調地址必須是外網可以訪問的。
1 if (Request.Cookies["UserGuid"] == null) 2 { 3 string httpUrl = 4 "https://open.weixin.qq.com/connect/oauth2/authorize?appid=XX&redirect_uri=URL&response_type=code&scope=snsapi_base&state="; 5 Response.Redirect(httpUrl); 6 } 7 else 8 { 9 //TODO 獲取userguid之后處理步驟 Request.Cookies["UserGuid"].ToString(); 10 11 }
4:回調頁面處理思路
4.1首先獲取通過認證后的Code參數,之后根據企業號的CorpID和Secret獲取AccessToken。
Https請求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
成功時返回:
{
"access_token": "XXX…………",
"expires_in": 7200
}
4.2獲取token之后,根據code和accesstoken字符串參數獲取微信用戶信息,accesstoken7200秒內有效,code參數五分鍾內有效且僅能使用一次。
Https請求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
驗證為企業成員時返回
{
"UserId":"USERID",
"DeviceId":"DEVICEID"
}
請求失敗時返回
{
"errcode": "40029",
"errmsg": "invalid code"
}
4.3獲取UerID之后,根據access_token和UerID獲取用戶通訊錄中信息。自定義字段在extattr屬性中。
Https請求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=UerID
成功時返回
{
"errcode": 0,
"errmsg": "ok",
"userid": "zhangsan",
"name": "XX",
"department": [2],
"position": "XX",
"mobile": "XX",
"gender": "1",
"email": "XX",
"weixinid": "XX",
"avatar": "XX",
"status": 1,
"extattr": {"attrs":[{"name":"用戶自定義字段名","value":"自定義字段值"}]}
}
4.4獲取用戶自定義字段UserGuid后存入cookie,並返回應用主頁面。主頁面此時驗證Cookie,userguid信息。
5:回調頁面代碼C#
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 4 try 5 { 6 //1.微信主頁判斷是否存在Cookie信息,如果存在則不需要再次驗證 7 //2.如果不存在,則跳轉到微信OAuth統一認證頁面認證,之后到此頁面獲取用戶信息存入Cookie返回主頁 8 //3.獲取Code,此code只能使用一次。 9 string code = Request["code"]; 10 11 //4.根據企業ID:XX,Secret:XXX,獲取token 12 string accessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; 13 string accessTokenResult = HttpGet(accessTokenUrl, "corpid=XX&corpsecret=XXXX"); 14 JavaScriptSerializer js = new JavaScriptSerializer(); 15 token mytoken = js.Deserialize<token>(accessTokenResult); 16 string tokenValue = mytoken.access_token; 17 18 //5.獲取UserInfo,包含userId 19 string userinfoUrl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; 20 string userinfojson = HttpGet(userinfoUrl, "access_token=" + tokenValue + "&code=" + code); 21 userinfo userinfo1 = js.Deserialize<userinfo>(userinfojson); 22 string UserId = userinfo1.UserId; 23 24 //6.根據userId獲取通訊錄中用戶的詳細信息 25 string userinfodetailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get"; 26 string userinfodetailResult = HttpGet(userinfodetailURL, "access_token=" + tokenValue + "&userid=" + UserId); 27 JObject jObject = (JObject)JsonConvert.DeserializeObject(userinfodetailResult); 28 JObject ja = (JObject)JsonConvert.DeserializeObject(jObject["extattr"].ToString()); 29 JArray jObject1 = (JArray)JsonConvert.DeserializeObject(ja["attrs"].ToString()); 30 //txtReturn2.Text = ja[0]["MainOrganization"].ToString(); 31 32 //測試結果 33 //Response.Write("1:token:" + accessTokenResult + "<br/>2:tokenValue:" + tokenValue + "<br/>3:code:" + code + "<br/>4:userinfojson:" + userinfojson + "<br/>5.UserId:" + UserId + "<br/>6.userinfodetailResult:" + userinfodetailResult + "<br/>7:數組:" + jObject1[0]["value"].ToString()); 34 35 //7.將Guid存入cookie 36 string userguid = jObject1[0]["value"].ToString(); 37 Response.Cookies["UserGuid"].Value = userguid; 38 Response.Cookies["UserGuid"].Expires = DateTime.Now.AddDays(1); 39 //todo:跳轉到微信主頁 40 Response.Redirect("XX", true); 41 } 42 catch (Exception ex) 43 { 44 //TODO 處理異常 45 46 } 47 } 48 /// <summary> 49 /// 發送HttpGet請求,返回string格式的json數據 50 /// </summary> 51 /// <param name="Url"></param> 52 /// <param name="postDataStr"></param> 53 /// <returns></returns> 54 public string HttpGet(string Url, string postDataStr) 55 { 56 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr); 57 request.Method = "GET"; 58 request.ContentType = "text/html;charset=UTF-8"; 59 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 60 Stream myResponseStream = response.GetResponseStream(); 61 StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); 62 string retString = myStreamReader.ReadToEnd(); 63 myStreamReader.Close(); 64 myResponseStream.Close(); 65 return retString; 66 }
6上面代碼涉及到的兩個類,為處理返回string類型的Json串,將json格式序列化為類。類的格式需和json保持一致。代碼如下:

1 public class userinfo 2 { 3 public string UserId { get; set; } 4 public string DeviceId { get; set; } 5 } 6 7 public class token 8 { 9 10 public string access_token { get; set; } 11 public int expires_in { get; set; } 12 13 }