Напоминание о выпуске общедоступной учетной записи WeChat (интерфейс сообщения шаблона общедоступной учетной записи WeChat)
Напоминание о выпуске общедоступной учетной записи WeChat (интерфейс сообщения шаблона общедоступной учетной записи WeChat)

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Основное содержание этой статьи:
  • 1. Введение в проект
    • Описание функции:
    • Сравнение функций

  • 2. Скриншоты проекта
  • 3. Подготовка разработки
    • 3.1 Инструменты разработки
    • 3.2 Экологическая поддержка
      • 1. Получить информацию о развитии государственного счета:
      • 2. Настройте белый список IP-адресов.
      • 3. Настройте доменное имя.
      • 4. Добавить разработчика
  • 4. Интерпретация официальных справочных документов
    • 4.1 веб-страница Авторизованный вход Интерпретация
      • 1. Получите код
      • 2. Обмен на access_token
      • 3. Получить информацию о пользователе
    • 4.2 Интерпретация отправки шаблонного сообщения
      • 1. Получите базовый access_token.
      • 2. Отправить шаблон сообщения
  • 5. Реализация авторизации входа на веб-страницу (на примере PHP)
    • 5.1 Инструмент GetWX
    • 5.2 Получить код
    • 5.3 Обмен на access_token
    • 5.4 Получение информации о пользователе
    • 5.5 Еще один полный пример
  • 6. Реализация шаблонного сообщения (на примере PHP)
    • 6.1 Официальная документация JSSDK (PHP)
    • 6.2 JSONизация шаблонного сообщения
    • 6.3 Отправить шаблонное сообщение
  • 7. Постскриптум и исходный код

1. Введение в проект

Вдохновленный школой ежедневное здоровье ежедневно,Запрос на использование WeChatМини программа проводит ежедневные проверки здоровья. Итак, функциональность этого проекта примерно такая: Групповой робот QQ,илида ежедневный будильник

Описание функции:

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

Сравнение функций
  • и Групповой робот По сравнению с QQ и будильником,Реализация этой функции,Удобно для пользователей, чтобы получить доступ к мини-программам напрямую одним щелчком мыши.
  • нода МетодНужно обратить внимание на сервисный номер,В то же время порог развития является относительно высоким.

2. Скриншоты проекта

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

3. Подготовка разработки

3.1 Инструменты разработки

1. Инструменты кодирования:для проектовразвивать。Если вы используете Java реализовано, можно использовать IntelliJ IDEA,Если вы используете PHP развитый, доступный JetBrains PhpStorm

2. Запустите инструмент:для местного тестирования。еслидаPHPразвивать,необязательныйphpstudy_proкакPHPСреда запуска и развертывания проекта;

3. Инструменты тестирования:можно использовать только Инструменты разработчика WeChat , выбор режима разработки Официальный аккаунтОтладка веб-страницы

Инструменты разработчика WeChatСкачать адрес:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

Потому что здесь задействован WeChat Авторизованный входная функция, поэтому инструмент тестирования должен использовать Инструменты разработчика WeChat,Однако обычные браузеры не могут реализовать эту функцию.

Инструменты разработчика Как использовать и отлаживать WeChat,То же, что и обычный браузер

3.2 Экологическая поддержка

1. Для любого доменного имени необходимо включить SSL (т. е. доступ по протоколу https);

2. Одна учетная запись службы WeChat, которая должна быть сертифицирована;

3. Сервер с внешним IP-адресом.

Если вы только изучаете технологию, просто выполняйте первые два пункта. Если проект необходимо вывести в Интернет, необходимы три вышеперечисленных пункта. Для первого2полоска,Нет сервисного номера,Также доступен вОткрытая платформа WeChat Создайте веб-приложение в формате . Однако открытая платформа WeChat также требует корпоративной сертификации.

Если вышеуказанная среда удовлетворяет требованиям, необходимо выполнить некоторые настройки учетной записи службы WeChat. В основном включают в себя:

1. Получить информацию о развитии государственного счета:

Информация о разработке официального аккаунта в основном Идентификатор разработчика (AppID) и развиватьили пароль(AppSecret)

Некоторые интерфейсы должны использовать идентификатор разработки или идентификатор или пароль для отправки запросов на вызов.

Получатьпутьда:Бэкэнд официального аккаунта WeChat → развитие → Базовая конфигурация

2. Настройте белый список IP-адресов.

толькоБелый список IP-адресоввIPМожно назвать только адрес Получатьaccess_tokenинтерфейс,где access_tokenда выполняет другие операции,Параметр «Отправить шаблонное сообщение» и т. д.

3. Настройте доменное имя.

配置域名из页面访问путьда:Официальный аккаунтназад台 → настраивать → Официальный аккаунтнастраивать → Функциянастраивать

Необходимо настроить три основных доменных имени:

① Доменное имя компании

настраивать Доменное имя После компании при входе на страницу под доменным именем в WeChat она не будет переставляться. Когда пользователь вводит имя домена, запрос безопасности не появляется. Например, при открытии веб-страницы в WeChat и вводе формы не будет никаких запросов безопасности, таких как «Не вводите пароль QQ».

② Доменное имя безопасности интерфейса JS.

настраивать Доменное имя безопасности интерфейса JSназад,Официальный аккаунтразвивать может вызывать открытый JS-интерфейс WeChat под этим доменным именем. Например, чтобы получить access_token в предыдущей статье, вам нужно использовать это доменное имя.

③ Авторизованное доменное имя веб-страницы.

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

4. Добавить разработчика

Только те, кто добавил усовершенствований,можно использоватьwebразвиватьинструмент进行对应Официальный Аккаунт развивается и отлаживается.

добавить вразвивать ВОЗ页面из访问путьда:Вичат Официальный аккаунтназад台 → развивать → развиватьинструмент → webразвиватьинструмент

5. Добавьте шаблон

существоватьДобавить функциональный плагинв модуле,добавить вшаблон сообщенияФункция

Затем найдите подходящий шаблон в библиотеке шаблонов и добавьте его:

Среди них идентификатор шаблона даразвивать используется параметром.

4. Интерпретация официальных справочных документов

О WeChat Официальный аккаунтизразвиватьтехнология,и путь его реализации,Все представлено на официальном сайте.

Официальная документация:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

Открыть официальный документ разработки,Обязательно прочтите перед первым разделом под названием «Развитие».,Необходимо прочитать главу усовершенствования и Глобальный код возврата иллюстрировать.

развиватьчас,Не нарушайте соответствующие правила WeChat.,нет легко забанить,Тогда глобальный код возврата поможет быстро обнаружить проблему.

4.1 Интерпретация авторизации входа на веб-страницу

Открыть официальный документ разработки,Нет.5главаСтраница WeChatсередина,Нет.2ФестивальАвторизация веб-страницысправочная документация.

прямая ссылка:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

Перед оглавлением в этой главе есть раздел, посвященный авторизации веб-страницы.

Нет.一点关于Авторизация веб-страницы回调域名изиллюстрировать,即前文середина关于域名из配置。 Нет.二点关于Авторизация веб-страницыиз两种scopeиз区别иллюстрировать,Основные два режима авторизации иллюстрировать,Форма авторизации для автоматического входа в систему,Эта форма может только Получать到用户изOpenID,Другой видда Получать Основная информация о пользователеиз形式,Эта форма откроет всплывающее окно,Пользователю необходимо вручную нажать кнопку входа в систему. Два метода реализации,основнойда修改登录链接вscopeпараметризценить。назад文详述。 Нет.三点关于Авторизация веб-страницыaccess_tokenиобычноaccess_tokenиз区别,Пожалуйста, обратитесь к документации. Фактически, основной токен авторизации веб-страницы иллюстрировать более безопасен.,должен пройтиcodeПриходить Получатьaccess_token,И разныеcodeПолучатьизaccess_tokenдругой,Каждый access_token действителен в течение 2 часов (7200 секунд).,Каждый access_token в течение этих 2 часов,Действительно только для одного и того же пользователя。而обычноaccess_token(即基础поддерживатьв“Получатьaccess_token”интерфейс Получать到из)может быть напрямую Получать,Можно повторно использовать в разных сценариях.,Срок действия также 2 часа.,Устаревшую информацию необходимо обновить.

В частности, процесс авторизации веб-страницы разделен на четыре этапа:

1. Попросите пользователя войти на страницу авторизации, чтобы согласиться на авторизацию и получить код.

2. Обменяйте код для авторизации веб-страницы access_token (отличный от access_token в базовой поддержке)

3. При необходимости,разработка может обновить авторизацию веб-страницы access_token,Избегайте истечения срока действия

4、проходить Авторизация веб-страницыaccess_tokenиopenidПолучать Основная информация о пользователе(поддерживатьUnionIDмеханизм)

1. Получите код

Сначала пользователям необходимо получить доступ к следующей ссылке для входа в систему:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

по этой ссылке,Поля, обозначенные заглавными буквами, необходимо заменить.(То же самое ниже)。

Подробная информация о каждом параметре в приведенной выше ссылке следующая:

параметр

Это необходимо

иллюстрировать

appid

да

Уникальный идентификатор официального аккаунта

redirect_uri

да

Адрес ссылки обратного вызова, перенаправленный после авторизации. Используйте urlEncode для обработки ссылки.

response_type

да

Тип возвращаемого значения, можно указать только код

scope

да

Область авторизации приложения может быть только snsapi_base (страница авторизации не всплывает, переходит напрямую и может получить только openid пользователя) или snsapi_userinfo (страница авторизации всплывает, и никнейм, пол и местоположение можно получить через openid Более того, даже если вы не подписаны на При определенных обстоятельствах, если пользователь разрешает это, его информация также может быть получена)

state

нет

После перенаправления будет введен параметр состояния,развивать Могу заполнитьa-zA-Z0-9изпараметрценить,До 128 байт

#wechat_redirect

да

Независимо от того, открываете ли вы его напрямую или выполняете перенаправление 302 на странице,,Необходимо ввести этот параметр

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

redirect_uri/?code=CODE&state=STATE

Вот КОДДалее обмен на access_token должен быть параметром, а STATEдаразвивать или другой настраиваемой информацией.

2. Обмен на access_token

Код получен выше. Далее вам нужно использовать этот код в обмен на access_token.

Ссылка на запрос выглядит следующим образом (метод GET):

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

Подробная информация о каждом параметре в приведенной выше ссылке следующая:

параметр

Это необходимо

иллюстрировать

appid

да

Уникальный идентификатор официального аккаунта、развивать ВОЗID

secret

да

Официальный аккаунтизappsecret、развиватьили пароль

code

да

填写Нет.一步Получатьизcodeпараметр

grant_type

да

Может быть только: код_авторизации

После успешного запроса формат возвращаемого пакета данных JSON будет следующим:

Язык кода:javascript
копировать
{ 
   
  "access_token":"ACCESS_TOKEN",
  "expires_in":7200,
  "refresh_token":"REFRESH_TOKEN",
  "openid":"OPENID",
  "scope":"SCOPE" 
}

Различные поля этого пакета данных JSON следующие:

параметр

иллюстрировать

access_token

Сертификат вызова интерфейса авторизации веб-страницы. Обратите внимание: этот access_token отличается от базового поддерживаемого access_token.

expires_in

Тайм-аут учетных данных вызова интерфейса Access_token, единица измерения (секунды)

refresh_token

Пользователь обновляет access_token, который действителен в течение 30 дней. Когда время доступа access_token истекает, для обновления можно использоватьrefresh_token.

openid

Уникальный идентификатор пользователя,пожалуйста Уведомление,существовать未сосредоточиться на Официальный аккаунт, когда пользователь посещает Официальный На веб-странице аккаунта также будет создан пользователь и Официальный. уникальный OpenID аккаунта

scope

Область авторизации пользователя, разделенная запятыми (,)

Следующие операции являются необязательными и обычно не используются:

использоватьrefresh_tokenПолучатьaccess_tokenсвязьследующее(GETСпособ):

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

Подробная информация о каждом параметре в приведенной выше ссылке следующая:

параметр

Это необходимо

иллюстрировать

appid

да

Уникальный идентификатор официального аккаунта

grant_type

да

Заполните какrefresh_token

refresh_token

да

填写проходитьaccess_tokenПолучать到изrefresh_tokenпараметр

Правильно возвращенный формат JSON соответствует приведенному выше.

Некоторыйиллюстрировать: На этом этапе выполнения мы получили OpenID пользователя. Если вы выполняете только проверку уникальности пользователя, вы можете завершить ее здесь. Аналогично, для отправки шаблонных сообщений требуется только OpenID пользователя.

3. Получить информацию о пользователе

Если область авторизации веб-страницы snsapi_userinfo , то в это время человек может пройти access_token и openid Получение информации о пользователе.

Ссылка на запрос выглядит следующим образом (метод GET、Необходимо использовать протокол https):

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

Параметриллюстрировать ссылку выше:

параметр

описывать

access_token

Интерфейс авторизации веб-страницы вызывает учетные данные, которые представляют собой access_token, полученный на предыдущем шаге.

openid

Уникальный идентификатор пользователя

lang

Вернуться к языковой версии страны и региона, упрощенный zh_CN, традиционный zh_TW, английский

Формат пакета данных JSON, возвращаемого после успешного запроса, следующий:

Язык кода:javascript
копировать
{ 
      
  "openid":" OPENID",
  "nickname": NICKNAME,
  "sex":"1",
  "province":"PROVINCE",
  "city":"CITY",
  "country":"COUNTRY",
  "headimgurl":       "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
  "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
  "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

Подробности вышеуказанного пакета данных JSON следующие:

параметр

описывать

openid

Уникальный идентификатор пользователя

nickname

Никнейм пользователя

sex

Пол пользователя,ценитьдля1часдамужской,ценитьдля2часдаженщина,ценитьдля0часданеизвестный

province

Провинция заполнена профилем пользователя

city

Город, в котором обычные пользователи заполняют свои персональные данные

country

Страна, например, Китай — CN.

headimgurl

Аватар пользователя, последнее значение представляет размер квадратного аватара (доступны значения 0, 46, 64, 96 и 132, 0 представляет квадратный аватар размером 640*640), этот элемент пуст, если пользователь не есть аватар. Если пользователь меняет свой аватар, исходный URL-адрес аватара будет недействителен.

privilege

Информация о привилегиях пользователя, массив json, например имя пользователя WeChat Woka (chinaunicom).

unionid

Это поле появится только после того, как пользователь привяжет официальную учетную запись к учетной записи WeChat Open Platform.

Вложение: Убедитесь, что сертификат авторизации (access_token) действителен.

Ссылка на запрос (метод GET, необходимо использовать протокол https):

https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

Параметриллюстрировать ссылку выше:

параметр

описывать

access_token

Сертификат вызова интерфейса авторизации веб-страницы. Обратите внимание: этот access_token отличается от базового поддерживаемого access_token.

openid

Уникальный идентификатор пользователя

Правильный результат возврата пакета данных JSON выглядит следующим образом:

Язык кода:javascript
копировать
{ 
    "errcode":0,"errmsg":"ok"}

Пример возврата JSON при ошибке:

Язык кода:javascript
копировать
{ 
    "errcode":40003,"errmsg":"invalid openid"}

Этот метод можно использовать для обнаружения истечения срока действия access_tokendanet, чтобы обеспечить высокую доступность проекта.

4.2 Интерпретация отправки шаблонного сообщения

Открыть официальный документ разработки,Нет.4глава Управление сообщениями , раздел 7 Интерфейс шаблона сообщения справочная документация.

прямая ссылка:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

В официальной документации,Содержание, описанное в этом модуле, очень обширно.,да Для сторонних поставщиков услуг WeChat,Итак, есть некоторые вещи, которые людям не нужны.

Подводя итог фактическому процессу отправки шаблонного сообщения, основные процессы следующие:

1. Получите базовый access_token.

Ссылка на запрос выглядит следующим образом (метод GET):

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

по этой ссылкеизпараметрподробныйиллюстрироватьследующее:

параметр

Это необходимо

иллюстрировать

grant_type

да

Получите access_token и заполните client_credential.

appid

да

Уникальные учетные данные для сторонних пользователей

secret

да

Уникальные учетные данные для сторонних пользователейключ,то есть appsecret

Формат пакета данных JSON, возвращаемого успешным запросом, следующий:

Язык кода:javascript
копировать
{ 
   "access_token":"ACCESS_TOKEN","expires_in":7200}

JSONпакетпараметриллюстрировать:

параметр

иллюстрировать

access_token

Полученные полномочия

expires_in

Время действия ваучера, единица измерения: секунды.

2. Отправить шаблон сообщения

Ссылка на запрос выглядит следующим образом (метод POST):

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

Эта ссылка требует только access_token Параметр, полученный на первом шаге access_token

Формат пакета данных POST — это формат JSON, пример следующий:

Язык кода:javascript
копировать
 { 
   
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",  
           "miniprogram":{ 
   
             "appid":"xiaochengxuappid12345",
             "pagepath":"pages/index?foo=bar"
           },          
           "data":{ 
   
                   "first": { 
   
                       "value":"Поздравляем с успешной покупкой!",
                       "color":"#173177"
                   },
                   "keyword1":{ 
   
                       "value":"шоколад",
                       "color":"#173177"
                   },
                   "keyword2": { 
   
                       "value":"39,8 юаней",
                       "color":"#173177"
                   },
                   "keyword3": { 
   
                       "value":"22 сентября 2014 г.",
                       "color":"#173177"
                   },
                   "remark":{ 
   
                       "value":"Добро пожаловать за покупкой снова!",
                       "color":"#173177"
                   }
           }
       }

Подробности каждого параметраиллюстрировать в этом пакете данных JSON следующие:

параметр

данет Обязательно

иллюстрировать

touser

да

приемникopenid

template_id

да

Идентификатор шаблона, строка символов, полученная после добавления сообщения шаблона в предыдущей конфигурации.

url

нет

Ссылка для перехода по шаблону (учетные записи за рубежом не имеют возможности перехода)

miniprogram

нет

Прыжок Мини программа требует данных, не нужно прыгать Мини программе не нужно передавать эти данные. При ссылке и Мини Когда обе программы существуют, сначала перейдите к Mini. программа。

appid

да

Мини, куда можно перейти программаappid(Должен Мини programappid должен совпадать с официальным, отправившим шаблонное сообщение. аккаунтда привязать отношения ассоциации, мини-игры пока не поддерживаются)

pagepath

нет

Требуется переход на Мини Конкретный путь к странице программы поддерживает параметр (пример страниц/index?foo=bar), для которого требуется Минимальный программа вышла и пока не поддерживает мини-игры.

data

да

Данные шаблона. Количество данных здесь,Должен соответствовать параметру в шаблоне сообщения.,Как показано ниже.

color

нет

Цвет шрифта содержимого шаблона. Если не заполнен, по умолчанию используется черный цвет.

После успешного запроса формат возвращаемого пакета данных JSON будет следующим:

Язык кода:javascript
копировать
 { 
   
    "errcode":0,
     "errmsg":"ok",
     "msgid":200228332
  }

В это время на мобильный телефон WeChat пользователя придет соответствующее напоминание.

На этом этапе описан основной процесс реализации да Авторизованного входа.Отправить шаблонное сообщение.

Ниже мы более подробно продемонстрируем процесс реализации вышеперечисленных функций в виде исходного кода проекта на основе реальных проектов.

5. Реализация авторизации входа на веб-страницу (на примере PHP)

5.1 Инструмент GetWX

Основная функция этого класса инструментов основана на авторизованном WeChat. входиз实现流程,进行链接пожалуйста求иданные Получать。

Язык кода:javascript
копировать
<?php

/** * Получить информацию о пользователе WeChat */
class GetWX
{ 
   
    //Официальный аккаунтизразвиватьинформация    private $appid = 'APPID';
    private $appsecret = 'APPSECERT';

    /** * Функция: авторизация пользователя и Tweet код * * @param $callback */
    public function get_code($callback)
    { 
   
        $appid = $this->appid;
        $scope = 'snsapi_userinfo';
        $state = md5(uniqid(rand(), TRUE));//Уникальный идентификатор ID никогда не будет повторяться
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($callback) . '&response_type=code&scope=' . $scope . '&state=' . $state . '#wechat_redirect';
        header("Location:$url");
    }

    /** * Функция: получить access_token через код. * * @param $code * @return mixed */
    public function get_access_token($code)
    { 
   
        $appid = $this->appid;
        $appsecret = $this->appsecret;
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code';
        $data = json_decode(file_get_contents($url));//Возвращённый массив json преобразуется в массив массивов
        return $data;
    }

    /** * Функция: используйте access_tokenПолучить информацию о пользователе * * @param $access_token * @param $openid * @return mixed */
    public function get_user_info($access_token, $openid)
    { 
   
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
        $data = json_decode(file_get_contents($url));//Возвращённый массив json преобразуется в массив массивов
        return $data;
    }
}

?>

Конкретный метод реализации этого класса инструментов не уникален. Ниже приведен второй полный пример.

5.2 Получить код

Исходный код страницы обратного вызова входа в систему (login.php) выглядит следующим образом:

Язык кода:javascript
копировать
<?php
include 'getWX.php';

$getWX = new GetWX();

//Если код не GET, выполняем операцию входа в систему
if (!isset($_GET['code'])) { 
   
    //URL обратного вызова сервера WeChat, вот URL этой страницы
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $callback = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    //Получить код
    $getWX->get_code($callback);
} //Получаем код, можно выполнять последующие операции
else { 
   

}

Как показано в исходном коде выше,В это время посетите https://XXXX.cn/test/login.php.,Выполнить оператор if,Определить, нет ли кода в параметре ссылки,так Получать了当前链接изURLадрес(callbackпараметр),и передаем его методу get_code,Этот метод создаст ссылку для входа,и перейдите на эту страницу,Затем появляется страница авторизации входа.,Как показано ниже:

Клики пользователей соглашаться 之назад,Вернитесь к ссылке $callback. В это время,Ссылка содержит параметр кода,И разработать или настроить параметр состояния. Как показано ниже:

Мы временно используем дакодпараметр.

5.3 Обмен на access_token

Далее используйте это codeВ обмен на access_token,Продолжайте улучшать код login.php.,Подробности следующие:

Язык кода:javascript
копировать
<?php
include 'getWX.php';

$getWX = new GetWX();

//Если код не GET, выполняем операцию входа в систему
if (!isset($_GET['code'])) { 
   
    //URL обратного вызова сервера WeChat, вот URL этой страницы
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $callback = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    //Получить код
    $getWX->get_code($callback);
} //Получаем код, можно выполнять последующие операции
else { 
   
    //Получаем код по ссылке
    $code = $_GET['code'];
    //Получаем авторизацию веб-страницы access_token и openid пользователя
    $data = $getWX->get_access_token($code);
    //Тестовый вывод
    echo 'access_token:' . $data->access_token . '<br>';
    echo 'expires_in:' . $data->expires_in . '<br>';
    echo 'refresh_token:' . $data->refresh_token . '<br>';
    echo 'openid:' . $data->openid . '<br>';
    echo 'scope:' . $data->scope . '<br>';
}

Выходная информация следующая:

5.4 Получение информации о пользователе

Получил это сверху access_token и OpenID,接下Приходить可以использовать这两个параметр Приходить Получать用户из基本информация。

Продолжайте улучшать login.php следующим образом:

Язык кода:javascript
копировать
<?php
include 'getWX.php';

$getWX = new GetWX();

//Если код не GET, выполняем операцию входа в систему
if (!isset($_GET['code'])) { 
   
    //URL обратного вызова сервера WeChat, вот URL этой страницы
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $callback = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    //Получить код
    $getWX->get_code($callback);
} //Получаем код, можно выполнять последующие операции
else { 
   
    //Получаем код по ссылке
    $code = $_GET['code'];
    //Получаем авторизацию веб-страницы access_token и openid пользователя
    $data = $getWX->get_access_token($code);
    //Получить информацию о пользователе WeChat
    $userInfo = $getWX->get_user_info($data->access_token, $data->openid);
    //Тестовый вывод:
    echo 'openid:' . $userInfo->openid . '<br>';
    echo 'nickname:' . $userInfo->nickname . '<br>';
    echo 'sex:' . $userInfo->sex . '<br>';
    echo 'province:' . $userInfo->province . '<br>';
    echo 'city:' . $userInfo->city . '<br>';
    echo 'country:' . $userInfo->country . '<br>';
    echo 'headimgurl:' . $userInfo->headimgurl . '<br>';
}

Результат выполнения показан на рисунке ниже:

На данный момент мы получили основную информацию о пользователе, а затем можем сохранить эту базовую информацию в базе данных, идентификатор пользователя и т. д. можно сохранить в сеансе или файле cookie и т. д., а также выполнить различные другие операции.

5.5 Еще один полный пример

Инструменты:

Язык кода:javascript
копировать
<?php

/** * Получить информацию о пользователе WeChat * Этот исходный код взят из Интернета */
class GetWxUser
{ 
   
    private $appid = '';
    private $appsecret = '';

    /** * 1、Получить информацию о пользователе WeChat,Определить, есть ли код,Есть код использования в обмене на access_token,не пошел Получить код。 * @return array Массив информации о пользователе WeChat */
    public function get_user_all()
    { 
   
        if (!isset($_GET['code'])) { 
   //Если кода нет, заходим в интерфейс WeChat Получить кодовый код
            //URL обратного вызова сервера WeChat, вот URL этой страницы
            $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
            $callback = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
            //Получить код
            $this->get_code($callback);
        } else { 
   //Получить Вернитесь сюда после кода
            $code = $_GET['code'];
            $data = $this->get_access_token($code);//Получаем авторизацию веб-страницы access_token и openid пользователя
            $userInfo = $this->get_user_info($data['access_token'], $data['openid']);//Получить информацию о пользователе WeChat
            return $userInfo;
        }
    }

    /** * 2. Авторизация пользователя и получение код * @param string $callback URL-адрес ссылки обратного вызова сервера WeChat */
    public function get_code($callback)
    { 
   
        $appid = $this->appid;
        $scope = 'snsapi_userinfo';
        $state = md5(uniqid(rand(), TRUE));//Уникальный идентификатор ID никогда не будет повторяться
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($callback) . '&response_type=code&scope=' . $scope . '&state=' . $state . '#wechat_redirect';
        header("Location:$url");
    }

    /** * 3. Используйте код обмен на access_token * @param string для В обмен на код access_token, предоставленный WeChat * @return array access_tokenиuser массив openid */
    public function get_access_token($code)
    { 
   
        $appid = $this->appid;
        $appsecret = $this->appsecret;
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code';
        $user = json_decode(file_get_contents($url));
        if (isset($user->errcode)) { 
   
            echo 'error:' . $user->errcode . '<hr>msg :' . $user->errmsg;
            exit;
        }
        $data = json_decode(json_encode($user), true);//Возвращенный массив json преобразуется в массив массивов
        return $data;
    }

    /** * 4、использоватьaccess_tokenПолучить информацию о пользователе * @param string access_token * @param string openid пользователя * @return array Информационный массив пользователя */
    public function get_user_info($access_token, $openid)
    { 
   
        $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
        $user = json_decode(file_get_contents($url));
        if (isset($user->errcode)) { 
   
            echo 'error:' . $user->errcode . '<hr>msg :' . $user->errmsg;
            exit;
        }
        $data = json_decode(json_encode($user), true);//Возвращенный массив json преобразуется в массив массивов
        return $data;
    }
}

?>

Страница входа в систему login.php:

Язык кода:javascript
копировать
<?php
header("Content-Type: text/html;charset=utf-8");
//настраиватьчас区
date_default_timezone_set('Asia/Chongqing');

include 'getWXUser.php';

$getWxUser = new GetWxUser();

//URL домашней страницы
$homeUrl = 'https://mzxy.cxhit.cn';

//Если кода нет, заходим в интерфейс WeChat Получить кодовый код
if (!isset($_GET['code'])) { 
   
    //URL обратного вызова сервера WeChat, вот URL этой страницы
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $callback = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];

    $getWxUser->get_code($callback);
} //Получить Вернитесь сюда после кода
else { 
   
    $code = $_GET['code'];
    //Получаем авторизацию веб-страницы access_token и openid пользователя
    $data = $getWxUser->get_access_token($code);
    //Получить информацию о пользователе WeChat (массив)
    $userInfo = $getWxUser->get_user_info($data['access_token'], $data['openid']);

    //Сохраняем в базу данных
    if ($userInfo['openid'] != '') { 
   
        saveUserInfo($userInfo['openid'], $userInfo['nickname'], $userInfo['sex'], $userInfo['province'], $userInfo['city'], $userInfo['country'], $userInfo['headimgurl']);
    }

    //Сохраняем в куки
    setcookie('openid', $userInfo['openid'], time() + 3600 * 24 * 30, "/");

    //возвращаемся на домашнюю страницу
    header("Location:" . $homeUrl);
}
?>

6. Реализация шаблонного сообщения (на примере PHP)

6.1 Официальная документация JSSDK (PHP)

ДолженSDKРазличныйпараметриз Получать,Исходный код выглядит следующим образом:

Язык кода:javascript
копировать
<?php

class JSSDK
{ 
   
    private $appId;
    private $appSecret;

    public function __construct($appId, $appSecret)
    { 
   
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }

    public function getSignPackage()
    { 
   
        $jsapiTicket = $this->getJsApiTicket();

        // Уведомление URL Его необходимо получать динамически, а не hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        // Здесь порядок параметров должен быть следующим key ценить ASCII Сортировать по коду в порядке возрастания
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

        $signature = sha1($string);

        $signPackage = array(
            "appId" => $this->appId,
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "url" => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }

    private function createNonceStr($length = 16)
    { 
   
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) { 
   
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket()
    { 
   
        // jsapi_ticket Он должен храниться и обновляться глобально. В качестве примера следующий код записывается в файл.
        $data = json_decode($this->get_php_file("jsapi_ticket.php"));
        if ($data->expire_time < time()) { 
   
            $accessToken = $this->getAccessToken();
            // Если в номере предприятия да используется следующее URL Получать ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) { 
   
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $this->set_php_file("jsapi_ticket.php", json_encode($data));
            }
        } else { 
   
            $ticket = $data->jsapi_ticket;
        }

        return $ticket;
    }

    public function getAccessToken()
    { 
   
        // access_token Он должен храниться и обновляться глобально. В качестве примера следующий код записывается в файл.
        $data = json_decode($this->get_php_file("access_token.php"));
        if ($data->expire_time < time()) { 
   
            // Если в номере предприятия да используется следующееURLПолучатьaccess_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) { 
   
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $this->set_php_file("access_token.php", json_encode($data));
            }
        } else { 
   
            $access_token = $data->access_token;
        }
        return $access_token;
    }

    private function httpGet($url)
    { 
   
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // Чтобы обеспечить безопасность передачи данных между сторонним сервером и сервером WeChat, все интерфейсы WeChat вызываются с использованием https, а для включения проверки безопасности SSL необходимо использовать следующие 2 строки кода.
        // Если ваш код не проходит проверку во время развертывания, перейдите к http://curl.haxx.se/ca/cacert.pem Загрузите новый файл идентификации сертификата.
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }

    private function get_php_file($filename)
    { 
   
        return trim(substr(file_get_contents($filename), 15));
    }

    private function set_php_file($filename, $content)
    { 
   
        $fp = fopen($filename, "w");
        fwrite($fp, "<?php exit();?>" . $content);
        fclose($fp);
    }
}
6.2 JSONизация шаблонного сообщения

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

Затем определите функцию, основной функцией которой является реализация форматирования JSON отправляемых данных.

Исходный код функции:

Язык кода:javascript
копировать
//Шаблон сообщенияJSONформат
function json_tempalte($openid, $appid, $nickname, $time)
{ 
   
    //Шаблон сообщения
    $template = array(
        'touser' => $openid,  //Открытый идентификатор пользователя
        'template_id' => 'XXXX', //существовать Официальный Идентификатор шаблона настроен под учетной записью
        'url' => 'https://XXXX.cn', //Нажмите ссылку, которая приведет к сообщению шаблона
        'miniprogram' => array(
            'appid' => $appid,
            'pagepath' => 'pages/main/login/login?foo=bar'
        ),
        'data' => array(
            'first' => array('value' => «Вы закончили сегодняшнее здоровье ежедневно?» Еще не завершено, пожалуйста, приходите как можно скорее~', 'color' => "#FF0000"),
            'keyword1' => array('value' => $nickname, 'color' => '#173177'),  //ключевое слово должно соответствовать настроенному сообщению шаблона
            'keyword2' => array('value' => $time, 'color' => '#173177'),
            'remark' => array('value' => 'Нажмите здесь, чтобы заполнить форму. Это уведомление генерируется вашей подпиской. Чтобы переключить личность, изменить время уведомления и отказаться от подписки, посетите модуль «Помощник по обучению» в строке меню. ', 'color' => '#FF0000'),
        )
    );
    $json_template = json_encode($template);
    return $json_template;
}

Эта функция возвращает результат пакета JSON.

6.3 Отправить шаблонное сообщение

Ключевой исходный код выглядит следующим образом:

Язык кода:javascript
копировать
include("jssdk.php");
$jssdk = new JSSDK("APPID", "APPSECRET");
//Определяем шаблон сообщения JSON
$json_template = json_tempalte('APPID', 'wxa0738e54aae84423', «Лу десяти лет» . '(старшекурсник)', date("Y-m-d"));
//ПолучатьAccessToken
$accessToken = $jssdk->getAccessToken();
//POST связь
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $accessToken;
//представлять на рассмотрение
list($returnCode, $returnContent) = http_post_json($url, $json_template);
//Печать журнала (формат JSON)
echo «Результат отправки следующий:» . $returnContent . '\n';

Среди них в приведенном выше коде http_post_json Функция следующая:

Язык кода:javascript
копировать
//Отправляем POST-запрос
функция http_post_json($url, $jsonStr)
{ 
   
    $ch = Curl_init();
    Curl_setopt ($ ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    Curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ jsonStr);
    Curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, массив(
            'Тип контента: application/json; кодировка = utf-8',
            'Длина контента:' . стрлен($jsonStr)
        )
    );
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    локон_закрыть ($ ч);

    возвращаемый массив ($httpCode, $response);
}

Эта функция сама по себе инкапсулирует запрос POST. Конечно, различные

После завершения выполнения пользователь может получить шаблон сообщения.

7. Постскриптум и исходный код

Пока о WeChat Авторизованный входи Вичатшаблон сообщения推送изосновнойиспользовать方法讲解完毕。

Хотя функция отправки шаблонных сообщений ежедневных напоминаний упоминалась в предыдущей статье, здесь она обсуждаться не будет.

Загрузка исходного кода:https://mianbaoduo.com/o/bread/YZuVk5dp

Вот и все.

Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/128618.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose