easyswoole - 基于swoole扩展实现的一款高性能php框架

快速開始

在我們已經(jīng)成功安裝完成 EasySwoole WeChat SDK 組件后,就可以很快地開始使用它了,當(dāng)然你還是有必要明白 PHP 的基本知識,如命名空間等,我這里就不贅述了。

接下來我們以完成 服務(wù)器端驗(yàn)證接收響應(yīng)用戶發(fā)送的消息 為例來演示,首先我們有必要先了解一下微信交互的運(yùn)行流程:

具體交互流程如下:

                                 +-----------------+                       +---------------+
+----------+                     |                 |    POST/GET/PUT       |               |
|          | ------------------> |                 | ------------------->  |               |
|   user   |                     |  wechat server  |                       |  your server  |
|          | < - - - - - - - - - |                 |                       |               |
+----------+                     |                 | <- - - - - - - - - -  |               |
                                 +-----------------+                       +---------------+

其實(shí)我們要做的就是圖中 微信服務(wù)器把用戶消息轉(zhuǎn)到我們的自有服務(wù)器(虛線返回部分) 后的處理過程。

服務(wù)端驗(yàn)證

在微信接入開始有一個(gè) "服務(wù)器驗(yàn)證" 的過程,這一步其實(shí)就是 微信服務(wù)器我們服務(wù)器 發(fā)起一個(gè)請求(上圖實(shí)線部分),傳了一個(gè)名稱為 echostr 的字符串過來,我們只需要原樣返回就好了。

作為開發(fā)者,你應(yīng)該知道,微信后臺只能填寫一個(gè)服務(wù)器地址,所以 服務(wù)器驗(yàn)證消息的接收與回復(fù),都在這一個(gè)鏈接內(nèi)完成交互。

考慮到這些,我們已經(jīng)把驗(yàn)證這一步給封裝到 SDK 里了,你可以完全忽略這一步。

下面我們來配置一個(gè)基本的服務(wù)端,這里假設(shè)我們自己的服務(wù)器域名叫 easyswoolewechat.com,并且我們在服務(wù)端已經(jīng)安裝好了一個(gè) EasySwoole 框架,或者我們在服務(wù)器上準(zhǔn)備一個(gè)文件 server.php(使用原生 Swoole 實(shí)現(xiàn),下文只提供偽代碼)。

使用 EasySwoole 框架配置服務(wù)端驗(yàn)證

以下為了演示,我們只在 App\HttpController\Index 控制器類下進(jìn)行編碼實(shí)現(xiàn)配置服務(wù)端驗(yàn)證,用戶可自行選擇其他控制器類進(jìn)行編碼實(shí)現(xiàn)。

在服務(wù)器的 EasySwoole 框架的 HTTP 服務(wù)的 控制器 中來配置一個(gè)基本的服務(wù)端:

配置主服務(wù)為 HTTP 服務(wù),然后我們可以在 App\HttpController\Index 控制器類下編寫 server 方法,編寫如下代碼實(shí)現(xiàn)服務(wù)端驗(yàn)證:

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\WeChat\Factory;

class Index extends Controller
{
    public function server()
    {
        $config = [
            // 微信公眾平臺后臺的 appid
            'appId' => 'wxefe41fdeexxxxxx',

            // 微信公眾平臺后臺配置的 Token
            'token' => 'dczmnau31ea9nzcnxxxxxxxxx',

            // 微信公眾平臺后臺配置的 EncodingAESKey
            'aesKey' => 'easyswoole'
        ];

        $officialAccount = Factory::officialAccount($config);

        $server = $officialAccount->server;

        /** @var \Psr\Http\Message\ServerRequestInterface $psr7Request */
        $psr7Request = $this->request();

        /**
         * @var \Psr\Http\Message\ResponseInterface $replyResponse
         * forceValidate() 表示啟用請求驗(yàn)證,以確保請求來自微信發(fā)送。默認(rèn)不啟用驗(yàn)證
         * serve() 會解析本次請求后回調(diào)之前注冊的事件(包括 AES 解密和解析 XML)
         * serve() 接受一個(gè)顯式實(shí)現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
         */
        $replyResponse = $server->forceValidate()->serve($psr7Request);

        /**
         * $replyResponse 是一個(gè)顯式實(shí)現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應(yīng)給微信
         * 下面是一個(gè)使用 EasySwoole 的響應(yīng)方法
         */
        $this->response()->withStatus($replyResponse->getStatusCode());

        /**
         * PSR-7 的 Header 并不是單純的 k => v 結(jié)構(gòu)
         */
        foreach ($replyResponse->getHeaders() as $name => $values) {
            $this->response()->withHeader($name, implode(", ", $values));
        }

        $this->response()->write($replyResponse->getBody()->__toString());
    }
}

使用原生 Swoole 配置服務(wù)端驗(yàn)證

server.php 的實(shí)現(xiàn)形式我就以原生 Swoolehttp_server 來啟動(dòng)一個(gè)服務(wù),偽代碼內(nèi)容如下:

<?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',

        // 微信公眾平臺后臺配置的 EncodingAESKey
        'aesKey' => 'easyswoole'
    ];

    $officialAccount = Factory::officialAccount($config);

    $server = $officialAccount->server;

    // 此處為實(shí)現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
    /** @var \Psr\Http\Message\ServerRequestInterface $psr7Request  */
    $psr7Request = new XxxReuest($request); // 偽代碼

    /**
     * @var \Psr\Http\Message\ResponseInterface $replyResponse
     * forceValidate() 表示啟用請求驗(yàn)證,以確保請求來自微信發(fā)送。默認(rèn)不啟用驗(yàn)證
     * serve() 會解析本次請求后回調(diào)之前注冊的事件(包括 AES 解密和解析 XML)
     * serve() 接受一個(gè)顯式實(shí)現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
     */
    $replyResponse = $server->forceValidate()->serve($psr7Request);

    /**
     * $replyResponse 是一個(gè)顯式實(shí)現(xiàn)了 PSR-7 的對象,用戶只需要處理該對象即可正確響應(yīng)給微信
     * 下面是一個(gè)原生 swoole 的響應(yīng)方法
     */
    $response->status($replyResponse->getStatusCode());

    /**
     * PSR-7 的 Header 并不是單純的 k => v 結(jié)構(gòu)
     */
    foreach ($replyResponse->getHeaders() as $name => $values) {
        $response->header($name, implode(", ", $values));
    }

    // 將響應(yīng)輸出到客戶端
    $response->write($replyResponse->getBody()->__toString());
});

$http->start();

上述 $psr7Request 請用戶參考 PSR-7 標(biāo)準(zhǔn)自行實(shí)現(xiàn) Psr\Http\Message\ServerRequestInterface 接口。

注意:安全模式下請一定要配置 aesKey。

很簡單,一個(gè)服務(wù)端帶驗(yàn)證功能的代碼已經(jīng)完成,當(dāng)然我們沒有對消息做處理,別著急,后面我們再講。

我們先來分析上面的代碼:

<?php

// 引入我們的主項(xiàng)目工廠類
use EasySwoole\WeChat\Factory;

// 一些配置
$config = [...];

// 使用配置來初始化一個(gè)公眾號應(yīng)用實(shí)例
$officialAccount = Factory::officialAccount($config);

// 得到一個(gè) Server\Guard $server 實(shí)例
$server = $officialAccount->server;

// 構(gòu)造 實(shí)現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
// 此處為實(shí)現(xiàn)了 \Psr\Http\Message\ServerRequestInterface 的 request 對象
/** @var \Psr\Http\Message\ServerRequestInterface $psr7Request  */
$psr7Request = new XxxReuest($request); // 偽代碼

// 得到一個(gè)實(shí)現(xiàn)了 `Psr\Http\Message\ResponseInterface` 接口的 response 響應(yīng)實(shí)例對象
$replyReponse = $server->forceValidate()->serve($psr7Request);

### 構(gòu)建 Swoole 響應(yīng)給到客戶端
// 設(shè)置響應(yīng) HTTP 狀態(tài)碼
$response->status($replyResponse->getStatusCode());
// 設(shè)置響應(yīng)頭 Header
foreach ($replyResponse->getHeaders() as $name => $values) {
    $response->header($name, implode(", ", $values));
}
// 將響應(yīng)輸出到客戶端
$response->write($replyResponse->getBody()->__toString());

最后這一行我有必要詳細(xì)講一下:

  • 我們的 $server->forceValidate()->serve($psr7Request); 就是執(zhí)行服務(wù)端業(yè)務(wù)了,那么它的返回值是一個(gè)實(shí)現(xiàn)了 Psr\Http\Message\ResponseInterface 接口的實(shí)例對象。
  • 我這里是直接調(diào)用了 Swoole 原生的響應(yīng)方法 write()。在一些的 Swoole 相關(guān)的框架中,你可以直接拿到 $replyResponse 實(shí)例對象進(jìn)行相關(guān)的操作,然后輸出到客戶端即可。在 EasySwoole 中,可以直接使用上文示例的方法操作即可輸出到客戶端。

OK,有了上面的代碼,那么請你按 微信官方的接入指引 在公眾號后臺完成配置并啟用,并相應(yīng)修改上面的 $config 的相關(guān)配置。

URL 就是我們的 http://easyswoolewechat.com/server,這里我是舉例哦,你可不要填寫我的域名。由于我使用的是 Swoole9501 端口提供服務(wù),請用戶自行進(jìn)行反向代理配置,具體如何配置反向代理請看 EasySwoole 反向代理。

請一定要將微信后臺的開發(fā)者模式 ”啟用” ?。。。。。】吹郊t色 “停用” 才真正的是啟用了。最后,請不要用瀏覽器訪問這個(gè)地址,它是給微信服務(wù)器訪問的,不是給人訪問的。

接收 & 回復(fù)用戶消息

上述完成服務(wù)端驗(yàn)證通過后,接下來我們就來試一下接收消息吧。

在剛剛上文代碼最后一行使用 $this->response()->write($replyResponse->getBody()->__toString()); (在 EasySwoole 框架中響應(yīng)) 或 使用 $response->write($replyResponse->getBody()->__toString()); (原生 Swoole 響應(yīng)); 在前面,現(xiàn)在我們調(diào)用 $officialAccount->serverpush() 方法來注冊一個(gè)消息處理器,這里用到了 PHP 閉包 的知識,如果你不熟悉趕緊補(bǔ)課去。

EasySwooleApp\HttpController\Index.php 實(shí)現(xiàn):

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\WeChat\Factory;

class Index extends Controller
{

    public function server()
    {
        // 這里省略 

        $server = $officialAccount->server;

        /** 注冊消息事件回調(diào) */
        $server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
            return new \EasySwoole\WeChat\Kernel\Messages\Text("您好!歡迎使用 EasySwoole WeChat!");
        });

        $psr7Request = $this->request();
        /** @var \Psr\Http\Message\ResponseInterface $replyResponse */
        $replyResponse = $server->forceValidate()->serve($psr7Request);

        $this->response()->withStatus($replyResponse->getStatusCode());
        foreach ($replyResponse->getHeaders() as $name => $values) {
            $this->response()->withHeader($name, implode(", ", $values));
        }

        // 將響應(yīng)輸出到客戶端
        $this->response()->write($replyResponse->getBody()->__toString());
    }
}

原生 Swoole 中單獨(dú)實(shí)現(xiàn) server.php

<?php

use EasySwoole\WeChat\Factory;

require_once __DIR__ . '/vendor/autoload.php';

// 這里省略

$http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {

    // 這里省略

    $server = $officialAccount->server;

    /** 注冊消息事件回調(diào) */
    $server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
        return new \EasySwoole\WeChat\Kernel\Messages\Text("您好!歡迎使用 EasySwoole WeChat!");
    });

    /** @var \Psr\Http\Message\ServerRequestInterface $psr7Request  */
    $psr7Request = new XxxReuest($request); // 偽代碼

    $replyResponse = $server->forceValidate()->serve($psr7Request);
    $response->status($replyResponse->getStatusCode());
    foreach ($replyResponse->getHeaders() as $name => $values) {
        $response->header($name, implode(", ", $values));
    }

    // 將響應(yīng)輸出
    $response->write($replyResponse->getBody()->__toString());
});

// 這里省略

OK,打開你的微信客戶端,向你的公眾號發(fā)送任意一條消息,你應(yīng)該會收到回復(fù):您好!歡迎使用 EasySwoole WeChat!。

如果您沒有收到回復(fù),但是看到了 “你的公眾號暫時(shí)無法提供服務(wù)”,好,那檢查一下你的日志吧,日志在哪兒?我們的配置里寫了日志路徑了(sys_get_temp_dir() . '/wechat.log')。沒有這個(gè)文件?看看權(quán)限。

一個(gè)基本的服務(wù)端驗(yàn)證就完成了。

總結(jié)

所有的應(yīng)用服務(wù)都通過主入口 EasySwoole\WeChat\Factory 類來創(chuàng)建:

<?php

use EasySwoole\WeChat\Factory;

// 公眾號
$officialAccount = Factory::officialAccount($config);

// 小程序
$miniProgram = Factory::miniProgram($config);

// 開放平臺
$openPlatform = Factory::openPlatform($config);

// 企業(yè)微信
$work = Factory::work($config);

最后

希望您在使用本 SDK 的時(shí)候如果您發(fā)現(xiàn) SDK 的不足,歡迎提交 PR 或者給我們 提建議 & 報(bào)告問題

主站蜘蛛池模板: 远红外桑拿房-江苏侨达健康科技有限公司| 石墨热场|PECVD石墨舟|碳碳框|燃料电池双极板|半导体石墨|光纤用石墨模具|石墨电极加工|石墨制品|上海弘竣新能源材料有限公司 | 山东淄博海杰化工有限公司-淄博海杰化工_NP-10、OP-10、吐温80、司盘80、磺酸、油酸等乳化剂 | 青岛熔喷过滤芯_青岛过滤器生产厂家_青岛净水滤料厂家_青岛净达过滤技术有限公司 | 冷却塔厂家_冷却塔降噪维修_闭式冷却塔维修改造厂家-广东特菱空调 | 环球医网 | 带来健康生活... | 网站建设-百度SEO关键词优化与企业全网营销推广服务-启源信息 | 亚澳农机-亚澳南阳农机股份公司,旋耕机,旋播机,旋播施肥机,免耕播种机,旋耕播草多用机,果园机械-首页 | 上海祝融起重机械有限公司-德国耶鲁手拉葫芦|耶鲁手拉葫芦|耶鲁手扳葫芦|耶鲁电动葫芦经销代理 | 住友套管总代理-日本住友套管-住友热缩管-上海弘奇电子科技有限公司 | 济宁三石工程机械有限公司-首页-小型起重机、环卫设备、小松配件 | 西藏旅游-西藏中旅-西藏中旅国际旅行社 | 南京消防申报公司-江苏国消设备安装有限公司 | 泰安德兴元机械设备有限公司|网站首页 | 全自动圆木多片锯_立式圆木多片锯价格_大型圆木多片锯厂家-邢台友创机械制造有限公司 | 廊坊保安公司_廊坊市万帮保安服务有限公司 | 泰安led显示屏-泰安户外裸眼3D显示屏-扩声系统-舞台灯光机械-电子屏-肥城宁阳新泰东平-泰安市奇美特电子有限公司 | 呼和浩特新华互联网电脑培训学校| 收银系统_收银机_pos收款机_门店管理系统-客如云 | 水电站泵站LCU控制屏_发电机保护_变压器保护_逆功率保护_防孤岛保护装置_ 电力微机保护网 | 重大事件回顾:三亚哪里可以打炮?2025年最全实战攻略带你玩转真枪射击 | 欧美日韩人妻精品一区二区三区_欧美成人精品欧美一级乱黄_亚洲欧美日韩高清一区二区三区_国产一级做a爰片久久毛片_日韩一级视频在线观看播放_精品一区二区三区免费毛片爱_完整观看高清秒播国内外精品资源 | 浙江健朗-舒华跑步机|公园运动器材|商用健身设备|户外健身器材厂家 | 贴片磁胶电感_一体成型电感_贴片共模电感_广东精密龙电子科技有限公司 | 山东胜王水处理设备有限公司,反渗透设备,纯净水设备,污水处理设备,SWS系列全自动钠离子交换器,纯净水设备报价,活性碳过滤器,多介质过滤器 | 商用车之家——观点有态度 热点不缺席 靠谱的商用车门户网站 | 上海熙隆光电科技有限公司-半导体激光器,一字线激光器,光纤耦合激光器,拉曼激光器 | 柚墨yomoer官网_PPT模板_工作总结PPT模板下载_个人简历模板 | 锦州龙威机械有限公司官网 ,锦州医药包装机,包装机,锦州包装机械,小袋颗粒装盒生产线,颗粒装盒生产线,软双铝装盒线,伺服颗粒 | 荆门市彩富机械有限责任公司|精铸件|五金|机械配件 | 南通搬运公司|吊车租赁|大件吊装|设备搬运|工厂搬迁|起重吊装搬运-顺林搬运 | 医用空气净化消毒机,医用床单位消毒机,无磁空气消毒机,紫外线空气消毒机厂家-南昌市扬帆环保设备有限公司 | 西安西雷脉冲功率技术有限公司-高压调制器/加速器与脉冲功率系统的研发/生产/应用推广/高压脉冲电源的应用研究/设计/生产和销售/高功率脉冲器件/材料与仪器设备的研发/生产和销售/高电压/大电流/强磁场环境的模拟及测试服务/会议会展服务/货物及进出口的业务/脉冲功率技术领域类的技术转让 | 破碎机设备-锤式颚式反击式圆锥移动冲击式破碎机厂家-成都大宏立机器公司 | 开水机-节能开水器-即热式开水器-上海捷水环保科技有限公司 | 铸铁平台-焊接平台-划线平台-三维焊接平台厂家-泊头市溪海冶金机械设备有限公司 | 机器人码垛机-纸箱套袋机-水平缠绕机-贴标机-开箱机-装盒机-杭州贝立智能设备有限公司 | 星干线艺考_导演艺考培训班_播音主持艺考_表演艺考培训班-助你考上北京电影学院影视表演系 | 智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒 | 五金冲压厂家_五金冲压件加工_微细孔加工-深圳市浩鑫精密五金制品有限公司 | 垃圾桶_垃圾桶厂家_临沂市旭宏塑料有限公司 |