По незнанию месяц ничего не писала Грех прожить такой развратный день.
Что ж, вернемся к основному тексту, поговорим о нашем апплете.
отдать дань уважения
Большая часть логического кода для входа исходит изРука об руку научит вас аутентификации при входе в апплет
Процесс входа
На картинке выше показан официальный процесс входа в систему, давайте посмотрим на логику.
1. Использование пользователемwx.login
получить временныйcode
, действует 5 минут
2. будет временноcode
Отправьте его в нашу внутреннюю службу и вызовите API WeChat, чтобы получитьsession_key
а такжеopenid
3. Серверная часть настраивает новый ключ и связывает возвращенный ключsession_key
а такжеopenid
, который возвращает новый ключ интерфейсу
4. Когда интерфейс отправляет запрос, он несет ключ, а сервер анализирует и возвращает данные.
session_key и openid
1,session_key
Сеансовый ключ используется для определения правильности операции сеанса, а также для шифрования и расшифровки пользовательских данных.Сервер может хранить его сам.Ключ не должен возвращаться во внешний интерфейс и диалог для использования.
2,openid
Уникальный идентификатор пользователя, также используемый только для сервера, может использоваться для идентификации уникальности пользователя.
Далее поговорим об их приобретении, которое получается путем вызова WeChat API с сервера.
API:https://api.weixin.qq.com/sns/jscode2session
Параметры следующие:
// 小程序页面
wx.login({
success:(ret)=>{
wx.request({
url: 'http://test.com', // 后端服务器
data:{
code : ret.code
}
})
}
})
Бэкенд-сервисы, которые мы используемrequest
модуль для отправки запроса
// 后端服务
let options = {
url: 'https://api.weixin.qq.com/sns/jscode2session',
qs:{
appid: appid,
secret: secret,
js_code: code,
grant_type:'authorization_code'
}
}
// 默认请求方式是get
request(options, (err, response, body) => {
if(err) return err
return body // {openid:'openid', session_key:'session_key'} 不是真正的返回 看下面的代码
})
Сгенерировать новый ключевой ключ
Мы получили session_key и openid выше, а следующие два слова называются keyID.Затем мы генерируем новый ключ и возвращаем его во внешний интерфейс и связываем новый ключ с keyID.
Генерируем ключ по алгоритму sha1 криптомодуля
const crypto = require('crypto')
function getShaKey(data){
return crypto.createHash('sha1').update(data, 'utf8').digest('hex')
}
Когда приведенный выше код вернется, мы изменим его на этот новый ключ. Внешний интерфейс сохранит этот ключ в хранилище и предоставит этот ключ при запросе на завершение пользовательского состояния входа в систему.
wx.checkSession
Он используется для проверки правильности ключа сеанса текущего пользователя. WeChat не будет информировать разработчика о сроке действия ключа сеанса. Чем чаще пользователь использует апплет, тем дольше будет срок действия ключа сеанса.
wx.checkSession({
success:function(){ // 当前session_key有效
... // 可以写我们的业务代码
},
fail:function(){ // 当前session_key已过期
wx.login() // 重新登录,获取新的session_key
}
})
Когда срок действия session_key истекает, мы вызываем API входа в систему, обновляем session_key, чтобы сгенерировать новый ключ, и связываем отношения между ними.
Инкапсуляция служебных функций
Ранее мы примерно перечислили процесс, а потом написали вышеописанный процесс как публичную функцию
// 验证session_key状态
function checkSession(){
return new Promise((resolve, reject) => {
wx.checkSession({
success:function(){
resolve(true)
},
fail:function(){
reject(false)
}
})
})
}
// 登录
function login(){
return new Promise((resolve, reject) => {
wx.login({
success: (ret) => {
wx.request({
url:'本地服务地址',
method: 'POST',
data:{
code: ret.code
},
success: (response) =>{
wx.setStorageSync('skey', response.data.key) // 将skey存在storage里面
resolve(response.data.key)
}
})
}
})
})
}
// 请求
function ajax(url, data, method="GET", config={}){
let skey = wx.getStorageSync('skey') // 获取skey
if(!skey){ // 没有skey,首次登录
return new Promise((resolve, reject) => {
login()
reject('请登录')
})
} else {
return new Promise((resolve, reject) => {
checkSession().then( _=> {
if (_){ // session_key有效
wx.request({
url,
method: method.toLocaleUpperCase(),
data,
header: Object.assign({}, { skey }, config),
success: (ret) => {
resolve(ret.data)
}
})
} else { // session_key失效
login()
reject('session_key失效')
}
})
})
}
}
внутренний код
использование серверной частикоа кадр, см. код в конце текстаgithub
адрес
расшифровать
Официально предоставляет образцы кода на нескольких языках программирования.нажмите, чтобы скачать
Здесь мы используем WeChat Sports API в качестве примера.
var app = getApp() // 我们将工具函数都放在了app的示例上面
Page({
onLoad:function(){
app.Util.login().then(_ => { // 先登录然后获取数据
this.getrunData()
})
},
getrunData(){
wx.getWeRunData({
success: (ret) => {
app.Util.ajax('本地服务地址', { iv: ret.iv, data: ret.encryptedData}, 'post').then(_=>{
console.log(_)
}, (err)=>{
console.log(err)
})
}
})
},
})
Результат возврата следующий
Выше мы завершили простую аутентификацию входа и расшифровку данных апплета.
Рендеринг городского здания
конец
Для аутентификации входа мы просто помещаем состояние пользователя в память.В реальном проекте оно должно быть помещено в базу данных.Вы можете прочитать его.Статья о Великом Боге, в котором рассказывается о работе базы данных.
Салют снова
Пожалуйста, нажмите на полный код этой статьиgithub