Interacción de datos de fondo del mini programa-Centro personal

Tabla de contenido

1. Obtenga el apodo y el avatar del usuario

proceso de inicio de sesión

Dos, subprograma de inicio de sesión

tres, fondo

Configuración del Mini Servidor de Programas


1. Obtenga el apodo y el avatar del usuario

proceso de inicio de sesión

Inicio de sesión del mini programa

El Mini Programa puede obtener fácilmente la identidad de usuario proporcionada por WeChat a través de la capacidad de inicio de sesión oficial proporcionada por WeChat y establecer rápidamente un sistema de usuario dentro del Mini Programa.

  • ilustrar

    • Llame a wx.login() para obtener el código de credencial de inicio de sesión temporal y envíelo al servidor del desarrollador.

    • Llame a la interfaz auth.code2Session a cambio del identificador único del usuario OpenID, el identificador único del usuario UnionID en la cuenta de la plataforma abierta de WeChat (si el Mini Programa actual se ha vinculado a la cuenta de la plataforma abierta de WeChat) y la clave de sesión session_key .

    • Posteriormente, el servidor del desarrollador puede generar un estado de inicio de sesión personalizado de acuerdo con la identificación del usuario, que se utiliza para identificar la identidad del usuario durante las interacciones de front-end y back-end en la lógica empresarial posterior.

  • Precauciones

    1. La clave de sesión session_keyes la clave que firma criptográficamente los datos del usuario . Para proteger los datos propios de la aplicación, el servidor del desarrollador no debe entregar la clave de sesión al subprograma, ni debe proporcionar esta clave al mundo exterior .

    2. El código de credencial de inicio de sesión temporal solo se puede usar una vez

  • descripción de ID de aplicación

    • El appid es el identificador único de la cuenta de WeChat, que es fijo; si comprende el desarrollo de la cuenta oficial de WeChat, debe prestar atención, el appid del applet y el appid de la cuenta oficial son inconsistentes

  • Descripción de la función session_key El cliente WeChat obtiene información del usuario a través de wx.getUserInfo(). El fondo a veces necesita obtener la información del usuario del cliente WeChat. Por lo tanto, es necesario usar la clave secreta session_key para obtener el documento oficial de la plataforma WeChat. La verificación de firma y el cifrado y descifrado de datos implica la clave de sesión del usuario session_key. El desarrollador debe obtener la clave de sesión session_key a través del proceso de inicio de sesión de wx.login por adelantado y guardarla en el servidor. Para no manipular los datos, el desarrollador no debe pasar session_key al entorno fuera del servidor, como el cliente del applet.

Dos, subprograma de inicio de sesión

  1. Ejecute wx.login para iniciar sesión y obtener el código del applet

  2. El servidor obtiene la session_key de WeChat de acuerdo con el código y la almacena en caché; al mismo tiempo, genera un access_token y lo guarda en el applet para mantener el estado de inicio de sesión;

  3. Cuando el applet solicita los datos del usuario del servidor, primero wx.checkSession, si es válido, determine el usuario a través de access_token y encuentre session_key, si no es válido, ejecute wx.login para volver a iniciar sesión para regenerar access_token, y el servidor vuelve a obtener session_key;

  4. Si el mini programa no se usa durante mucho tiempo, la clave de sesión en el servidor dejará de ser válida y la clave de sesión ya no se puede usar para obtener datos de WeChat, y el mini programa debe realizar la operación de inicio de sesión nuevamente; el servidor puede solo obtenga session_key a través del inicio de sesión del mini programa;

wx.checkSession

Compruebe si el estado de inicio de sesión ha caducado

wx.login

Llame a la interfaz para obtener las credenciales de inicio de sesión (código)

wx.solicitud

Solicite su propio mini servidor de programas y lleve código, información de información de usuario

iniciar sesión.js

user.loginByWeixin(res.userInfo).then(res => {
    app.globalData.hasLogin = true;
    wx.navigateBack({
    delta: 1
    })
})

usuario.js

function loginByWeixin(userInfo) {
  return new Promise(function(resolve, reject) {
    return login().then((res) => {
      //登录远程服务器
      util.request(api.AuthLoginByWeixin, {
        code: res.code,
        userInfo: userInfo
      }, 'POST').then(res => {
        if (res.errno === 0) {
          //存储用户信息
          wx.setStorageSync('userInfo', res.data.userInfo);
          wx.setStorageSync('token', res.data.token);
          resolve(res);
        } else {
          reject(res);
        }
      })

Guardar información de usuario y datos de token localmente

util.js

function request(url, data = {}, method = "GET") {
  return new Promise(function (resolve, reject) {
    wx.request({
      url: url,
      data: data,
      method: method,
      timeout:6000,
      header: {
        'Content-Type': 'application/json',
        'X-OA-Token': wx.getStorageSync('token')
      },

Si usa la función util.request, cada solicitud llevará 'X-OA-Token': wx.getStorageSync('token'); y el servidor ha guardado todos los tokens, por lo que el servidor distingue a cada cliente por token

emoticonos

Utf8 de Mysql codifica un carácter con un máximo de 3 bytes, pero una expresión emoji tiene 4 bytes, por lo que utf8 no admite el almacenamiento de expresiones emoji. Pero utf8mb4, un superconjunto de utf8, puede tener hasta 4 bytes por carácter, por lo que puede admitir el almacenamiento de expresiones emoji.

El archivo de configuración de MySQL en el sistema Linux es my.cnf.

El archivo de configuración en Windows es my.ini.

[mysql]

# 设置mysql客户端默认字符集
default-character-set=utf8mb4
​
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\tools\\mysql-5.7.23-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\\tools\\mysql-5.7.23-winx64\\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

tres, fondo

Configuración del Mini Servidor de Programas

Importar WeChat Mini Programa SDK

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>3.3.0</version>
</dependency>

aplicación.yml

oa:
  wx:
    app-id: wxf23b28b5e4ea4d6a
    app-secret: 212621faa31cdf0691367ea45b2b6041
    msgDataFormat: JSON

WxPropiedades

Encapsular los datos de oa.wx

@Data
@Configuration
@ConfigurationProperties(prefix = "oa.wx")
public class WxProperties {
	/**
	 * 设置微信小程序的appId
	 */
	private String appId;
	/**
	 * 设置微信小程序的Secret
	 */
	private String appSecret;
	/**
	 * 消息数据格式
	 */
	private String msgDataFormat;

}

WxConfig

Registrar WxMaService

@Configuration
public class WxConfig {
	@Autowired
	private WxProperties properties;

	@Bean
	public WxMaConfig wxMaConfig() {
		WxMaInMemoryConfig config = new WxMaInMemoryConfig();
		config.setAppid(properties.getAppId());
		config.setSecret(properties.getAppSecret());
		config.setMsgDataFormat(properties.getMsgDataFormat());
		return config;
	}

	@Bean
	public WxMaService wxMaService(WxMaConfig maConfig) {
		WxMaService service = new WxMaServiceImpl();
		service.setWxMaConfig(maConfig);
		return service;
	}

}

Controlador WxAuth

@RequestMapping("/wx/auth")
public class WxAuthController {
    @Autowired
    private WxMaService wxService;
     @PostMapping("login_by_weixin")
    public Object loginByWeixin(@RequestBody WxLoginInfo wxLoginInfo, HttpServletRequest request) {

        //客户端需携带code与userInfo信息
        String code = wxLoginInfo.getCode();
        UserInfo userInfo = wxLoginInfo.getUserInfo();
        if (code == null || userInfo == null) {
            return ResponseUtil.badArgument();
        }
        //调用微信sdk获取openId及sessionKey
        String sessionKey = null;
        String openId = null;
        try {
            WxMaJscode2SessionResult result = this.wxService.getUserService().getSessionInfo(code);
            sessionKey = result.getSessionKey();//session id
            openId = result.getOpenid();//用户唯一标识 OpenID
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (sessionKey == null || openId == null) {
            log.error("微信登录,调用官方接口失败:{}", code);
            return ResponseUtil.fail();
        }else{
            log.info("openId={},sessionKey={}",openId,sessionKey);
        }
        //根据openId查询wx_user表
        //如果不存在,初始化wx_user,并保存到数据库中
        //如果存在,更新最后登录时间
        //....
        // token
        UserToken userToken = null;
        try {
            userToken = UserTokenManager.generateToken(user.getId());
        } catch (Exception e) {
            log.error("微信登录失败,生成token失败:{}", user.getId());
            e.printStackTrace();
            return ResponseUtil.fail();
        }
        userToken.setSessionKey(sessionKey);
        log.info("SessionKey={}",UserTokenManager.getSessionKey(user.getId()));
        Map<Object, Object> result = new HashMap<Object, Object>();
        result.put("token", userToken.getToken());
        result.put("tokenExpire", userToken.getExpireTime().toString());
        result.put("userInfo", userInfo);
        //....


        log.info("【请求结束】微信登录,响应结果:{}", JSONObject.toJSONString(result));

        return ResponseUtil.ok(result);
    }

Los datos de respuesta al cliente son: token userInfo

Supongo que te gusta

Origin blog.csdn.net/weixin_66202611/article/details/128525386
Recomendado
Clasificación