微信公眾號開發掃碼登入(java版)
文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:
好好學java
,獲取優質學習資源。
商家資訊管理系統登入時可以用微信掃碼登入。
參考文件是微信開放平臺,著重需要關注文件(開發前一定看懂流程)的網站應用微信登入開發指南部分。
注意這裡是微信開放平臺,不同於微信公眾平臺,還需要另外註冊賬號。我們在微信開放平臺註冊賬號後,需要填寫我們網站的域名,這樣我們才能有權使用微信的介面。同樣個人沒有資質,要向師兄借用賬號。
在進行講解之前,我們需要明白使用者登入一個網站的實質,也就是每一個使用者對這個網站唯一的身份標識。而且我們每個微信使用者對於一個微信開放平臺賬戶有唯一的openid,這樣我們就可以用使用者的openid作為網站對這個使用者的唯一標識。但不是每個網站都有許可權獲取使用者的openid等資訊的,這就需要擁有這個網站的公司到微信開放平臺註冊一個賬號,然後在賬號裡填入自己網站的域名。然後網站就可以設定一個微信掃碼登入按鈕,讓訪問網站的使用者點選,點選這個按鈕就會訪問微信官方給的微信掃碼登陸介面,使用者掃碼同意後,就會回撥一個我們在微信掃碼登陸接口裡設定的return_url,並帶上code引數,我們就可以通過code引數,換取openid了。
過程和微信網頁授權過程非常相似。
第一步訪問微信給定的介面(加上自己的appID,appSecret,redirect_url,state引數),會獲取CODE,並以CODE和state為引數,回撥redirect_url。
然後以code、appid、appsecret為引數訪問微信給的另一個介面,就可以獲取openid等資訊。
以上是根據微信官方文件手工方式獲取openid的方法,我們也可以使用SDK的方式獲取,還是weixin-java-tools這個SDK。
分以下兩步:
第一步 先宣告好bean。
@Bean
public WxMpService wxOpenService (){
WxMpService wxOpenService=new WxMpServiceImpl();
wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage());
return wxOpenService;
}
@Bean
public WxMpConfigStorage wxOpenConfigStorage(){
WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage=new WxMpInMemoryConfigStorage();
wxMpInMemoryConfigStorage.setAppId(accountConfig.getOpenAppId());
wxMpInMemoryConfigStorage.setSecret(accountConfig.getOpenAppSecret());
return wxMpInMemoryConfigStorage;
}
第二步 構造自己的url,訪問
@GetMapping("/qrAuthorize")
public String qrAuthorize(@RequestParam("returnUrl") String returnUrl){
String url=projectUrlConfig.getWechatOpenAuthorize()+"/sell/wechat/userInfo";
String redirectUrl=wxOpenService.buildQrConnectUrl(url,WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN,URLEncoder.encode(returnUrl));
return "redirect:"+redirectUrl;
}
@GetMapping("qrUserInfo")
public String qrUserInfo(@RequestParam("code") String code,
@RequestParam("state") String returnUrl){
WxMpOAuth2AccessToken wxMpOAuth2AccessToken=new WxMpOAuth2AccessToken();
try{
wxMpOAuth2AccessToken=wxOpenService.oauth2getAccessToken(code);
}catch (WxErrorException e){
log.error("【微信網頁】{}",e);
throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
}
log.info("wxMpOAuth2AccessToken={}",wxMpOAuth2AccessToken);
String openId=wxMpOAuth2AccessToken.getOpenId();
return "redirect:"+returnUrl+"?openid="+openId;
}