La serie de artículos de la plataforma de terceros, hoy finalmente comenzó a actualizarse nuevamente, hoy continúan aprendiendo el inicio de sesión de terceros autorizado de Wechat (wechat)
1. Preparación
1. Solicite una cuenta de prueba pública de WeChat
Dado que somos desarrolladores individuales, debemos registrarnos y solicitar una cuenta de prueba para la plataforma pública de WeChat.
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
Después de iniciar sesión con el código de escaneo de WeChat, podemos obtener appID y appsecret
2. Siga el número de prueba público
3. Configure el nombre de dominio de devolución de llamada
Busque "Cuenta web" en "Servicios web" y modifique el nombre de dominio de devolución de llamada de la interfaz "Autorización web para obtener información básica del usuario"
Nota: decir aquí es que el nombre de dominio autorizado de devolución de llamada de la página web de configuración, generalmente acoplados con interfaces de terceros no son lo mismo, no complete la dirección completa de una devolución de llamada, sino el nombre de dominio de devolución de llamada, la dirección de devolución de llamada bajo el nombre de dominio
- Por ejemplo :
dirección de devolución de llamada: http://www.baidu.com/wechat/back y
luego aquí: baidu.com
Los principiantes son generalmente fáciles de confundir aquí, una vez completada la configuración, haga clic en "confirmar"
2. Iniciar el desarrollo
1. Obtenga información de la aplicación
Escribiremos el appID y appsecret obtenidos en el archivo de configuración, mi proyecto SpringBoot aquí, lo puse en el archivo application.yml
2. Introducir la dependencia de maven
<!-- 网络请求 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
Aquí necesitamos usar solicitudes de red y la conversión de objetos JSON, así que presenté httpclient y fastjson, y el resto de las dependencias, preséntese
3. Obtenga la información de configuración de "wechat" del archivo de configuración
/**
* 公众平台提供的 appid 和 appsecret
*/
@Value("${wechat.oauth.appid}")
public String APPID;
@Value("${wechat.oauth.appsecret}")
public String APPKEY;
@Value("${wechat.oauth.callback}")
public String URL;
4. Redirigir a la página de autorización
/**
* 请求授权页面
*/
@RequestMapping("/auth")
public String token(HttpSession session) throws Exception {
// 用于第三方应用防止CSRF攻击
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
session.setAttribute("state", uuid);
// Step1:获取Authorization Code
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=" + APPID +
"&redirect_uri=" + URLEncoder.encode(URL) +
"&response_type=code" +
"&scope=snsapi_userinfo" +
"&state=" + uuid +
"#wechat_redirect";
return PasswordUtils.redirectTo(url);
}
- Los parámetros de Step1 se explican a continuación:
parámetro | Tienes que | Descripción |
---|---|---|
appid | si | El identificador único de la cuenta oficial. |
redirect_uri | si | Dirección del enlace de devolución de llamada redirigida después de la autorización, utilice urlEncode para procesar el enlace |
tipo_respuesta | si | Tipo de devolución, ingrese el código |
alcance | si | Alcance de autorización de la aplicación, snsapi_base (no muestre la página de autorización, salte directamente, solo obtenga el openid del usuario), snsapi_userinfo (muestre la página de autorización, puede obtener el apodo, el género y la ubicación a través de openid. E incluso si no está prestando atención, Siempre que el usuario esté autorizado, se puede obtener la información) |
estado | No | Después de la redirección, se traerá el parámetro de estado y los desarrolladores pueden completar el valor del parámetro de a-zA-Z0-9, hasta 128 bytes |
#wechat_redirect | si | Ya sea para abrir directamente o para redireccionar la página 302, debe traer este parámetro |
En este momento, cuando visitemos, aparecerá la página de autorización
5. Devolución de llamada de autorización
/**
* 授权回调
*/
@GetMapping(value = "/callback")
public void callback(HttpServletRequest request) throws Exception {
HttpSession session = request.getSession();
// 得到Authorization Code
String code = request.getParameter("code");
// 我们放在地址中的状态码
String state = request.getParameter("state");
String uuid = (String) session.getAttribute("state");
// 验证信息我们发送的状态码
if (null != uuid) {
// 状态码不正确,直接返回登录页面
if (!uuid.equals(state)) {
return PasswordUtils.redirectTo("/login");
}
}
// Step2:通过Authorization Code获取Access Token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=" + APPID +
"&secret=" + APPKEY +
"&code=" + code +
"&grant_type=authorization_code";
JSONObject resJson = HttpRequestUtils.httpRequestGet(url);
if (null == resJson) {
return PasswordUtils.redirectTo("/login");
}
String accessToken = resJson.getString("access_token");
String openId = resJson.getString("openid");
if (StringUtils.isBlank(accessToken) || StringUtils.isBlank(openId)) {
return PasswordUtils.redirectTo("/login");
}
url = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=" + accessToken +
"&openid=" + openId +
"&lang=zh_CN";
// Step3: 获取微信用户信息
resJson = HttpRequestUtils.httpRequestGet(url);
/**
* TODO 这时就该写自己的业务逻辑了
*/
}
- Los parámetros de Step2 se explican a continuación:
parámetro | Tienes que | Descripción |
---|---|---|
appid | si | El identificador único de la cuenta oficial. |
secreto | si | Appsecret de la cuenta oficial |
código | si | Complete los parámetros del código obtenidos en el primer paso |
grant_type | si | Complete como código_autorización |
- Los parámetros de Step3 se explican a continuación:
parámetro | Tienes que | Descripción |
---|---|---|
access_token | si | Credenciales de llamada de la interfaz de autorización de la página web, nota: este access_token es diferente del access_token básico compatible |
openid | si | ID único del usuario |
lang | si | Regrese a la versión del idioma del país y la región, zh_CN simplificado, zh_TW tradicional, en inglés |
6. Método de solicitud de red
El paso 2 y el paso 3 son métodos de solicitud GET
/**
* GET 请求
*/
public static JSONObject httpRequestGet(String url) throws IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "UTF-8");
return JSONObject.parseObject(result);
}
httpGet.releaseConnection();
return null;
}
3. Documentación
La dirección del documento para el inicio de sesión autorizado de WeChat es la siguiente:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
Cuatro, resumen
El proceso de autenticación de autorización se ajusta al proceso de autenticación básico de OAuth2. Para las aplicaciones, el proceso consta de dos pasos: obtener el Código de Autorización y obtener el Token de Acceso a través del Código de Autorización, como se muestra en la figura:
Si encuentra deficiencias en la lectura, ¡deje un mensaje! ! !