Table des matières
1. Obtenir le surnom et l'avatar de l'utilisateur
Configuration du mini-serveur de programme
1. Obtenir le surnom et l'avatar de l'utilisateur
processus de connexion
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
La clé de session
session_key
est 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 .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
Exécutez wx.login pour vous connecter afin d'obtenir le code de l'applet
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 ;
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 ;
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