后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载本篇基于 EasyWeChat 6.xPHP 微信 SDK的开放平台第三方平台模块围绕其官方示例文档整理出一套可直接落地的实战方案从 Laravel / Laravel Octane / webman 框架中接收开放平台推送消息、处理授权事件到 6.3.0 新增的 PC 版预授权流程以及基于 refresh_token / access_token 代公众号、代小程序调用 API甚至代公众号响应回调消息。读完你可以直接在现有 PHP 框架中复刻整套第三方平台接入流程。前置准备实例化开放平台对象示例中所有代码都基于一个已实例化的$app对象即EasyWeChat\OpenPlatform\Application。它需要开放平台账号的app_id、secret、token、aes_key四项核心配置具体实例化方式可参考 开放平台模块总览。需要注意不要把公众号/小程序的配置信息用来初始化开放平台对象。在 Laravel / webman 等框架项目中常见的做法是把配置放入config/wechatv6.php如wechatv6.open_platform键再通过new Application($config)创建实例use EasyWeChat\OpenPlatform\Application; $config config(wechatv6.open_platform); $app new Application($config);从源码结构看Application是一个工厂类所有模块服务端、客户端、ComponentAccessToken、VerifyTicket、账户信息等都从$app上按需访问见 src/OpenPlatform/Application.php。一、Laravel接收开放平台推送消息并处理授权事件开放平台第三方平台的所有事件推送授权成功、授权更新、授权取消、VerifyTicket都会推送到你设置的「授权事件接收 URL」。假设该 URL 为https://easywechat.com/open-platform在 Laravel 中只需在routes/web.php注册一个 POST 路由把请求直接交给$app-server-serve()// routes/web.php Route::post(open-platform, function () { // $app 为你实例化的开放平台对象此处省略实例化步骤 return $app-server-serve(); // Done! });⚠️ 注意该路由需要排除 CSRF 校验在 Laravel 的VerifyCsrfToken中间件白名单中排除该 URI。如果要处理具体事件例如「授权成功」可以注册handleAuthorized监听器$message为微信推送的通知内容EasyWeChat\OpenPlatform\Message实例不同事件内容字段不同// 处理授权事件 Route::post(open-platform, function () { $server $app-getServer(); // 处理授权成功事件其他事件同理 $server-handleAuthorized(function ($message) { // $message 为微信推送的通知内容不同事件不同内容详看微信官方文档 // 获取授权公众号 AppId $message[AuthorizerAppid] // 获取 AuthCode$message[AuthorizationCode] // 然后进行业务处理如存数据库等... }); return $server-serve(); });这里有几个值得注意的源码细节可印证 src/OpenPlatform/Server.phphandleAuthorized()、handleUnauthorized()、handleAuthorizeUpdated()分别对应InfoType为authorized、unauthorized、updateauthorized三个事件实现上通过中间件按InfoType分流见 src/OpenPlatform/Server.php官方示例中回调函数接收$message并直接使用$message[AuthorizerAppid]、$message[AuthorizationCode]取字段Message类继承自EasyWeChat\Kernel\Message支持数组式属性访问见 src/OpenPlatform/Message.phpserve()内部会先处理echostr服务端验证再解密推送消息并按中间件链处理事件最终返回success或加工后的响应见 src/OpenPlatform/Server.php。此外component_verify_ticket事件已被 SDK 默认处理getServer()每次被调用时会自动注入默认的 VerifyTicket 处理器把推送中的ComponentVerifyTicket写入缓存见 src/OpenPlatform/Application.php因此即使你不注册任何监听器直接serve()也能正常工作。二、Laravel OctaneSwoole长驻进程下的兼容写法Laravel Octane常配合 Swoole下请求对象与常规 FPM 生命周期不同需要把当前请求显式注入Application再交给服务端处理// routes/web.php use EasyWeChat\OpenPlatform\Application; // 授权事件回调地址http://easywechat.com/open-platform/server Route::post(open-platform/server, function () { $config config(wechatv6.open_platform); $app new Application($config); // 兼容octane $app-setRequestFromSymfonyRequest(request()); $server $app-getServer(); return $server-serve(); });关键点在于setRequestFromSymfonyRequest(request())Application内部通过InteractWithServerRequestTrait 持有 PSR-7 风格的请求对象见 src/OpenPlatform/Application.phpgetServer()构造的Server会从该请求中读取echostr、signature、timestamp、nonce、msg_signature等查询参数以及推送的 XML 消息体因此在 Swoole/Octane 这类「请求对象需手动绑定」的场景下显式注入当前请求是保证消息验签与解密正确的必要步骤。三、webman手动构造 Symfony Request 接收推送webman 同样需要把原生请求转换为Symfony\Component\HttpFoundation\Request后注入Application。示例中通过手动组装参数、Cookie、原始 Body 与 Header 实现namespace app\controller; use EasyWeChat\OpenPlatform\Application; use support\Request; use Symfony\Component\HttpFoundation\HeaderBag; use Symfony\Component\HttpFoundation\Request as SymfonyRequest; // 授权事件回调地址http://easywechat.com/openPlatform/server class OpenPlatform { public function server(Request $request) { $config config(wechatv6.open_platform); $app new Application($config); $symfony_request new SymfonyRequest($request-get(), $request-post(), [], $request-cookie(), [], [], $request-rawBody()); $symfony_request-headers new HeaderBag($request-header()); $app-setRequestFromSymfonyRequest($symfony_request); $server $app-getServer(); $response $server-serve(); return $response-getBody()-getContents(); } }这段代码把 webman 的support\Request中的 GET、POST、Cookie、原始请求体rawBody()推送的 XML 就在这里以及请求头完整搬运到 Symfony Request 上再通过setRequestFromSymfonyRequest()注入。返回时取$response-getBody()-getContents()以适配 webman 的响应格式。验签所需的signature等参数来自查询字符串头部则用于框架层面兼容二者缺一不可。四、开放平台 PC 版预授权流程6.3.0从 6.3.0 版本开始SDK 提供了createPreAuthorizationUrl()与createPreAuthorizationCode()可以一键生成预授权码并拼装授权页地址旧版本需要手动调微信接口拿预授权码再自行拼 URL。一个完整的 Laravel 预授权用例包含「授权落地页」与「授权跳转页」两个路由// routes/web.php // 授权落地页 Route::any(open-platform/auth, function(){ $auth_code request()-get(auth_code); // 完成授权写入数据库的逻辑省略。。。 })-name(open_platform.auth); // 授权跳转页 Route::any(open-platform/preauth, function(){ // $app 为你实例化的开放平台对象此处省略实例化步骤 $options[ //1 表示手机端仅展示公众号2 表示仅展示小程序3 表示公众号和小程序都展示。如果为未指定则默认小程序和公众号都展示。 // auth_type , // 指定的权限集id列表如果不指定则默认拉取当前第三方账号已经全网发布的权限集列表。 // category_id_list , ]; $url $app-createPreAuthorizationUrl(route(open_platform.auth), $options); return response(scriptwindow.location.href$url;/script)-header(Content-Type, text/html); });参数说明参数说明auth_type展示类型1手机端仅展示公众号2仅展示小程序3公众号和小程序都展示。不传则默认小程序和公众号都展示category_id_list指定的权限集 id 列表不指定则默认拉取当前第三方账号已全网发布的权限集列表从源码看createPreAuthorizationUrl(string $callbackUrl, array|string $optional [])的实现逻辑是见 src/OpenPlatform/Application.php若$optional是字符串则兼容旧版 API把它当作pre_auth_code使用若传入数组则自动调用createPreAuthorizationCode()获取pre_auth_code填充最终把pre_auth_code、component_appid、redirect_uri等参数拼装到https://mp.weixin.qq.com/cgi-bin/componentloginpage?...上。所以上面的示例即使不显式传pre_auth_code方法内部也会自动完成「创建预授权码 → 拼授权页地址」的全过程。授权完成后微信会携带auth_code与expires_in跳回落地页如https://easywechat.com/callback?auth_codexxxexpires_in600你可以用$app-getAuthorization($auth_code)换取授权方信息见 获取授权信息。五、代公众号 / 代小程序调用 API6.3.0第三方平台最常见的业务是代替已授权的公众号、小程序调用其接口。6.3.0 提供了两条便捷入口getOfficialAccountWithRefreshToken($appId, $refreshToken)传入公众号appid与授权时拿到的authorizer_refresh_token返回EasyWeChat\OfficialAccount\Application实例getMiniAppWithRefreshToken($appId, $refreshToken)同上返回EasyWeChat\MiniApp\Application实例。这两个方法内部都会先调用getAuthorizerAccessToken()其实现会对 token 做按 appid refresh_token 维度缓存缓存键为open-platform.authorizer_access_token.{appid}.{md5(refresh_token)}并以expires_in - 500秒的余量写入缓存未命中时才回源refreshAuthorizerToken()刷新见 src/OpenPlatform/Application.php因此高并发场景下不必担心频繁触发刷新接口的每日限额。一个同时演示「代小程序」和「代公众号」的 Laravel 控制器示例如下。首先配置路由// routes/web.php // 例如https://easywechat.com/open-platform/miniapp/get-phone-number/wx123212312313abc Route::any(open-platform/miniapp/get-phone-number/{appid}, OpenPlatformControllergetPhoneNumber); Route::any(open-platform/officialAccount/get-user-list/{appid}, OpenPlatformControllergetUsers);对应控制器app/Http/Controllers/OpenPlatformControlleruse App\Http\Controllers\Controller; class OpenPlatformController extends Controller { public function mini(string $appid): \EasyWeChat\MiniApp\Application { $refreshToken 授权后在缓存或数据库获取; // $app 为你实例化的开放平台对象此处省略实例化步骤 return $app-getMiniAppWithRefreshToken($appid, $refreshToken); } public function officialAccount(string $appid): \EasyWeChat\OfficialAccount\Application { $refreshToken 授权后在缓存或数据库获取; // $app 为你实例化的开放平台对象此处省略实例化步骤 return $app-getOfficialAccountWithRefreshToken($appid, $refreshToken); } public function getUsers(string $appid) { return $this-officialAccount($appid) -getClient() -get(cgi-bin/users/list) -toArray(); } public function getPhoneNumber(string $appid) { $data [ code (string) request()-get(code), ]; return $this-mini($appid) -getClient() -postJson(wxa/business/getuserphonenumber, $data) -toArray(); } }核心要点返回的Application实例可直接用-getClient()调用该公众号/小程序任意 APISDK 会自动携带代调用所需的authorizer_access_token代调用的小程序、公众号对象实际是EasyWeChat\MiniApp\Application与EasyWeChat\OfficialAccount\Application其 Client 的 token 来自AuthorizerAccessToken见 src/OpenPlatform/AuthorizerAccessToken.php并通过setAccessToken()注入见 src/OpenPlatform/Application.phpauthorizer_access_token有效期仅 2 小时SDK 内部通过缓存 自动刷新机制管理你只需持久化authorizer_refresh_token即可。除了 refresh_token 方式6.3.0 还支持直接使用authorizer_access_token的getOfficialAccountWithAccessToken()/getMiniAppWithAccessToken()适用于「独立中央授权服务单独维护授权信息」的架构旧版通过new AuthorizerAccessToken($appId, $token)getOfficialAccount()/getMiniApp()的方式官方示例中已标注不推荐使用。更多细节见 开放平台模块总览。六、代公众号处理回调事件第三方平台还可以代替公众号接收并响应用户发来的消息。示例中在同一个回调路由里根据 URL 中的{appid}取出对应授权方的 refresh_token构造公众号对象并注册消息监听器// 代公众号处理回调事件 Route::any(callback/{appid}, function ($appId) { // $app 为你实例化的开放平台对象此处省略实例化步骤 // $refreshToken 为授权后你缓存或数据库中的 authorizer_refresh_token此处省略获取步骤 $refreshToken 你已缓存或数据库中的 authorizer_refresh_token; $server $app-getOfficialAccountWithRefreshToken($appId, $refreshToken)-getServer(); $server-addMessageListener(text, function ($message) { return sprintf(你对 overtrue 说“%s”, $message-Content); }); return $server-serve(); });这里getOfficialAccountWithRefreshToken()返回的公众号对象自带getServer()服务端其加密参数token、aes_key、Encryptor会复用开放平台的配置见 src/OpenPlatform/Application.php因此代公众号回调同样走「验签 → 解密 → 消息监听器 → 加密回复」的完整链路。addMessageListener(text, ...)注册的是文本消息处理器$message-Content即用户发送的文本内容返回字符串即自动回复。更多服务端用法handleAuthorized/handleUnauthorized/handleAuthorizeUpdated/ 自定义中间件 /getDecryptedMessage等可参考 服务端使用文档。七、周边模块衔接与注意事项CSRF 排除开放平台事件推送与回调路由必须从 Laravel CSRF 白名单中排除否则会收到 419 响应VerifyTicket 默认处理component_verify_ticket事件由 SDK 默认写入缓存缓存键open_platform.verify_ticket.{app_id}见 src/OpenPlatform/VerifyTicket.phpComponentAccessToken的获取与刷新都依赖它见 src/OpenPlatform/ComponentAccessToken.php。若你自行接管 VerifyTicket 推送必须同时注入自定义ComponentAccessToken否则会因缺少 ticket 而无法换取component_access_tokentoken 缓存策略ComponentAccessToken以expires_in - 100秒写入缓存authorizer_access_token以expires_in - 500秒写入缓存均预留了时钟偏差余量请勿再手动缩短或重复刷新代调用入口公众号代调用详见 公众号模块小程序代调用详见 小程序模块普通 API 调用方式见 API Client 文档网页授权第三方应用/网站的网页授权通过$app-getOAuth()获取逻辑与公众号网页授权基本一致详见 网页授权授权码换授权信息$app-getAuthorization($authCode)返回的Authorization对象可依次取得getAppId()、getAccessToken()AuthorizerAccessToken实例、getRefreshToken()并支持toArray()/toJson()序列化便于落库对应实现见 src/OpenPlatform/Authorization.php。附如何验证与继续深入仓库中 tests/OpenPlatform/ApplicationTest.php 提供了上述能力的单元测试佐证test_get_authorization验证了换取授权信息时 POST 到cgi-bin/component/api_query_auth且请求体包含component_appid与authorization_codetest_refresh_authorizer_token验证了刷新令牌接口cgi-bin/component/api_authorizer_token的请求参数拼装test_get_official_account/test_get_mini_app验证了代调用返回的实例类型。接入时若遇到验签失败、消息解密异常或 token 类问题可对照这些测试与上述源码路径定位。想要继续完善本文示例欢迎按 贡献指南 向 EasyWeChat 文档仓库补充更多框架的接入用例。赞分享后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载相关推荐EasyWeChat 开放平台第三方平台代授权方公众号/小程序实现业务完整指南EasyWeChat 开放平台第三方平台代授权方公众号/小程序实现业务完整指南 授权方公众号、小程序把自己的账号授权给你的开放平台第三方平台之后你就后端即时通讯EasyWeChat 开放平台第三方平台代授权方开发指南一行代码获取公众号/小程序实例并代其执行业务EasyWeChat 开放平台第三方平台代授权方开发指南一行代码获取公众号/小程序实例并代其执行业务 本篇指南聚焦 EasyWeChat 开放平台第三方平台的后端即时通讯EasyWeChat 微信开放平台第三方平台开发指南事件推送监听、授权管理与 API 调用实战EasyWeChat 微信开放平台第三方平台开发指南事件推送监听、授权管理与 API 调用实战 本指南围绕 EasyWeChat 官方文档中的「微信开放平后端即时通讯上一篇球谐函数算子深度解析gauss-splat如何用Ascend C计算视角相关颜色Fwd/Bwd实现走读下一篇彻底解决分布式并发yudao-cloud基于Redisson实现跨服务锁机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考