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

Артур Шевченко
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;
}
Николай Савин
12 января 2023, 12:40
0
Кажется мы друг друга не очень понимаем.

Еще раз. Метод receive не используется клиентом, администратором и т.п.
Он нужен для того чтобы Банк в фоновом режиме сообщил сайту о совершенной оплате. Никаких редиректов там нет и быть не может.

Смену статуса оплаты по URL в данном случае использовать нельзя, потому что зная нужную комбинацию — мошенник может подтвердить оплату, не производя ее.
Опирайтесь ТОЛЬКО на автоматическую служебную информацию от банка.
Vladimir
12 января 2023, 12:35
0
А можете пожалуйста подсказать, как отправить это в другой поток, то есть после оплаты не важно какой идёт редирект, а там происходит проверка и смена статуса, так как мне добавить проверку и смену статуса, чтобы оно не мешало пользователю и страница не грузилась там несколько секунд. А сразу редиректила на отдельную страницу.

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

Хостинг обычный виртуальный, php 7.4+ modx 2.7.3
Vladimir
12 января 2023, 09:02
0
Да, спасибо смотрел, буду так и делать
Николай Савин
12 января 2023, 08:56
0
receive это метод, который реагирует запрос из вне. Обычно банк после оплаты дергает файл
/assets/components/minishop2/payment/имя_платежки/имя_платежки.php
В этом файле «по вкусу» происходит валидация входящего от банка запроса и затем вызывается метод receive, основная задача которого — поменять статус заказа на оплачено. Запрос на проверку успешной оплаты производится также «по вкусу». Многие платежки просто слепо доверяют входящим данным.

Для фронта, в случае этого метода ничего не происходит, так как он является служебным API методом.

Как его тригерить — посмотрите в том же Paypal или например Робокасса
Vladimir
12 января 2023, 08:43
0
У сервиса оплаты минишопа есть такой метод как «receive», как я понял из сущ пейпала, что это метод при котором отправляется запрос на проверку успешной оплаты, как его за тригерить? или он сам тригерится после возвращение на страницу оформления заказа с параметрами, успеха, номера заказа и хэша заказа?
Vladimir
12 января 2023, 08:37
0
Мне нужно наверно сделать как в пейпале, добавить php, в ассет платежей минишопа, и ловить это сообщение, а потом что сделать? вручную менять статус? или есть у минишопа метод для этого после успешной оплаты?
scorpi71183
12 января 2023, 03:04
0
Подскажите пожалуйста! Как сделать чтобы msOptionsPrice не модицировал цена по умолчанию… Т.е после загрузки страницы не ставил цену и input type=«hidden» name=«options[color]» value=«Яркое блестящее серебро (HPB)»
, а модицировал только при выборе опции кликом… А то получается что первоначальная цена (цена товара дофолтовая) не доступна…
Константин Ильин
11 января 2023, 19:59
+1
@Илья Уткин, НЕ стал создавать пост. Посмотри пожалуйста, вроде как на MySQL 8 не работает сортировка из-за поля rank, т.к. это слово зарезервировано в MySQL 8
Артур Шевченко
11 января 2023, 19:10
0
Вы сейчас удивитесь, но чтобы прикрепить файл к письму отправленному через AjaxForm+FormIt не нужно делать ничего. Главное чтобы у формы был атрибут enctype=«multipart/form-data».
Alex
11 января 2023, 16:55
0
пробую в &where=`{«published:=»:1,«resource_id:=»:[[*id]]}` прописать исключение для b1_json, Ничего не получается.
Подскажите пожалуйста
Иван
11 января 2023, 13:34
0
Думаю какой нибудь ген директор или топ менеджеру оценит работаспособность на iphone или macbook))