博客 / 詳情

返回

Java 實現企業微信掃碼登錄

一、場景

Web 系統登錄頁面“企業微信”圖標,點擊後調取企業微信掃碼登錄頁面,掃碼成功後判斷系統賬號與企業微信用户ID綁定情況,有則直接登錄,無則跳轉到綁定登錄頁面,用户手動輸入個人賬號密碼進行綁定,首次綁定後後續無需再綁定。

二、企業微信應用相關配置

1、新建企微應用

進入企微管理後台,應用管理模塊,點擊創建應用,填寫應用名稱、介紹,設置應用Logo,點擊創建應用。

image

 2、應用 ID 和 Secret

創建好應用後,保存好應用的 AgentId 和 Secret,後續系統調用企微接口會用到。

image

以及企業ID(在管理後台 - 我的企業中查看)。

image

 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。

image

 三、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;
    }

 

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.