ENTWICKLERRESSOURCEN

API-Entwicklung

API-Referenz, Server- und Mobilbeispiele sowie Rückkehr und Benachrichtigungen in einer Anleitung. PHP, Node.js, Python, C#, Java, iOS Swift und Android Kotlin unterstützen ON_SITE und HPP.

REST API · ZAHLUNGSOBERFLÄCHE

Eine Bestellung. ON_SITE oder HPP.

Bestellung serverseitig erstellen und zuordnen, dann Darstellung wählen. Beide Modi behalten order_id.

SieheSynchrone HPP-Rückkehr und asynchrone ON_SITE/HPP-Benachrichtigungen, mit PHP-, Node.js-, Python-, C#- und Java-Code.

ON_SITE

Zahlungsdialog im eigenen Checkout

Betrag, Adresse, Netzwerk und QR im eigenen Dialog zeigen. Server fragt ab und liefert sichere Ansicht.

HTML und PHP ansehen →
HPP

Zur MochiPay-Zahlung weiterleiten

Zu payment_url weiterleiten und Rückgabe oder Benachrichtigung mit authentifiziertem Query Order prüfen.

PHP-Weiterleitung ansehen →

Auszüge aus checkout.php und den Hilfsfunktionen von PHP Demo 1.1.4 (PHP 7.0–8.4). Zuerst mit order.php erstellen, um beide Links zu erhalten. Im Produktivbetrieb den berechtigten Auftrag aus Sitzung/Datenbank laden und mit einer idempotenten Transaktion abschließen.

Nach Serverprüfung weiterleiten

HPP · PHP

Validate the stored order binding and destination, then send the Location header before any page output.

checkout.php · HPP branch
// checkout.php: after loading the saved attempt and
// verifying its token, order binding and payment URL.
// $payment is the authenticated Query Order response.
if ($mode === 'HPP') {
    header('Location: ' . $payment['payment_url'], true, 303);
    exit; // Send the header before any HTML output.
}
// Verify the notification/return server-side before fulfillment.

The complete file loads the saved attempt and validates its token, authenticated query and expected payment_url before this branch.

Dialog in Ihrer Seite anzeigen

ON_SITE · PHP + HTML

Include the local dialog assets in your checkout HTML. The browser talks to your local poll endpoint; it never signs requests or receives API credentials.

checkout.php · local dialog assets
// checkout.php: use the SAME saved reference/token.
$pollUrl = 'order.php?' . http_build_query([
    'view' => $reference, 'token' => $token, 'poll' => 1
], '', '&', PHP_QUERY_RFC3986);
$completeUrl = 'callback.php?' . http_build_query([
    'mode' => 'return', 'merchant_order_id' => $reference
], '', '&', PHP_QUERY_RFC3986);
$config = json_encode([
    'poll' => $pollUrl, 'complete' => $completeUrl
], JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
?>
<!-- Inside your own checkout page: -->
<link rel="stylesheet" href="portable/onsite.css">
<button id="reopen" type="button">Open payment dialog</button>
<script>window.MochiPayConfig = <?php echo $config; ?>;</script>
<script src="portable/qrcode.min.js"></script>
<script src="portable/onsite.js"></script>

onsite.js opens the dialog over your existing page. Closing it leaves checkout visible; the Open payment dialog button reopens the same payment.

Ihr Backend prüft den Auftrag

Authorize the saved reference/token, query by the stored MochiPay order_id, and compare the original amount/currency, asset/network, address and exact payable amount. Return only a safe payment view with decimal strings.

order.php · local polling endpoint
// order.php?view=...&token=...&poll=1 (server-side)
// The demo has already authorized the saved attempt/token.
$response = mochipay_query_order(
    'order_id', $record['snapshot']['order_id']
);
if (!$response['ok'] || !mochipay_bound($record, $response['data'])) {
    http_response_code(403);
    exit;
}
// Also check the expected received amount before accepting PAID.
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store');
echo json_encode([
    'success' => true,
    'data' => MochiPayPortable::view($response['data'])
]); // Safe view: decimal strings; no credentials/customer fields.

The full demo additionally verifies the received amount for PAID. callback.php verifies notifications and browser returns. A screenshot, redirect or browser flag is never proof of payment.

Authentifizierung

Every API request must include the merchant API key and a Base64-encoded HMAC-SHA256 signature.

KopfzeileerforderlichBeschreibung
X-Mochi-KeyJaYour merchant API key.
X-Mochi-SignatureJaBase64-encoded HMAC-SHA256 signature.
Content-TypePOST requestsapplication/json
Keep your API secret on the server. Never expose it in browser JavaScript, mobile applications or public source code.

Signatur

For Create Order, sign the exact raw JSON body. For Query Order, sign the raw query string without the leading ?.

SIGNATURE FORMULA
Base64(HMAC-SHA256(UTF8(signing_text), UTF8(api_secret)))

Unterstützte Währungen

The order currency prices the purchase. The payment method selects the cryptocurrency and blockchain network used to pay.

BESTELLWÄHRUNGEN

28 supported fiat currencies

Use one of these exact ISO codes in the currency Feld.

USDEURGBPCAD AUDNZDJPYCNY HKDSGDCHFSEK NOKDKKPLNCZK HUFAEDSARINR IDRTHBMYRPHP KRWBRLMXNZAR
CRYPTO ORDER CURRENCIES

Preise in Kryptowährungen

Orders may also be priced directly in these cryptocurrencies.

USDTUSDCBTCETHSOL
ZAHLUNGSMETHODEN

Supported cryptocurrency and network combinations

Send one of these exact values in the payment_method Feld.

USDT_TRC20USDT on TRON
USDC_ERC20USDC on Ethereum
BTC_BITCOINNative BTC on Bitcoin
ETH_ERC20Native ETH on Ethereum
SOL_SOLANANative SOL on Solana
Umrechnungsregel: If the order currency and payment asset are the same, MochiPay uses a rate of 1 without conversion. Otherwise, the stored exchange rate and merchant markup are applied when the order is created. View current reference exchange rates →
BestellwertZahlungsmethodeErgebnis
49.90 USDUSDT_TRC20Uses the stored USD → USDT rate and merchant markup.
100 EURBTC_BITCOINUses the stored EUR → BTC rate and merchant markup.
25 USDCUSDC_ERC20No conversion. The exchange rate is 1.

Auftrag erstellen

Create a payment order with a hosted payment URL and the payment instructions needed for an on-site interface.

POST https://mochi.bz/api/v1/orders/create

Anfrageparameter

Order currency and payment method are different concepts. amountundcurrency define the merchant's original order value. payment_method defines the cryptocurrency and blockchain network used by the customer to pay. For example, 49.90 USD mit USDT_TRC20 means that a USD-denominated order is paid with the calculated amount of USDT on the TRON network.
ParametererforderlichTyp / LängeBeschreibung
merchant_order_idJastring · 1–100Your order reference. Without request_id, each successful creation receives a new globally unique MochiPay order_id. With request_id, a retry reuses its original order.
amountJadecimal(28,8)Positive original order amount. Fiat normally uses 2 decimal places; supported cryptocurrencies may use up to 8.
currencyJastring · 1–20Original order currency code. It may be fiat, such as USD oder EUR, or cryptocurrency, such as USDT oder USDC.
payment_methodJaasset ≤20 + network ≤30Payment cryptocurrency and blockchain network in ASSET_NETWORK format, such as USDT_TRC20 oder USDC_ERC20.
unique_amount_directionNeinUP oder DOWNDirection used for the small unique amount adjustment. Defaults to UP.
product_typeNeinPHYSICAL oder DIGITAL_SERVICEOrder type displayed at checkout. Defaults to DIGITAL_SERVICE. Shipping fields remain optional for both types.
descriptionNeinstring · 0–500Human-readable order description.
product_infoNeinJSON/string · nvarchar(max)Product, cart or custom metadata. The complete HTTP request body must not exceed 65,536 bytes.
customer_emailNeinstring · 0–255Customer email address. When supplied, it must be a valid email address.
customer_phoneNeinstring · 0–50Customer telephone number.
first_nameNeinstring · 0–100Customer first name.
last_nameNeinstring · 0–100Customer last name.
companyNeinstring · 0–200Customer company or organization name.
countryNeinstring · 0–100Customer country or region.
stateNeinstring · 0–100Customer state, province or region.
cityNeinstring · 0–100Customer city.
address1Neinstring · 0–500Primary customer address line.
address2Neinstring · 0–500Additional customer address line.
postal_codeNeinstring · 0–30Customer postal or ZIP code.
request_idNeinstring · 1–64Optional retry key, scoped to your merchant. Sign it with the JSON body. Reuse the same key and payload after a timeout. See request deduplication.
notify_urlNeinstring · 0–1000Absolut http:// oder https:// asynchronous server notification URL. Only public destinations are allowed; localhost, private/reserved IPs and redirects are blocked.
redirect_urlNeinstring · 0–1000Absolute customer return URL used after a successful payment.
customer_ipNeinIPv4/IPv6 · 0–45Customer IP supplied by the merchant. MochiPay also records the API request IP separately.

Anfragebeispiel

JSON
{
  "merchant_order_id": "ORDER-20260919-001",
  "amount": 49.90,
  "currency": "USD",
  "payment_method": "USDT_TRC20",
  "unique_amount_direction": "UP",
  "product_type": "DIGITAL_SERVICE",
  "description": "MochiPay order",
  "customer_email": "customer@example.com",
  "redirect_url": "https://merchant.example.com/payment/return"
}
C# · CREATE ORDER
string baseUrl = "https://mochi.bz";
string body = @"{
  ""merchant_order_id"": ""ORDER-20260920-001"",
  ""amount"": 49.90,
  ""currency"": ""USD"",
  ""payment_method"": ""USDT_TRC20"",
  ""unique_amount_direction"": ""UP"",
  ""product_type"": ""DIGITAL_SERVICE"",
  ""description"": ""Example order"",
  ""notify_url"": ""https://merchant.example.com/mochipay/notify"",
  ""redirect_url"": ""https://merchant.example.com/payment/return""
}";

string signature;
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(apiSecret)))
{
    signature = Convert.ToBase64String(
        hmac.ComputeHash(Encoding.UTF8.GetBytes(body)));
}

using (var client = new HttpClient())
using (var request = new HttpRequestMessage(
    HttpMethod.Post, baseUrl + "/api/v1/orders/create"))
{
    request.Headers.Add("X-Mochi-Key", apiKey);
    request.Headers.Add("X-Mochi-Signature", signature);
    request.Content = new StringContent(body, Encoding.UTF8, "application/json");
    HttpResponseMessage response = await client.SendAsync(request);
    string json = await response.Content.ReadAsStringAsync();
}
PHP 7.0–8.4 · CREATE ORDER
<?php
$baseUrl = 'https://mochi.bz';
$apiKey = 'YOUR_API_KEY';
$apiSecret = 'YOUR_API_SECRET';

$payload = [
    'merchant_order_id' => 'ORDER-20260920-001',
    'amount' => '49.90',
    'currency' => 'USD',
    'payment_method' => 'USDT_TRC20',
    'unique_amount_direction' => 'UP',
    'product_type' => 'DIGITAL_SERVICE',
    'description' => 'Example order',
    'notify_url' => 'https://merchant.example.com/mochipay/notify',
    'redirect_url' => 'https://merchant.example.com/payment/return'
];

$body = json_encode($payload, JSON_UNESCAPED_SLASHES);
$signature = base64_encode(
    hash_hmac('sha256', $body, $apiSecret, true)
);

$ch = curl_init($baseUrl . '/api/v1/orders/create');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-Mochi-Key: ' . $apiKey,
        'X-Mochi-Signature: ' . $signature
    ],
    CURLOPT_POSTFIELDS => $body,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT => 30
]);

$json = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);

if ($json === false) {
    throw new RuntimeException($error);
}

// Preserve decimal JSON numbers as text before decoding.
$json = preg_replace(
    '/("(?:amount|base_pay_amount|pay_amount|received_amount|exchange_rate|rate_markup_percent|unique_amount_delta)"\s*:\s*)(-?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)(?=\s*[,}])/',
    '$1"$2"', $json
);
$result = json_decode($json, true);
if ($httpCode < 200 || $httpCode >= 300 || empty($result['success'])) {
    throw new RuntimeException('MochiPay request failed. Review before retrying creation.');
}
?>

Erfolgsantwort

FeldTyp / LängeBeschreibung
successbooleanTrue when creation succeeds.
order_idstring · 32MochiPay system identifier. Store it with your local order.
merchant_order_idstring · ≤100Your original merchant reference.
product_typestring · ≤20PHYSICAL or DIGITAL_SERVICE.
statusstring · ≤20Current payment status.
amountdecimal(28,8)Original order amount; preserve decimal precision.
currencystring · ≤20Original pricing currency.
base_pay_amountdecimal(28,8)Converted amount before the unique adjustment.
unique_amount_deltadecimal(28,8)Signed matching adjustment.
unique_amount_directionstring · ≤10UP or DOWN.
pay_amountdecimal(28,8)Exact chain amount to display and send. Do not round.
payment_methodstringSelected asset/network, e.g. USDT_TRC20.
payment_addressstring · ≤255Receiving address for this payment and network.
payment_urlstring · URLHPP URL. On-site uses the same order instructions.
expires_atdatetimeExpiration in yyyy-MM-dd HH:mm:ss format.
HTTP 200 · JSON
{
  "success": true,
  "order_id": "41ad45477bd444f3bd89f0bab7f571bb",
  "merchant_order_id": "ORDER-20261003-001",
  "product_type": "DIGITAL_SERVICE",
  "status": "WAITING_PAYMENT",
  "amount": 49.90,
  "currency": "USD",
  "base_pay_amount": 49.90,
  "unique_amount_delta": 0.001,
  "unique_amount_direction": "UP",
  "pay_amount": 49.901,
  "payment_method": "USDT_TRC20",
  "payment_address": "TExampleReceivingAddressForIllustrationOnly",
  "payment_url": "https://mochi.bz/pay/41ad45477bd444f3bd89f0bab7f571bb",
  "expires_at": "2026-10-03 15:30:00"
}

Auftrag abfragen

Retrieve an order owned by the authenticated merchant using exactly one order identifier.

GET https://mochi.bz/api/v1/orders/query
AbfrageparametererforderlichTyp / LängeBeschreibung
order_idOne of twostring · 32MochiPay order identifier.
merchant_order_idOne of twostring · 1–100Your merchant order identifier. If it was reused, the newest matching order is returned.
Verwenden order_id once stored. After an uncertain Create response, query the same unique merchant reference before deciding what happened; repeated Create requests are not guaranteed to be idempotent. Send only one identifier. Sign the exact raw query string, for example merchant_order_id=ORDER-20260919-001.

Abfragebeispiele

C# · QUERY ORDER
string baseUrl = "https://mochi.bz";
string query = "merchant_order_id=ORDER-20260919-001";

using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(apiSecret)))
{
    string signature = Convert.ToBase64String(
        hmac.ComputeHash(Encoding.UTF8.GetBytes(query)));

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("X-Mochi-Key", apiKey);
        client.DefaultRequestHeaders.Add("X-Mochi-Signature", signature);
        string json = await client.GetStringAsync(
            baseUrl + "/api/v1/orders/query?" + query);
    }
}
PHP 7.0–8.4 · QUERY ORDER
<?php
$baseUrl = 'https://mochi.bz';
$apiKey = 'YOUR_API_KEY';
$apiSecret = 'YOUR_API_SECRET';
$query = http_build_query(
    ['merchant_order_id' => 'ORDER-20260919-001'],
    '',
    '&',
    PHP_QUERY_RFC3986
);
$signature = base64_encode(
    hash_hmac('sha256', $query, $apiSecret, true)
);

$ch = curl_init($baseUrl . '/api/v1/orders/query?' . $query);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'X-Mochi-Key: ' . $apiKey,
        'X-Mochi-Signature: ' . $signature
    ],
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT => 30
]);

$json = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);

if ($json === false) {
    throw new RuntimeException($error);
}

// Preserve decimal JSON numbers as text before decoding.
$json = preg_replace(
    '/("(?:amount|base_pay_amount|pay_amount|received_amount|exchange_rate|rate_markup_percent|unique_amount_delta)"\s*:\s*)(-?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)(?=\s*[,}])/',
    '$1"$2"', $json
);
$result = json_decode($json, true);
if ($httpCode < 200 || $httpCode >= 300 || empty($result['success'])) {
    throw new RuntimeException('MochiPay request failed. Review before retrying creation.');
}
?>

Felder der Erfolgsantwort

The query returns wallet_typeundnetwork separately; Create Order returns their combined payment_method. Compare them with the method saved on your local order. Return only necessary payment fields to the customer browser.

FeldTyp / LängeBeschreibung
order_idstring · 32MochiPay order identifier.
merchant_order_idstring · ≤100Your merchant order identifier.
sourcestring · ≤20Order source, such as API.
descriptionstring · ≤500Order description.
product_typestring · ≤20PHYSICAL oder DIGITAL_SERVICE.
product_infoJSON/string/nullProduct or cart information supplied when the order was created.
statusstring · ≤20Overall order payment status.
merchant_statusstring · ≤50Merchant-facing order status.
amountdecimal(28,8)Original order amount.
currencystring · ≤20Original order currency, such as USD, EUR, USDT oder USDC.
base_pay_amountdecimal(28,8)Converted payment amount before the unique matching adjustment.
unique_amount_deltadecimal(28,8)Small signed amount added to or subtracted from the base amount.
unique_amount_directionstring · ≤10UP oder DOWN.
pay_amountdecimal(28,8)Exact cryptocurrency amount the customer must pay.
received_amountdecimal(28,8)Cryptocurrency amount received so far.
exchange_ratedecimal(38,18)Exchange-rate snapshot used when the order was created.
rate_markup_percentdecimal(9,4)Merchant rate markup snapshot used for the order.
wallet_typestring · ≤20Zahlungsvermögenswert: USDT, USDC, BTC, ETH oder SOL.
networkstring · ≤30Blockchain network, such as TRC20 oder ERC20.
payment_addressstring · ≤255Merchant receiving address selected for this order.
tx_hashstring/null · ≤255Detected customer payment transaction hash.
confirmationsintegerCurrent blockchain confirmation count.
customer_email … postal_codestring/nullOptional customer and shipping fields supplied at order creation.
payment_urlstring · URLHPP checkout URL; on-site integrations query the same order for status and payment instructions.
expires_atdatetimeOrder expiration time.
paid_atdatetime/nullPayment completion time.
created_atdatetimeOrder creation time.
updated_atdatetimeLast order update time.

Codebeispiele

PHP, Node.js, Python, C# / .NET Framework, Java, iOS Swift und Android Kotlin. Eine gespeicherte Zahlung unterstützt ON_SITE und HPP.

Quellpaket für Ihre Anwendung auswählen

Ein aktuelles ZIP pro Sprache oder Mobilplattform mit englischer Anleitung. Shop-Plugins bleiben getrennt; bestehende Integrationen funktionieren weiterhin.

SERVER-DEMO · ON_SITE + HPP

PHP

7.0–8.4

Ursprüngliche PHP-Routen: order.php, checkout.php und callback.php

ZIP herunterladen
SERVER-DEMO · ON_SITE + HPP

Node.js

22+

Gemeinsame Server- und Mobilrouten

ZIP herunterladen
SERVER-DEMO · ON_SITE + HPP

Python

3.10+

Gemeinsame Server- und Mobilrouten

ZIP herunterladen
SERVER-DEMO · ON_SITE + HPP

C# / .NET Framework

4.6.1 / VS2019

Gemeinsame Server- und Mobilrouten

ZIP herunterladen
SERVER-DEMO · ON_SITE + HPP

Java

JDK17+

Gemeinsame Server- und Mobilrouten

ZIP herunterladen
MOBILER QUELLCODE · ON_SITE + HPP

iOS Swift

iOS15+ / Xcode14+

Gemeinsames Backend verwenden; nur Quellprojekt

ZIP herunterladen
MOBILER QUELLCODE · ON_SITE + HPP

Android Kotlin

API26+ / SDK35 / JDK17

Gemeinsames Backend verwenden; nur Quellprojekt

ZIP herunterladen

Vollständigen Serverablauf ausführen

  1. MochiPay-Zugangsdaten, aktive Wallets, öffentliche HTTPS-Callback-Adresse und unabhängiges Testtoken privat konfigurieren. Der Server legt den Preis fest; der Browser kann ihn nicht ändern.
  2. Mit gespeicherter request_id und unverändertem Inhalt erstellen oder wiederherstellen. Exakte UTF-8-Bytes und kodierte Abfragen mit HMAC-SHA256 signieren.
  3. Gespeicherten ON_SITE-Dialog oder HPP-Weiterleitung öffnen; beide verwenden denselben Auftrag. ON_SITE bietet QR, Kopieren und zehn Sprachen.
  4. notify_url serverseitig bearbeiten und gespeicherte ID abfragen. Rückkehr und Polling verwenden dieselbe Bindungs- und exakte Betragsprüfung.
  5. Verifizierte Zahlung einmal erfassen. Vor Produktion Testdateien und Markierungen durch Benutzerberechtigungen und atomare Datenbankaktualisierung ersetzen.

PHP behält order.php / checkout.php / callback.php. Die vier anderen Backends bieten folgende gemeinsame Routen für Browser und mobile Clients.

RouteAufgabe
POST /paymentsServerbepreisten Artikel erstellen oder wiederherstellen; request_id, payment_method und Test-Bearer-Token.
GET /checkout?r=…&t=…&mode=ON_SITELokaler Händler-Zahlungsdialog zum gespeicherten Auftrag.
GET /checkout?…&mode=HPP303-Weiterleitung nach Bindungs- und Zielprüfung.
GET /status?r=…&t=…Signierte MochiPay-Abfrage; minimales DTO mit Dezimalbeträgen als Zeichenfolgen.
POST /callback?r=…&t=…Asynchrone Prüfung und einmalige Zahlungsmarkierung.
GET /complete?r=…&t=…Geprüfte synchrone Rückkehr-/Ergebnisseite.

Mobiles Bezahlen ohne API-Geheimnisse auf dem Gerät

Swift und Kotlin verwenden eines der vier gemeinsamen Backends. In der App nur die HTTPS-Händleradresse konfigurieren. ON_SITE zeigt lokales Checkout in WKWebView oder Android WebView; HPP öffnet die Händlerweiterleitung im externen Browser. Bei Aktivierung fragt die App erneut ab; Schließen beendet keine Serverbenachrichtigungen.

Gespeicherte ID bleibt nach Wiederholung/Neustart erhalten. Oberflächen- und Sprachwechsel verwenden denselben Auftrag. Testtoken ist unabhängig von MochiPay-Zugangsdaten; durch die authentifizierte Benutzersitzung Ihrer Anwendung ersetzen.

Dies sind Integrationsbeispiele, keine nativen SDKs oder App-Store-Freigaben. Prüfen Sie die aktuellenApple-AbrechnungsregelnundGoogle-Play-Zahlungsrichtlinienfür Produkt und Zielregion.

Vor Veröffentlichung prüfen

README und TESTING.md jedes Pakets beachten. Lokale signierte Tests decken Wiederholungen, falsche Bindungen, unbezahlte Zustände und doppelte Meldungen ab. Xcode/Android Studio, echte Geräte und eine kleine echte Zahlung müssen im Staging geprüft werden. Keine neuen MochiPay-Tabellen oder Plugin-Neuinstallation nötig.

Synchrone Rückkehr und asynchrone Benachrichtigungen implementieren →

Rückkehr und Benachrichtigungen

Eine serverseitige Prüfung verarbeitet synchrone HPP-Rückkehr, asynchrone HPP-Meldungen und ON_SITE-Aktualisierungen.

Mehrere Eingänge. Eine geprüfte Auftragsaktualisierung.

AblaufAPI-Feld / EingangZweck
Synchrone HPP-Rückkehrredirect_url · Browser-GETErgebnis nach signierter Serverabfrage anzeigen. Der Kunde kehrt möglicherweise nicht zurück.
Asynchrone HPP-Benachrichtigungnotify_url · Server-POSTLokalen Auftrag unabhängig vom Browser prüfen und aktualisieren.
Asynchrone ON_SITE-BenachrichtigungDieselbe notify_url · Server-POSTAuftrag auch bei geschlossenem Dialog oder geschlossener App aktualisieren.
ON_SITE-StatusanzeigeBrowser/App fragt Händler-/status abMinimales Ergebnis derselben Backend-Prüfung anzeigen.

HPP: synchrone Browser-Rückkehr

Beim Erstellen redirect_url mit lokalem Auftragstoken speichern. Beispiel: HTTPS /complete?r=…&t=…. Nach gehostetem Checkout den gespeicherten Auftrag laden, Eigentümer/Token prüfen und Query Order mit gespeicherter MochiPay-order_id signieren.

PAID erst nach gültiger Bindung und exakt passendem Empfangsbetrag anzeigen; sonst warten oder prüfen. URL, Browsermeldung oder Bildschirmfoto beweisen keine Zahlung. Callback kann vor oder nach Rückkehr eintreffen.

HPP und ON_SITE: asynchrone Serverbenachrichtigung

notify_url beim Erstellen speichern; Beispiele: /callback?r=…&t=…. MochiPay sendet unabhängig vom Browser POST. Eingehende Werte nur als Suchhinweise verwenden. Authentifizierte API abfragen und gespeicherte ID, Referenz, Originalbetrag/Währung, Asset/Netzwerk, Adresse und exakten Zahlbetrag vergleichen.

PAID und received_amount exakt gleich pay_amount verlangen. Zahlung atomar einmal erfassen; wiederholte gültige Meldungen erhalten OK ohne doppelte Aktualisierung oder Lieferung. Unbestätigte Zustände, ungültige Bindungen und Abfrage-/Speicherfehler dürfen nicht als erfolgreiche Zahlung bestätigt werden.

Demos speichern eine einmalige paid_verified-Markierung. Durch eine Transaktion in Ihrer Auftragsdatenbank ersetzen; sie liefert keine Waren. Callback-Inhalt allein aktualisiert keinen Auftrag.

ON_SITE: asynchrone Aktualisierung und Dialog-Polling

ON_SITE nutzt dieselbe notify_url und prüft auch bei geschlossenem Dialog/offline App weiter. Der sichtbare Dialog fragt nur Ihr berechtigtes Backend alle 15 Sekunden ab. Dieses fragt MochiPay und liefert minimale Felder mit Dezimalbeträgen als Text. PAID verwendet dieselbe Prüfung wie Callback; API-Geheimnisse und vollständige Kundendaten gelangen nicht in den Browser.

Schließen, Wiederöffnen oder ON_SITE/HPP-Wechsel verwendet die gespeicherte Zahlung. Nach Timeout request_id und exakten Inhalt behalten; geänderte Referenz kann einen zusätzlichen Auftrag erzeugen.

Ausführbarer Code in jedem Backend-Paket

Jedes Beispiel enthält beide Modi, Benachrichtigung, Rückkehr, sicheren Statusendpunkt und dauerhaften Versuch. notify_url und redirect_url sind API-Felder; Checkout-Modus ist eine lokale Auswahl, kein Create-Order-Feld.

Node.js · Prüfung, Rückkehr und Benachrichtigung

Auszüge aus dem ausführbaren Paket. Routenvariablen und Speicherhilfen sind im vollständigen Quellcode definiert; die vollständige Integration verwenden.

async function verify(r,t){const a=load(r);if(!equal(a.token,t)||!a.snapshot)throw Error('Invalid payment capability');const d=await api('/api/v1/orders/query','order_id='+encodeURIComponent(a.snapshot.order_id));bind(a,d);if(d.status==='PAID'&&!a.paid_verified){a.paid_verified=true;save(r,a)}return d}

// HPP redirect_url -> GET /complete: verify before displaying result.
await verify(r,t);
// notify_url -> POST /callback: same verification and atomic once-only marker.
const d=await verify(r,t);
output(res,d.status==='PAID'?200:409,'text/plain',d.status==='PAID'?'OK':'Payment not confirmed');
// ON_SITE polling -> GET /status: only the safe DTO reaches the browser.
json(res,200,{success:true,data:safe(await verify(r,t))});
Python · Prüfung, Rückkehr und Benachrichtigung

Auszüge aus dem ausführbaren Paket. Routenvariablen und Speicherhilfen sind im vollständigen Quellcode definiert; die vollständige Integration verwenden.

def verify(r, t):
    a = load(r)
    if not isinstance(t,str) or not hmac.compare_digest(a['token'],t) or not a.get('snapshot'): raise ValueError('Invalid capability')
    d = api('/api/v1/orders/query',urlencode({'order_id':a['snapshot']['order_id']})); bind(a,d)
    if d.get('status') == 'PAID' and not a['paid_verified']: a['paid_verified'] = True; save(r,a)
    return d

# HPP browser return
verify(r,t)
# HPP and ON_SITE server notification (inside the handler lock)
d = verify(r,t)
self.out(200 if d['status']=='PAID' else 409,'text/plain','OK' if d['status']=='PAID' else 'Payment not confirmed')
# ON_SITE display only
self.jout(200,dict(success=True,data=safe(verify(r,t))))
C# / .NET Framework · Prüfung, Rückkehr und Benachrichtigung

Auszüge aus dem ausführbaren Paket. Routenvariablen und Speicherhilfen sind im vollständigen Quellcode definiert; die vollständige Integration verwenden.

        static JObject Verify(string r,string t)
        {
            var a=Load(r);if(!Equal(S(a,"token"),t)||a["snapshot"]==null)throw new Exception("Invalid capability");var d=Api("/api/v1/orders/query",null,"order_id="+Uri.EscapeDataString(S(a["snapshot"],"order_id")));Bind(a,d);
            if(S(d,"status")=="PAID"&&!(bool)a["paid_verified"]){a["paid_verified"]=true;Save(r,a);}return d;
        }

// GET /complete: verified HPP return.
Verify(r,t);
// POST /callback: asynchronous notification for both modes.
var d=Verify(r,t);
Out(res,S(d,"status")=="PAID"?200:409,"text/plain",S(d,"status")=="PAID"?"OK":"Payment not confirmed");
// GET /status: display only the minimal DTO.
JOut(res,200,new JObject {{"success",true},{"data",Safe(Verify(r,t))}});
Java · Prüfung, Rückkehr und Benachrichtigung

Auszüge aus dem ausführbaren Paket. Routenvariablen und Speicherhilfen sind im vollständigen Quellcode definiert; die vollständige Integration verwenden.

    static JsonObject verify(String r,String t)throws Exception{JsonObject a=load(r);if(!equal(s(a,"token"),t)||!a.has("snapshot"))throw new IllegalArgumentException("Invalid capability");JsonObject d=api("/api/v1/orders/query",null,"order_id="+enc(s(a.getAsJsonObject("snapshot"),"order_id")));bind(a,d);if(s(d,"status").equals("PAID")&&!a.get("paid_verified").getAsBoolean()){a.addProperty("paid_verified",true);save(r,a);}return d;}

// GET /complete: verified HPP return.
verify(r,t);
// POST /callback: both presentation modes use this route.
boolean paid=s(verify(r,t),"status").equals("PAID");
out(x,paid?200:409,"text/plain",paid?"OK":"Payment not confirmed");
// GET /status: minimal safe display DTO.
jout(x,200,object("success",true,"data",safe(verify(r,t))));
PHP · Prüfung, Rückkehr und Benachrichtigung

Auszüge aus dem ausführbaren Paket. Routenvariablen und Speicherhilfen sind im vollständigen Quellcode definiert; die vollständige Integration verwenden.

    // Authenticate the result by querying MochiPay server-to-server.
    $verified = mochipay_query_order('order_id', $orderId);
    if (!$verified['ok'] || !is_array($verified['data'])) {
        callback_text(503, 'VERIFICATION_FAILED');
    }

    $order = $verified['data'];
    if (!isset($order['order_id']) || !hash_equals((string) $order['order_id'], $orderId)) {
        callback_text(409, 'ORDER_MISMATCH');
    }

    $verifiedMerchantId = isset($order['merchant_order_id']) ? (string)$order['merchant_order_id'] : '';
    try { $record = mochipay_load($verifiedMerchantId); }
    catch (Exception $e) { callback_text(503, 'LOCAL_STORAGE_UNAVAILABLE'); }
    if (!mochipay_bound($record, $order) || (isset($callback['merchant_order_id']) && !hash_equals($verifiedMerchantId, (string)$callback['merchant_order_id']))) callback_text(409, 'LOCAL_ORDER_MISMATCH');
    if (!isset($order['received_amount']) || MochiPayPortable::decimal($order['received_amount']) !== MochiPayPortable::decimal($order['pay_amount'])) callback_text(409, 'PAYMENT_AMOUNT_REQUIRES_REVIEW');

    if (!isset($order['status']) || strtoupper((string) $order['status']) !== 'PAID') {
        callback_text(409, 'ORDER_NOT_PAID');
    }

    /*
     * TODO: In your production database, atomically fulfill the bound local order.
     * This demo acknowledges verification only; it does not deliver goods.
     * Make the operation idempotent: repeated callbacks must not deliver goods
     * or credit the customer more than once.
     */
    try { mochipay_record_verified($record, $order); }
    catch (Exception $e) { callback_text(503, 'LOCAL_UPDATE_FAILED'); }
    callback_text(200, 'OK');
}

// GET browser return verifies the saved capability, then queries the saved ID.
$authorized = $record && $returnToken !== '' && hash_equals($record['token'], $returnToken);
if ($authorized) {
    $verified = mochipay_query_order('order_id', $record['snapshot']['order_id']);
    $paid = $verified['ok'] && mochipay_record_verified($record, $verified['data']);
}
Vollständige Beispiele herunterladen

Fehlerantworten

Errors return an HTTP status code and a stable machine-readable message.

JSON
{ "success": false, "message": "INVALID_SIGNATURE" }
HTTPNachrichtBeschreibung
400INVALID_JSON / INVALID_AMOUNTRequest data is invalid.
400INVALID_CURRENCY / INVALID_PAYMENT_METHODCurrency or payment method is unsupported.
400INVALID_UNIQUE_AMOUNT_DIRECTION / INVALID_PRODUCT_TYPEThe direction or product-type value is unsupported.
400FIELD_TOO_LONG / INVALID_REDIRECT_URL / INVALID_NOTIFY_URLAn optional field exceeds its limit or a supplied URL is invalid.
400ORDER_ID_REQUIRED / ORDER_IDENTIFIER_CONFLICTQuery identifier is missing or conflicting.
401INVALID_API_KEY / INVALID_SIGNATUREAuthentifizierung fehlgeschlagen.
403SUBSCRIPTION_REQUIRED / SUBSCRIPTION_EXPIREDMerchant subscription is unavailable.
403MERCHANT_DISABLEDMerchant account is disabled.
404ORDER_NOT_FOUNDNo matching merchant-owned order was found.
500SYSTEM_ERRORThe request could not be completed.

Integration klassischer SaaS-Shops

HPP-only compatibility for Shopyy / Shopoem, Shoplus, Wooshoppaas and Fecify. No plugin download or SaaS source-code change is required.

POST https://mochi.bz/api/v/orders/legacy_create/{MerchantApiKey}/{PaymentMethod}
Use the API key, never the API secret, in this URL. The URL identifies the merchant and payment method. The SaaS platform continues to send its existing application/x-www-form-urlencoded order fields.

Unterstützte Plattformen

Shopyy / ShopoemSame company and compatible gateway format
ShoplusConfigure the payment interface URL
WooshoppaasConfigure the payment interface URL
FecifyConfigure the payment interface URL

Einrichtung

  1. Copy the merchant API key from the MochiPay merchant dashboard.
  2. Choose one supported payment method for this SaaS payment option.
  3. Ersetzen {MerchantApiKey}und{PaymentMethod} in the endpoint URL.
  4. Paste the completed URL into the SaaS payment gateway's interface or submit URL setting.
  5. Keep the SaaS platform's existing POST parameters, return URL and notify URL unchanged.

URL-Beispiele

LEGACY PAYMENT INTERFACE URL
https://mochi.bz/api/v/orders/legacy_create/YOUR_MERCHANT_API_KEY/USDT_TRC20

https://mochi.bz/api/v/orders/legacy_create/YOUR_MERCHANT_API_KEY/USDC_ERC20

https://mochi.bz/api/v/orders/legacy_create/YOUR_MERCHANT_API_KEY/SOL_SOLANA

ZAHLUNGSMETHODEN

USDT_TRC20USDT on TRON
USDC_ERC20USDC on Ethereum
BTC_BITCOINNative BTC on Bitcoin
ETH_ERC20Native ETH on Ethereum
SOL_SOLANANative SOL on Solana

Erforderliche Legacy-Felder

ParameterZweck
merchant_urlOriginal SaaS store value, retained in the complete request record for diagnostics.
system_nameExisting SaaS platform identifier, retained in the complete request record.
account_type / payment_modeKeep the platform's existing values, normally liveundsale.
orders_idOriginal SaaS order identifier.
amount / currencyOriginal order amount and currency.
return_urlCustomer return URL after confirmed payment.
notify_urlServer notification URL for the completed payment.
securityTokenOptional passthrough token returned unchanged.
productsOptional product or cart data.
customer_*Existing customer, address, IP and user-agent fields.

Antwort auf die Bestellerstellung

The existing SaaS integration extracts the hosted checkout URL from the three-part plain-text response.

TEXT
_____https://mochi.bz/pay/ORDER_ID_____

Successful return and notification fields

FeldWert
securityTokenThe original passthrough value.
paymentMethodonlinepay
paymentStatusCompleted
paymentTransactionThe confirmed blockchain transaction hash.
paymentCommentsMochiPay payment confirmed
orderIDThe original SaaS orders_id.

E-Commerce-Plugins herunterladen

Eines der 19 ZIPs gemäß Shop, Version und PHP wählen. Jedes enthält englische Anleitungen und PHP-Anforderungen. Nutzen Sie die von Ihrem Shop erlaubte Umgebung.

ON-SITE + HPP

WooCommerce

Classic Checkout, Checkout Blocks und HPOS.

PlattformWooCommerce ab 5.8 mit nativer Gateway-API
PHPPHP 7.4–8.4

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

OpenCart 2.0–2.2

Frühe Zahlungsrouten und versionsabhängige Vorlagenpfade.

PlattformOpenCart 2.0.x-2.2.x
PHPPHP 5.6–7.4; neuere Versionen benötigen Core-Patches

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

OpenCart 2.3

Separate extension/payment-Struktur für 2.3.

PlattformOpenCart 2.3.x
PHPPHP 5.6–7.4; neuere Versionen benötigen Core-Patches

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

OpenCart 3

Twig-Ansichten und natives OpenCart-3-Gateway.

PlattformOpenCart 3.0.x
PHPPHP 5.6–8.4; genaue Core- und Abhängigkeitsanforderungen beachten

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

OpenCart 4

Native Namespaces, Routen und Erweiterungspakete für 4.x.

PlattformOpenCart 4.0.2.x-4.1.x
PHPPHP 8.0.2–8.4; 4.1.0.4 benötigt 8.1+

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Zen Cart 1.5.3–1.5.7

Ältere define-Sprachdateien und native Statuseinstellungen.

PlattformZen Cart 1.5.3-1.5.7
PHPPHP 5.6–8.0, abhängig von der Core-Version

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Zen Cart 1.5.8–2.2

Moderne Array-Sprachdateien und native Statuseinstellungen.

PlattformZen Cart 1.5.8 / 2.0.x / 2.1.x / 2.2.x
PHPPHP 7.3–8.4, abhängig von der Core-Version

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Magento 1 / OpenMage

Magento CE 1.9.3.0–1.9.4.5 und kompatibles OpenMage 19/20.

PlattformMagento CE 1.9.3.0-1.9.4.5; native M1-API von OpenMage 19/20
PHPPHP 5.6–8.4; PHP 8 benötigt einen kompatiblen OpenMage-Core

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Magento 2

Magento Open Source 2.3.7–2.4.8 mit nativem Checkout.

PlattformMagento Open Source 2.3.7-2.4.8 mit nativem Checkout
PHPPHP 7.3–8.4, abhängig von der Core-Version

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

PrestaShop 1.6

Zahlungs-Hook und Formular von PrestaShop 1.6.1.

PlattformPrestaShop 1.6.1.x
PHPPHP 5.6–7.1

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

PrestaShop 1.7 / 8 / 9

PrestaShop 1.7.6–1.7.8, 8.x und 9.0.x mit paymentOptions.

PlattformPrestaShop 1.7.6-1.7.8 / 8.x / 9.0.x
PHPPHP 5.6–8.4, abhängig von der Core-Version

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Shopware 6.6

Separate native Handler für Shopware 6.6 und 6.7.

PlattformShopware >=6.6.10.0 <6.7.0.0
PHPPHP 8.2.x / 8.3.x / 8.4.x

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Shopware 6.7

Separate native Handler für Shopware 6.6 und 6.7.

PlattformShopware >=6.7.0.0 <6.8.0.0
PHPPHP 8.2.x / 8.3.x / 8.4.x

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Drupal Commerce

Natives Commerce-Gateway für unterstützte Drupal- und Commerce-Versionen.

PlattformCommerce 2.40.x with Drupal 9.3–10.x; or Commerce 3.3.10+ <3.4 with Drupal 10.3–11.x
PHPDrupal 9.3–9.5: PHP 7.4–8.1; Drupal 10: PHP 8.1–8.3; Drupal 11: PHP 8.3–8.4, nur wenn die genaue Drupal-Version dies zulässt

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

EC-CUBE 4.3

Nativer JPY-Checkout mit EC-CUBE-Kaufablauf.

PlattformEC-CUBE >=4.3.0 <4.4.0
PHPPHP 8.1.x / 8.2.x / 8.3.x

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Bagisto 2.3

Laravel-Paket mit nativen Bestellungen und Rechnungen.

PlattformBagisto >=2.3.0 <2.4.0
PHPPHP 8.2.x / 8.3.x / 8.4.x (auch gesperrte Shop-Abhängigkeiten einhalten)

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

Sylius 2.0

Nativer Payum-Checkout und Sylius-Zahlungszustände.

PlattformSylius >=2.0.0 <2.1.0 with PayumBundle 2.6+ / Payum 1.7-compatible core
PHPPHP 8.2.x / 8.3.x / 8.4.x (auch gesperrte Shop-Abhängigkeiten einhalten)

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

osCommerce 4.14

Natives V4-Zahlungsmodul; getrennt von älteren osCommerce 2.x und 3.x.

PlattformosCommerce 4.14.x; native V4-orderPayment-Modul-API
PHPPHP 7.4.x–8.3.x, abhängig von osCommerce-Version und gesperrten Abhängigkeiten

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →
ON-SITE + HPP

thirty bees 1.6

Natives Zahlungsmodul und Bestellverlauf für thirty bees 1.6.

Plattformthirty bees >=1.6.0 <1.7.0
PHPPHP 7.4.x / 8.0.x / 8.1.x / 8.2.x / 8.3.x; passende thirty-bees-Distribution verwenden

Englische Anleitung und detaillierte PHP-Tabelle im ZIP.

ZIP herunterladenEinrichtungsanleitung →

Neue Adapter sind Erstversionen. Installation und echte Zahlungen in Staging vor Produktion prüfen.

Mit MochiPay entwickeln

Konto erstellen und passende Integration wählen.

Jetzt starten