@DependsOn(value="weChatTokenManager") @Component public class WebPageAuthorizationManager extends Object
1、引导用户进入授权页面同意授权,获取code
2、通过 code 换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和 openid 获取用户基本信息(支持 UnionID 机制)
| 构造器和说明 |
|---|
WebPageAuthorizationManager() |
| 限定符和类型 | 方法和说明 |
|---|---|
WeChatResponse |
checkAccessToken(@NotBlank(message="\u7528\u6237\u7684id\u4e0d\u80fd\u4e3a\u7a7a") String openId,
@NotBlank(message="\u6388\u6743token\u4e0d\u80fd\u4e3a\u7a7a") String accessToken)
检验授权凭证(access_token)是否有效
|
AuthAccessTokenResponse |
getAuthorizeAccessToken(@NotBlank(message="\u5fae\u4fe1\u6388\u6743code\u4e0d\u80fd\u4e3a\u7a7a") String code)
第二步:通过 code 换取网页授权access_token
首先请注意,这里通过 code 换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。
|
String |
getAuthorizeUrl(@NotBlank(message="\u91cd\u5b9a\u5411\u5730\u5740\u4e0d\u80fd\u4e3a\u7a7a") @Pattern(regexp="^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$",message="\u91cd\u5b9a\u5411\u5730\u5740\u5fc5\u987b\u662f\u4e00\u4e2a\u94fe\u63a5\u5730\u5740") String redirectUri,
@NotNull(message="\u6388\u6743\u4f5c\u7528\u57df\u4e0d\u80fd\u4e3a\u7a7a") AuthScope scope,
@Size(max=128,message="\u6700\u5927\u957f\u5ea6128\u5b57\u8282") String state)
第一步:用户同意授权,获取code
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下
(已认证服务号,默认拥有 scope 参数中的snsapi_base和snsapi_userinfo 权限),引导关注者打开如下页面:
https://open.weixin.qq.com/connect/oauth2/authorize?
|
AuthUserInfoResponse |
getUserInfo(@NotBlank(message="\u7528\u6237\u7684id\u4e0d\u80fd\u4e3a\u7a7a") String openId,
@NotBlank(message="\u6388\u6743token\u4e0d\u80fd\u4e3a\u7a7a") String accessToken,
@NotNull(message="\u8bed\u8a00\u4e0d\u80fd\u4e3a\u7a7a") LanguageEnum languageEnum)
第四步:拉取用户信息(需 scope 为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和 openid 拉取用户信息了。
|
AuthAccessTokenResponse |
refreshToken(@NotBlank(message="\u5f85\u5237\u65b0\u5f85token\u4e0d\u80fd\u4e3a\u7a7a") String token)
第三步:刷新access_token(如果需要)
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,
refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
|
public String getAuthorizeUrl(@NotBlank(message="\u91cd\u5b9a\u5411\u5730\u5740\u4e0d\u80fd\u4e3a\u7a7a") @Pattern(regexp="^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$",message="\u91cd\u5b9a\u5411\u5730\u5740\u5fc5\u987b\u662f\u4e00\u4e2a\u94fe\u63a5\u5730\u5740") @NotBlank(message="\u91cd\u5b9a\u5411\u5730\u5740\u4e0d\u80fd\u4e3a\u7a7a") @Pattern(regexp="^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$",message="\u91cd\u5b9a\u5411\u5730\u5740\u5fc5\u987b\u662f\u4e00\u4e2a\u94fe\u63a5\u5730\u5740") String redirectUri, @NotNull(message="\u6388\u6743\u4f5c\u7528\u57df\u4e0d\u80fd\u4e3a\u7a7a") @NotNull(message="\u6388\u6743\u4f5c\u7528\u57df\u4e0d\u80fd\u4e3a\u7a7a") AuthScope scope, @Size(max=128,message="\u6700\u5927\u957f\u5ea6128\u5b57\u8282") @Size(max=128,message="\u6700\u5927\u957f\u5ea6128\u5b57\u8282") String state) throws ParamCheckException, UnsupportedEncodingException
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有 scope 参数对应的授权作用域权限。
尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
如果用户同意授权,页面将跳转至 redirect_uri/?code=微信携带的code参数&state=用户自定义的参数
redirectUri - 授权后重定向的回调链接地址scope - 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过 openid 拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )state - 重定向后会带上 state 参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节ParamCheckException - 方法执行前,参数检查未通过UnsupportedEncodingException - URL编码失败public AuthAccessTokenResponse getAuthorizeAccessToken(@NotBlank(message="\u5fae\u4fe1\u6388\u6743code\u4e0d\u80fd\u4e3a\u7a7a") @NotBlank(message="\u5fae\u4fe1\u6388\u6743code\u4e0d\u80fd\u4e3a\u7a7a") String code) throws WeChatException, ParamCheckException
尤其注意:由于公众号的 secret 和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。 后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。
code - 步骤一,用户同意授权后,回调到重定向地址所携带的参数WeChatException - 微信验证失败ParamCheckException - 方法执行前,参数检查未通过public AuthAccessTokenResponse refreshToken(@NotBlank(message="\u5f85\u5237\u65b0\u5f85token\u4e0d\u80fd\u4e3a\u7a7a") @NotBlank(message="\u5f85\u5237\u65b0\u5f85token\u4e0d\u80fd\u4e3a\u7a7a") String token) throws WeChatException, ParamCheckException
token - 步骤二中获取的tokenWeChatException - 微信验证失败ParamCheckException - 方法执行前,参数检查未通过public AuthUserInfoResponse getUserInfo(@NotBlank(message="\u7528\u6237\u7684id\u4e0d\u80fd\u4e3a\u7a7a") @NotBlank(message="\u7528\u6237\u7684id\u4e0d\u80fd\u4e3a\u7a7a") String openId, @NotBlank(message="\u6388\u6743token\u4e0d\u80fd\u4e3a\u7a7a") @NotBlank(message="\u6388\u6743token\u4e0d\u80fd\u4e3a\u7a7a") String accessToken, @NotNull(message="\u8bed\u8a00\u4e0d\u80fd\u4e3a\u7a7a") @NotNull(message="\u8bed\u8a00\u4e0d\u80fd\u4e3a\u7a7a") LanguageEnum languageEnum) throws WeChatException, ParamCheckException
accessToken - 步骤二获取的tokenopenId - 用户的openIdWeChatException - 微信验证失败ParamCheckException - 方法执行前,参数检查未通过public WeChatResponse checkAccessToken(@NotBlank(message="\u7528\u6237\u7684id\u4e0d\u80fd\u4e3a\u7a7a") @NotBlank(message="\u7528\u6237\u7684id\u4e0d\u80fd\u4e3a\u7a7a") String openId, @NotBlank(message="\u6388\u6743token\u4e0d\u80fd\u4e3a\u7a7a") @NotBlank(message="\u6388\u6743token\u4e0d\u80fd\u4e3a\u7a7a") String accessToken) throws WeChatException, ParamCheckException
accessToken - 步骤二获取的 tokenopenId - 用户openIdWeChatException - 微信验证失败ParamCheckException - 方法执行前,参数检查未通过Copyright © 2023. All rights reserved.