duzhenlin / iopenwechat
微信开放平台
Requires
- php: >=7.3
- ext-openssl: *
- doctrine/cache: ^1.0
- guzzlehttp/guzzle: ^6.5.8
- pimple/pimple: ~3.0
- symfony/http-foundation: ^5.4.50
Requires (Dev)
- mockery/mockery: ^1.0@dev
- phpunit/phpunit: ~4.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
微信开放平台。
环境要求
- PHP >= 7.3
- composer
- openssl 扩展
SDK 对所使用的框架并无特别要求
安装
composer require duzhenlin/iopenwechat
强制加密回调
生产环境建议在服务端配置中开启 force_encrypt:
$app = new \IopenWechat\Core\App([ 'appid' => '平台 AppID', 'appsecret' => '平台 AppSecret', 'token' => '回调 Token', 'encodingAesKey' => '回调 EncodingAESKey', 'force_encrypt' => true, ]);
开启后,消息正文必须通过 AES 验签解密才能进入业务处理。缺少 encrypt_type、
传入其他模式或伪造签名都不能将处理降级为明文。合法加密消息即使没有携带
encrypt_type=aes,也会按服务端策略验签解密。包含业务内容的回复同样加密;
微信协议允许的空回复 success 保持原样。加密失败会抛出现有 FaultException,
不会返回未加密的业务内容。
force_encrypt 是布尔配置,默认 false,仅用于保留旧版本的模式选择行为。
默认值不提供强制加密保护;已使用加密回调的生产系统应显式设置为 true。
它不替代图片下载地址限制或基于可信客户端地址的回调 IP 白名单。
如直接实例化消息服务,也可通过第四个构造参数开启:
$message = new \IopenWechat\Message\Message($wxcrypt, $request, $xml, true);
安全回归测试:
php vendor/phpunit/phpunit/phpunit --bootstrap vendor/autoload.php tests/MessageEncryptionTest.php
微信服务器 IP 列表
// $app 为上面初始化的第三方平台实例,自动复用 component_access_token 及其缓存。 $callbackIps = $app->basic->getCallbackIp()['ip_list']; $apiIps = $app->basic->getApiDomainIp()['ip_list'];
| 方法 | 微信接口 | 用途 |
|---|---|---|
getCallbackIp() |
获取微信推送服务器 IP | 微信向业务服务器推送消息时的来源 IP,用于回调来源白名单 |
getApiDomainIp() |
获取微信 API 服务器 IP | 业务服务器调用 api.weixin.qq.com 时的目标 IP,用于出站访问限制 |
两个方法都返回 SDK 统一的 Collection,其中 ip_list 为 IP 或网段列表,原样保留微信返回内容。
接口使用 HTTPS GET,查询参数为 access_token,值由现有平台凭据服务自动获取。
微信错误码沿用 HttpException 抛出,网络错误同样向调用方传递,不会被转换为空名单。
SDK 每次调用都会请求微信获取最新名单;名单的持久化和白名单更新由业务系统负责。 微信建议每天刷新一次。更新前应校验名单非空且格式有效,失败时保留上一份有效配置, 不要把获取失败或空名单解释为允许所有来源。不要长期将 API 域名固定到旧 IP。 域名前经过 CDN 或代理时,白名单校验必须使用经过可信代理配置还原的客户端地址。 这两个方法仅提供名单查询,不会自动拦截回调,也不能替代强制加密验签。
SDK 回归测试:
php vendor/phpunit/phpunit/phpunit --bootstrap vendor/autoload.php tests
贡献代码
License
MIT