Interaction des données d'arrière-plan du mini programme-Centre personnel

Table des matières

1. Obtenir le surnom et l'avatar de l'utilisateur

processus de connexion

Deux, applet de connexion

Trois, fond

Configuration du mini-serveur de programme


1. Obtenir le surnom et l'avatar de l'utilisateur

processus de connexion

Connexion au mini-programme

Le mini programme peut facilement obtenir l'identité de l'utilisateur fournie par WeChat grâce à la capacité de connexion officielle fournie par WeChat, et établir rapidement un système d'utilisateur au sein du mini programme.

  • illustrer

    • Appelez wx.login() pour obtenir le code d'identification de connexion temporaire et renvoyez-le au serveur de développement.

    • Appelez l'interface auth.code2Session en échange de l'identifiant unique de l'utilisateur OpenID, de l'identifiant unique de l'utilisateur UnionID sous le compte de la plateforme ouverte WeChat (si le mini programme actuel a été lié au compte de la plateforme ouverte WeChat) et de la clé de session session_key .

    • Ensuite, le serveur de développement peut générer un statut de connexion personnalisé en fonction de l'ID utilisateur, qui est utilisé pour identifier l'identité de l'utilisateur lors des interactions frontales et principales dans la logique métier ultérieure.

  • Précautions

    1. La clé de session session_keyest la clé qui signe cryptographiquement les données utilisateur . Afin de protéger les données propres à l'application, le serveur développeur ne doit pas fournir la clé de session à l'applet, ni fournir cette clé au monde extérieur .

    2. Le code d'identification de connexion temporaire ne peut être utilisé qu'une seule fois

  • description de l'ID d'application

    • L'appid est l'identifiant unique du compte WeChat, qui est fixe ; si vous comprenez le développement du compte officiel WeChat, vous devez faire attention, l'appid de l'applet et l'appid du compte officiel sont incohérents

  • description de la fonction session_key Le client WeChat obtient les informations utilisateur via wx.getUserInfo(). L'arrière-plan a parfois besoin d'obtenir les informations utilisateur du client WeChat. Par conséquent, il est nécessaire d'utiliser la clé secrète session_key pour obtenir le document officiel de la plateforme WeChat La vérification de signature et le chiffrement et déchiffrement des données impliquent la clé de session session_key de l'utilisateur. Le développeur doit obtenir à l'avance la clé de session session_key via le processus de connexion wx.login et l'enregistrer sur le serveur. Afin de ne pas altérer les données, le développeur ne doit pas transmettre la session_key à l'environnement extérieur au serveur, tel que le client de l'applet.

Deux, applet de connexion

  1. Exécutez wx.login pour vous connecter afin d'obtenir le code de l'applet

  2. Le serveur obtient la session_key de WeChat en fonction du code et la met en cache ; en même temps, il génère un access_token et l'enregistre dans l'applet pour maintenir le statut de connexion ;

  3. Lorsque l'applet demande les données de l'utilisateur du serveur, d'abord wx.checkSession, s'il est valide, détermine l'utilisateur via access_token et trouve session_key ; s'il est invalide, exécute wx.login pour se reconnecter afin de régénérer access_token, et le serveur ré-obtient session_key ;

  4. Si le mini-programme n'est pas utilisé pendant une longue période, la session_key sur le serveur deviendra invalide et la session_key ne pourra plus être utilisée pour obtenir des données de WeChat, et le mini-programme devra effectuer à nouveau l'opération de connexion ; le serveur peut n'obtenez la session_key qu'en vous connectant au mini programme ;

wx.checkSession

Vérifiez si le statut de connexion a expiré

wx.login

Appelez l'interface pour obtenir les identifiants de connexion (code)

wx.request

Demandez votre propre mini serveur de programme et portez le code, les informations userInfo

connexion.js

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

utilisateur.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);
        }
      })

Enregistrer les informations utilisateur et les données de jeton localement

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 vous utilisez la fonction util.request, chaque requête portera 'X-OA-Token' : wx.getStorageSync('token'); et le serveur a enregistré tous les jetons, de sorte que le serveur distingue chaque client par jeton

émoji

L'utf8 de Mysql encode un caractère avec un maximum de 3 octets, mais une expression emoji est de 4 octets, donc utf8 ne prend pas en charge le stockage des expressions emoji. Mais utf8mb4, un sur-ensemble de utf8, peut avoir jusqu'à 4 octets par caractère, il peut donc prendre en charge le stockage des expressions emoji.

Le fichier de configuration de MySQL dans le système Linux est my.cnf.

Le fichier de configuration sous Windows est 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

Trois, fond

Configuration du mini-serveur de programme

Importer le SDK du programme WeChat Mini

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

application.yml

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

WxPropriétés

Encapsuler les données de oa.wx

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

}

WxConfig

Enregistrez 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;
	}

}

WxAuthController

@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);
    }

Les données de réponse au client sont : token userInfo

Je suppose que tu aimes

Origine blog.csdn.net/weixin_66202611/article/details/128525386
conseillé
Classement