Всего 123 800 комментариев

Vladimir
13 января 2023, 08:59
0
А до этого вообще в самое последнее поле не добавлялись данные, было 2 поля, но сохранялось всё в предпоследний. Лишь после того как я его сделал видимым для админки, то есть в самом заказе он теперь тоже виден, потом стал заполнятся лишь он последний
Alexey
13 января 2023, 07:45
1
+1
Попробуй так:

$modx->log(modX::LOG_LEVEL_ERROR, print_r($dt, 1));

Это вариант для логирования массива
Alex
13 января 2023, 01:19
0
Глобальные на уровне контекста — а у меня 3 контекста.
Мне нужно вывести глобальный параметр конкретно ID ресурса.
Артур Шевченко
12 января 2023, 22:04
0
Вы же сами в заголовке написали «ГЛОБАЛЬНЫЕ» т.е. доступные везде. Вам не нужен pdoFields, настройки контекста можно получить как плейсхолдер [[++key]]
Артур Шевченко
12 января 2023, 22:01
0
Чанк это кусок html, который вставляется на страницу при парсинге страницы НА СЕРВЕРЕ, а кликнуть по ссылке можно только на фронте. К тому же ссылка это ссылка, туда нельзя вставить html. Я думаю вам нужно модальное окно, но лучше уточнить задачу.
Alexey
12 января 2023, 20:51
0
Перечитал свой коммент и понял, что коряво сформулировал. Артур прав, конечно, файлы из js никак не могут попасть на сервер, при помощи библиотеки dropzone они отправляются по урлу, указанному в action. И уже php-обработчик их отлавливает и может залить в нужную директорию.

Вот что я имел в виду, говоря «сразу попадают на сервер во временную папку».
Артур Шевченко
12 января 2023, 17:56
0
Ну это магия какая-то, чтобы файлы сами по себе залетали на сервер))) Мои знания о том, как работает drag&drop, говорят, что должен быть input типа файл и отправка его на сервер, другое дело, что используемая библиотека может делать это каким-то неявным образом, но я не представляю как это возможно.
Alexey
12 января 2023, 14:43
0
Файлы, закинутые через dropzone, сразу попадают на сервер во временную папку, и ими можно манипулировать через отдельный php-загрузчик. И да — эти файлы в форме не прикрепляются к инпуту с типом file, так как они уже на сервере. Если, в процессе загрузки файлов обработчиком их складывать в определенную папку, то потом при помощи хука их можно прикрепить к письму. Получается, что стандартный хук mail для formIt не подходит, нужно мутить свой.

Если не прав, сорри, пишу по памяти) Возможно, есть ещё какие-то лайт-варианты.
Артур Шевченко
12 января 2023, 14:35
0
Файлы закинутые через Drag & Drop также должны добавляться в поле типа file, других способов отправить файлы с фронта просто не существует.
Vladimir
12 января 2023, 14:31
0
1) Чтобы обновить статус заказа на оплачен, либо поставить статус что ошибка оплаты и так далее. Почему именно так, потому что в ответе от банка, в пост запросе я получу только номер счёта на оплату, а так же эти данные приходят не сразу, а если будет хэш заказа, то уже будет сложнее подобрать, плюс у меня нет никакой проверки что этот запрос был от банка, у меня от банка просто приходит номер счёта на оплату из важных.

2) Всё что было решил, просто по моему решение мне нужно была помощь чтобы он выполнялся в фоне.

3) Переделаю как вы посоветовали, будет так же как в робокасе и пейпале, только из проверки будет только на ориджин. И само собой будут проверки на стороне сайта, то есть сначала спрошу заново о статусе, лишь потом буду что-то менять в заказе.
Николай Савин
12 января 2023, 14:21
0
У меня два вопроса.
Первый — Зачем вообще после возвращения со страницы оплаты что то делать? Это может быть актуально разве что для цифровых товаров, которые после оплаты должны быть доступны для скачивания.

Второй вопрос — я потерял нить разговора. У вас вопрос какой бы изначально? В чем затык?
Vladimir
12 января 2023, 14:14
0
Тоже самое почти что и пейпал. Со мной расходства есть, я в методе сенд получаю ответ авторизации, и потом отправляю его на фронт (ПОТОМУ ЧТО без этого никак, без их js библиотеки это попросту не работает, писал в тех поддержку спрашивал(да такое бывает, мне самому плохо и меня откачивали).
Затем идёт редирект с фронта на оплату, и потом я сделал редирект после успешной оплаты, идёт редирект, в редиректе есть обычные гет запросы, с номером заказа, хэш заказа, а так же номер счёта на оплату, и потом точно так же как в робокасе и пейпале, я всё отправляю в метод оплаты, и внутри на сайте, потом сверяю все предоставленные данные, и только потом я отправляю отдельный запрос в банк чтобы он дал мне статус оплаты по данному счёту на оплату, и там же внутри самого сайта я меняю статус в зависимости от ответа от банка.

У меня от банка приходит лишь номер счёта на оплату, и всё, нет ни подписи, не номера заказа, не хэш этого заказа, по этому я сделал через редирект, сейчас сделаю как вы посоветовали.
Денис Мавлютов
12 января 2023, 14:04
0
Это в случае, если вы прикрепляете файл через input type=«file», но значение этого input поля нельзя менять динамический или как-то из вне, вы получите ошибку в браузере о мерах безопасности.

Я предполагаю, что можно как-то добавить к отправляемой форме файлы из dropzone.

Еще раз. Файлы закинутые через Drag and Drop не добавляются в input и потому стандартным путем не будут добавляться к письму.

enctype=«multipart/form-data» у меня в форме добавлен
Николай Савин
12 января 2023, 14:02
0
Я вам выше дал ссылку на исходный код платежки от Робокассы.
Посмотрите как устроена она. Это самый свежий компонент.
Vladimir
12 января 2023, 13:53
0
По моему опираясь только на банк(в моём случае) и ждать пока он отправит тоже не то, максимально что я получу от банка, это номер счёта, и максимальная защита это origin запроса.

Сейчас же, в гет запрос должен попасть номер заказа, а так же хэш заказа, а потом ещё и номер заказа, получается защиты будет по больше, ему нужно будет подобрать 2 параметра.

К тому же, по урл ничего не меняется, происходят проверки, и потом лишь только запрашивается у банка код транзакции на стороне сайта, и лишь потом на стороне сайта меняется статус заказа. В том же пейпале точно так же как и у меня, у меня даже по больше защиты будет, разве нет?
Vladimir
12 января 2023, 12:57
0
По урл у меня ничего не обновляется, у меня идёт редирект после оплаты на страницу, сразу с гет запросами стандартными, action, mscode, msorder, а так же добавил свой invoice_id, всё, потом идёт проверки, правильный ли хэш заказа с номером заказа, потом берётся номер счёта на оплату, и спрашивает у банка код этой транзакции, если код транзакции говорит ок, то только тогда я меняю статус.

Так же сейчас добавлю поле для заказа, и буду записывать туда номер счёта на оплату, и так же добавлю новую проверку
Vladimir
12 января 2023, 12:45
0
Сделал по аналогу как в пейпале код ниже. Я поставил чтобы редирект был на этот файл, чтобы получить поля «action» и так далее. Проверяется оплата, проверяется хэш, потом идёт редирект, и получается что всё это время у пользователя грузится страница, секунды 4.

<?php

const MODX_API_MODE = true;
/** @noinspection PhpIncludeInspection */
require dirname(__FILE__, 5) . '/index.php';

/** @var modX $modx */
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');


function goNext(){
    global $modx;
    $redirect = $_GET['action'] == 'success'
        ? $modx->makeUrl((int) $modx->getOption('epay_post_success_page_id'), '', '', 'full')
        : $modx->makeUrl((int) $modx->getOption('epay_post_error_page_id'), '', '', 'full');
    return $modx->sendRedirect($redirect);
}


if (isset($_GET['action']) && !empty($_GET['action']) && !empty($_GET['msorder']) && !empty($_GET['mscode']) && !empty($_GET['invoice_id'])) {

    /** @var miniShop2 $miniShop2 */
    $miniShop2 = $modx->getService('miniShop2');
    $miniShop2->loadCustomClasses('payment');



    if (!class_exists('EpayHalykBank')) {
        $_GET['action'] = 'cancel';
        goNext();
    }


    /** @var msOrder $order */
    $order = $modx->newObject('msOrder');    
    $handler = new EpayHalykBank($order);


    if ($order = $modx->getObject('msOrder', (int)$_GET['msorder'])) {
        /** @var msPaymentInterface|EpayHalykBank $handler */

 
        $verifyingOrderPaymentStatus = $handler->getOrderPaymentStatus($order, array(
            'action' => $_GET['action'],
            'msorder' => $_GET['msorder'],
            'mscode' => $_GET['mscode'],
            'invoice_id' => $_GET['invoice_id']
        ));

        // $modx->log(
        //     modX::LOG_LEVEL_ERROR,
        //     'Верификация 
'.var_dump($verifyingOrderPaymentStatus['status'])
        // );

        if($verifyingOrderPaymentStatus && !empty($verifyingOrderPaymentStatus['status'])){
            $updatingOrder = $handler->receive($order, array(
                'verifyedResponse' => $verifyingOrderPaymentStatus,
                'requestParams' => array(
                    'action' => $_GET['action'],
                    'msorder' => $_GET['msorder'],
                    'mscode' => $_GET['mscode'],
                    'invoice_id' => $_GET['invoice_id']
                )
            ));
            if($updatingOrder){
                $_GET['action'] = 'success';
            } else {
                $_GET['action'] = 'cancel';
            }
            goNext();
        }        
    } else {
        $_GET['action'] = 'cancel';
        goNext();
    }


}

goNext();
Ниже функции проверки и смены статуса
/**
* @param msOrder $order
* @param array params
*
* @return array|string
*/
public function getOrderPaymentStatus(msOrder $order, $params = array()){

    if($params['action'] == 'continue'){
        $createdOrderHash = $this->getOrderHashOld($order);
        if($params['mscode'] == $createdOrderHash){
            $authResponse = $this->paymentAuth($order);

            if($authResponse['access_token']){
                $getPaymentStatus = $this->jwt_request(
                    $this->config['transactionCheckStatusUrl'].$params['invoice_id'],
                    $authResponse['access_token']
                );

                return array(
                    'status' => 'verified',
                    'response' => $getPaymentStatus
                );

            } else {
                return array(
                    'status' => 'error'
                );
            }


        }
    }

}




/**
* @param msOrder $order
* @param array $params
*
* @return bool
*/
public function receive(msOrder $order, $params = array())
{
    if ($params['requestParams']['action'] == 'continue' && $params['verifyedResponse']['status'] == 'verified') {

        if(!empty($params['verifyedResponse']) && !empty($params['verifyedResponse']['response'])  && !empty($params['verifyedResponse']['response']['resultCode'])){
            
            if ($params['verifyedResponse']['response']['resultCode'] == '100') {
                $this->ms2->changeOrderStatus($order->get('id'), 2); // Set status "paid"
            } else {
                $this->ms2->changeOrderStatus($order->get('id'), 1002); // Set status "Payment error"

                $msOrder->set('payment_response_status', $result);
                $msOrder->save();
                return false;
            }

        }

    } else {
        return false;
    }

    return true;
}