WeChat Open Platform Access, Официальный веб -сайт: https://open.weixin.qq.com, вы можете получить app_id и app_secret после регистрации и добавления заявок на официальный веб -сайт.
Шаг 1: Создайте интерфейс, который наследует AuthService, WeChatauthService, следующим образом
Публичный интерфейс weChatauthservice Extends Authservice {public jsonObject getUserinfo (string accesstoken, string openid);}Шаг 2: Конкретная реализация WeChatservice заключается в следующем
@ServicePublic Class WeChatAuthServiceImpl Extends DefaultAuthServiceImpl реализует weChatauthservice {private logger logger = loggerFactory.getLogger (weChatauthServiceimpl.class); // Запросить этот адрес и перейти к интерфейсу QR login private static autorization_url = "https://open.weixin.qq.com/connect/qrconnect?appid=%S&redirect_uri=%S&response_type=code&scope=%S&state=%S#wechat_redirect"; // Получить URL пользователя OpenID и Access-Toke Private Static Final String AccessToke_openid_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%S&secret=%S&code=%S&grant_type=authorization_code"; Приватная статическая конечная строка rupresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%S&grant_type=refresh_token&refresh_token=%S"; Приватная статическая конечная строка user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%S&openid=%S&lang=zh_cn"; Private Static Final String APP_ID = "XXXXXX"; Private Static Final String APP_SECRET = "XXXXXX"; Private Static Final String Scope = "snsapi_login"; Приватная строка Callbackurl = "https://www.xxx.cn/auth/wechat"; // Вызов доменного имени @Override public String getAuthorizationUrl () бросает UnsupportedEncodingException {callbackurl = urlencoder.encode (callbackurl, "utf-8"); String url = string.format (Authorization_URL, APP_ID, Callbackurl, Scope, System.CurrentTimeMillis ()); вернуть URL; } @Override public String getAccessToken (String Code) {string url = string.format (accesstoke_openid_url, app_id, app_secret, code); UricomponentsBuilder Builder = UricomponentsBuilder.Fromhttpurl (url); Uri uri = builder.build (). Encode (). Touri (); String resp = getRestTemplate (). GetForObject (uri, string.class); logger.error ("getaccesstoken resp ="+resp); if (resp.contains ("openid")) {jsonObject jsonObject = jsonObject.parseObject (resp); String access_token = jsonobject.getString ("access_token"); String openID = jsonObject.getString ("openID") ;; JsonObject res = new jsonObject (); res.put ("access_token", access_token); res.put ("openid", openid); res.put ("refresh_token", jsonobject.getString ("refresh_token")); вернуть res.tojSonstring (); } else {бросить новое ServiceException ("access token fail, msg ="+resp); }} // В интерфейсе WeChat, токен и OpenID возвращаются вместе, поэтому этот метод не должен быть реализован @Override public String getOpenid (string accessToken) {return null; } @Override public jsonObject getUserInfo (string accessToken, string openD) {string url = string.format (user_info_url, accesstoken, openid); UricomponentsBuilder Builder = UricomponentsBuilder.Fromhttpurl (url); Uri uri = builder.build (). Encode (). Touri (); String resp = getRestTemplate (). GetForObject (uri, string.class); logger.Error ("getUserinfo resp ="+resp); if (resp.contains ("errcode")) {бросить новое Service Exception ("Ошибка получения пользовательской информации, msg ="+resp); } else {jsonObject data = jsonObject.parseObject (resp); JsonObject result = new jsonObject (); result.put ("id", data.getString ("UnionId")); result.put («Прозвище», data.getString («Прозвище»)); result.put ("avatar", data.getString ("Headimgurl")); результат возврата; }} // Токен WeChat имеет только 2-часовой период достоверности, и его необходимо время от времени повторно приобрести, поэтому чиновник предоставляет метод обновления и получения токена в соответствии с refresh_token. Этот проект получает только информацию // информацию и хранит информацию в библиотеку, поэтому достаточно двух часов @Override public String refreshtoken (string refresh_token) {string url = string.format (refresh_token_url, app_id, refresh_token); UricomponentsBuilder Builder = UricomponentsBuilder.Fromhttpurl (url); Uri uri = builder.build (). Encode (). Touri (); Responseentity <jsonObject> resp = getRestTemplate (). GetForentity (uri, jsonObject.class); JsonObject jsonObject = resp.getBody (); String access_token = jsonobject.getString ("access_token"); return access_token; }}Шаг 3:
Вызван в контроллере, код выглядит следующим образом:
@Requestmapping (value = "/wxloginpage", method = requestMethod.get) public jsonObject wxloginPage () Throws Exception {String uri = weChatauthService.getAuthorizationUrl (); вернуть LoginPage (URI); } @RequestMapping (value = "/weChat") public void -обратный вызов (строковый код, httpservletRequest, httpservletresponse response) throws exection {string result = weChatauthService.getAccessToken (code); JsonObject jsonObject = jsonObject.parseObject (результат); String access_token = jsonobject.getString ("access_token"); String openID = jsonObject.getString ("openID"); // String refresh_token = jsonObject.getString ("refresh_token"); // Сохранить access_token в cookie, истек для двух часов cookie accesstokencookie = new cookie ("accesstoken", access_token); accesstokencookie.setmaxage (60 *2); response.addcookie (accesstokencookie); Cookie openidcookie = new cookie ("openid", openid); OpenIdcookie.setMaxage (60 *2); response.addcookie (openidcookie); // Судят, вошел ли пользователь на основе OpenID. Kmsuser user = userservice.getuserbycondition (openid); if (user == null) {response.sendredirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+constants.login_type_wechat); } else {// Если пользователь уже существует, войдите непосредственно на response.sendredirect (request.getContextPath () + "/student/html/index.min.html#/app/home?open_id=" + openid); }} Шаг 4:
На стойке регистрации JS, сначала запрос Auth/wxloginPage, получите адрес авторизации и вызовите обратный/auth/weChat после авторизации пользователя, а затем выполните логическую обработку в этом методе.
Проблемы встретились:
1. При настройке имени домена обратного вызова на официальном веб -сайте WeChat вам не нужны некоторые протоколы HTTP или HTTPS. Вам нужно только написать домен. Например, http://baidu.com, вам нужно только заполнить baidu.com. Если вы хотите перейти к контроллеру под проектом, таким как baidu.com/auth/wechat, вам нужно только настраивать baidu.com, и вам не нужно указывать последующую Auth/WeChat. Последующий адрес может быть записан по адресу обратного вызова в коде. Код должен быть настроен как https://baidu.com/auth/wechat.
2. При прыжке на авторизованный интерфейс QR -кода вы столкнетесь с ситуацией, когда QR -код не может быть выпущен. Это из -за адреса обратного вызова в коде. Не должно быть никаких проблем при настройке метода в приведенном выше коде.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.