Configuration
Merchant Secret хранится в localStorage. Не коммить файл в публичный git — это эквивалент пароля от мерчанта.
Тестовые Merchant ID и базовые правила
•
•
• amount везде в minor units (пенсы/центы): £25.12 →
• currencyCode/countryCode — ISO 4217/3166 numeric: GBP=826, EUR=978, USD=840, UK=826, DE=276
• cardExpiryDate — формат
• type — 1 = e-commerce, 2 = MOTO, 9 = continuous authority (recurring)
100001 — basic Visa/MC test merchant•
100856 — 3DS test merchant• amount везде в minor units (пенсы/центы): £25.12 →
2512• currencyCode/countryCode — ISO 4217/3166 numeric: GBP=826, EUR=978, USD=840, UK=826, DE=276
• cardExpiryDate — формат
MMYY (1234 = декабрь 2034)• type — 1 = e-commerce, 2 = MOTO, 9 = continuous authority (recurring)
Query & status
Получить статус транзакции по xref
Аналог "посмотреть платёж". Если знаешь
xref или transactionUnique — получишь полный response, как при изначальном SALE.// response will appear here
Payments (raw card data — PCI scope)
Эти действия принимают полный PAN карты. Использовать ТОЛЬКО в PCI-окружении или с тестовыми картами.
Прямое списание
Auth + capture сразу. Деньги списываются полностью.
// response will appear here
Авторизация без списания (hold)
Холдирует сумму на карте. Дальше нужен CAPTURE (захватить) или CANCEL (отпустить).
// response will appear here
Проверка карты (zero-amount)
Проверить что карта валидна, не списывая ничего.
amount=0.// response will appear here
Manage existing transaction (by xref)
Захватить ранее авторизованную сумму
После PREAUTH. Можно частично — указать меньший amount.
// response will appear here
Отменить транзакцию до клиринга
Void — отменяет PREAUTH (или ещё не оттендеренный SALE).
// response will appear here
Возврат по существующей транзакции
Полный или частичный возврат уже списанного SALE.
// response will appear here
Standalone refund (выплата на карту)
Опасно. Это независимый payout — деньги уходят на карту без связи с предыдущей транзакцией. У большинства merchant'ов отключено.
// response will appear here
Repeat charge by xref (Continuous Authority)
Повторное списание без карданных
Если первый SALE был с
type=9 (Continuous Authority) или мерчант хранит CA — следующие списания делаются по xref, без CVV/PAN.// response will appear here
Raw request (любой action, любые поля)
Произвольный запрос
Введи свои пары
key=value по одной на строку. Подпись посчитается автоматически, merchantID подставится из конфига.// response will appear here
Signature inspector
Посмотреть как считается подпись
Вставь параметры запроса — увидишь промежуточные шаги (sorted query string + secret → SHA-512).
Local proxy (если CORS блокирует)
Сохрани как
server.js, запусти node server.js. В Proxy prefix впиши http://localhost:8787/proxy?url=. Этот же proxy работает и для OPPWA.const http = require('http');
const https = require('https');
const { URL } = require('url');
http.createServer((req, res) => {
res.setHeader('Access-Control-Allow-Origin','*');
res.setHeader('Access-Control-Allow-Methods','GET,POST,DELETE,OPTIONS');
res.setHeader('Access-Control-Allow-Headers','Authorization,Content-Type');
if (req.method === 'OPTIONS') return res.end();
const target = new URL(req.url, 'http://x').searchParams.get('url');
if (!target) { res.statusCode = 400; return res.end('url required'); }
const u = new URL(target);
const opts = { method: req.method, headers: { ...req.headers, host: u.host } };
delete opts.headers['origin']; delete opts.headers['referer'];
const proxied = https.request(u, opts, (r) => {
res.statusCode = r.statusCode;
Object.entries(r.headers).forEach(([k,v]) => {
if (k.toLowerCase() !== 'access-control-allow-origin') res.setHeader(k, v);
});
res.setHeader('Access-Control-Allow-Origin','*');
r.pipe(res);
});
proxied.on('error', e => { res.statusCode=500; res.end(e.message); });
req.pipe(proxied);
}).listen(8787, () => console.log('proxy on http://localhost:8787'));