Configuration

Merchant Secret хранится в localStorage. Не коммить файл в публичный git — это эквивалент пароля от мерчанта.
Тестовые Merchant ID и базовые правила
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

QUERY

Получить статус транзакции по xref

Аналог "посмотреть платёж". Если знаешь xref или transactionUnique — получишь полный response, как при изначальном SALE.

  
// response will appear here

Payments (raw card data — PCI scope)

Эти действия принимают полный PAN карты. Использовать ТОЛЬКО в PCI-окружении или с тестовыми картами.
SALE

Прямое списание

Auth + capture сразу. Деньги списываются полностью.

  
// response will appear here
PREAUTH

Авторизация без списания (hold)

Холдирует сумму на карте. Дальше нужен CAPTURE (захватить) или CANCEL (отпустить).

  
// response will appear here
VERIFY

Проверка карты (zero-amount)

Проверить что карта валидна, не списывая ничего. amount=0.

  
// response will appear here

Manage existing transaction (by xref)

CAPTURE

Захватить ранее авторизованную сумму

После PREAUTH. Можно частично — указать меньший amount.

  
// response will appear here
CANCEL

Отменить транзакцию до клиринга

Void — отменяет PREAUTH (или ещё не оттендеренный SALE).

  
// response will appear here
REFUND_SALE

Возврат по существующей транзакции

Полный или частичный возврат уже списанного SALE.

  
// response will appear here
REFUND

Standalone refund (выплата на карту)

Опасно. Это независимый payout — деньги уходят на карту без связи с предыдущей транзакцией. У большинства merchant'ов отключено.

  
// response will appear here

Repeat charge by xref (Continuous Authority)

SALE

Повторное списание без карданных

Если первый SALE был с type=9 (Continuous Authority) или мерчант хранит CA — следующие списания делаются по xref, без CVV/PAN.

  
// response will appear here

Raw request (любой action, любые поля)

CUSTOM

Произвольный запрос

Введи свои пары key=value по одной на строку. Подпись посчитается автоматически, merchantID подставится из конфига.

  
// response will appear here

Signature inspector

DEBUG

Посмотреть как считается подпись

Вставь параметры запроса — увидишь промежуточные шаги (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'));