'referenceId', 'payment_token' => 'paymentToken', 'payment_method_id' => 'paymentMethodId', 'client_ip' => 'clientIp', 'merchant_customer_id' => 'merchantCustomerId', ); private static $paymentDataSerializerMap = array( PaymentMethodType::BANK_CARD => 'serializePaymentDataBankCard', PaymentMethodType::YOO_MONEY => 'serializePaymentDataYooMoney', PaymentMethodType::APPLE_PAY => 'serializePaymentDataMobile', PaymentMethodType::GOOGLE_PAY => 'serializePaymentDataGooglePay', PaymentMethodType::SBERBANK => 'serializePaymentDataSberbank', PaymentMethodType::ALFABANK => 'serializePaymentDataAlfabank', PaymentMethodType::WEBMONEY => 'serializePaymentData', PaymentMethodType::QIWI => 'serializePaymentDataMobilePhone', PaymentMethodType::CASH => 'serializePaymentDataMobilePhone', PaymentMethodType::MOBILE_BALANCE => 'serializePaymentDataMobilePhone', PaymentMethodType::INSTALLMENTS => 'serializePaymentData', PaymentMethodType::B2B_SBERBANK => 'serializePaymentDataB2BSberbank', PaymentMethodType::TINKOFF_BANK => 'serializePaymentData', PaymentMethodType::WECHAT => 'serializePaymentData', PaymentMethodType::SBP => 'serializePaymentData', PaymentMethodType::SBER_LOAN => 'serializePaymentData', PaymentMethodType::SBER_BNPL => 'serializePaymentDataMobilePhone', PaymentMethodType::ELECTRONIC_CERTIFICATE => 'serializePaymentDataElectronicCertificate', PaymentMethodType::ALFA_PAY => 'serializePaymentData', ); /** * Формирует ассоциативный массив данных из объекта запроса * * @param CreatePaymentRequestInterface $request Объект запроса * @return array Массив данных для дальнейшего кодирования в JSON */ public function serialize(CreatePaymentRequestInterface $request) { $result = array(); if ($request->getAmount()->getValue() > 0) { $result['amount'] = $this->serializeAmount($request->getAmount()); } if ($request->hasTransfers()) { $result['transfers'] = $this->serializeTransfers($request->getTransfers()); } if ($request->hasDescription()) { $result['description'] = $request->getDescription(); } if ($request->hasReceipt() && $request->getReceipt()->notEmpty()) { $result['receipt'] = $request->getReceipt()->toArray(); } if ($request->hasRecipient()) { $result['recipient'] = $request->getRecipient()->toArray(); } if ($request->hasPaymentMethodData()) { $method = self::$paymentDataSerializerMap[$request->getPaymentMethodData()->getType()]; $result['payment_method_data'] = $this->{$method}($request->getPaymentMethodData()); } if ($request->hasConfirmation()) { $confirmation = $request->getConfirmation(); $result['confirmation'] = $this->serializeConfirmation($confirmation); } if ($request->hasMetadata()) { $result['metadata'] = $request->getMetadata()->toArray(); } if ($request->hasCapture()) { $result['capture'] = $request->getCapture(); } if ($request->hasSavePaymentMethod()) { $result['save_payment_method'] = $request->getSavePaymentMethod(); } if ($request->hasAirline()) { $result['airline'] = $request->getAirline()->toArray(); } if ($request->hasDeal()) { $result['deal'] = $request->getDeal()->toArray(); } foreach (self::$propertyMap as $name => $property) { $value = $request->{$property}; if (!empty($value)) { $result[$name] = $value; } } return $result; } private function serializeConfirmation(AbstractConfirmationAttributes $confirmation) { $result = array( 'type' => $confirmation->getType(), ); if ($locale = $confirmation->getLocale()) { $result['locale'] = $locale; } if ($confirmation->getType() === ConfirmationType::REDIRECT) { /** @var ConfirmationAttributesRedirect $confirmation */ if ($confirmation->getEnforce()) { $result['enforce'] = $confirmation->getEnforce(); } $result['return_url'] = $confirmation->getReturnUrl(); } if ($confirmation->getType() === ConfirmationType::MOBILE_APPLICATION) { $result['return_url'] = $confirmation->getReturnUrl(); } return $result; } private function serializeAmount(AmountInterface $amount) { return array( 'value' => $amount->getValue(), 'currency' => $amount->getCurrency(), ); } private function serializePaymentDataBankCard(PaymentDataBankCard $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getCard() !== null) { $result['card'] = array( 'cardholder' => $paymentData->getCard()->getCardholder(), 'expiry_year' => $paymentData->getCard()->getExpiryYear(), 'expiry_month' => $paymentData->getCard()->getExpiryMonth(), 'number' => $paymentData->getCard()->getNumber(), 'csc' => $paymentData->getCard()->getCsc(), ); } return $result; } private function serializePaymentDataYooMoney(PaymentDataYooMoney $paymentData) { $result = array( 'type' => $paymentData->getType(), ); return $result; } private function serializePaymentDataMobile(AbstractPaymentData $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getPaymentData() !== null) { $result['payment_data'] = $paymentData->getPaymentData(); } return $result; } private function serializePaymentDataSberbank(PaymentDataSberbank $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getPhone() !== null) { $result['phone'] = $paymentData->getPhone(); } return $result; } private function serializePaymentDataAlfabank(PaymentDataAlfabank $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getLogin() !== null) { $result['login'] = $paymentData->getLogin(); } return $result; } private function serializePaymentData(AbstractPaymentData $paymentData) { return array( 'type' => $paymentData->getType(), ); } private function serializePaymentDataMobilePhone(AbstractPaymentData $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getPhone() !== null) { $result['phone'] = $paymentData->getPhone(); } return $result; } /** * @param PaymentDataGooglePay $paymentData * * @return array */ private function serializePaymentDataGooglePay(PaymentDataGooglePay $paymentData) { $result = array( 'type' => $paymentData->getType(), 'payment_method_token' => $paymentData->getPaymentMethodToken(), 'google_transaction_id' => $paymentData->getGoogleTransactionId(), ); return $result; } /** * @param PaymentDataB2bSberbank $paymentData * * @return array */ private function serializePaymentDataB2BSberbank(PaymentDataB2bSberbank $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getPaymentPurpose() !== null) { $result['payment_purpose'] = $paymentData->getPaymentPurpose(); } if ($paymentData->getVatData() !== null) { $vatData = array( 'type' => $paymentData->getVatData()->getType(), ); if ($paymentData->getVatData()->getRate() !== null) { $vatData['rate'] = $paymentData->getVatData()->getRate(); } if ($paymentData->getVatData()->getAmount() !== null) { $vatData['amount'] = $this->serializeAmount($paymentData->getVatData()->getAmount()); } $result['vat_data'] = $vatData; } return $result; } /** * @param TransferInterface[] $transfers * * @return array */ private function serializeTransfers(array $transfers) { $result = array(); foreach ($transfers as $transfer) { $item = array( 'account_id' => $transfer->getAccountId(), 'amount' => $this->serializeAmount($transfer->getAmount()), 'status' => $transfer->getStatus(), ); if ($transfer->hasPlatformFeeAmount()) { $item['platform_fee_amount'] = $this->serializeAmount($transfer->getPlatformFeeAmount()); } if ($transfer->hasDescription()) { $item['description'] = $transfer->getDescription(); } if ($transfer->hasMetadata()) { $item['metadata'] = $transfer->getMetadata()->toArray(); } $result[] = $item; } return $result; } /** * @param PaymentDataElectronicCertificate $paymentData * * @return array */ private function serializePaymentDataElectronicCertificate(PaymentDataElectronicCertificate $paymentData) { $result = array( 'type' => $paymentData->getType(), ); if ($paymentData->getCard() !== null) { $result['card'] = array( 'cardholder' => $paymentData->getCard()->getCardholder(), 'expiry_year' => $paymentData->getCard()->getExpiryYear(), 'expiry_month' => $paymentData->getCard()->getExpiryMonth(), 'number' => $paymentData->getCard()->getNumber(), 'csc' => $paymentData->getCard()->getCsc(), ); } if ($paymentData->getElectronicCertificate() !== null) { $electronicCertificate = $paymentData->getElectronicCertificate(); $result['electronic_certificate'] = array( 'amount' => $this->serializeAmount($electronicCertificate->getAmount()), 'basket_id' => $electronicCertificate->getBasketId(), ); } if ($paymentData->getArticles() !== null) { $articles = array(); foreach ($paymentData->getArticles() as $article) { $articleData = array( 'article_number' => $article->getArticleNumber(), 'tru_code' => $article->getTruCode(), 'article_name' => $article->getArticleName(), 'quantity' => $article->getQuantity(), 'price' => $this->serializeAmount($article->getPrice()), ); if ($article->getArticleCode() !== null) { $articleData['article_code'] = $article->getArticleCode(); } if ($article->getMetadata() !== null) { $articleData['metadata'] = $article->getMetadata()->toArray(); } $articles[] = $articleData; } $result['articles'] = $articles; } return $result; } }