• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Пере конвертированная валюта в письмах заказа

adamsage

Форумчанин
Всем привет! Делаю магазин с ценами в евро. Платежная система - Яндекс Касса. В оф. мануале говорится, что Яндекс Касса НЕ принимает оплату в валюте и необходимо конвертировать цены в рубли на стороне сайта. Готовых решений не нашел, собрал свое (собирал из кусков т.к. я не программист). После нажатия кнопки "Оформить заказ", при переходе на оплату цена конвертируется и отображается в рублях. НО в письмах админу и клиенту об "Оформлении заказа" также в total вставляется сумма в рублях (сама цифра) с подписью что это евро.
Нужно чтобы вставлялась первоначальная правильная цена, а не пере конвертированная. Помогите, плиз!
problem.jpg

Сам код (в конец functions.php)

Код:
add_action( 'woocommerce_checkout_create_order', 'change_total_on_checking', 20, 1 );
function change_total_on_checking( $order ) {
    // Get order total
    $total = $order->get_total();

// Start converter config!!!!    https://github.com/ilyatom/currency-converter
    
    class CurrencyConverter {
    
    /*
     * Класс для конвертации валют
     */

// PROPERTIES

    protected $fromCurrencyAmount;
    protected $fromCurrencyName = 'RUB';
    protected $fromCurrencyRate;
    protected $toCurrencyAmount;
    protected $toCurrencyName = 'RUB';
    protected $toCurrencyRate;
    protected $precision = 1;

// API

    public function from($currencyName) {
        $this->fromCurrencyName = $currencyName;
        return $this;
    }

    public function to($currencyName) {
        $this->toCurrencyName = $currencyName;
        return $this;
    }

    public function precision($precision) {
        $this->precision = $precision;
        return $this;
    }

    public function convert($fromCurrencyAmount) {
        if ($this->fromCurrencyName != 'RUB') {
            $this->fromCurrencyRate = $this->GetRate($this->fromCurrencyName);
        } else {
            $this->fromCurrencyRate = 1;
        }

        if ($this->toCurrencyName != 'RUB') {
            $this->toCurrencyRate = $this->GetRate($this->toCurrencyName);
        } else {
            $this->toCurrencyRate = 1;
        }

        $result = $fromCurrencyAmount / $this->fromCurrencyRate * $this->toCurrencyRate;
        $this->toCurrencyAmount = round($result, $this->precision);
        return $this->toCurrencyAmount;
    }

// PROTECTED

    private function today() {
        return date('d/m/Y');
    }

    private function GetXML() {
        $r = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp?date_req='.$this->today());
        $xml = simplexml_load_string($r);
        return $xml;
    }

    private function GetRateFromXML($currency) {
            $xml = $this->GetXML();
            foreach ($xml->Valute as $valute) {
                    if ($valute->CharCode == $currency) {
                            $value = str_replace(',', '.', $valute->Value);
                            $rate = $valute->Nominal / $value;
                    }
            }
            if (isset($rate)) {
                    $r = $rate;
            } else {
                    $r = false;
            }
            return $r;
    }

    private function GetRateFromCookie($currency) {
            if ($this->IsSetCurrencyCookie($currency)) {
                    $parts = explode('_', $this->GetRateCookie($currency));
                    $rate = $parts[0];
                    $r = $rate;
            } else {
                    $r = false;
            }
            return $r;
    }

    private function SetRateCookie($currency, $rate) {
            setcookie($currency, $rate.'_'.$this->today());
    }

    private function GetRateCookie($currency) {
            return filter_input(INPUT_COOKIE, $currency);
    }

    private function IsSetCurrencyCookie($currency){
        if ($this->GetRateCookie($currency) != FALSE and $this->GetRateCookie($currency) != NULL) {
            return TRUE;
        }else {
            return FALSE;
        }
    }

    private function GetRate($currency) {
            if ($this->IsSetCurrencyCookie($currency)) {
                    $parts = explode('_', $this->GetRateCookie($currency));
                    $date = $parts[1];
                    if ($date == $this->today()) {
                            $rate = $this->GetRateFromCookie($currency);
                    } else {
                            $rate = $this->GetRateFromXML($currency);
                            $this->SetRateCookie($currency, $rate);
                    }
            } else {
                    $rate = $this->GetRateFromXML($currency);
                    $this->SetRateCookie($currency, $rate);
            }
            return $rate;
    }
}
// End converter config

//start converting total
    $curConv = new CurrencyConverter;
    $new_total = $curConv->from('EUR')->convert($total);
//end converting total    

    // Set the new calculated total
    $order->set_total( $new_total );
}
 

adamsage

Форумчанин
Как понимаю, мой код не совсем подходит. Правильней будет, как-то перехватить переменную $total из массива $order, сконвертировать её через вышеописанную функцию (или подобную ей) и руками подставить в yandex-money-checkout\gateway\YandexMoneyCheckoutGateway.php Вот только я не умею перехватывать переменные )))) Понимаю, что это тоже не совсем правильный выход в плагине переменные менять, но это уже спасибо яндекс кассе
 

marr

Специалист
Местный
но это уже спасибо яндекс кассе
Российские платежные системы не работают с иностранной валютой. Сомневаюсь, что зарубежные заказчики смогут что-либо оплатить через кассу, даже если вы справитесь с переменной. Их кредитки не пройдут
 
Последнее редактирование:

adamsage

Форумчанин
[QUOTE = "marr, post: 45917, member: 11465"]
Российские платежные системы не работают с иностранной валютой. Сомневаюсь, что зарубежные заказчики что-либо оплатить через кассу, даже если вы справитесь с ошибкой. Их кредитки не пройдут
[/ QUOTE]
Спасибо, что откликнулись, у меня есть оф. ответ от яндекса на эту тему, цитирую: "
Наша форма по оплате предполагает только оплату в рублях. Подробнее вам объясню, как это будет выглядеть для вашего клиента и для вас:
Вам необходимо установить на ваш сайт специальный конвертер. Клиент заходит на ваш сайт, видит сумму товара 10 $. Нажимает кнопку оплатить и у него открывается наша форма для оплаты, где будет указана сумма в рублях. Если бы конвертера у вас не было или бы он был настроен неправильно, то в нашу форму будет подтягиваться сумма в 10 рублей (рекомендуем сделать тестовый платеж товара на 1 $ и посмотреть правильно ли подгружается сумма в нашу форму). После этого вы можете сделать возврат в день из личной кабинета, чтобы не потерять проценты по данной транзакции.
После подтверждения оплаты в нашей форме, клиенту на телефон придет смс в его валюте от его банка. Он подтверждает покупку и с его карты идет списание в 10 $. Что происходит далее. Его банк переводит сумму к нам, при переводе она конвертируется в рубли по курсу - эмитента на день покупки, мы получаем эту сумму, списываем свой% и переводим сумму за вычетом% вам на расчетный счет в рублях.
"
 

marr

Специалист
Местный
Последнее редактирование:

adamsage

Форумчанин
[QUOTE = "marr, post: 45921, member: 11465"]
У вас заключен дополнительный договор на расширенный список стран и карт? Принимаете American Express, JCB и Diners Club?
[URL unwurl = "true"] https://kassa.yandex.ru/questions/q163/ [/ URL]
[/ QUOTE]
Спасибо за ссылку, сейчас звонил в Яндекс касса, они сказали, что у нас подключены платежи по всему миру (пакет Россия, СНГ, Европа и Азия.). Оплата возможна!
 
Сверху Снизу