public function send(ApiClient $apiClient, array $data) : PaymentResponse
 {
     if (array_key_exists('resultCode', $data) && is_numeric($data['resultCode'])) {
         $data['resultCode'] = (int) $data['resultCode'];
     }
     if (array_key_exists('paymentStatus', $data) && is_numeric($data['paymentStatus'])) {
         $data['paymentStatus'] = (int) $data['paymentStatus'];
     }
     $response = $apiClient->createResponseByData($data, new SignatureDataFormatter(['payId' => null, 'dttm' => null, 'resultCode' => null, 'resultMessage' => null, 'paymentStatus' => null, 'authCode' => null, 'merchantData' => null]));
     $data = $response->getData();
     return new PaymentResponse($data['payId'], DateTimeImmutable::createFromFormat('YmdHis', $data['dttm']), new ResultCode($data['resultCode']), $data['resultMessage'], isset($data['paymentStatus']) ? new PaymentStatus($data['paymentStatus']) : null, $data['authCode'] ?? null, isset($data['merchantData']) ? base64_decode($data['merchantData']) : null);
 }
 public function testCreateResponseByData()
 {
     $data = ['signature' => 'abc', 'foo' => 123, 'bar' => 456];
     $cryptoService = $this->getMockBuilder(CryptoService::class)->disableOriginalConstructor()->getMock();
     $cryptoService->expects(self::any())->method('verifyData')->willReturn(true);
     $apiClientDriver = $this->getMockBuilder(ApiClientDriver::class)->getMock();
     /** @var CryptoService $cryptoService */
     /** @var ApiClientDriver $apiClientDriver */
     $apiClient = new ApiClient($apiClientDriver, $cryptoService);
     $response = $apiClient->createResponseByData($data, new SignatureDataFormatter([]));
     unset($data['signature']);
     $this->assertInstanceOf(Response::class, $response);
     $this->assertSame(ResponseCode::S200_OK, $response->getResponseCode()->getValue());
     $this->assertEquals([], $response->getHeaders());
     $this->assertEquals($data, $response->getData());
 }