NotifyService.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\Lakala\Service;
  4. use SixShop\Lakala\Config;
  5. use SixShop\Lakala\Log;
  6. use SixShop\Lakala\OpenAPISDK\V3\Api\LakalaNotifyApi;
  7. use SixShop\Lakala\OpenAPISDK\V3\Model\ModelTradeNotify;
  8. use SixShop\Lakala\PaymentProvider;
  9. use SixShop\Payment\Enum\PaymentStatusEnum;
  10. use SixShop\Payment\Model\ExtensionPaymentModel;
  11. use function SixShop\Core\error_response;
  12. use function SixShop\Core\throw_logic_exception;
  13. class NotifyService
  14. {
  15. private LakalaNotifyApi $notifyApi;
  16. public function __construct(private Config $config, private PaymentProvider $paymentProvider, private Log $log)
  17. {
  18. $this->notifyApi = new LakalaNotifyApi($this->config->getV3Config());
  19. }
  20. public function notify(): void
  21. {
  22. $headers = getallheaders();
  23. $body = file_get_contents('php://input');
  24. $this->log->debug('lakala notify headers:{headers} body:{body}', [
  25. 'headers' => json_encode($headers),
  26. 'body' => $body
  27. ]);
  28. $notify = $this->notifyApi->notiApi($headers, $body);
  29. $inBody = $notify->getOriginalText();
  30. if (!json_validate($inBody)) {
  31. throw_logic_exception('lakala notify json error');
  32. }
  33. $bodyArr = json_decode($inBody, true);
  34. $payment = ExtensionPaymentModel::where(['transaction_id' => $bodyArr['trade_no']])->findOrEmpty();
  35. if ($payment->isEmpty()) {
  36. throw_logic_exception('lakala notify transaction_id error');
  37. }
  38. if ($payment->status != PaymentStatusEnum::PENDING) {
  39. throw_logic_exception('lakala notify transaction_id status error');
  40. }
  41. $this->paymentProvider->query($payment->id);
  42. $this->log->debug('lakala notified success {transaction_id}', ['transaction_id' => $payment->transaction_id]);
  43. }
  44. }