HandleAsyncRequestTrait.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\WechatPay\Trait;
  4. use GuzzleHttp\Exception\RequestException;
  5. use GuzzleHttp\Promise\PromiseInterface;
  6. use SixShop\WechatPay\Facade\WechatPayBuilder;
  7. use think\exception\ErrorException;
  8. use think\facade\Log;
  9. trait HandleAsyncRequestTrait
  10. {
  11. private function handleAsyncRequest(PromiseInterface|\Closure $promiseOrCallback, ...$args)
  12. {
  13. if ($promiseOrCallback instanceof \Closure) {
  14. $promise = $promiseOrCallback(WechatPayBuilder::getBuilderChainable(), WechatPayBuilder::getConfig(), ...$args);
  15. } else {
  16. $promise = $promiseOrCallback;
  17. }
  18. return $promise
  19. ->then(function ($response) {
  20. Log::info('微信支付异步回调返回数据:' . $response->getBody());
  21. return json_decode((string)$response->getBody());
  22. })
  23. ->otherwise(function ($e) {
  24. if ($e instanceof RequestException && $e->hasResponse()) {
  25. $content = $e->getResponse()->getBody()->getContents();
  26. Log::error('微信支付异步回调错误:' . $content);
  27. if (json_validate($content)) {
  28. $errorBody = json_decode($content);
  29. throw new ErrorException(severity: $e->getCode(), message: trim($errorBody->message));
  30. }
  31. }
  32. throw $e;
  33. })
  34. ->wait();
  35. }
  36. }