El desarrollo de Mini Programas de WeChat requiere una implementación robusta del sistema de inicio de sesión, que típicamente involucra la obtención de un código temporal mediante la API de WeChat, seguido por una solicitud al servidor backend para adquirir un identificader único (openId). Este flujo permite manejar el estado del usuario, como registro pendiente o cuenta activa, y es esencial para redirigir a las páginas apropiadas dentro de la aplicación.
Para mejorar la experiencia de usuario, se integra la biblioteca Vant para componentes predefinidos, como diálogos y alertas. Además, al subir imágenes, es crucial gestionar URLs locales para previsualización, asegurando que sean individuales y no estructuras de array. En el despliegue, se deben configurar dominios legítimos en el backend y verificarlos a través de las herramientas de desarrollo, desactivando temporalmente la verificación durante pruebas.
A continuación, se presenta un ejemplo reestructurado del código para la página de inicio de sesión, con cambios en la lógica, nombres de variables y estructura para mantener la funcionalidad original.
// miniprogram/pages/login/login.js
import Dialog from '../../miniprogram_npm/@vant/weapp/dialog/dialog';
const appInstance = getApp()
var config = require('../../config/settings.js');
var encoder = require('../../utils/encoding.js');
Page({
data: {
userLogin: '',
secretKey: '',
authType: 'password',
appType: '3',
accessScope: 'all',
tokenRefresh: '',
authHeader: 'Basic ' + encoder.encode('myAppClient:myAppSecret'),
userAvatar: '../../images/default-avatar.png',
userData: {},
},
checkUserStatus: function () {
var self = this
wx.request({
url: config.USER_STATUS_ENDPOINT,
data: {
sessionCode: appInstance.globalData.loginCode,
uniqueId: appInstance.globalData.userUniqueId,
},
method: "GET",
header: {
"Content-Type": 'application/json'
},
success: function (response) {
if (response.statusCode === 200) {
wx.hideLoading()
var status = response.data.status
if (status === 'unregistered') {
wx.redirectTo({
url: '/pages/signup/signup',
})
} else if (status === 'pending') {
wx.redirectTo({
url: '/pages/pending/pending',
})
} else if (status === 'active') {
self.authenticateUser();
} else {
Dialog.alert({
title: 'Error',
message: response.data.errorMsg,
theme: 'round-button',
}).then(() => {});
}
} else {
wx.hideLoading()
}
},
fail: function (error) {
wx.hideLoading()
}
})
},
handleUserAuth: function(e){
let self = this;
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
wx.getUserInfo({
success(info) {
wx.showLoading({
title: 'Cargando',
})
self.setData({
userAvatar: info.userInfo.avatarUrl,
userData: info.userInfo
});
self.checkUserStatus();
},
fail(err) {
console.log("Error al obtener info del usuario", err)
}
})
} else {
wx.showToast({title: 'Autorización requerida', icon: 'none' })
}
}
})
},
authenticateUser:function() {
wx.showLoading({
title: 'Autenticando',
})
var self = this
wx.request({
url: config.TOKEN_ENDPOINT,
data: {
grant_type: this.data.authType,
user: appInstance.globalData.userUniqueId,
pass: appInstance.globalData.userUniqueId,
client: this.data.appType,
scope: this.data.accessScope,
refresh: this.data.tokenRefresh
},
method: "POST",
header: {
"Content-Type": "application/x-www-form-urlencoded",
'Authorization': this.data.authHeader,
},
success: function (response) {
appInstance.globalData.viewId = response.data.identifiers[0]
wx.hideLoading()
if (response.statusCode === 200) {
appInstance.globalData.accountData = response.data
wx.reLaunch({
url: '/pages/dashboard/main',
})
} else {
Dialog.alert({
title: 'Error',
message: response.data.errorMsg,
theme: 'round-button',
}).then(() => {});
}
},
fail: function (error) {
wx.hideLoading()
}
})
},
onLoad: function (options) {
// Lógica de carga inicial
},
})
El archivo principal de la aplicación gestiona la obtención inicial del código y openId, almacenándolos en variables globales para su uso posterior.
// app.js
var config = require('./config/settings.js');
App({
onLaunch: function () {
let self = this;
wx.login({
success (res) {
self.globalData.loginCode = res.code
if (res.code) {
wx.request({
url: config.USER_STATUS_ENDPOINT,
data: {
sessionCode: res.code
},
success: function (result) {
self.globalData.userUniqueId = result.data.uniqueId
}
})
} else {
console.log('Fallo en el inicio de sesión: ' + res.errMsg)
}
}
})
if (!wx.cloud) {
console.error('Se requiere la versión 2.2.3 o superior para usar capacidades en la nube')
} else {
wx.cloud.init({
traceUser: true,
})
}
},
globalData: {
loginCode: null,
userData: null,
accountData: null,
userUniqueId: null,
tempInfo: null,
tempEndInfo: null,
viewId: null
}
})
Esta configuración asegura que los datos de autenticación estén disponibles de manera global, facilitando la comunicación entre diferentes páginas y componentes del Mini Programa.