服務端
第三方平臺推送事件
公眾號第三方平臺推送的有四個事件:
如已經授權的公眾號、小程序再次進行授權,而未修改已授權的權限的話,是沒有相關事件推送的。
授權成功 authorized
?授權更新 updateauthorized
?授權取消 unauthorized
?VerifyTicket component_verify_ticket
SDK
默認會處理事件 component_verify_ticket
,并會緩存 verify_ticket
所以如果你暫時不需要處理其他事件,直接這樣使用即可:
在 EasySwoole
框架中配置服務端驗證,示例代碼如下:
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\WeChat\Factory;
class Index extends Controller
{
public function index()
{
$config = [
// 開放平臺第三方平臺 APPID
'appId' => 'wxefe41fdeexxxxxx',
// 開放平臺第三方平臺 Token
'token' => 'dczmnau31ea9nzcnxxxxxxxxx',
// 開放平臺第三方平臺 AES Key
'aesKey' => 'easyswoole',
// 開放平臺第三方平臺 Secret
'secret' => 'your-AppSecret'
];
// 開放平臺
$openPlatform = Factory::openPlatform($config);
$server = $openPlatform->server;
/** @var \Psr\Http\Message\ServerRequestInterface $psr7Request */
$psr7Request = $this->request();
// $psr7esponse 是一個顯式實現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應給微信
$psr7Response = $server->serve($psr7Request);
$this->response()->withStatus($psr7Response->getStatusCode());
// PSR-7 的 Header 并不是單純的 k => v 結構
foreach ($psr7Response->getHeaders() as $name => $values) {
$this->response()->withHeader($name, implode(", ", $values));
}
$this->response()->write($psr7Response->getBody()->__toString());
}
}
使用原生 Swoole
配置服務端驗證,示例代碼如下:
server.php
的實現(xiàn)形式下面就以原生 Swoole
的 http_server
來啟動一個服務,偽代碼內容如下:
<?php
use EasySwoole\WeChat\Factory;
require_once __DIR__ . '/vendor/autoload.php';
$http = new Swoole\Http\Server('0.0.0.0', 9501);
$http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {
$config = [
// 開放平臺第三方平臺 APPID
'appId' => 'wxefe41fdeexxxxxx',
// 開放平臺第三方平臺 Token
'token' => 'dczmnau31ea9nzcnxxxxxxxxx',
// 開放平臺第三方平臺 AES Key
'aesKey' => 'easyswoole',
// 開放平臺第三方平臺 Secret
'secret' => 'your-AppSecret'
];
// 開放平臺
$openPlatform = \EasySwoole\WeChat\Factory::openPlatform($config);
$server = $openPlatform->server;
// 此處為實現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
/** @var \Psr\Http\Message\ServerRequestInterface $psr7Request */
$psr7Request = new XxxReuest($request); // 偽代碼
/**
* @var \Psr\Http\Message\ResponseInterface $psr7Response
* forceValidate() 表示啟用請求驗證,以確保請求來自微信發(fā)送。默認不啟用驗證
* serve() 會解析本次請求后回調之前注冊的事件(包括 AES 解密和解析 XML)
* serve() 接受一個顯式實現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
*/
$psr7Response = $server->serve($psr7Request);
/**
* $replyResponse 是一個顯式實現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應給微信
* 下面是一個原生 swoole 的響應方法
*/
$response->status($psr7Response->getStatusCode());
/**
* PSR-7 的 Header 并不是單純的 k => v 結構
*/
foreach ($psr7Response->getHeaders() as $name => $values) {
$response->header($name, implode(", ", $values));
}
// 將響應輸出到客戶端
$response->write($psr7Response->getBody()->__toString());
});
$http->start();
自定義消息處理器
消息處理器詳細說明見 公眾號開發(fā) - 服務端章節(jié)
<?php
use EasySwoole\WeChat\OpenPlatform\Server\Guard;
use EasySwoole\WeChat\Kernel\Messages\Message;
$server = $openPlatform->server;
// 處理授權成功事件
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
// ...
}, Guard::EVENT_AUTHORIZED);
// 處理授權更新事件
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
// ...
}, Guard::EVENT_UPDATE_AUTHORIZED);
// 處理授權取消事件
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
// ...
}, Guard::EVENT_UNAUTHORIZED);
使用示例(在 EasySwoole 框架中使用)
使用示例 1:在
App\HttpController\Router.php
(即路由)中使用:
示例代碼如下:
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\AbstractRouter;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use EasySwoole\WeChat\OpenPlatform\Server\Guard;
use FastRoute\RouteCollector;
class Router extends AbstractRouter
{
function initialize(RouteCollector $routeCollector)
{
// 假設你的開放平臺第三方平臺設置的授權事件接收 URL 為: https://easyswoole.wechat.com/openPlatform (其他事件推送同樣會推送到這個 URL)
$routeCollector->post('/openPlatform', function (Request $request, Response $response) {
// $openPlatform 為你實例化的開放平臺對象,此處省略實例化步驟
// $psr7esponse 是一個顯式實現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應給微信
$psr7Response = $openPlatform->server->serve($request); // Done!
$response->withStatus($psr7Response->getStatusCode());
// PSR-7 的 Header 并不是單純的 k => v 結構
foreach ($psr7Response->getHeaders() as $name => $values) {
$response->withHeader($name, implode(", ", $values));
}
$response->write($psr7Response->getBody()->__toString());
return false;
});
// 處理事件
$routeCollector->post('/openPlatform', function (Request $request, Response $response) {
// $openPlatform 為你實例化的開放平臺對象,此處省略實例化步驟
$server = $openPlatform->server;
// 處理授權成功事件,其他事件同理
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
// $message 為微信推送的通知內容,不同事件不同內容,詳看微信官方文檔
// 獲取授權公眾號 AppId: $message['AuthorizerAppid']
// 獲取 AuthCode:$message['AuthorizationCode']
// 然后進行業(yè)務處理,如存數(shù)據(jù)庫等...
}, Guard::EVENT_AUTHORIZED);
// $psr7esponse 是一個顯式實現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應給微信
$psr7Response = $server->serve($request); // Done!
$response->withStatus($psr7Response->getStatusCode());
// PSR-7 的 Header 并不是單純的 k => v 結構
foreach ($psr7Response->getHeaders() as $name => $values) {
$response->withHeader($name, implode(", ", $values));
}
$response->write($psr7Response->getBody()->__toString());
return false;
});
}
}
使用示例 2:在
App\HttpController\Index.php
(即控制器類)中使用,用戶可在自定義其他控制器中實現(xiàn):
假設你的開放平臺第三方平臺設置的授權事件接收 URL
為: https://easyswoole.wechat.com/openPlatform
(其他事件推送同樣會推送到這個 URL
)
示例代碼如下:
首先在 App\HttpController\Router.php
中定義路由:
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\AbstractRouter;
use FastRoute\RouteCollector;
use EasySwoole\WeChat\OpenPlatform\Server\Guard;
class Router extends AbstractRouter
{
function initialize(RouteCollector $routeCollector)
{
// 假設你的開放平臺第三方平臺設置的授權事件接收 URL 為: https://easyswoole.wechat.com/openPlatform (其他事件推送同樣會推送到這個 URL)
$routeCollector->post('/openPlatform', '/Index/openPlatform');
}
}
然后在 App\HttpController\Index.php
控制器中處理事件:
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\WeChat\OpenPlatform\Server\Guard;
class Index extends Controller
{
public function openPlatform()
{
// $openPlatform 為你實例化的開放平臺對象,此處省略實例化步驟
$server = $openPlatform->server;
// 處理授權成功事件,其他事件同理
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
// $message 為微信推送的通知內容,不同事件不同內容,詳看微信官方文檔
// 獲取授權公眾號 AppId: $message['AuthorizerAppid']
// 獲取 AuthCode:$message['AuthorizationCode']
// 然后進行業(yè)務處理,如存數(shù)據(jù)庫等...
}, Guard::EVENT_AUTHORIZED);
/** @var \Psr\Http\Message\ServerRequestInterface $psr7Request */
$psr7Request = $this->request();
// $psr7esponse 是一個顯式實現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應給微信
$psr7Response = $server->serve($psr7Request);
$this->response()->withStatus($psr7Response->getStatusCode());
// PSR-7 的 Header 并不是單純的 k => v 結構
foreach ($psr7Response->getHeaders() as $name => $values) {
$this->response()->withHeader($name, implode(", ", $values));
}
$this->response()->write($psr7Response->getBody()->__toString());
}
}