<?php declare(strict_types=1); namespace Yansongda\Pay\Plugin\Unipay; use Closure; use Yansongda\Pay\Contract\PluginInterface; use Yansongda\Pay\Direction\NoHttpRequestDirection; use Yansongda\Pay\Exception\ContainerException; use Yansongda\Pay\Exception\Exception; use Yansongda\Pay\Exception\InvalidConfigException; use Yansongda\Pay\Exception\InvalidResponseException; use Yansongda\Pay\Exception\ServiceNotFoundException; use Yansongda\Pay\Logger; use Yansongda\Pay\Rocket; use Yansongda\Supports\Collection; use Yansongda\Supports\Str; use function Yansongda\Pay\verify_unipay_sign; class CallbackPlugin implements PluginInterface { /** * @throws ContainerException * @throws InvalidConfigException * @throws ServiceNotFoundException * @throws InvalidResponseException */ public function assembly(Rocket $rocket, Closure $next): Rocket { Logger::debug('[unipay][CallbackPlugin] 插件开始装载', ['rocket' => $rocket]); $this->formatPayload($rocket); $params = $rocket->getParams(); $signature = $params['signature'] ?? false; if (!$signature) { throw new InvalidResponseException(Exception::INVALID_RESPONSE_SIGN, '', $params); } verify_unipay_sign($params, $rocket->getPayload()->sortKeys()->toString(), $signature); $rocket->setDirection(NoHttpRequestDirection::class) ->setDestination($rocket->getPayload()) ; Logger::info('[unipay][CallbackPlugin] 插件装载完毕', ['rocket' => $rocket]); return $next($rocket); } protected function formatPayload(Rocket $rocket): void { $payload = (new Collection($rocket->getParams())) ->filter(fn ($v, $k) => 'signature' != $k && !Str::startsWith($k, '_')) ; $rocket->setPayload($payload); } }