В этой статье рассказывается о первом шаге в разработке WeChat, доступе к официальной учетной записи и управлению Access_token.
1. Доступ к официальной учетной записи WeChat
В руководстве по разработке официального учетной записи WeChat контент о официальном разделе доступа к учетной записи написан более подробно. В документе говорится, что для доступа к официальной учетной записи требуется три шага, а именно:
Фактически, шаг 3 больше не может рассматриваться как шаг доступа к официальной учетной записи. Однако после доступа разработчики могут сделать некоторую разработку на основе интерфейса, предоставленного официальной учетной записью WeChat.
На шаге 1 конфигурация сервера включает в себя адрес сервера (URL), токен и EncodingaeSkey.
Адрес сервера - это входной адрес, который предоставляет бизнес -логику для бэкэнд официальной учетной записи. В настоящее время он поддерживает только порт 80. После этого должна быть введена проверка доступа, и любые другие запросы на операцию (такие как отправка сообщений, управление меню, управление материалами и т. Д.). Разница между проверкой доступа и другими запросами состоит в том, что когда проверка доступа является запросом GET, а когда в других случаях это почтовый запрос;
Токен может быть заполнен разработчиком и используется в качестве подписи для генерации (токен будет сравниваться с токеном, содержащимся в URL интерфейса для проверки безопасности);
EncodingaeSkey заполняется вручную или случайным образом генерируется разработчиком и будет использоваться в качестве зашифрованного ключа дешифрования тела. В этом примере все представляют собой незашифрованные сообщения с открытым текстом, и этот элемент конфигурации не задействован.
Шаг 2: Проверьте обоснованность адреса сервера. Нажав кнопку «Отправить», сервер WeChat отправит запрос HTTP GET на только что заполнил адрес сервера, и проведет четыре параметра:
После получения запроса нам нужно сделать следующие три шага. Если мы подтвердим, что запрос GET поступает с сервера WeChat и вернем содержимое параметра EchoStr, как есть, доступ вступит в силу, в противном случае доступ не удастся.
Код может говорить. Ниже приведено вход Servlevt I, в котором метод проверки определяется в методе Doget:
// tokenprivate final String token = "fengzheng"; Защищенная void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioException {System.out.println («Проверка подписи старта»); String signature = request.getParameter ("signature"); String TimeStamp = request.getParameter ("TimeStamp"); String nonce = request.getParameter ("nonce"); String echoStr = request.getParameter ("echoStr"); Arraylist <string> array = new ArrayList <string> (); array.add (подпись); Array.Add (TimeStamp); array.add (nonce); // Сортировка строки sortString = sort (token, timestamp, nonce); // шифровать строку mytoken = descript.sha1 (sortstring); // Проверьте подпись if (mytoken! = Null && mytoken! = "" && mytoken.equals (signature)) {System.out.println ("Проверка проверки подписи."); response.getWriter (). println (echoStr); // Если проверка успешно выводится EchoStr, сервер WeChat подтвердит, что проверка завершена только после получения этого вывода. } else {System.out.println ("Проверка подписи не удалась."); }} /** * Сортировка метода * @param token * @param timestamp * @param nonce * @return * /public Static String Sort (String Token, String TimeStamp, String nonce) {string [] strarray = {token, timestamp, nonce}; Arrays.sort (Strarray); StringBuilder sbuilder = new StringBuilder (); for (string str: strarray) {sbuilder.append (str); } return sbuilder.toString ();}Следующий код является методом шифрования:
Открытый класс Descript {public Static String sha1 (String descript) {try {messagedigest digest = messagedigest .getinstance ("sha-1"); digest.update (descript.getbytes ()); Byte MessageDigest [] = digest.digest (); // Создать шестигранную строку stringbuffer hexstring = new StringBuffer (); // преобразовать байтовые массивы в шестнадцатеричный номер для (int i = 0; i <messagedigest.length; i ++) {string shahex = integer.tohexstring (messagedigest [i] & 0xff); if (shahex.length () <2) {hexstring.append (0); } hexstring.append (shahex); } вернуть hexstring.toString (); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } возвращаться ""; }}XML, нанесенный на сервлете, выглядит следующим образом:
<servlet> <servlet-name> start </servlet-name> <berlet-class> org.fengzheng.wechat.start </servlet-class> </servlet> <servlet-mapping> <servlet-name> start </servlet-name> <url-pattern>/wechat </url-pattern> </servlet-mapping> <url-pattern>/wechat </url-pattern>
Я использую разработку Intellij Idea+Tomcat7.0 здесь, запускайте проект напрямую, а затем использую NGROK, чтобы отобразить локальный порт 8080 на внешнюю сеть. Введите интерфейс управления учетной записью WeChat Test, заполните отображенный внешний сетевой адрес и токен в информации о конфигурации интерфейса.
Нажмите кнопку «Отправить», и страница подскажет, что конфигурация успешна.
Вы пойдете в IDE и увидите информацию об информации в консоли
2. Access_token Management
Перед Access_token есть два важных параметра, которые необходимо знать. Эти два параметра являются аппетитными и приложениями. Это автоматически назначается официальной учетной записи при подаче заявления на официальную учетную запись. Это эквивалентно идентичности официальной учетной записи. Эти два параметра необходимы во многих интерфейсах. Далее, при запросе access_token необходимы эти два параметра.
После того, как официальная учетная запись успешно доступна, необходимо реализовать соответствующую логику. При использовании интерфейса официальной учетной записи WeChat я обнаружил, что многие запросы требуют Access_token. access_token - это глобальный уникальный учетный данные официальной учетной записи. Access_token требуется при вызове каждого интерфейса официальной учетной записи. Разработчики должны сохранить его должным образом. Хранение Access_token должно сохранить не менее 512 пространства символов. Период достоверности Access_token в настоящее время составляет 2 часа и должен регулярно обновляться. Повторное приобретение приведет к недействительным Access_token, который вы получили в прошлый раз. А верхний предел интерфейса access_token называется каждый день, в 2000 раз.
Подводя итог приведенного выше объяснения, access_token должен сделать следующие два пункта:
В связи с этим решение, принятое здесь, выглядит следующим образом: Определите сервлет запуска по умолчанию, запустите поток в методе init и определите метод бесконечного цикла в этом процессе для получения Access_token. Когда приобретение будет успешным, процесс спит в течение 7000 секунд, в противном случае он будет спать в течение 3 секунд, чтобы продолжать получать. Блок -схема заключается в следующем:
Ниже приведена вышеуказанная идея, которая была реализована в проекте, поскольку возвращаемые данные находятся в формате JSON, библиотека FastJson от Alibaba будет использоваться здесь для обеспечения поддержки сериализации данных и десериализации после построения запросов и запросов на обработку. Другие последующие интерфейсы также будут использоваться.
1. Определите объект AccessToken
открытый класс AccessToken {public String getAccessToken () {return accessToken; } public void setAccessToken (string accessToken) {this.accessToken = accessToken; } public int getExpiresIn () {return expiresIn; } public void setExpiresIn (int oxresin) {this.expiresin = expiresin; } частная строка AccessToken; частный int истекает; } 2. Определите сервлет запуска по умолчанию, запустите поток в методе инициации и установите этот сервлет на самостоятельную работу по умолчанию в web.xml.
Импорт javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; импорт javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservlectresponse; java.io.ioexception; @webservlet (name = "accesstokenservlet") открытый класс AccessTokenServlet extends httpservlet {public void init () throws vervletexception {tokenthread.appid = getInitParameter ("Appid"); // Получить начальные параметры сервлета Appid и AppSecret tokenthread.appsecret = getInitParameter ("appSecret"); System.out.println ("appid:"+tokenthread.appid); System.out.println ("appsecret:"+tokenthread.appsecret); Новый поток (New TokentHread ()). start (); // Запуск процесса} Защищенный void Dopost (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {} защищенный void doget (httpservletrequest, httpservletresponse response) Thripes Servletexception, {}}}}}}}}}}}}}}} Установите AutoStart Servlet в web.xml и установите параметры инициализации Appid и Appsecret
<servlet> <servlet-name>initAccessTokenServlet</servlet-name> <servlet-class> org.fengzheng.wechat.accesstoken.AccessTokenServlet </servlet-class> <init-param> <param-name>appid</param-name> <param-value>your appid</param-value> </init-param> <init-param> <param-name> appsecret </param-name> <param-value> hous appsecret </param-value> </init-param> <load-on-startup> 0 </load-on-startup> </servlet>
3. Определите класс потока, Call Access_token в этом классе, чтобы получить интерфейс, и абстрагировать полученные данные в статическую сущность для использования в других местах. Адрес интерфейса-https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret, где грант_тип фирменного записана как client_credential. Этот запрос является запросом https get, а возвращаемый формат данных - {"access_token": "access_token", "expires_in": 7200}.
Реализация класса процесса выглядит следующим образом:
Импорт com.alibaba.fastjson.json; import com.alibaba.fastjson.jsonobject; импорт org.fengzheng.wechat.common.networkhelper; открытый класс Tokenthread реализует Runnable {public Static String Appid = ""; public Static String appsecret = ""; <br> // Обратите внимание, что это статический общедоступный статический accesstoken accesstoken = null; public void run () {while (true) {try {accessToken = this.getAccessToken (); if (null! = accessToken) {System.out.println (accessToken.getAccessToken ()); Thread.sleep (7000 * 1000); // получить access_token, чтобы спать в течение 7000 секунд} else {thread.sleep (1000*3); // полученный access_token - пустой сон в течение 3 секунд}} catch (Exception e) {System.out.println ("Исключение происходит:"+e.getMessage ()); e.printstacktrace (); try {thread.sleep (1000*10); // Исключение возникает для сна для 1 секунды} catch (Exception e1) {}}}}}/** * get access_token * @return */private accessToken getAccessToken () {NetworkHelper nethelper = new NetworkHelper (); String url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%S&secret=%S", this.appid, this.appsecret); String result = nethelper.gethttpsresponse (url, ""); System.out.println (результат); //Response.getWriter().println(Result); JsonObject json = json.parseObject (результат); AccessToken token = new AccessToken (); token.setaccesstoken (json.getString ("access_token")); token.setexpiresin (json.getInteger ("oxry_in")); вернуть токен; }}Метод GethttpsResponse В NetworkHelper запрашивает HTTPS -адрес, параметр requestMethod - это строка «get» или «post», а по умолчанию - метод получения.
Реализация выглядит следующим образом:
public String gethttpsresponse (String hsurl, String requestMethod) {url url; InputStream IS = null; String resultData = ""; try {url = new url (hsurl); Httpsurlconnection con = (httpsurlconnection) url.openconcenection (); TrustManager [] tm = {xtm}; Sslcontext ctx = sslcontext.getInstance ("tls"); ctx.init (null, tm, null); con.setsslsocketFactory (ctx.getSocketFactory ()); con.sethostnameverifier (new hostnameVerifier () {@override public boolean vesitify (String arg0, sslsession arg1) {return true;}}); con.setDoinput (true); // разрешить потоки ввода, то есть загрузки,/в Android, этот элемент должен быть установлен на false con.setDoOutput (false); // разрешить выходные потоки, то есть загружать con.setusecaches (false); // не используйте буферизацию if (null! = Requestmethod &&! Requestmethod.equals ("")) {con.setrequestmethod (requestmethod); // Использовать указанный метод} else {con.setRequestMethod ("get"); // Использовать GET запрос} IS = con.getInputStream (); // Получить поток ввода, а затем ссылка фактически установлена. InputStreamReader ISR = новый inputStreamReader (IS); BufferedReader BufferReader = new BufferedReader (ISR); String inputline = ""; while ((inputline = bufferReader.readline ())! = null) {resultData + = inputline + "/n"; } System.out.println (resultData); Сертификат [] certs = con.getServercertificates (); int certnum = 1; для (сертификат сертификата: certs) {x509certificate xcert = (x509Certificate) Cert; }} catch (Exception e) {e.printstackTrace (); } return resultData; } X509trustmanager xtm = new x509trustmanager () {@Override public x509Certificate [] getAcceptedIssuers () {// todo Автогенерированный метод return return; } @Override public void CheckServerTrusted (x509Certificate [] arg0, String arg1) Throws SertiCateException {// TODO Auto-генерируемый метод stub} @Override public void checkClientTrusted (x509certificate [] arg0, string arg1) throws sertiexception {// todo aut-gronerated atub wyberated wyberated wyberated atberetated wyberated)На этом этапе, после реализации кода, проект развернут, и вывод консоли выглядит следующим образом:
Чтобы просмотреть эффект, вы можете установить время сна немного короче, например, получение его один раз через 30 секунд, а затем вывод Access_token. Давайте сделаем тестовую страницу JSP и установим время сна до 30 секунд. Таким образом, через 30 секунд вы можете увидеть изменения. Кстати, как получить access_token в других местах
< %@ page contentType = "text/html; charset = utf-8" language = "java" %> < %@ page import = "org.fengzheng.wechat.accesstoken.tokenthread" %> <html> <Head> <title> </title> </head> <body> access_token: <%= Tokenthread.accesstoken.getAccesstoken ()%> </body> </html>
Таким образом, просмотрите эту страницу в браузере, и эффект отображения выглядит следующим образом:
Обновляется через 30 секунд, это значение изменилось:
Эта статья была составлена в «Резюме для разработки Android WeChat», и «Резюме по разработке Java WeChat» приветствует всех учиться и читать.
Выше всего об этой статье. Я надеюсь, что для каждого будет полезно разработать официальный аккаунт Java WeChat.