微信公眾號 網頁授權獲取
阿新 • • 發佈:2018-11-07
一、普通方法獲取
1.獲取openid需要微信認證的服務號及以上許可權才可以,如果是個人學習可以申請一個測試賬號。
申請測試賬號:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
2.微訊號關注測試賬號。
3.修改回撥頁面域名(如果沒有域名,可以使用花生殼等內網穿透工具)
4.進入訊息介面使用指南,進入微信網頁開發,進入微信網頁授權
5.根據相應提示,拼接成一個完整的url,在微信端開啟。
url示例:https://open.weixin.qq.com/connect/oauth2/authorize?appid=***&redirect_uri=http://186***4.iask.in/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
6.controller測試是否能獲取對應的資訊
@Slf4j @RestController @RequestMapping("weixin") public class WeixinController { @GetMapping("auth") public void auth(@RequestParam("code") String code) { log.info("進入驗證"); log.info("code={}", code); String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx111f1b7437e708dd&secret=e12860f0ce3d177f39e2160a0c8286c1&code=" + code + "&grant_type=authorization_code"; RestTemplate restTemplate = new RestTemplate(); String response=restTemplate.getForObject(url,String.class); log.info("response={}",response); }
7.微信端開啟連結,測試通過!
2018-01-22 14:21:39,721 - 進入驗證2018-01-22 14:21:39,722 - code= 0211m1EK15XJC60PZUHK1Lw0EK11m1EM
2018-01-22 14:21:39,864 - response={"access_token":"6_PI28kdwbshmOV7pjOEt-7d00n5RadMrK8mQPjPmnN5wIc-Tq_lC3uN80ciF8FeW95bUqHINZnyCWtvEXfwbgyV0_PxP7rLv71qw-2khXS88","expires_in":7200,"refresh_token":"6_mAl5UpV30kKlwsDt5ni68ZQrErwoHlFA57WTXtx554yURUyCY6mB9xDw88Fi-vyYt-yCBgc-Rkr-VamKlKQvjpp6yUxqApUC1Fzk69PiD3Y","openid":" oakir0f-2BQXKjR7ARMHt1iwTQdE","scope":"snsapi_userinfo"}
ps: 如上所示,使用者通過url訪問微信,微信通過url上提供的相應的資訊,重定向到我們指定的地址(含有code),在controller中可以獲取code,同時controller根據這個code,和其他的資訊,訪問微信,可以獲取到一系列資訊,包括最重要的openid。
二、根據第三方工作包,便捷獲取。
1.github地址:https://github.com/Wechat-Group/weixin-java-tools2. MP_OAuth2網頁授權文件:https://github.com/Wechat-Group/weixin-java-tools/wiki/MP_OAuth2%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83
3.maven依賴
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>2.9.0</version> </dependency>4.根據文件,進行相應的操作即可,原理和一、相同
5.進行優化:(可以略過) application配置
wechat: appId: wx***dd appSecret: e1286***86c1
@Component @ConfigurationProperties(prefix = "wechat") public class WeChatAccountConfig { //省略set get,(匯入application配置) private String appId; private String appSecret; }
@Component public class WeChatMpConfig { @Autowired private WeChatAccountConfig accountConfig; @Bean public WxMpService wxMpService(){ WxMpService wxMpService=new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxMpConfigStorage()); return wxMpService; } @Bean public WxMpConfigStorage wxMpConfigStorage(){ WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage=new WxMpInMemoryConfigStorage(); wxMpInMemoryConfigStorage.setAppId(accountConfig.getAppId()); wxMpInMemoryConfigStorage.setSecret(accountConfig.getAppSecret()); return wxMpInMemoryConfigStorage; } }
@Slf4j @RequestMapping("wechat") @Controller public class WeChatController { @Autowired private WxMpService wxMpService; @GetMapping("authorize") public String authorize(){ //1.配置 //2.呼叫方法 String url="http://186***3bi4.iask.in/sell/wechat/userInfo"; String redirectUrl=wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_BASE,null); log.info("【微信網頁授權】獲取code,result={}",redirectUrl); return "redirect:"+redirectUrl; } @GetMapping("userInfo") public void userInfo(@RequestParam("code")String code){ WxMpOAuth2AccessToken wxMpOAuth2AccessToken; try { wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code); }catch (WxErrorException e){ log.error("【微信網頁授權】{}",e); throw new SellException(ErrorEnum.WX_MP_ERROR.getCode(),e.getError().getErrorMsg()); } String openid=wxMpOAuth2AccessToken.getOpenId(); log.info("openid={}",openid); } }