Search by

duzhenlin / iopenwechat

duzhenlin

微信开放平台

Package info

github.com/duzhenlin/iopenwechat

pkg:composer/duzhenlin/iopenwechat

Statistics

Installs: 108

Dependents: 0

Suggesters: 0

Stars: 2

Open Issues: 2

1.3.1 2026-10-19 03:25 UTC

This package is auto-updated.

Last update: 2026-11-04 01:04:55 UTC


README

微信开放平台。

环境要求

  1. PHP >= 7.3
  2. composer
  3. 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