微信公眾號開發 (4) 網頁授權

一、前言

本文將實現


  1. 網頁授權
  2. 獲取用戶基本信息


  1. 填寫網頁授權回調域名
  2. 引導用戶進入授權頁面同意授權,獲取code
  3. 通過code 換 取網頁授權access_token 和 openid (注:與基礎支持中的access_token不同)
  4. 刷新網頁授權access_token,避免過期(可選擇性操作)
  5. 通過網頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)

測試號在如下地址中,體驗接口權限表 -> 網頁帳號 -> 修改http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

微信公眾號開發 (4) 網頁授權

注:勿加 http:// 等協議頭!

微信公眾號開發 (4) 網頁授權


溫馨小提示:接口相關參數說明可直接查看微信官方文檔 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html


<code>https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect/<code>


參數
是否必須 說明
appid

公眾號的唯一標識
redirect_uri

授權後重定向的回調鏈接地址, 請使用 urlEncode 對鏈接進行處理 response_type

返回類型,請填寫code
scope

應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且, 即使在未關注的情況下,只要用戶授權,也能獲取其信息 ) state

重定向後會帶上state參數,開發者可以填寫a-zA-Z0-9的參數值,最多128字節 #wechat_redirect 是
無論直接打開還是做頁面302重定向時候,必須帶此參數


2、通過code換取網頁授權access_token和openid


<code>【GET請求】https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code/<code>


參數
是否必須 說明
appid

公眾號的唯一標識
secret

公眾號的appsecret
code

填寫第一步獲取的code參數 grant_type 是
填寫為authorization_code


3、刷新access_token(如果需要)


<code>【GET請求】https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN/<code>


參數
是否必須 說明
appid


公眾號的唯一標識
grant_type

填寫為refresh_token
refresh_token 是
填寫通過accesstoken獲取到的refreshtoken參數


4、獲取用戶信息(需scope為 snsapi_userinfo)


<code>【GET請求】https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN/<code>


參數
描述
access_token 網頁授權接口調用憑證,注意:此accesstoken與基礎支持的accesstoken不同 openid
用戶的唯一標識
lang
返回國家地區語言版本,zhCN 簡體,zhTW 繁體,en 英語


5、檢驗授權憑證(access_token)是否有效


<code>【GET請求】https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID/<code>


參數
描述
access_token 網頁授權接口調用憑證,注意:此accesstoken與基礎支持的accesstoken不同 openid
用戶的唯一標識



注:下面部分只貼出了重要代碼部分,完整案例可參考文末提供的源碼



四、引導用戶進入授權頁面同意授權 -> 獲取code


方式①:通過創建鏈接式菜單(view)

微信公眾號開發 (4) 網頁授權

微信公眾號開發 (4) 網頁授權

方式②:直接發送授權url消息,用戶點擊進入授權


<code>https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx62d91f5c16d6e8e0&redirect_uri=http://m9adhq.natappfree.cc/api/weixin/basic/getOpenId&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect/<code>
微信公眾號開發 (4) 網頁授權

微信公眾號開發 (4) 網頁授權

五、通過code換取網頁授權access_token和openid(與基礎支持中的access_token不同)

用戶同意授權後,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE

code說明 : code作為換取access_token的票據,每次用戶授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。

注:小編這裡拿到access_token和openid之後將頁面重定向到了獲取用戶信息的接口,然後返回json用戶信息數據~

<code>public void getOpenId(HttpServletRequest request, HttpServletResponse response) {
String code = request.getParameter("code");
String state = request.getParameter("state");

log.debug("======================================= \\n code值:" + code);

String responseContent = restTemplate.getForObject(Constants.AUTH_GET_ACCESS_TOKEN_AND_OPENID
.replace("APPID", Constants.APP_ID)
.replace("SECRET", Constants.APP_SECRET)
.replace("CODE", code), String.class);
JSONObject result = JSON.parseObject(responseContent);
String accessToken = result.getString("access_token");
String openid = result.getString("openid");
String refreshToken = result.getString("refresh_token");

log.debug("======================================= \\n access_token值:" + accessToken + "\\n openid值:" + openid);

String redirectUrl = "http://m9adhq.natappfree.cc/api/weixin/basic/getUserInfo?openid=" + openid + "&access_token=" + accessToken;
try {
// 授權之後重定向到指定URL(這裡是跳轉到獲取用戶基本信息接口)
response.sendRedirect(redirectUrl);
} catch (IOException e) {
e.printStackTrace();
}
}/<code>



<code>public WeixinUserInfoVO getUserInfo(String openId, String accessToken) {
WeixinUserInfoVO weixinUserInfoVO = null;
String responseContent = restTemplate.getForObject(Constants.AUTH_GET_USER_INFO
.replace("ACCESS_TOKEN", accessToken)
.replace("OPENID", openId), String.class);
weixinUserInfoVO = JSON.parseObject(responseContent, WeixinUserInfoVO.class);
return weixinUserInfoVO;
}/<code>

其中WeixinUserInfoVO基本信息類

<code>@Data
@ApiModel(description = "微信用戶基本信息")

public class WeixinUserInfoVO {

@ApiModelProperty(value = "用戶的唯一標識")
private String openid;

@ApiModelProperty(value = "用戶暱稱")
private String nickname;

@ApiModelProperty(value = "用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知")
private Integer sex;

@ApiModelProperty(value = "用戶個人資料填寫的省份")
private String province;

@ApiModelProperty(value = "普通用戶個人資料填寫的城市")
private String city;

@ApiModelProperty(value = "國家,如中國為CN")
private String country;

@ApiModelProperty(value = "用戶頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。")
private String headimgurl;

@ApiModelProperty(value = "用戶特權信息,json 數組,如微信沃卡用戶為(chinaunicom)")
private String privilege;

@ApiModelProperty(value = "只有在用戶將公眾號綁定到微信開放平臺帳號後,才會出現該字段。")
private String unionid;

@ApiModelProperty(value = "返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語")

private String language;

}/<code>

響應數據如下:

微信公眾號開發 (4) 網頁授權

這裡獲取到用戶信息之後,也就可以寫頁面,然後進行自己的業務交互了... (openid:微信用戶的唯一標識)

七、刷新access_token(如果需要)

由於accesstoken擁有較短的有效期,當accesstoken超時後,可以使用refreshtoken進行刷新,refreshtoken有效期為30天,當refresh_token失效之後,需要用戶重新授權。

<code>public String refreshAccessToken(String appId, String refreshToken) {
String responseResult = restTemplate.getForObject(Constants.AUTH_REFRESH_ACCESS_TOKEN
.replace("APPID", appId)
.replace("REFRESH_TOKEN", refreshToken), String.class);
JSONObject jsonObject = JSON.parseObject(responseResult);
return jsonObject.getString("access_token");
}/<code>


八、檢驗授權憑證(access_token)是否有效


<code>public WeixinResponseResult checkAccessToken(String openId, String accessToken) {
String responseResult = restTemplate.getForObject(Constants.AUTH_CHECK_ACCESS_TOKEN
.replace("ACCESS_TOKEN", accessToken)
.replace("OPENID", openId), String.class);
WeixinResponseResult weixinResponseResult = JSON.parseObject(responseResult, WeixinResponseResult.class);
if (weixinResponseResult.getErrcode() != 0) {
log.error("授權憑證無效:" + responseResult);
throw new MyException(weixinResponseResult.getErrcode(), weixinResponseResult.getErrmsg());
}
return weixinResponseResult;
}/<code>


九、總結


  1. 微信公眾號開發網上有很多教程,但針對於每一個開發者的環境以及語言不同而有所差異,建議認真看微信提供的官方文檔去學習,大致也就是查看文檔 封裝數據 調微信api接口 業務處理
  2. 關於微信公眾號開發小編也已經寫了幾篇了,大家在學習完微信官方提供的原始api之後,GitHub以及Gitee等上面有很多大神已經封裝好了優秀的開源sdk,這時候我們有了一定的微信開發基礎就可以去閱讀參考學習
  3. 小編建議大家在學習遇到問題,查看別人如何實現以及解決問題的時候,更多的是去學習思維方式處理邏輯,而不是拿到就跑,雖然寫代碼也不過就是複製黏貼運行完無bug就萬事大吉,但我們也要 知其然知其所以然 !

本文案例demo源碼

https://gitee.com/zhengqingya/java-workspace


分享到:


相關文章: