Springboot整合企業(yè)微信掃碼登錄管理后臺

應(yīng)用場景

企業(yè)網(wǎng)站或者后臺管理系統(tǒng)登錄時营曼,在開放外網(wǎng)使用時通過賬號密碼登錄有賬號盜用的風(fēng)險缭召,因此開發(fā)一個通過企業(yè)微信掃碼登錄的系統(tǒng)能很大程度降低這種風(fēng)險戒悠。

開始

  1. 提前準(zhǔn)備好內(nèi)網(wǎng)穿透烦衣,比如ngrok
    內(nèi)網(wǎng)穿透的方案有很多嚷闭,可以百度自行查找,使用內(nèi)網(wǎng)穿透主要是由于企業(yè)微信的回調(diào)地址必須是域名论寨,不能是localhost或者ip地址星立,通過內(nèi)網(wǎng)穿透便于開發(fā)階段的調(diào)試工作

  2. 在企業(yè)微信中創(chuàng)建應(yīng)用
    1.1 登錄企業(yè)微信
    1.2 在應(yīng)用管理中創(chuàng)建應(yīng)用


    創(chuàng)建應(yīng)用

    1.3 配置企業(yè)微信授權(quán)登錄


    配置登錄企業(yè)微信授權(quán)

    1.4 設(shè)置企業(yè)微信授權(quán)回調(diào)并在工作臺中隱藏
    第一步內(nèi)網(wǎng)穿透映射到本地的域名填在這里
    配置回調(diào)

    因?yàn)檫@個應(yīng)用的作用就是掃碼登錄,所以這里可以隱藏掉
  3. 配置文件

  • 在你的程序里配置企業(yè)微信的一些信息
    application.yml
wechat:
  cropid: *********
  agentid: *********
  agentsecret: *********
  redirect: http://*****.ngrok.io/weworklogin

寫一個bean,方便拿到這些屬性

@Data
@Component
public class WechatWorkBean {
    @Value("${wechat.cropid}")
    private String cropId;

    @Value("${wechat.agentid}")
    private String agentId;

    @Value("${wechat.agentsecret}")
    private String agentSecret;

    @Value("${wechat.redirect}")
    private String redirect;
}

在你的登錄視圖中加入這些屬性
model.addAttribute("wechat",wechatWorkBean);

  • 登錄頁面中加入企業(yè)微信的二維碼
    引入js文件
    <script th:src="@{js/wechat_work.js}" charset="utf-8"></script>
    可以放個div來放二維碼
   <div id="qrcode"></div>

加一段js代碼顯示出二維碼來

<script th:inline="javascript">
    let wechat = [[${wechat}]];
    window.WwLogin({
        "id" : "qrcode",
        "appid" : wechat.cropId,
        "agentid" : wechat.agentId,
        "redirect_uri" : wechat.redirect,
        "state" : "",
        // "href" : "",
    });
</script>

值得注意的是redirect_uri的域名要和之前配置的回調(diào)域在同一個域名下

  1. 掃碼之后的處理
  • 和所有微信相關(guān)的開發(fā)一樣葬凳,拿到access_token
    access_token的有效時間是兩個小時绰垂,重復(fù)獲取的話,之前的access_token會失效火焰,官方建議的是全局緩存劲装,我把它存在了redis里
@Component
@Slf4j
public class WechatWorkAccessToken {
    @Autowired
    RedisUtils redisUtils;

    @Autowired
    WechatWorkBean wechatWorkBean;

    public String getWeworkAccessToken() {
        String key = "wechatWorkAccessToken_" + wechatWorkBean.getAgentId();
        String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET";
        Object o = redisUtils.get(key);
        if(o == null) {

            url = url.replace("ID", wechatWorkBean.getCropId()).replace("SECRET", wechatWorkBean.getAgentSecret());
            String result = HttpUtils.doGet(url);
            log.info(result);
            Map<String, Object> map = FastJsonConvert.convertJSONToObject(result, Map.class);
            String accessToken = String.valueOf(map.get("access_token"));
            String expired = String.valueOf(map.get("expires_in"));
            if(StringUtils.isNotBlank(accessToken)) {
                redisUtils.set(key,accessToken,RedisUtils.HOUR);
                return accessToken;
            } else {
                log.error(result);
                return "";
            }
        }
        return o.toString();
    }
}

access_token告一段落,之前配置的redirect_url中要有個處理掃碼之后處理的方法昌简,掃碼之后企業(yè)微信會發(fā)一個重定向占业,后面加個code參數(shù)請求到redirect_url中,這里要寫一下這個方法處理這個纯赎,通過code拿到企業(yè)微信的用戶id谦疾,然后通過用戶id查找到系統(tǒng)用戶,就可以完成登錄了址否。

@RequestMapping("weworklogin")
    public String oauth2(HttpServletRequest request, HttpServletResponse response) {
        String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE";
        //  1.檢查code
        String code = request.getParameter("code");
        // code存在, 獲取用戶信息
        if(StringUtils.isNotBlank(code)) {
            url = url.replace("ACCESS_TOKEN",wechatWorkAccessToken.getWeworkAccessToken()).replace("CODE",code);
            String result = HttpUtils.doGet(url);
            Map<String,String> map = FastJsonConvert.convertJSONToObject(result,Map.class);
            String userId = map.get("UserId");
            if(StringUtils.isNotBlank(userId)) {
                String session = null;
                try {
                    session = baseUserService.login(userId);
                    CookieUtils.addCookie("eubasession",session);
                    return "redirect:/";
                } catch (EuException e) {
                    return "redirect:login?msg=" + UriEncoder.encode("您的企業(yè)微信ID【"+ userId +"】,請聯(lián)系管理員創(chuàng)建或綁定賬號");
                }
            } else {
                return "redirect:login?msg="+UriEncoder.encode("您不是企業(yè)用戶餐蔬,無法登陸,請聯(lián)系管理員");
            }
        } else {
            return "redirect:login?msg="+UriEncoder.encode("登錄失敗佑附,請聯(lián)系管理員");
        }
    }

基本上到這里核心功能就做完了。后面可以自行擴(kuò)展一下仗考,我做了一些額外的處理音同,在開發(fā)環(huán)境中還是允許賬號密碼登錄,線上環(huán)境中屏蔽掉秃嗜。权均。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顿膨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叽赊,更是在濱河造成了極大的恐慌恋沃,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件必指,死亡現(xiàn)場離奇詭異囊咏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塔橡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門梅割,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葛家,你說我怎么就攤上這事户辞。” “怎么了癞谒?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵底燎,是天一觀的道長。 經(jīng)常有香客問我弹砚,道長双仍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任迅栅,我火速辦了婚禮殊校,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘读存。我一直安慰自己为流,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布让簿。 她就那樣靜靜地躺著敬察,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尔当。 梳的紋絲不亂的頭發(fā)上莲祸,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音椭迎,去河邊找鬼锐帜。 笑死,一個胖子當(dāng)著我的面吹牛畜号,可吹牛的內(nèi)容都是我干的缴阎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼简软,長吁一口氣:“原來是場噩夢啊……” “哼蛮拔!你這毒婦竟也來了述暂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤建炫,失蹤者是張志新(化名)和其女友劉穎畦韭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛跌,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艺配,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惋砂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒挎。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖西饵,靈堂內(nèi)的尸體忽然破棺而出酝掩,到底是詐尸還是另有隱情,我是刑警寧澤眷柔,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布期虾,位于F島的核電站,受9級特大地震影響驯嘱,放射性物質(zhì)發(fā)生泄漏镶苞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一鞠评、第九天 我趴在偏房一處隱蔽的房頂上張望茂蚓。 院中可真熱鬧,春花似錦剃幌、人聲如沸聋涨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牍白。三九已至,卻和暖如春抖棘,著一層夾襖步出監(jiān)牢的瞬間茂腥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工切省, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最岗,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓朝捆,卻偏偏與公主長得像仑性,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子右蹦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345