POST запрос к API

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

POST запрос к API

Сообщение louisvuitton »

Возможно в вопросе сквозит непонимание, НО
Как сделать пост запрос к внешнему API из контроллера (без формы) с переходом на запрашиваемый адрес?

Нужно обратиться к api яндекс денег POST запросом с параметрами, делаю с помощью http client встроенного в Yii

Код: Выделить всё

    public function actionTest() {
        $scope = ["payment"];

        $client = new Client();
        $response = $client->createRequest()
            ->setMethod('post')
//            ->setFormat(Client::FORMAT_XML) 
            ->setUrl('https://sp-money.yandex.ru/oauth/authorize')
            ->setData(['client_id' => self::YA_ID, 'response_type' => 'code', 'redirect_uri' => self::YA_REDIR, 'scope' => $scope])
            ->send();
    }
При этом я остаюсь на текущей белой странице, а мне надо, чтобы произошел переход на https://sp-money.yandex.ru/oauth/authorize :cry:

[spoiler] ps: этот вопрос кака часть вот этого viewtopic.php?f=4&t=43491 [/spoiler]
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: POST запрос к API

Сообщение zelenin »

то, что вы делаете, не имеет смысл - после редиректа потеряются данные, отправленные POST'ом.
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: POST запрос к API

Сообщение louisvuitton »

Продолжаю свои разбирательства с yandex money api.

Как я понял оно не такое как, например, инстаграм, где отправил post запрос и получил json с результатами, а нужны обязательные редиректы на страницы яндекса (по крайней мере на этапе токенов и запросов платежей)

Так вот, у меня на странице форма с полем для ввода суммы и кнопка "отправить". Как сделать чтобы юзер мог это сделать нормально за 1 клик?
В action пришел post от юзера с суммой, если токена нет, редирект на запрос токена, пользователь авторизировался и яндекс возвращает токен, нужно создать платеж, но пока редиректило (как правильно подметил zelenin) пропали данные суммы. Делать отдельную таблицу что ли куда сохранять это значение между редиректами? это выглядит как то дерьмово
Подскажите плз.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: POST запрос к API

Сообщение Nex-Otaku »

Глянул код в расширении https://github.com/grigorieff/yii2-yandex-money

https://github.com/grigorieff/yii2-yand ... ponent.php

Код: Выделить всё

$access_token = API::getAccessToken($this->client_id,$this->code,$this->redirect_uri, $this->client_secret);
$this->api = new API($access_token);
Токен заполняется "втихаря", создаётся объект API с полученным токеном и дальше уже производится действие с объектом API.

Так что как вариант )
louisvuitton
Сообщения: 203
Зарегистрирован: 2014.02.16, 03:09

Re: POST запрос к API

Сообщение louisvuitton »

Спасибо,
но там редирект требуется, чтобы получить параметр $this->code который используется в getAccessToken() (нужно переходить на страницу яндекса и пользователь должен посмотреть какие права запрашиваются и разрешает\не разрешает он доступ.

Мой код экшена примерно такой.
Туда приходит первый Post с суммой от пользователя и туда же возвращается редирект от яндекса.

Код: Выделить всё

    public function actionYaredir() {
        $code = Yii::$app->request->get('code'); // если это редирект от яндекса с кодом то забираем его
        $sum = Yii::$app->request->post('sum'); // тут какбы сумма из формы
        
	// если нет кода то нужно идти за ним на яндекс и теряется сумма
	  if(!$code) { 
            $scope = 'payment-p2p';
            $url = API::buildObtainTokenUrl(
                self::YA_ID,
                self::YA_REDIR,
                explode(" ", $scope)
            );
            $this->redirect($url);
            Yii::$app->end();
        }

	// вот момент как вы написали
        $access_token_response = API::getAccessToken(self::YA_ID, $code, self::YA_REDIR, self::YA_SECRET);
        $access_token = $access_token_response->access_token;

        if($access_token) {
            $api = new API($access_token);

            $request_payment = $api->requestPayment([
                "pattern_id" => "p2p",
                "to" => "8383838383838",
                "amount_due" => $sum,  // вот тут нужна сумма, а так как она пустая после редиректа этот метод яндекса возвращает ошибку
                "comment" => 'Пополнение',
                "message" => 'Пополнение',
                "label" => "testPayment",
                "test_payment" => "true",
                "test_result" => "success"
            ]);


            if($request_payment->status != "success") {
                return $pay_message = 'Ошибка: ошибка системы';
            }

            $process_payment = $api->processPayment([
                "request_id" => $request_payment->request_id,
            ]);
            vd($process_payment);

        }
    }
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: POST запрос к API

Сообщение Nex-Otaku »

Ну и храните между запросами данные либо в сессии, либо в БД. Не вижу проблемы.
Ответить