Escriba una función de inicio de sesión de terceros (versión web) de WeChat. El terminal móvil está autorizado. Preste atención a la diferencia entre los dos. He visto muchos documentos y documentos oficiales de desarrollo. Finalmente realizada esta función, lo siguiente es el código y el proceso.
1. Primero, debemos solicitar una aplicación de sitio web en la plataforma abierta de WeChat.
Tenga en cuenta que esto es una tarifa (no lo piense, es imposible que la interfaz de WeChat sea una prostituta)
. Después de la solicitud, habrá un appid y una clave para guardar., Y luego necesitamos configurar nuestro dominio de devolución de llamada (esto es una cadena, no agregue http || protocolo https). Una vez completada la configuración, puede desarrollarla (para principiantes, puede solicitar un número de prueba y probar el enlace de la aplicación: https: //mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login para probar)
Código de front-end:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>微信登录</title>
</head>
<body>
<div onclick="dianji()">微信登录</div>
<div id="login_container">
</div>
</body>
//实现二维码 就要引入这个js样式,如果是上线的话,需要把这个js下载下来引入
<script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
//jquery文件引入
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</html>
código js:
function dianji() {
var obj = new WxLogin({
self_redirect:true,
id:"login_container", //要与你在那里生成二维码的div id 一致
appid: "appid", //你申请的appid
scope:"snsapi_login,snsapi_userinfo",//你的权限
redirect_uri:encodeURIComponent("你自己配置的回调地址"),//url要进行encodeURIComponent编码
state: "STATE",//微信官方接口为了防止跨域攻击要加的参数 可以自己定义
style: "black",//样式
href: ""//可以引入你自己的样式 注意这个只能是网络中的
});
}
Código de back-end:
public class WxLoginController{
@Autowired
private WxLoginService wxLoginService;
@RequestMapping(value = "/MessageController/get_weiXingInformation", method=RequestMethod.GET)
@ResponseBody
public String wxLogin(@RequestParam("code") String code,@RequestParam("wzid") Integer wzid,@RequestParam("mid") Integer mid,@RequestParam("wzUrl") String wzUrl,@RequestParam("stafftoken") String stafftoken,HttpServletResponse res) throws IOException{
if (code==null) {
return ResultJsonData.resultFailed("请扫码");
}
if (wzid==null||wzUrl==null||mid==null||stafftoken==null) {
return ResultJsonData.resultFailed("请查看参数: id="+wzid+", 分享者id="+mid+", 文章唯一标识id参数="+stafftoken);
}
//向第三方微信发送的url
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=密钥&code="+code+"&grant_type=authorization_code";
JSONObject jsonObject = this.httpGet(url);//向第三方发送请求
String accesstoken = jsonObject.getString("access_token"); // 获取微信开放平台票据号
String refreshtoken = jsonObject.getString("refresh_token");//获取微信开放平台的刷新token
String openId = jsonObject.getString("openid"); // 获取登录微信的唯一凭证号
url="https://api.weixin.qq.com/sns/userinfo?access_token="+accesstoken+"&openid="+openId; // 该url用于从微信那里获取用户数据
jsonObject = this.httpGet(url);//向第三方发送请求
Visitor visitor = new Visitor(); //创建微信用户对象 用于存储
//根据key获取jsonObject对象并转换为String类型并存储到Visitor对象中 主要用于添加wx用户
visitor.setOpenid(jsonObject.getString("openid").toString());//用户的标识
visitor.setNickname(jsonObject.getString("nickname").toString());//用户名称
visitor.setSex(jsonObject.getString("sex").toString());//用户性别
visitor.setProvince(jsonObject.getString("province").toString());//用户省份
visitor.setCity(jsonObject.getString("city").toString());//用户城市
visitor.setCountry(jsonObject.getString("country").toString());//用户国家
visitor.setHeadimgurl(jsonObject.getString("headimgurl").toString());//用户头像
visitor.setPrivilege(jsonObject.getString("privilege").toString());//用户特权信息
visitor.setUnionid(jsonObject.getString("unionid").toString());//用户唯一身份
visitor.setAccesstoken(accesstoken);//用户交换的token
visitor.setRefreshtoken(refreshtoken);//用来刷新token的凭证
Visitor wxUser = wxLoginService.getWxUser(visitor.getUnionid());//向数据查询是否有这个微信用户
if (null!=wxUser) {
//查询到了有这个用户 但是依然要更新信息 unionid 是不变的
int add = wxLoginService.updateWxUserByUnionid(wxUser);
if (add>0) {
System.out.println("有这个用户"+wzUrl+"&unionid="+wxUser.getUnionid()+"&stafftoken="+stafftoken);
//重定向我的原Url 并携带参数 unionid 是微信的唯一ID wzid 是文章的D stafftoken 是文章的标识
res.sendRedirect(wzUrl+"&unionid="+wxUser.getUnionid()+"&stafftoken="+stafftoken+"&id="+wzid);
return ResultJsonData.resultFailed("wx用户修改成功");
}else {
System.out.println(wzUrl+"&unionid="+wxUser.getUnionid()+"&stafftoken="+stafftoken+"&id="+wzid);
//重定向我的原Url 并携带参数 stafftoken 是文章的标识
res.sendRedirect("有这个用户失败"+wzUrl);
return ResultJsonData.resultFailed("wx用户修改失败");
}
}else {
//没有查询到这个用户 向数据库里添加一个微信用户
int addWxUser = wxLoginService.addWxUser(visitor);
if (addWxUser>0) {
System.out.println("成功加入用户"+wzUrl+"&unionid="+wxUser.getUnionid()+"&stafftoken="+stafftoken);
//重定向我的原Url 并携带参数 unionid 是微信的唯一ID wzid 是文章的ID stafftoken 是文章的标识
res.sendRedirect(wzUrl+"&unionid="+wxUser.getUnionid()+"&stafftoken="+stafftoken+"&wzid="+wzid);
return ResultJsonData.resultFailed("wx用户添加成功");
}else {
System.out.println("加入用户失败"+wzUrl+"&unionid="+wxUser.getUnionid()+"&stafftoken="+stafftoken);
//重定向我的原Url 并携带参数 stafftoken 是文章的标识
res.sendRedirect(wzUrl);
return ResultJsonData.resultFailed("wx用户添加失败");
}
}
}
}
Autorización de WeChat
== Explicación de la autorización de WeChat: en comparación con el desarrollo empresarial, necesitamos solicitar una cuenta oficial o una cuenta de suscripción (preferiblemente una cuenta oficial). Lo que necesitamos son Appid y secret. Si ha desarrollado una aplicación de sitio web en WeChat, abra plataforma, debe vincular nuestra aplicación a la cuenta oficial y vincularla a la aplicación de nuestro sitio web. Esto significa que si está utilizando el inicio de sesión de WeChat en mi aplicación y autorizando su ID de unión de WeChat es el único representante que la misma persona no necesita ser agregado al usuario Si no está vinculado a la tabla, el tercero de WeChat no le devolverá el identificador de unión del identificador de unión. Este campo representa que este campo es exclusivo del desarrollador (para decirlo simplemente, la cuenta oficial de WeChat y un La aplicación del sitio web o varias aplicaciones del sitio web son nuestras, lo que significa que ha utilizado una de las aplicaciones de mi sitio web, entonces su unionid es el único en mis otras aplicaciones de sitios web y cuentas oficiales. Solo dígame otras aplicaciones bajo mi nombre. Esta persona tiene una cuenta, no es necesario registrarse) == Para obtener una
explicación relacionada, puede ir al documento oficial: plataforma pública WeChat
Código de front-end autorizado: solo necesitamos redirigir a la dirección de nuestro tercero WeChat para usar el appid que solicitamos
Paso 1: el usuario acepta la autorización y obtiene el código
window.location.href=https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
Luego, aparecerá la página de autorización y seleccionará el permiso para enviar una solicitud al tercero de WeChat. Después de verificar que sus parámetros no son un problema, el tercero de WeChat saltará a la dirección de devolución de llamada que configuramos y llevará el parámetro de código.
Paso 2: intercambie el código para la autorización web access_token
Envíe una dirección URL de solicitud a un tercero de WeChat a través de java: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
lista de parámetros:
Campo de parámetro | Descripción de parámetros |
---|---|
appid | La aplicación que solicitó |
secreto | La clave que solicitó |
grant_type | Debe ser código_autorización |
código | Parámetros llevados cuando WeChat salta a la dirección de devolución de llamada |
Parámetros de retorno:
parámetro | descripción |
---|---|
access_token | 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 |
expira en | Tiempo de espera de la credencial de llamada de la interfaz de Access_token, unidad (segundos) |
refresh_token | Actualización de usuario access_token |
openid | El ID único del usuario. Tenga en cuenta que cuando el usuario visita la página web de la cuenta oficial sin seguir la cuenta oficial, también se generará un OpenID exclusivo para el usuario y la cuenta oficial. |
alcance | El alcance de la autorización del usuario, separado por comas (,) |
Paso 3: extraiga la información del usuario (el alcance necesario es snsapi_userinfo)
Envíe una dirección URL de solicitud a un tercero de WeChat a través de java: https://api.weixin.qq.com/sns/userinfo?access_token=the access_token que obtuvo & openid = the openid que obtuvo & lang = la versión de idioma del país y la región para ser devuelto (chino simplificado zh_CN simplificado, zh_TW tradicional, en inglés)
Parámetros de retorno:
parámetro | descripción |
---|---|
openid | ID único del usuario |
apodo | Apodo del usuario |
sexo | El género del usuario, cuando el valor es 1, es masculino, cuando el valor es 2, es femenino, y cuando el valor es 0, se desconoce |
provincia | Provincia rellenada en el perfil de usuario |
ciudad | Ciudad completada por datos personales del usuario general |
país | País, como China es CN |
headimgurl | Avatar de usuario, el último valor representa el tamaño del avatar cuadrado (hay valores opcionales de 0, 46, 64, 96, 132 y 0 representa un avatar cuadrado de 640 * 640). Cuando el usuario no tiene avatar, este el artículo está vacío. Si el usuario cambia el avatar, la URL del avatar original no será válida. |
privilegio | Información de privilegios de usuario, matriz json, por ejemplo, el usuario de WeChat Woka es (chinaunicom) |
sindicatos | Este campo solo aparecerá después de que el usuario vincule la cuenta oficial a la cuenta de la plataforma abierta de WeChat. |