✏️ 正在编辑: payment.php
路径:
/home/bpioifn/www/pigmentse/modules/clearpay/controllers/front/payment.php
提示:
您可以编辑任何文件(包括二进制文件),但请注意不当修改可能导致文件损坏。
<?php /** * This file is part of the official Clearpay module for PrestaShop. * * @author Clearpay <integrations@clearpay.com> * @copyright 2020 Clearpay * @license Apache License 2.0 */ use Afterpay\SDK\HTTP\Request\CreateCheckout; use Afterpay\SDK\MerchantAccount as ClearpayMerchantAccount; require_once('AbstractController.php'); /** * Class ClearpayRedirectModuleFrontController */ class ClearpayPaymentModuleFrontController extends AbstractController { /** @var string $language */ protected $language; /** * Default currency per region * * @var array */ public $defaultLanguagePerCurrency = array( 'GBP' => 'GB', ); /** * @return mixed * @throws \Afterpay\SDK\Exception\InvalidArgumentException * @throws \Afterpay\SDK\Exception\NetworkException * @throws \Afterpay\SDK\Exception\ParsingException */ public function postProcess() { $context = Context::getContext(); $paymentObjData = array(); $paymentObjData['currency'] = $context->currency->iso_code; $paymentObjData['region'] = Configuration::get('CLEARPAY_REGION'); /** @var Cart $paymentObjData['cart'] */ $paymentObjData['cart'] = $context->cart; $paymentObjData['shippingAddress'] = new Address($paymentObjData['cart']->id_address_delivery); $shippingCountryObj = new Country($paymentObjData['shippingAddress']->id_country); $paymentObjData['shippingCountryCode'] = $shippingCountryObj->iso_code; $shippingStateObj = new State($paymentObjData['shippingAddress']->id_state); $paymentObjData['shippingStateCode'] = ''; if (!empty($paymentObjData['shippingAddress']->id_state)) { $paymentObjData['shippingStateCode'] = $shippingStateObj->iso_code; } $paymentObjData['billingAddress'] = new Address($paymentObjData['cart']->id_address_invoice); $paymentObjData['billingCountryCode'] = Country::getIsoById($paymentObjData['billingAddress']->id_country); $billingStateObj = new State($paymentObjData['billingAddress']->id_state); $paymentObjData['billingStateCode'] = ''; if (!empty($paymentObjData['billingAddress']->id_state)) { $paymentObjData['billingStateCode'] = $billingStateObj->iso_code; } $paymentObjData['countryCode'] = $this->getCountryCode($paymentObjData); $paymentObjData['discountAmount'] = $paymentObjData['cart']->getOrderTotal(true, Cart::ONLY_DISCOUNTS); /** @var Carrier $paymentObjData['carrier'] */ $paymentObjData['carrier'] = new Carrier($paymentObjData['cart']->id_carrier); /** @var Customer $paymentObjData['customer'] */ $paymentObjData['customer'] = $context->customer; if (!$paymentObjData['cart']->id) { Tools::redirect('index.php?controller=order'); } $paymentObjData['urlToken'] = Tools::strtoupper(md5(uniqid(rand(), true))); $paymentObjData['koUrl'] = $context->link->getPageLink( 'order', null, null, array('step'=>3) ); $paymentObjData['cancelUrl'] = (!empty(Configuration::get('CLEARPAY_URL_KO'))) ? Configuration::get('CLEARPAY_URL_KO') : $paymentObjData['koUrl']; $paymentObjData['publicKey'] = Configuration::get('CLEARPAY_PUBLIC_KEY'); $paymentObjData['secretKey'] = Configuration::get('CLEARPAY_SECRET_KEY'); $paymentObjData['environment'] = Configuration::get('CLEARPAY_ENVIRONMENT'); $query = array( 'id_cart' => $paymentObjData['cart']->id, 'key' => $paymentObjData['cart']->secure_key, ); $paymentObjData['okUrl'] = _PS_BASE_URL_SSL_.__PS_BASE_URI__ .'index.php?canonical=true&fc=module&module=clearpay&controller=notify' .'&token='.$paymentObjData['urlToken'] . '&' . http_build_query($query) ; $url = $paymentObjData['cancelUrl']; try { \Afterpay\SDK\Model::setAutomaticValidationEnabled(true); $clearpayPaymentObj = new CreateCheckout(); $clearpayMerchantAccount = new ClearpayMerchantAccount(); $clearpayMerchantAccount ->setMerchantId($paymentObjData['publicKey']) ->setSecretKey($paymentObjData['secretKey']) ->setApiEnvironment($paymentObjData['environment']) ; if (!is_null($paymentObjData['countryCode'])) { $clearpayMerchantAccount->setCountryCode($paymentObjData['countryCode']); } $clearpayPaymentObj ->setMerchant(array( 'redirectConfirmUrl' => $paymentObjData['okUrl'], 'redirectCancelUrl' => $paymentObjData['cancelUrl'] )) ->setMerchantAccount($clearpayMerchantAccount) ->setAmount( Clearpay::parseAmount($paymentObjData['cart']->getOrderTotal(true, Cart::BOTH)), $paymentObjData['currency'] ) ->setTaxAmount( Clearpay::parseAmount( $paymentObjData['cart']->getOrderTotal(true, Cart::BOTH) - $paymentObjData['cart']->getOrderTotal(false, Cart::BOTH) ), $paymentObjData['currency'] ) ->setConsumer(array( 'phoneNumber' => $paymentObjData['billingAddress']->phone, 'givenNames' => $paymentObjData['customer']->firstname, 'surname' => $paymentObjData['customer']->lastname, 'email' => $paymentObjData['customer']->email )) ->setBilling(array( 'name' => $paymentObjData['billingAddress']->firstname . " " . $paymentObjData['billingAddress']->lastname, 'line1' => $paymentObjData['billingAddress']->address1, 'line2' => $paymentObjData['billingAddress']->address2, 'area1' => $paymentObjData['billingAddress']->city, 'region' => $paymentObjData['billingStateCode'], 'postcode' => $paymentObjData['billingAddress']->postcode, 'countryCode' => Tools::strtoupper($paymentObjData['billingCountryCode']), 'phoneNumber' => $paymentObjData['billingAddress']->phone )) ->setShipping(array( 'name' => $paymentObjData['shippingAddress']->firstname . " " . $paymentObjData['shippingAddress']->lastname, 'line1' => $paymentObjData['shippingAddress']->address1, 'line2' => $paymentObjData['shippingAddress']->address2, 'area1' => $paymentObjData['shippingAddress']->city, 'region' => $paymentObjData['shippingStateCode'], 'postcode' => $paymentObjData['shippingAddress']->postcode, 'countryCode' => Tools::strtoupper($paymentObjData['shippingCountryCode']), 'phoneNumber' => $paymentObjData['shippingAddress']->phone )) ->setShippingAmount( Clearpay::parseAmount($paymentObjData['cart']->getTotalShippingCost()), $paymentObjData['currency'] ) ->setCourier(array( 'shippedAt' => '', 'name' => $paymentObjData['carrier']->name . '', 'tracking' => '', 'priority' => 'STANDARD' )); if (!empty($paymentObjData['discountAmount'])) { $clearpayPaymentObj->setDiscounts(array( array( 'displayName' => 'Shop discount', 'amount' => array( Clearpay::parseAmount($paymentObjData['discountAmount']), $paymentObjData['currency'] ) ) )); } $items = $paymentObjData['cart']->getProducts(); $products = array(); foreach ($items as $item) { $products[] = array( 'name' => utf8_encode($item['name']), 'sku' => $item['reference'], 'quantity' => (int) $item['quantity'], 'price' => array( 'amount' => Clearpay::parseAmount($item['price_wt']), 'currency' => $paymentObjData['currency'] ) ); } $clearpayPaymentObj->setItems($products); $clearpayPaymentObj->setAmount( Clearpay::parseAmount($paymentObjData['cart']->getOrderTotal(true, Cart::BOTH)), $paymentObjData['currency'] ); } catch (\Exception $exception) { $this->saveLog($exception->getMessage(), 3); return Tools::redirect($url); } if (!$clearpayPaymentObj->isValid()) { $this->saveLog($clearpayPaymentObj->getValidationErrors(), 2); return Tools::redirect($url); } $clearpayPaymentObj->send(); $errorMessage = 'empty response'; if ($clearpayPaymentObj->getResponse()->getHttpStatusCode() >= 400 || isset($clearpayPaymentObj->getResponse()->getParsedBody()->errorCode) ) { if (isset($clearpayPaymentObj->getResponse()->getParsedBody()->message)) { $errorMessage = $clearpayPaymentObj->getResponse()->getParsedBody()->message; } $errorMessage .= '. Status code: ' . $clearpayPaymentObj->getResponse()->getHttpStatusCode(); $logMessage = 'Error received when trying to create a order: ' . $errorMessage . '. URL: ' . $clearpayPaymentObj->getApiEnvironmentUrl().$clearpayPaymentObj->getUri(); $this->saveLog( $logMessage, 2 ); return Tools::redirect($url); } try { $url = $clearpayPaymentObj->getResponse()->getParsedBody()->redirectCheckoutUrl; $orderId = $clearpayPaymentObj->getResponse()->getParsedBody()->token; $cartId = pSQL($paymentObjData['cart']->id); $orderId = pSQL($orderId); $urlToken = pSQL($paymentObjData['urlToken']); $countryCode = pSQL($paymentObjData['countryCode']); $sql = "INSERT INTO `" . _DB_PREFIX_ . "clearpay_order` (`id`, `order_id`, `token`, `country_code`) VALUES ('$cartId','$orderId', '$urlToken', '$countryCode')"; $result = Db::getInstance()->execute($sql); if (!$result) { throw new \Exception('Unable to save clearpay-order-id in database: '. $sql); } } catch (\Exception $exception) { $this->saveLog($exception->getMessage(), 3); $url = $paymentObjData['cancelUrl']; } return Tools::redirect($url); } /** * @param array $paymentObjData * @return string|null */ private function getCountryCode($paymentObjData) { // for uk currency if (isset($this->defaultLanguagePerCurrency[$paymentObjData['currency']])) { return $this->defaultLanguagePerCurrency[$paymentObjData['currency']]; } $allowedCountries = json_decode(Configuration::get('CLEARPAY_ALLOWED_COUNTRIES')); $lang = Language::getLanguage($this->context->language->id); $langArray = explode("-", $lang['language_code']); if (count($langArray) != 2 && isset($lang['locale'])) { $langArray = explode("-", $lang['locale']); } $language = Tools::strtoupper($langArray[count($langArray)-1]); // Prevent null language detection if (in_array(Tools::strtoupper($language), $allowedCountries)) { return $language; } $shippingAddress = new Address($paymentObjData['cart']->id_address_delivery); if ($shippingAddress) { $language = Country::getIsoById($paymentObjData['shippingAddress']->id_country); if (in_array(Tools::strtoupper($language), $allowedCountries)) { return $language; } } $billingAddress = new Address($paymentObjData['cart']->id_address_invoice); if ($billingAddress) { $language = Country::getIsoById($paymentObjData['billingAddress']->id_country); if (in_array(Tools::strtoupper($language), $allowedCountries)) { return $language; } } if ($language == 'US' || $language == 'EN') { return "GB"; } return null; } }
💾 保存文件
← 返回文件管理器