日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

code换取微信openid_微信授权登录开发的两种方式

發布時間:2023/12/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_微信授权登录开发的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。