En el desarrollo de WeChat, a menudo hay tales necesidades: obtener avatares de usuario, vincular cuentas WeChat para enviar mensajes a los usuarios ... ¡entonces el requisito previo para lograr estas es autorización!
1. Configure el nombre de dominio seguro de devolución de llamada:
Antes de solicitar la autorización de la página web del usuario por cuenta pública de WeChat, los desarrolladores deben ir a la opción de configuración de "Desarrollo - Permisos de interfaz - Servicios web - Cuentas web - Autorización web para obtener información básica del usuario" en el sitio web oficial de la plataforma pública para modificar el nombre de dominio de devolución de llamada de autorización. Vale la pena señalar que esto es escribir directamente el nombre de dominio completo, como: www.liliangel.cn. Sin embargo, en nuestro desarrollo de H5, generalmente usamos nombres de dominio secundario, como: H5.Liliangel.cn, que también se encuentra en los nombres de dominio de devolución de llamada segura.
2. Autorización a nivel de usuario y autorización silenciosa
1. La autorización de la página web iniciada por SNSAPI_BASE se utiliza para obtener el OpenID del usuario que ingresa a la página, y se autoriza silenciosamente y se salta automáticamente a la página de devolución de llamada. Lo que el usuario percibe es que ingresa directamente a la página de devolución de llamada.
2. Autorización de la página web iniciada por SNSAPI_USERINFO A medida que el alcance se utiliza para obtener información básica del usuario. Sin embargo, esta autorización requiere el consentimiento manual del usuario, y dado que el usuario ha acordado, no es necesario prestarle atención y la información básica del usuario se puede obtener después de la autorización.
3. La diferencia entre la autorización web Access_Token y Ordinary Access_Token
1. La autorización de la página web de WeChat se implementa a través del mecanismo OAuth2.0. Después de que el usuario autoriza la cuenta oficial, la cuenta oficial puede obtener una credencial de llamada de interfaz (autorización web access_token) exclusiva de la autorización de la página web. La llamada de interfaz de autorización se puede realizar a través de la página web Autorización Access_Token, como obtener información básica del usuario;
2. Para otras interfaces de WeChat, se necesitan llamadas ordinarias access_token a través de la interfaz "get access_token" en soporte básico.
4. Guíe al usuario a la página de autorización para aceptar la autorización y obtener el código
Después de actualizar WeChat, la página de autorización también ha cambiado. En realidad, estoy acostumbrado a la página verde clásica ...
JS:
var Center = {init: function () {.......}, enterwxauthor: function () {var wxuserInfo = localstorage.getitem ("wxuserInfo"); if (! WxuserInfo) {var Code = Common.getUrlParameter ('Code'); if (código) {Common.getWxuserInfo (); Center.init (); } else {// sin información del usuario de WeChat, sin autorización ->> Se requiere autorización, salte a la página de autorización window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ wx_appid+' & redirect_uri = '+ window.location.hreff +'& respuesta_type = code & scope = snsapi_userinfo#weChat_redirect'; }} else {Center.init (); }}} $ (documento) .Ready (function () {center.enterwxauthor ();}Tome el alcance = snsapi_userinfo como ejemplo. Cuando se cargue la página, ingrese el método de autorización. Primero, obtenga el objeto WxuserInfo del caché. Si hay alguna explicación, ingrese el método de inicialización directamente. Si no, determine si la URL contiene un código. Si hay un código, significa que es la página después de ingresar la devolución de llamada de la página de autorización. Luego intercambie la información del usuario a través del código. No hay código, es decir, el usuario ingresa a la página por primera vez y guía a la página de autorización. Redirect_uri es la dirección de página actual.
Método GetWxuserInfo:
/ *** Obtenga la información básica del usuario después de la autorización*/ getwxuserInfo: function (par) {var code = comuns.getUrlParameter ("código"); if (par) código = par; $ .AJAX ({async: false, data: {Code: Code}, type: "get", url: wx_root + "wechat/autorization", éxito: function (json) {if (json) {try {// Asegúrese de que el wxuserInfo escrito sea data var data = json.parse (json); if (data.openid) localStorage.SetItem ('wxuserInfo', json); // escribir caché-wechat información de usuario}} catch (e) {// tODO: manejar excepción}}}}}); },5. Backend Restful- /WeChat /Autoration, Intercambie la información del usuario basada en el código
/*** Autorización WeChat* @param El código expira después de usar** @return Información básica del usuario* @throws ioexception*/@RequestMapping (valor = "/autorización", método = requestmethod.get) public void autorizatizationweixin (@RequestParam String Code, HtttpServletRequest Solicitud, HttpServletResponse Response) Showsception {String de string String { request.setcharacterEncoding ("UTF-8"); respuesta.setcharacterEncoding ("UTF-8"); PrintWriter out = Response.getWriter (); Logger.info ("RESTFUL de Código de parámetros de autorización: {}", código); Pruebe {String rs = weChatservice.getOautaccessToken (código); out.write (RS); Logger.info ("RESTFUL de la autorización es exitosa", RS); } catch (excepción e) {logger.error ("RESTFUL de la autorización es error", e); } finalmente {out.close (); }}Hay un Access_Token autorizado aquí. Recuerde: Access_token autorizado no es Global Access_Token, y requiere el uso de caché. Yo uso Redis aquí. No diré mucho sobre la configuración específica y escribiré una publicación de blog de configuración relacionada más adelante. Por supuesto, también puedes usar Ehcache. Hay una introducción detallada a la configuración de Ehcahe en mi primer blog.
/ ** * Obtenga tokens autorizados basados en el código solo están disponibles cuando la autorización, diferente de Global Access_Tokens * @param Code * @return * @throws ioException * @throws ClientProtocolException */ public String getOautAutCcessToken (String CODE) SHILLSProTOCOLECOLECTCECECIONES, IOException {string data = redonservice.get ("Weixinkin (weixinkin Cadena rs_access_token = null; Cadena rs_openid = null; String url = wx_oauth_access_token_url+"? Appid ="+wx_appid+"& secret ="+wx_appsecret+"& code ="+code+"& Grant_type = autorization_code"; if (stringUtils.isEmpty (data)) {sincronizado (this) {// expirado, string hs = apiservice.doget (url); JsonObject json = jsonObject.ParseObject (HS); Cadena refresh_token = json.getString ("refresh_token"); String Refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+wx_appid+"&grant_type=refresh_token&refresh_token="+refresh_token; Cadena r_hs = apiservice.doget (refresh_url); JsonObject r_json = jsonObject.ParseObject (r_hs); Cadena r_access_token = r_json.getString ("access_token"); Cadena r_expires_in = r_json.getString ("expires_in"); rs_openid = r_json.getString ("OpenId"); rs_access_token = r_access_token; redisService.set ("weixin_sq_access_token", r_access_token, integer.parseInt (r_expires_in) - 3600); Logger.info ("Establecer sq access_token con redis es exitoso. Tiempo de parámetros: {}, realización real", integer.parseInt (r_expires_in), integer.parseInt (r_expires_in) - 3600); }} else {// no cadena hs = apiservice.doget (url); JsonObject json = jsonObject.ParseObject (HS); rs_access_token = json.getString ("access_token"); rs_openid = json.getString ("OpenID"); Logger.info ("Get sq access_token desde redis es exitoso.rs_access_token: {}, rs_openid: {}", rs_access_token, rs_openid); } return getoauthuserInfo (rs_access_token, rs_openid); Información del usuario de obtener información basada en la información del usuario basada en el token autorizado * @param access_token * @param openid * @return */public string getOautuserInfo (string access_token, string openid) {string url = "https://api.weixin.qqq.com/Sns/userinfo- +"& lang = zh_cn"; intente {String hs = apiservice.doget (url); // Guardar información del usuario SaveWeIxInUser (HS); devolver hs; } catch (ioException e) {logger.error ("RESTFUL de la autorización es error", e); } return null; }Tenía prisa y el nombre del código era desordenado. Como puede ver, utilicé un método de sincronización para obtener la clave del caché como weixin_sq_access_token. Si se recuperan las instrucciones, llamaré directamente a la interfaz proporcionada por WeChat a través de HttpClient y devolveré la cadena de información del usuario a la parte delantera. Si no está recuperado, significa que no es o ha expirado. Luego, actualice el access_token de acuerdo con refresh_token y escriba el caché. Dado que Access_Token tiene un breve período de validez, establecí el tiempo de vencimiento de caché aquí para reducir el tiempo dado por WeChat en otra hora. Mirando hacia atrás en el código, descubrí que la lógica anterior es un pequeño problema. Escribir como este causará la primera adquisición o falla de caché para actualizar el Access_Token para la primera adquisición, lo que no afectará el uso por el momento. Haré la optimización y modificaré el TODO más tarde.
6: Guardar información del usuario
Por lo general, después de la autorización, guardaremos la información del usuario en la tabla de la base de datos, OpenID como la única clave principal, y la clave externa asociará nuestra propia tabla de usuarios. De esta manera, no importa qué negocios queramos llevar a cabo en el futuro o hacer estadísticas de datos operativos, tenemos una asociación con la cuenta pública de WeChat. Vale la pena señalar que el Headimgurl que obtuvimos es una dirección de URL proporcionada por WeChat. Cuando el usuario modifica el avatar, la dirección original puede ser inválida, por lo que es mejor guardar la imagen en el servidor local y luego guardar la URL de la dirección local.
El valor devuelto por WeChat:
Enlace de referencia:
Documento oficial de la plataforma pública WeChat: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
Herramienta de depuración de interfaz en línea: http://mp.weixin.qq.com/debug
No hay beneficios de cuenta oficial: la solicitud de cuenta de prueba http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo sea de ayuda para el estudio o el trabajo de todos. ¡También espero apoyar a Wulin.com más!