一、場景
Web 系統登錄頁面“企業微信”圖標,點擊後調取企業微信掃碼登錄頁面,掃碼成功後判斷系統賬號與企業微信用户ID綁定情況,有則直接登錄,無則跳轉到綁定登錄頁面,用户手動輸入個人賬號密碼進行綁定,首次綁定後後續無需再綁定。
二、企業微信應用相關配置
1、新建企微應用
進入企微管理後台,應用管理模塊,點擊創建應用,填寫應用名稱、介紹,設置應用Logo,點擊創建應用。
2、應用 ID 和 Secret
創建好應用後,保存好應用的 AgentId 和 Secret,後續系統調用企微接口會用到。
以及企業ID(在管理後台 - 我的企業中查看)。
3、配置可信域名、授權回調域、企業可信IP
如果系統地址為 http://www.oa.com:8099,則可信域名、授權回調域填寫 www.oa.com:8099。並且確保系統授權流程中的回調接口地址也是 http://www.oa.com:8099/xxx/xxx 格式,有任意一處對不上,進行掃碼登錄時會提示:edirect_uri 與配置的授權完成回調域名不一致 問題。
配置可信域名時可能會讓進行域名歸屬認證,下載認證文件,放到域名訪問根目錄下,確保 http://www.oa.com:8099/WW_verify_xxxxxxx.txt,在瀏覽器可訪問(會顯示WW_verify_xxxxxxx.txt內的內容),具體實現方式根據系統的部署方式決定,可根據系統的部署方式詢問AI。
三、Java 流程實現
常量參數:
// 企微企業 ID String wxworkCorpId = xxx; // 企微應用 AgentId String wxworkAgentId = xxx; // 企微應用 Secret String wxworkSecret = xxx; // 登錄回調地址 String wxworkRedirectUri = "http://www.oa.com:8099/wxwork/callback";
跳轉到企微登錄頁:
/** * 跳轉到企業微信掃碼登錄頁面 */ @GetMapping("/wxwork/login") public void wxworkLogin(HttpServletResponse response) throws Exception { // 企業微信網頁掃碼授權 URL String authUrl = "https://open.work.weixin.qq.com/wwopen/sso/qrConnect?" + "appid=" + wxworkCorpId + "&agentid=" + wxworkAgentId + "&redirect_uri=" + URLEncoder.encode(wxworkRedirectUri, "UTF-8") + "&state=meiqu_erp"; response.sendRedirect(authUrl); }
企業微信登錄回調:
@GetMapping("/wxwork/callback") public String wxworkCallback(@RequestParam("code") String code, @RequestParam(value = "state", required = false) String state, HttpServletRequest request) throws Exception { // 1. 獲取企業微信 access_token String accessToken = getWxworkAccessToken(); // 2. 用 code 換取用户的 UserId String userId = getWxworkUserId(accessToken, code); if (StringUtils.isBlank(userId)) { return "redirect:/login?error=wxwork_auth_failed"; } // 3. 根據企業微信 userId 查找綁定的系統用户 // 3.1 userId 沒有匹配到系統用户,跳轉到綁定頁面,讓用户首次手動輸入系統賬户密碼進行綁定 // 3.2 userId 匹配到系統用户,跳轉登錄。 }
獲取企業微信 access_token:
/** * 獲取企業微信 access_token * 接口:GET https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=xxx&corpsecret=xxx */ private String getWxworkAccessToken() throws Exception { String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?" + "corpid=" + wxworkCorpId + "&corpsecret=" + wxworkSecret; String result = getJson(url); return JSON.parseObject(result).getString("access_token"); }
用 Code 換取用户的 UserId:
/** * 用 code 換取企業微信用户的 UserId * 接口:GET https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=xxx&code=xxx */ private String getWxworkUserId(String accessToken, String code) throws Exception { String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?" + "access_token=" + accessToken + "&code=" + code; String result = getJson(url); JSONObject json = JSON.parseObject(result); // errcode=0 表示成功,UserId 為企業內用户ID if (json.getIntValue("errcode") == 0) { return json.getString("UserId"); } return null; }