利用WxJava實現網站集成微信登陸功能,核心代碼居然不超過10行

最近網站PC端集成微信掃碼登陸,踩了很多坑,在此記錄下實現過程和注意事項。java

本文目錄

1、微信開放平臺操做步驟1.建立「網站應用」2.獲取AppID和AppSecret2、開發指南3、開發實戰一、pom.xml引入jar包二、配置文件添加對應的配置三、初始化配置四、控制層核心代碼4、運行效果1.構造pc端連接2.微信掃描生成的二維碼3.獲取微信用戶信息git

1、微信開放平臺操做步驟

微信開放平臺地址:https://open.weixin.qq.comgithub

必定要注意,網站集成微信登陸須要在微信開放平臺操做,它和微信公衆平臺不同,雖然雙方最後的用戶惟一標識都是openId,可是是不互通的。若是開發平臺想和公衆平臺相互通,兩個平臺得互相綁定,而後獲取惟一識別的unionId。web

下面說下在開放平臺上的操做步驟:redis

1.建立「網站應用」

因爲到對接PC網站登陸,因此建立「網站應用」,操做截圖以下:spring



新建網站應用截圖

2.獲取AppID和AppSecret

等微信審覈經過後,會分配對應的AppId,AppSecret須要管理員掃描生成,生成後截圖以下:api


查看AppId截圖

 

2、開發指南

微信OAuth2.0受權登陸讓微信用戶使用微信身份安全登陸第三方應用或網站,在微信用戶受權登陸已接入微信OAuth2.0的第三方應用後,第三方能夠獲取到用戶的接口調用憑證(access_token),經過access_token能夠進行微信開放平臺受權關係接口調用,從而可實現獲取微信用戶基本開放信息和幫助用戶實現基礎開放功能等,總體流程爲:跨域

1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
2. 經過code參數加上AppID和AppSecret等,經過API換取access_token;
3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。

3、開發實戰

項目中使用了開源項目WxJava,WxJava源碼地址(https://github.com/Wechat-Group/WxJava);安全

先新建要給Spring Boot項目,具體能夠參考文章我以前的文章《Spring Boot入門-快速搭建web項目》ruby

新建好項目後,繼續按照下面步驟操做便可。

一、pom.xml引入jar包

<!-- 微信登陸jar -->
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>3.3.0</version>
</dependency>

二、配置文件添加對應的配置

配置appId和appSecret,application.yml內以下:

wx:
  mp:
    configs:
        - appid: wx1*********
          secret: ***********
          token: 
          aesKey: 
          msgDataFormat: 

三、初始化配置

WxMpProperties.java代碼以下:

@Data
@ConfigurationProperties(prefix = "wx.mp")
public class WxMpProperties {

    private List<MpConfig> configs;

    @Data
    public static class MpConfig {
        /**
         * 設置微信公衆號的appid
         */

        private String appId;

        /**
         * 設置微信公衆號的app secret
         */

        private String secret;

        /**
         * 設置微信公衆號的token
         */

        private String token;

        /**
         * 設置微信公衆號的EncodingAESKey
         */

        private String aesKey;
    }

}

WxMpConfiguration.java代碼以下:

@Slf4j
@Configuration
@EnableConfigurationProperties(WxMpProperties.class)
public class WxMpConfiguration {

    private static Map<String, WxMpService> mpServices = Maps.newHashMap();

    public static Map<String, WxMpService> getMpServices() {
        return mpServices;
    }

    @Autowired
    private WxMpProperties properties;

    @Autowired
    private WxMpInRedisConfigStorageMy configStorage;

    @PostConstruct
    public void initServices() {
        // 代碼裏 getConfigs()處報錯的同窗,請注意仔細閱讀項目說明,你的IDE須要引入lombok插件!!!!
        final List<WxMpProperties.MpConfig> configs = this.properties.getConfigs();
        if (configs == null) {
            throw new RuntimeException("大哥,拜託先看下項目首頁的說明(readme文件),添加下相關配置,注意別配錯了!");
        }

        mpServices = configs.stream().map(a -> {
            //redis
            configStorage.setAppId(a.getAppId());
            configStorage.setSecret(a.getSecret());
            configStorage.setToken(a.getToken());
            configStorage.setAesKey(a.getAesKey());

            WxMpService service = new WxMpServiceImpl();
            service.setWxMpConfigStorage(configStorage);
            log.info("配置的appId={}",a.getAppId());
            return service;
        }).collect(Collectors.toMap(s -> s.getWxMpConfigStorage().getAppId(), a -> a, (o, n) -> o));
    }
}

四、控制層核心代碼

@Slf4j
@Controller
@RequestMapping("/redirect/{appid}")
public class WxRedirectController {

    /**
     * 獲取用戶信息
     *
     */

    @RequestMapping("/getUserInfo")
    public void getBase(HttpServletRequest request, HttpServletResponse response, @PathVariable String appid, @RequestParam("code") String code) {
        WxMpService mpService = WxMpConfiguration.getMpServices().get(appid);
        try {
            WxMpOAuth2AccessToken accessToken = mpService.oauth2getAccessToken(code);
            log.info("accessToken={}", JSON.toJSONString(accessToken));
            WxMpUser wxMpUser = mpService.oauth2getUserInfo(accessToken, null);
            log.info("wxMpUser={}", JSON.toJSONString(wxMpUser));
        } catch (Exception e) {
            log.error("獲取用戶信息異常!", e);
        }
    }
}

4、運行效果

1.構造pc端連接

https://open.weixin.qq.com/connect/qrconnect?appid=wx12345678redirect_uri=http%3a%2f%2fwww.test.com%2fredirect%2fwx12345678%2fgetUserInfo&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect

打開上面連接後截圖以下:


2.微信掃描生成的二維碼

微信掃描後手機端截圖以下:


微信用戶使用微信掃描二維碼而且確認登陸後,PC端會跳轉到

http://www.test.com/redirect/wx12345678/getUserInfo?code=CODE&state=STATE

3.獲取微信用戶信息

控制層代碼能夠接收到上code和state參數,根據這兩個參數能夠獲取微信用戶信息,請求過來後打印用戶信息的日誌以下:

[http-nio-8104-exec-2] INFO  c.t.m.s.c.WxRedirectController - accessToken={"accessToken":"24_vWnvRSV9vmR7qOqhJKRoER93bhsPg","expiresIn":7200,"openId":"oRXsdsUh6scaKof3D1I4d3c","refreshToken":"24_WmknxCn9ff2Pl2xhLFw-kY96p6zgiqFJy8LMIOP_CaMZOHEM","scope":"snsapi_login","unionId":"oJxUkwfFOSyu1oC6oF2h6pTI"}
[http-nio-8104-exec-2] INFO  c.t.m.s.c.WxRedirectController - wxMpUser={"city":"","country":"","headImgUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Q3auHgzwzM4ibeAsuoVIf3qr4QxjnNWh4Q1WiawCFNfzkGMzVqubPOnr0hA3Micwsu1LtblQ7phImdYSC2nic6OUicQ/132","language":"","nickname":"阿白","openId":"oRXsdsUh6scaKof3D1I4d3c","privileges":[],"province":"","sex":0,"sexDesc":"未知","unionId":"oaDUkwVfCpMJOSyu1oC2oF2h6pTI"}

到此PC網站集成微信登陸已經所有實現完成了,有問題歡迎留言溝通哦!

推薦閱讀

1.Spring Boot 2.X 整合Redis
2.Spring Boot 2.X 如何優雅的解決跨域問題?
3.Spring Boot 2.X 集成spring session實現session共享
4.Spring條件註解@Conditional
5.SpringBoot 2.X從0到1實現郵件發送功能
6.Redis批量刪除key的小技巧,你知道嗎?
7.Spring Boot 2.X 如何快速整合jpa?
8.Spring Boot之Profile--快速搞定多環境使用與切換
9.Spring Boot快速集成kaptcha生成驗證碼
10.Spring Boot 2.X整合Spring-cache,讓你的網站速度飛起來


限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分佈式、大數據、機器學習等技術。
關注下方公衆號便可免費領取:

Java碎碎念公衆號
相關文章
相關標籤/搜索