Cost+Docs

Java / Kotlin

Hivatalos Kotlin/Java SDK a Cost+ fizetési átjáróhoz

Hivatalos Kotlin SDK a Cost+ fizetési átjáróhoz, teljes Java interoperabilitással. Egyszerűsíti a HPP (tárolt fizetési oldal) átirányítási folyamatot, a HMAC adatcsomag-aláírást és a webhook ellenőrzést.

Funkciók

  • Kotlin-első, Java-barát — adatosztályok, korutinok, null biztonság; teljes mértékben használható Java-ból
  • kotlinx.serialization — nincs Gson/Jackson függőség; automatikus snake_case/camelCase leképezés
  • HMAC-SHA256 aláírás generálás és állandó idejű ellenőrzés
  • Webhook feldolgozás + API-alapú rendelés ellenőrzés
  • Suspend függvények nem blokkoló I/O-hoz Kotlin korutinokkal
  • Injektálható HttpClient a könnyű teszteléshez mock átvitellel
  • Célzott platform: Java 17+

Követelmények

Telepítés

Gradle (Kotlin DSL)

dependencies {
    implementation("io.nopayn:nopayn-sdk:1.0.0")
}

Gradle (Groovy)

dependencies {
    implementation 'io.nopayn:nopayn-sdk:1.0.0'
}

Maven

<dependency>
    <groupId>io.nopayn</groupId>
    <artifactId>nopayn-sdk</artifactId>
    <version>1.0.0</version>
</dependency>

Gyorsindítás (Kotlin)

1. A kliens inicializálása

import io.nopayn.*
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    val nopayn = NoPaynClient(
        NoPaynConfig(
            apiKey = "your-api-key",
            merchantId = "your-project",
        )
    )
}

2. Fizetés létrehozása és átirányítás a HPP-re

val result = nopayn.generatePaymentUrl(
    CreateOrderParams(
        amount = 1295,            // €12.95 in cents
        currency = "EUR",
        merchantOrderId = "ORDER-001",
        description = "Premium Widget",
        returnUrl = "https://shop.example.com/success",
        failureUrl = "https://shop.example.com/failure",
        webhookUrl = "https://shop.example.com/webhook",
        locale = "en-GB",
        expirationPeriod = "PT30M",
    )
)

println(result.orderUrl)    // HPP URL
println(result.paymentUrl)  // Direct payment method URL
println(result.signature)   // HMAC-SHA256 signature

3. Webhook kezelése

// In your HTTP handler (Ktor, Spring, etc.)
val rawBody: String = request.body()
val verified = nopayn.verifyWebhook(rawBody)

println(verified.order.status)  // "completed", "cancelled", etc.
println(verified.isFinal)       // true when the order won't change

if (verified.order.status == "completed") {
    // Fulfil the order
}

Gyorsindítás (Java)

import io.nopayn.*;
import kotlinx.coroutines.BuildersKt;
import kotlinx.coroutines.Dispatchers;

public class Example {
    public static void main(String[] args) throws Exception {
        NoPaynClient client = new NoPaynClient(
            new NoPaynConfig("your-api-key", "your-project", "https://api.nopayn.co.uk")
        );

        Order order = BuildersKt.runBlocking(
            Dispatchers.getIO(),
            (scope, continuation) -> client.createOrder(
                new CreateOrderParams(
                    1295, "EUR", "ORDER-001", "Premium Widget",
                    "https://shop.example.com/success",
                    "https://shop.example.com/failure",
                    "https://shop.example.com/webhook",
                    "en-GB", null, "PT30M"
                ),
                continuation
            )
        );

        System.out.println("Order ID: " + order.getId());
        System.out.println("Order URL: " + order.getOrderUrl());

        // Signature utilities work synchronously
        String sig = client.generateSignature(1295, "EUR", order.getId());
        boolean valid = client.verifySignature(1295, "EUR", order.getId(), sig);
    }
}

API-referencia

NoPaynClient(config, httpClient?)

ParaméterTípusKötelezőAlapértelmezett
config.apiKeyStringIgen
config.merchantIdStringIgen
config.baseUrlStringNemhttps://api.nopayn.co.uk
httpClientjava.net.http.HttpClientNemAlapértelmezett kliens

client.createOrder(params): Order (suspend)

Rendelést hoz létre a POST /v1/orders/ végponton.

ParaméterTípusKötelezőLeírás
amountIntIgenÖsszeg a legkisebb pénznem-egységben (cent)
currencyStringIgenISO 4217 kód (EUR, GBP, USD, NOK, SEK)
merchantOrderIdString?NemAz Ön belső rendelési hivatkozása
descriptionString?NemRendelés leírása
returnUrlString?NemÁtirányítás sikeres fizetés után
failureUrlString?NemÁtirányítás törlés/lejárat/hiba esetén
webhookUrlString?NemAszinkron állapotváltozási értesítések
localeString?NemHPP nyelv (en-GB, de-DE, nl-NL stb.)
paymentMethodsList<String>?NemHPP módok szűrése
expirationPeriodString?NemISO 8601 időtartam (PT30M)

Elérhető fizetési módok: credit-card, apple-pay, google-pay, vipps-mobilepay

client.getOrder(orderId): Order (suspend)

Rendelés részleteinek lekérdezése a GET /v1/orders/{id}/ végponton.

client.createRefund(orderId, amount, description?): Refund (suspend)

Teljes vagy részleges visszatérítés kiadása a POST /v1/orders/{id}/refunds/ végponton.

client.generatePaymentUrl(params): PaymentUrlResult (suspend)

Kényelmi metódus, amely rendelést hoz létre és visszaadja:

PaymentUrlResult(
    orderId: String,     // NoPayn order UUID
    orderUrl: String,    // HPP URL
    paymentUrl: String?, // Direct payment URL (first transaction)
    signature: String,   // HMAC-SHA256 of amount:currency:orderId
    order: Order,        // Full order object
)

client.generateSignature(amount, currency, orderId): String

HMAC-SHA256 hex aláírást generál. A kanonikus üzenet: $amount:$currency:$orderId, az API-kulccsal aláírva.

client.verifySignature(amount, currency, orderId, signature): Boolean

HMAC-SHA256 aláírás állandó idejű ellenőrzése.

client.verifyWebhook(rawBody): VerifiedWebhook (suspend)

Feldolgozza a webhook törzset, majd meghívja a GET /v1/orders/{id}/ végpontot az aktuális állapot ellenőrzéséhez.

Önálló HMAC segédeszközök

import io.nopayn.NoPaynSignature

val sig = NoPaynSignature.generate("your-api-key", 1295, "EUR", "order-uuid")
val ok  = NoPaynSignature.verify("your-api-key", 1295, "EUR", "order-uuid", sig)

Java-ból:

String sig = NoPaynSignature.generate("your-api-key", 1295, "EUR", "order-uuid");
boolean ok = NoPaynSignature.verify("your-api-key", 1295, "EUR", "order-uuid", sig);

Hibakezelés

import io.nopayn.*

try {
    nopayn.createOrder(CreateOrderParams(amount = 100, currency = "EUR"))
} catch (e: ApiException) {
    println(e.statusCode)  // 401, 400, etc.
    println(e.errorBody)   // Raw API error response
} catch (e: NoPaynException) {
    println(e.message)     // Network or parsing error
}

Rendelés állapotok

ÁllapotVégleges?Leírás
newNemRendelés létrehozva
processingNemFizetés folyamatban
completedIgenFizetés sikeres — szállítsa az árut
cancelledIgenFizetés törölve az ügyfél által
expiredIgenA fizetési link lejárt
errorIgenTechnikai hiba

Webhook bevált gyakorlatok

  1. Mindig ellenőrizze az API-n keresztül — a webhook adatcsomag csak a rendelés azonosítóját tartalmazza, soha nem az állapotot. Az SDK verifyWebhook() metódusa ezt automatikusan elvégzi.
  2. Válaszoljon HTTP 200-zal a fogadás nyugtázásához. Bármely más kód legfeljebb 10 újrapróbálkozást vált ki (2 percenként).
  3. Alkalmazzon tartalék lekérdezést — a 10 percnél régebbi, végleges állapotot még el nem ért rendelésekhez kérdezze le a getOrder() metódust biztonsági hálóként.
  4. Legyen idempotens — ugyanazt a webhookot többször is megkaphatja.

Tesztkártyák

Használja ezeket a kártyákat Cost+ teszt módban (sandbox weboldal):

KártyaSzámMegjegyzés
Visa (sikeres)4111 1111 1111 1111Bármely CVV
Mastercard (sikeres)5544 3300 0003 7Bármely CVV
Visa (elutasítva)4111 1111 1111 1105Do Not Honor
Visa (elégtelen fedezet)4111 1111 1111 1151Insufficient Funds

Használjon bármely jövőbeli lejárati dátumot és bármely 3 számjegyű CVC-t.

Demo alkalmazás

Egy Docker-alapú demo alkalmazás (Ktor) található a GitHub tárolóban a teljes fizetési folyamat teszteléséhez.

Támogatás

Segítségre van szüksége? Forduljon ügyfélszolgálatunkhoz: support@costplus.io.

On this page