1. 程式人生 > >微信公眾號 網頁授權獲取

微信公眾號 網頁授權獲取

一、普通方法獲取

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-tools
2. 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);
    }
}