Инструкция ниже, я предлагаю вариант на Node JS с установленным модулем request (npm i request), но можете делать запросы как угодно. Если кто-то работает сейчас с. P2P и не затруднит подсказать как не получать банов - буду признателен. /* Description: Получение токена для **** API #1 - Запускаем функцию requestTokenCreation() #2 - Ждем смс код #3 - Запускаем функцию confirmTokenCreation() с параметром code */ function getUrlEncodedObject(object) { var formBody = []; for (var property in object) { var encodedKey = encodeURIComponent(property); var encodedValue = encodeURIComponent(object[property]); formBody.push(encodedKey + "=" + encodedValue); } formBody = formBody.join("&"); return formBody; } function requestTokenCreation() { request.post({ uri: 'https://****.com/oauth/authorize', body: getUrlEncodedObject({ response_type: 'code', client_id: 'qiwi_wallet_api', client_software: 'WEB v4.96.0', username: 'ТУТ НОМЕР КОШЕЛЬКА', scope: 'read_person_profile read_balance read_payment_history accept_payments get_virtual_cards_requisites write_ip_whitelist', token_head: 'TOKEN HEAD С САЙТА ****.COM', token_head_client_id: 'web-qw' }), json: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded', Cookie: 'COOKIE С САЙТА ****.COM' } }, (error, response, body) => { if (typeof body === "undefined" || typeof body.code === "undefined") console.log(error); else { // ТУТ ЖДЕМ СМС КОД И ПОТОМ ЗАПУСКАЕМ ВТОРУЮ ФУНКЦИЮ С ПАРАМЕТРОМ body.code } }); } function confirmTokenCreation(code) { request.post({ uri: 'https://****.com/oauth/token', body: getUrlEncodedObject({ grant_type: 'urn:****:oauth:grant-type:vcode', client_id: 'qiwi_wallet_api', code, vcode: 'СМС КОД' }), json: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded', Cookie: 'COOKIE С САЙТА ****.COM' } }, (error, response, body) => { if (typeof body !== "undefined" && typeof body.access_token !== "undefined") { console.log("TOKEN: " + body.access_token); } else console.log(error); }); } /* Description: Создание ключа мерчанта для **** P2P API #1 - Запускаем функцию createP2PMerchantKey() с токеном, который получили в предыдущем пункте */ function createP2PMerchantKey(token) { const options = { url: 'https://edge.****.com/widgets-api/api/p2p/protected/keys/create', body: { keysPairName: 'ТУТ ИМЯ КЛЮЧА', serverNotificationsUrl: 'ТУТ URL ОПОВЕЩЕНИЙ' } } request.post({ url: options.url, json: true, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': "Bearer " + token }, body: options.body }, (error, response, body) => { if (error || response.statusCode != 200) { if (response.statusCode === 401) { console.log("Ключ заблокирован"); } else if (response.statusCode === 403) console.log("Недостаточно прав"); else console.log(error); } else { console.log("Ключ создан"); console.log(body); } }); } JS /* Description: Получение токена для **** API #1 - Запускаем функцию requestTokenCreation() #2 - Ждем смс код #3 - Запускаем функцию confirmTokenCreation() с параметром code */ function getUrlEncodedObject(object) { var formBody = []; for (var property in object) { var encodedKey = encodeURIComponent(property); var encodedValue = encodeURIComponent(object[property]); formBody.push(encodedKey + "=" + encodedValue); } formBody = formBody.join("&"); return formBody; } function requestTokenCreation() { request.post({ uri: 'https://****.com/oauth/authorize', body: getUrlEncodedObject({ response_type: 'code', client_id: 'qiwi_wallet_api', client_software: 'WEB v4.96.0', username: 'ТУТ НОМЕР КОШЕЛЬКА', scope: 'read_person_profile read_balance read_payment_history accept_payments get_virtual_cards_requisites write_ip_whitelist', token_head: 'TOKEN HEAD С САЙТА ****.COM', token_head_client_id: 'web-qw' }), json: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded', Cookie: 'COOKIE С САЙТА ****.COM' } }, (error, response, body) => { if (typeof body === "undefined" || typeof body.code === "undefined") console.log(error); else { // ТУТ ЖДЕМ СМС КОД И ПОТОМ ЗАПУСКАЕМ ВТОРУЮ ФУНКЦИЮ С ПАРАМЕТРОМ body.code } }); } function confirmTokenCreation(code) { request.post({ uri: 'https://****.com/oauth/token', body: getUrlEncodedObject({ grant_type: 'urn:****:oauth:grant-type:vcode', client_id: 'qiwi_wallet_api', code, vcode: 'СМС КОД' }), json: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded', Cookie: 'COOKIE С САЙТА ****.COM' } }, (error, response, body) => { if (typeof body !== "undefined" && typeof body.access_token !== "undefined") { console.log("TOKEN: " + body.access_token); } else console.log(error); }); } /* Description: Создание ключа мерчанта для **** P2P API #1 - Запускаем функцию createP2PMerchantKey() с токеном, который получили в предыдущем пункте */ function createP2PMerchantKey(token) { const options = { url: 'https://edge.****.com/widgets-api/api/p2p/protected/keys/create', body: { keysPairName: 'ТУТ ИМЯ КЛЮЧА', serverNotificationsUrl: 'ТУТ URL ОПОВЕЩЕНИЙ' } } request.post({ url: options.url, json: true, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': "Bearer " + token }, body: options.body }, (error, response, body) => { if (error || response.statusCode != 200) { if (response.statusCode === 401) { console.log("Ключ заблокирован"); } else if (response.statusCode === 403) console.log("Недостаточно прав"); else console.log(error); } else { console.log("Ключ создан"); console.log(body); } }); }
CloudsEthics, Есть вариант выппустить токен с единственным разрешением "Запрос информации о профиле кошелька"?
Полезная тема, нужно будет проверить создание с помощью этого метода. А он просит код в любом случае?