tourze/wechat-mini-program-custom-service-bundle
Symfony bundle for integrating WeChat Mini Program customer service (custom service) capabilities into PHP applications. Provides service wiring and APIs to manage customer service sessions and message exchange, helping connect your backend to WeChat’s customer service workflow.
Note: the 0.1.0 release notes contain only a compare link with no changelog body, so this assessment is derived from package metadata and the
0.0.2 → 0.1.0cadence rather than from documented changes. Treat version-specific claims as unverified until you read the diff.
composer.json first, not the README. Tourze publishes Symfony bundles, not Laravel packages. Check for symfony/framework-bundle, symfony/dependency-injection, doctrine/orm, and tourze/* siblings. If those are hard requirements, this is not a composer require-and-go dependency in a Laravel app — you'll be pulling Symfony's kernel, DI compiler passes, and possibly Doctrine into an Illuminate container that doesn't run them.*CustomService* / *Service and for the WeChat endpoints /cgi-bin/message/custom/send and /cgi-bin/token. That's the entire functional surface: exchange credentials for an access_token, then POST a JSON message body to a specific openid.config/wechat.php to publish.If you only need to call the WeChat custom-service API from Laravel, you are likely better off with a thin Guzzle/Http:: wrapper than adopting this bundle. Adopt it if you are already inside a Symfony runtime or a Tourze bundle stack.
access_token per app (7200s TTL, and fetching a new one invalidates the old). Whatever this bundle does internally, ensure you are not calling token acquisition per-request. Wrap it in a cache with a mutex/short lock; concurrent refreshes cause 40001 storms.CustomerServiceSender interface in your app with sendText(string $openid, string $text): void and bind the bundle's service behind it. Given the 0.x version and empty changelog, this insulation layer is what makes the next release cheap to absorb.$tries/backoff rather than inline in a request. Classify failures: retryable (-1 system busy, 45047 rate limit) vs. terminal (45015 outside 48h window, 43004 not followed, 40003 bad openid).45015.ServiceProvider, no Facade, no config publishing, no auto-discovery. This is the single largest source of friction and the reason 0.1.0's changes are hard to assess from the notes alone.0.0.2 → 0.1.0 with no changelog body means you cannot diff intent. Pin the exact version in composer.json ("0.1.0", not ^0.1) and review the diff before bumping.40164 — a classic false "the package is broken" signal.JSON_UNESCAPED_UNICODE is worth setting for readable logs) and that any XML parser handles CDATA.errcode, not the status code. If the bundle's HTTP client only throws on non-2xx, failures will pass silently. Log the raw body.45015 is a state bug, not an API bug. Almost every "message won't send" report is the 48-hour window. Track inbound timestamps and refuse to enqueue sends you know will fail.*Interface / *Aware) before forking — a decorator on a TokenProviderInterface is far cheaper than a patch.How can I help you explore Laravel packages today?