HasWechatEncryption.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. declare(strict_types=1);
  3. namespace Yansongda\Pay\Traits;
  4. use Yansongda\Pay\Exception\ContainerException;
  5. use Yansongda\Pay\Exception\Exception;
  6. use Yansongda\Pay\Exception\InvalidConfigException;
  7. use Yansongda\Pay\Exception\InvalidParamsException;
  8. use Yansongda\Pay\Exception\InvalidResponseException;
  9. use Yansongda\Pay\Exception\ServiceNotFoundException;
  10. use function Yansongda\Pay\get_wechat_config;
  11. use function Yansongda\Pay\reload_wechat_public_certs;
  12. trait HasWechatEncryption
  13. {
  14. /**
  15. * @throws ContainerException
  16. * @throws InvalidConfigException
  17. * @throws InvalidParamsException
  18. * @throws InvalidResponseException
  19. * @throws ServiceNotFoundException
  20. */
  21. public function loadSerialNo(array $params): array
  22. {
  23. $config = get_wechat_config($params);
  24. if (empty($config['wechat_public_cert_path'])) {
  25. reload_wechat_public_certs($params);
  26. $config = get_wechat_config($params);
  27. }
  28. if (empty($params['_serial_no'])) {
  29. mt_srand();
  30. $params['_serial_no'] = strval(array_rand($config['wechat_public_cert_path']));
  31. }
  32. return $params;
  33. }
  34. /**
  35. * @throws ContainerException
  36. * @throws InvalidParamsException
  37. * @throws ServiceNotFoundException
  38. */
  39. public function getPublicKey(array $params, string $serialNo): string
  40. {
  41. $config = get_wechat_config($params);
  42. $publicKey = $config['wechat_public_cert_path'][$serialNo] ?? null;
  43. if (empty($publicKey)) {
  44. throw new InvalidParamsException(Exception::WECHAT_SERIAL_NO_NOT_FOUND, 'Wechat serial no not found: '.$serialNo);
  45. }
  46. return $publicKey;
  47. }
  48. }