Client.php 2.3 KB
<?php


namespace Lackoxygen\GzCbec;

use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\RequestOptions;
use Illuminate\Support\Arr;
use Lackoxygen\GzCbec\Contract\ClientInterface;
use Lackoxygen\GzCbec\Contract\RequestInterface;
use GuzzleHttp\Client as GuzzleHttp;
use Lackoxygen\GzCbec\Exception\Exception;
use Psr\Http\Message\ResponseInterface;

class Client implements ClientInterface
{
    /**
     * @var GuzzleHttp
     */
    protected $guzzleHttp;

    /**
     * @var RequestInterface
     */
    protected $request;

    /**
     * @var array
     */
    protected $config = [];

    protected function __construct(RequestInterface $request)
    {
        $this->guzzleHttp = new GuzzleHttp([
            'base_uri' => Arr::get($this->config, 'base_uri'),
            'verify'   => false
        ]);
        $this->request    = $request;
        $this->config     = config('gz-cbec');
    }

    /**
     * @param RequestInterface $request
     *
     * @return ClientInterface
     */
    protected static function make(RequestInterface $request): ClientInterface
    {
        return new static($request);
    }


    /**
     * @return ResponseInterface
     * @throws Exception
     */
    public function send(): ResponseInterface
    {
        $content = $this->request->getPacket()->getContent();
        try {
            $response = $this->guzzleHttp->request($this->request->getMethod(), $this->request->getPath(), [
                RequestOptions::FORM_PARAMS => [
                    'clientid'    => $this->config['record_sn'],
                    'key'         => $this->config['secret_key'],
                    'messageType' => $this->request->getMessageType(),
                    'messageText' => $content
                ]
            ]);
        } catch (GuzzleException $e) {
            throw new Exception($e);
        }

        return $response;
    }

    /**
     * @param RequestInterface $request
     *
     * @return array
     */
    public static function request(RequestInterface $request): array
    {
        $client = self::make($request);
        /**
         * @var ResponseInterface $response
         */
        $response = $client->send();

        $content = $response->getBody()->getContents();

        $response->getBody()->rewind();

        return (array)\json_decode($content, true);
    }
}