AddPayloadSignPlugin.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. declare(strict_types=1);
  3. namespace Yansongda\Pay\Plugin\Jsb;
  4. use Closure;
  5. use Yansongda\Artful\Contract\PluginInterface;
  6. use Yansongda\Artful\Exception\ContainerException;
  7. use Yansongda\Artful\Exception\InvalidConfigException;
  8. use Yansongda\Artful\Exception\InvalidParamsException;
  9. use Yansongda\Artful\Exception\ServiceNotFoundException;
  10. use Yansongda\Artful\Logger;
  11. use Yansongda\Artful\Rocket;
  12. use Yansongda\Pay\Exception\Exception;
  13. use Yansongda\Supports\Collection;
  14. use function Yansongda\Pay\get_private_cert;
  15. use function Yansongda\Pay\get_provider_config;
  16. class AddPayloadSignPlugin implements PluginInterface
  17. {
  18. /**
  19. * @throws ContainerException
  20. * @throws InvalidConfigException
  21. * @throws InvalidParamsException
  22. * @throws ServiceNotFoundException
  23. */
  24. public function assembly(Rocket $rocket, Closure $next): Rocket
  25. {
  26. Logger::info('[Jsb][AddPayloadSignPlugin] 插件开始装载', ['rocket' => $rocket]);
  27. $params = $rocket->getParams();
  28. $config = get_provider_config('jsb', $params);
  29. $payload = $rocket->getPayload();
  30. if (empty($payload) || $payload->isEmpty()) {
  31. throw new InvalidParamsException(Exception::PARAMS_NECESSARY_PARAMS_MISSING, '参数异常: 缺少支付必要参数。可能插件用错顺序,应该先使用 `业务插件`');
  32. }
  33. $privateCertPath = $config['mch_secret_cert_path'] ?? '';
  34. if (empty($privateCertPath)) {
  35. throw new InvalidConfigException(Exception::CONFIG_JSB_INVALID, '配置异常: 缺少配置参数 -- [mch_secret_cert_path]');
  36. }
  37. $rocket->mergePayload([
  38. 'signType' => 'RSA',
  39. 'sign' => $this->getSignature(get_private_cert($privateCertPath), $payload),
  40. ]);
  41. Logger::info('[Jsb][AddPayloadSignPlugin] 插件装载完毕', ['rocket' => $rocket]);
  42. return $next($rocket);
  43. }
  44. protected function getSignature(string $pkey, Collection $payload): string
  45. {
  46. $content = $payload->sortKeys()->toString();
  47. openssl_sign($content, $signature, $pkey);
  48. return base64_encode($signature);
  49. }
  50. }