В разработке WeChat часто бывают такие потребности: получать пользовательские аватары, связывать учетные записи WeChat, чтобы отправлять сообщения пользователям ... тогда необходимым условием для достижения их является авторизация!
1. Настройте имя домена безопасного обратного вызова:
Прежде чем запрашивать авторизацию веб -страницы пользователя WeChat Public Account, разработчики необходимо перейти к опции конфигурации «Разработка - Интерфейсные разрешения - веб -службы - веб -учетные записи - веб -авторизация для получения базовой информации пользователя» на официальном веб -сайте публичной платформы для изменения доменного имени доменного разрешения авторизации. Стоит отметить, что это напрямую написать полное доменное имя, например: www.liliangel.cn. Однако в нашей разработке H5 мы обычно используем вторичные доменные имена, такие как: h5.liliangel.cn, который также находится в безопасных доменных именах обратного вызова.
2. Авторизация на уровне пользователя и молчаливое разрешение
1. Авторизация веб -страницы, инициированная SNSAPI_BASE, используется для получения OpenID пользователя, входящего на страницу, и молча авторизована и автоматически перепрыгивается на страницу обратного вызова. Пользователь воспринимает, так это то, что он напрямую входит на страницу обратного вызова.
2. Авторизация веб -страницы, инициированная SNSAPI_USERINFO, как область применения, используется для получения основной информации пользователя. Тем не менее, это авторизация требует согласия пользователя, и, поскольку пользователь согласился, нет необходимости обращать на это внимание, и основная информация пользователя может быть получена после авторизации.
3. Разница между веб -авторизацией Access_token и обычным Access_token
1. Авторизация веб -страницы WeChat реализована с помощью механизма OAuth2.0. После того, как пользователь разрешает официальную учетную запись, официальная учетная запись может получить учетные данные для интерфейса вызова (веб -авторизация Access_token), уникальный для авторизации веб -страницы. Веса авторизации может быть выполнен с помощью веб -страницы Aproadization Access_token, такой как получение базовой информации пользователя;
2. Для других интерфейсов WeChat обычные вызовы access_token необходимы через интерфейс «get access_token» в базовой поддержке.
4. направляйте пользователя на страницу авторизации, чтобы согласиться с авторизацией и получить код
После обновления WeChat страница авторизации также изменилась. На самом деле, я привык к классической зеленой странице ...
JS:
var center = {init: function () {.......}, enterwxAuthor: function () {var wxuserinfo = localstorage.getitem ("wxuserinfo"); if (! wxuserinfo) {var code = common.getUrlParameter ('code'); if (code) {common.getwxuserinfo (); center.init (); } else {// no weChat пользовательская информация, без авторизации ->> Требуется авторизация, перейдите на windows страницы авторизации. +'& response_type = code & scope = snsapi_userinfo#wechat_redirect'; }} else {center.init (); }}} $ (document) .ready (function () {center.enterwxauthor ();}Возьмите Scope = SNSAPI_USERINFO в качестве примера. Когда страница загружена, введите метод авторизации. Во -первых, получите объект wxuserinfo из кеша. Если есть какое -либо объяснение, введите метод инициализации напрямую. Если нет, определите, содержит ли URL код. Если есть код, это означает, что это страница после введения обратного вызова страницы авторизации. Затем обменяйте информацию пользователя через код. Нет кода, то есть пользователь впервые входит на страницу и направляет на страницу авторизации. Redirect_uri - это текущий адрес страницы.
Метод getWxuserInfo:
/ *** Получить основную информацию пользователя после авторизации*/ getWxuserInfo: function (par) {var code = common.getUrlParameter ("code"); if (par) code = par; $ .ajax ({async: false, data: {code: code}, type: «get», url: wx_root + "weChat/adution", успех: function (json) {if (json) {try {// Убедитесь, что Wxuserinfo письменное - это правильный var = json.parse (json); localstorage.setitem ('wxuserinfo', json); // написать кэш-информация пользователя-wechat}} catch (e) {// todo: обрабатывать исключение}}}}}); },5. Backend Restful-- /weChat /Authorization, обмениваться информацией пользователя на основе кода
/*** weChat Authortization* @param код истекает после использования** @return Пользовательская базовая информация* @Throws ioException*/@Requestmapping (value = "/worutization", method = requestMethod.get) public void authorizationWexin (@RequestPar request.setcharacterencoding ("UTF-8"); response.setcharacterencoding ("UTF-8"); Printwriter Out = response.getWriter (); Logger.info ("Restful of Authorization Parameters Code: {}", code); try {string rs = wechatservice.getoauthaccesstoken (code); out.write (rs); Logger.info («Restful of Authorization успешно»., RS); } catch (Exception e) {logger.Error ("Restful of Authorization - это ошибка.", e); } наконец {out.close (); }}Здесь есть авторизованный Access_token. Помните: авторизованный access_token не является глобальным Access_token, и это требует использования кэша. Я использую Redis здесь. Я не скажу много о конкретной конфигурации, а позже напишу соответствующее сообщение в блоге конфигурации. Конечно, вы также можете использовать ehcache. В моем первом блоге есть подробное введение в конфигурацию EHCAHE.
/** * Get authorized tokens based on code are only available when authorizing, different from global access_tokens* @param code * @return * @throws IOException * @throws ClientProtocolException */ public String getOauthAccessToken(String code) throws ClientProtocolException, IOException{ String data = redisService.get("WEIXIN_SQ_ACCESS_TOKEN"); String rs_access_token = null; String rs_openid = null; String url = wx_oauth_access_token_url+"? Appid ="+wx_appid+"& secret ="+wx_appsecret+"& code ="+code+"& grant_type = arutionization_code"; if (stringUtils.isempty (data)) {synchronized (this) {// iscired, string hs = apiservice.doget (url); JsonObject json = jsonObject.parseObject (hs); String refresh_token = json.getString ("refresh_token"); String refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+wx_appid+"&grant_type=refresh_token&refresh_token="+Refresh_token; String r_hs = apiservice.doget (refresh_url); JsonObject r_json = jsonObject.parseObject (r_hs); String r_access_token = r_json.getString ("access_token"); String r_expires_in = r_json.getString ("expires_in"); rs_openid = r_json.getstring ("openid"); rs_access_token = r_access_token; sedisservice.set ("weixin_sq_access_token", r_access_token, integer.parseint (r_expires_in) - 3600); Logger.info ("set sq access_token to redis is успешно. Pparameters Time: {}, Realtime", integer.parseint (r_expires_in), integer.parseint (r_expires_in) - 3600); }} else {// не истек string hs = apiservice.doget (url); JsonObject json = jsonObject.parseObject (hs); rs_access_token = json.getString ("access_token"); rs_openid = json.getstring ("openid"); Logger.info ("get sq access_token из redis is успешно. } вернуть getoAuthuserinfo (rs_access_token, rs_openid); }/** * Получить информацию пользователя на основе авторизованного токена * @param access_token * @param openid * @return */public String getoAuthuserInfo (string access_token, string openid) {string url = "https://api.wexin.qq.com/sns/userinfo?access_token="token+" opendIdIdEdoken+ "openDIDIDIDEKENKENKEKENKEKENKEKENKEKENKEKEKENKEKENKEKENKEKENKEKENKEKENKENKEKENGENGENGEN. +"& lang = zh_cn"; try {string hs = apiservice.doget (url); // Сохранить информацию пользователя SaveWexinuser (HS); вернуть HS; } catch (ioException e) {logger.error ("Restful of Authorization - это ошибка.", e); } return null; }Я спешил, и название кода было грязным. Как видите, я использовал метод синхронизации, чтобы получить ключ из кэша в качестве weixin_sq_access_token. Если инструкции будут получены, я напрямую вызову интерфейс, предоставленный WeChat через HttpClient, и вернуть строку пользовательской информации на переднюю часть. Если он не получен, это означает, что это не истекло или истек. Затем обновите Access_token в соответствии с represh_token и напишите кэш. Поскольку Access_token имеет короткий период достоверности, я установил здесь время истечения срока кеша, чтобы сократить время, предоставленное WeChat еще на час. Оглядываясь назад на код, я обнаружил, что приведенная выше логика - небольшая проблема. Письмо, подобное этому, приведет к тому, что первое приобретение или кэш не сможет обновить Access_token для первого приобретения, что пока не повлияет на использование. Я сделаю оптимизацию и изменю TODO позже.
6: Сохранить пользовательскую информацию
Обычно, после авторизации, мы сохраняем пользовательскую информацию в таблице баз данных, с OpenID в качестве единственного первичного ключа и иностранными ключами, связанными с нашей собственной таблицей пользователя. Таким образом, независимо от того, какой бизнес мы хотим вести в будущем или выполнять статистику операционных данных, мы имеем связь с общественным аккаунтом WeChat. Стоит отметить, что полученный нами Headimgurl - это адрес URL -адреса, предоставляемый WeChat. Когда пользователь изменяет аватар, исходный адрес может быть недействительным, поэтому лучше всего сохранить изображение на локальном сервере, а затем сохранить URL локального адреса!
Значение, возвращаемое WeChat:
Ссылка на ссылку:
Официальный документ общедоступной платформы WeChat: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
Инструмент отладки интерфейса онлайн: http://mp.weixin.qq.com/debug
Нет официальных преимуществ учетной записи: Приложение для тестовой учетной записи http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
Выше всего содержание этой статьи. Я надеюсь, что содержание этой статьи поможет всем, кто учится или работа. Я также надеюсь поддержать Wulin.com больше!