code换取微信openid_微信授权登录开发的两种方式
本文主要針對微信公眾號(公眾平臺的開發)
首先理解一個概念:OAuth:
OAuth(開放授權)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯系人列表),而無需將用戶名和密碼提供給第三方應用。
在本篇文章中模擬用戶在微信公眾號中使用OAuth進行授權,從而使第三方應用拿到用戶的部分信息。
詳細的開發文檔可查看微信的官方文檔 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
首先由于本人沒有企業級微信公眾賬號,所以利用個人微信申請了微信公眾賬號的一個測試號,申請步驟如下:
進入測試號之后,系統會分配一個appleID和appsecret(可以用于在開發項目的yml文件中配置)
接著需要配置接口信息,由于微信開發需要公網才能被訪問到,因此需要將內網穿透到外網才能保證接口可訪問性。
natapp地址:
NATAPP -?natapp.cn由于免費隧道每次映射的ip會發生變化,所以建議購買VIP隧道(大概加上二級域名12元/月?)買完之后你會拿到一個authtoken。
然后下載natapp文件,使用終端cd到natapp所在的文件夾下,利用:
#進行授權操作 $ chmod a+x natapp # 在natapp文件的當前路徑運行 $ ./natapp -authtoken={此處填寫authtoken值}顯示如下則配置成功:
這樣以后就可以繼續配置測試號中的接口了,現在來說說接口信息中的URL和token到底是什么。
簡單地說就是微信測試號需要通過請求一個URL來相應token驗證,也就是說你在點擊確定時向你指定的URL發送一個請求,在請求里面來驗證你的token是否一致。完成此驗證之后,微信才能進行調用這個外網服務器端口。所以需要編寫一個借口放在服務器上面:
SpringBoot代碼如下:
@RequestMapping("/wechat") @Controller public class TestnatappController {private static Logger logger = Logger.getLogger(TestnatappController.class);private static String WECHAT_TOKEN = "DQicy";@RequestMapping(value = "/wx.do")public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {logger.error("WechatController ---- WechatController");System.out.println("========WechatController========= ");logger.info("請求進來了...");Enumeration pNames = request.getParameterNames();while (pNames.hasMoreElements()) {String name = (String) pNames.nextElement();String value = request.getParameter(name);// out.print(name + "=" + value);String log = "name =" + name + " value =" + value;logger.error(log);}String signature = request.getParameter("signature");/// 微信加密簽名String timestamp = request.getParameter("timestamp");/// 時間戳String nonce = request.getParameter("nonce"); /// 隨機數String echostr = request.getParameter("echostr"); // 隨機字符串PrintWriter out = response.getWriter();//if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr); // }sout.close(); // out = null;} }注意將程序中的token換成和你想要配置的token一致即可。然后url就可以寫成你原先配置的外網/wechat/wx.do的形式,即可驗證通過。
繼續配置回調函數:
回調函數用于當我們在微信客戶端訪問第三方應用的時候,首先通過微信網頁授權機制獲取到用戶授權的信息后,通過回調的域名設置,頁面還會進行再次跳轉。所以配置為外網即可(注意去掉協議部分,即http://)。如果你的網址沒有被列入黑名單,就會通過安全監測,就可以使用啦。
至此,域名的配置成功了。
然后進入授權部分,先看官方文檔怎么說:
兩種方法:
1.手工獲取openid
首先第一步:引導關注者打開https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
其中appid替換為自己的標識信息,
redirect_uri填上要跳轉的連接,
scope是應用授權的作用域,有兩種選擇(根據不同需要作出不同選擇):
(1)snsapi_base:這種方式可以直接獲取用戶的少量信息,不彈出授權的頁面
(2)snsapi_userinfo: 這種方式需要用戶點擊確認按鍵,但是可以通過openid拿到更多用戶的信息
response_type設置為code即可。
如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。也就是說返回的url中會拿到code值,于是在項目中補上controller來接收用戶的code值(code值有效期只有5分鐘)
控制器代碼如下:
package com.imooc.controller; @RestController @RequestMapping("/weixin") @Slf4j public class WeixinController {@GetMapping("/auth")public void auth(@RequestParam("code") String code) {log.info("進入auth方法...");log.info("code={}", code);} }在auth方法中接收url返回的code值通過手機測試,可以在console輸出code的值。
第二步:通過code換取網頁授權的access_token
根據官方說明,用code換取access_token的過程實際上是返回一個json格式的數據。
接著測試:
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx45ea7710b15596a9&secret=0dffebbdf4591d3de7f76ebc08d5f13d&code=" + code + "&grant_type=authorization_code";RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject(url,String.class);log.info("response={}",response);response即為包含access_token的json數據,其中包含后面會用到的openid。
2.利用第三方SDK
github地址:
https://github.com/Pay-Group/best-pay-sdk?github.com用之前先在pom.xml中引入依賴,再看網頁授權部分的操作:
https://github.com/Wechat-Group/WxJava/wiki/MP_OAuth2%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83?github.com首先配置WxService:
@Data @Component //下面注解的作用:spring-boot 提供該注解將配置文件的值映射到類上使用 @ConfigurationProperties(prefix = "wechat") public class WechatAccountConfig {//公眾平臺Idprivate String mpAppId;//公眾平臺密鑰private String mpAppSecret; }在MpConfig文件中引用配置的account:
@Component public class WechatMpConfig {@Autowiredprivate WechatAccountConfig accountConfig;@Beanpublic WxMpService wxMpService(){WxMpService wxMpService = new WxMpServiceImpl();wxMpService.setWxMpConfigStorage(wxMpConfigStorage());return wxMpService;}@Beanpublic WxMpConfigStorage wxMpConfigStorage() {WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();wxMpConfigStorage.setAppId(accountConfig.getMpAppId());wxMpConfigStorage.setSecret(accountConfig.getMpAppSecret());return wxMpConfigStorage;} }然后寫控制器類:
@Controller @RequestMapping("/wechat") @Slf4j public class WechatController {@Autowiredprivate WxMpService wxMpService;@GetMapping("/authorize")public String authorize(@RequestParam("returnUrl") String returnUrl){//1.配置//2.調用方法 (重定向)String url = "http://.../sell/wechat/userInfo";String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url,WxConsts.OAUTH2_SCOPE_BASE, URLEncoder.encode(returnUrl));log.info("[微信網頁授權] 獲得code, result={}", redirectUrl);return "redirect:" + redirectUrl ;}//下面為重定向后到達的方法@GetMapping("/userInfo")public String userInfo(@RequestParam("code") String code,@RequestParam("state") String returnUrl){WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();try {wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);}catch (WxErrorException e){log.error("[微信網頁授權] {}",e);throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode() , e.getError().getErrorMsg());}return "redirect:" + returnUrl + "?openid=" + openId;}}通過獲取code,再通過獲取access_token的方式即可獲得用戶的openid。
以上為兩種微信授權登錄的常用方式。
總結
以上是生活随笔為你收集整理的code换取微信openid_微信授权登录开发的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辣眼睛?网红“安福路小公主”首度回应质疑
- 下一篇: 魅族20主摄确认5000万像素大底:对焦