Апплет WeChat входит в эти вещи

Апплет WeChat

В последнее время команда разрабатывает небольшую программу, все они новички и разрабатывают, читая документацию. Будут разные проблемы в разработке.Сегодня организую процесс входа в апплет и сделаю запись.

Логин апплета — это не то же самое, что логин вашего собственного приложения, есть еще одна роль — сервер WeChat.

登录流程时序

Согласно диаграмме последовательности процесса входа в систему, официально предоставленной WeChat, вы можете четко понять, сколько шагов требуется для входа в апплет.Подведем итоги ниже:

  • Апплет запускается, и код получается через wx.login()
  • Сервер разработчика должен предоставить интерфейс входа в систему, а параметром является код, полученный апплетом.
  • После того, как интерфейс входа получит код, вызовите интерфейс, предоставленный WeChat, для проверки кода.
  • Получите результат проверки, вы можете получить session_key и openid после успеха
  • Создайте пользовательский ключ и свяжите session_key и openid с настраиваемым ключом.
  • Верните пользовательский ключ к апплету
  • Ключ передается с каждым запросом, и серверная часть получает openid в соответствии с ключом, чтобы идентифицировать текущую личность пользователя.

Во-первых, код WeChat дается, если вы можете проверить сгенерированный код, конечно, никакого эффекта, только микро-письмо, чтобы код был эффективным. После того, как код распространился на собственный сервис разработчика, зайдите в микрописьмо:

Привет, приятель, мой код действителен или недействителен?

WeChat сообщит вам, является ли он действительным или недействительным.Если он действителен, он также предоставит вам идентификатор пользователя, который является openid, и session_key, который является ключом сеанса. Срок действия по умолчанию session_key составляет 2 часа. Когда пользователь использует апплет, он будет автоматически обновляться. Это поддерживается WeChat.

Уведомление:

  1. сеансовый ключsession_keyэто пользовательские данныекриптографическая подписьключ. Для обеспечения безопасности собственных данных приложения сервер разработчикаКлюч сеанса не должен быть доставлен в апплет, а также ключ не должен предоставляться извне..
  2. Временный код для входа в систему можно использовать только один раз.

Итак, нам нужно создать псевдоним для session_key.Только мы знаем, с каким пользователем этот псевдоним связан, и единственная работа, которую нужно сделать, — здесь.

Я рекомендую 2 способа сделать ассоциацию:

Первое:Случайным образом сгенерируйте ключ, свяжите openid и сохраните его в Redis. Когда запрос вводится в ключ, openid напрямую получается из Redis для получения текущей информации о пользователе. Фактически, мы сами поддерживаем информацию о сеансе.

Секунда:Используйте JWT для создания маркера, привязки openid к маркеру, возврата маркера в апплет, передачи маркера при запросе и получения информации о пользователе путем анализа маркера.

Далее мы объясним второй способ и вставим некоторый код:

В апплете добавьте метод получения кода к методу onLaunch в app.js и вызовите интерфейс входа в систему для получения токена:

wx.login({
      success: function (res) {
        var code = res.code;
        if (code) {
          console.log('app启动获取用户登录凭证:' + code);
          let params = { "code": code };
          let result = config.requestHttp(config.url.userLogin, 'POST', params)
          result.then(res => {
            let data = res.data
            if (data.code == 200) {
              wx.setStorageSync("login_token", data.data.token);
            }
          }).catch(err => {
            console.log(err)
          });
        } else {
          console.log('获取用户登录态失败:' + res.errMsg);
        }
      }
})

Интерфейс userLogin вызывает интерфейс WeChat для проверки по коду апплета:

// 小程序获取SessionKey接口地址
String loginUrl = "https://api.weixin.qq.com/sns/jscode2session";
String url = loginUrl + "?appid=%s&secret=%s&grant_type=%s&js_code=%s";
url = String.format(url, appid, appSecret, grantType, param.getCode());
String result = restTemplate.getForObject(url, String.class);
Map<String, Object> map = JsonUtils.toBean(Map.class, result);
// 请求成功
if (map.containsKey("session_key")) {
	String openid = map.get("openid").toString();
    // 第一次保存到用户表,生成JWT TOKEN返回
}

Апплет должен закончить WX.Request (), инкапсулированное в общем случае, все взаимодействие с фоном использовали этот метод для вызова интерфейса, мы можем создать после входа в систему в этом методе токен. Так что каждый запрос будет фаршированным заголовком запрашивания токена, мы можем получить проверку этой проверки токена в шлюзе.

//请求封装
function requestHttp(url, method, data) {
  //请求头设置
  var header = {
    Authorization: wx.getStorageSync("login_token")
  }
  return new Promise((resolve, reject) => {
    wx.request({
      url: config.home_config + url,
      data: data,
      header: header,
      method: method,
      success: (res => {
        if (res.data.code === 200) {
          resolve(res)
        } else {
          reject(res)
        }
      }),
      fail: (res => {
        reject(res)
      })
    })
  })
}

Проверьте в Зууле:

  RequestContext ctx = RequestContext.getCurrentContext();
  HttpServletRequest request = ctx.getRequest();
  String token = request.getHeader("Authorization");
  if (StringUtils.isBlank(token)) {
    		ctx.setSendZuulResponse(false);
            ctx.set("isSuccess", false);
            ctx.setResponseBody(JsonUtils.toJson(Response.fail("非法请求【缺少Authorization】", ResponseCode.NO_AUTH_CODE)));
            ctx.getResponse().setContentType("application/json; charset=utf-8");
            return null;
  }
    
  // 验证Token是否有效
  JWTResult jwResult = JWTUtils.checkToken(token);
  if (!jwResult.isStatus()) {
    		ctx.setSendZuulResponse(false);
            ctx.set("isSuccess", false);
            ctx.setResponseBody(JsonUtils.toJson(Response.fail(jwResult.getMsg(), jwResult.getCode())));
            ctx.getResponse().setContentType("application/json; charset=utf-8");
            return null;
   }
   ctx.addZuulRequestHeader("loginUserId", jwResult.getUid());
   return null;

После успешной проверки установите идентификатор пользователя в заголовок запроса и передайте его внутренней службе для использования.

Должна быть проблема с использованием JWT - это аннулирование токена. Я установил время истечения 2 часа. Обычно, если пользователь открывает апплет, его нельзя использовать непрерывно более 2 часов. Логика входа в систему такова. сделано в app.js. Да, если вы введете токен в следующий раз, вы снова подадите заявку на него. Но это также можно отрегулировать, например, немного длиннее.

Суть в том, что аутентификация пользователя передается WeChat. Пока WeChat сообщает нам, что аутентификация прошла успешно, мы можем сами получить информацию о сеансе.