Cost+Docs

Java / Kotlin

Oficialus Kotlin/Java SDK Cost+ mokėjimų šliuzui

Oficialus Kotlin SDK Cost+ mokėjimų šliuzui, visiškai suderinamas su Java. Supaprastina HPP (mokėjimo puslapio) nukreipimo procesą, HMAC turinio pasirašymą ir webhook patvirtinimą.

Savybės

  • Kotlin-first, Java draugiškas — data klasės, korutinos, null saugumas; visiškai naudojamas iš Java
  • kotlinx.serialization — jokios Gson/Jackson priklausomybės; automatinis snake_case/camelCase atitikimas
  • HMAC-SHA256 parašo generavimas ir pastovaus laiko patikrinimas
  • Webhook analizė + API pagrįstas užsakymo patikrinimas
  • Suspend funkcijos neblokuojančiam IO per Kotlin korutinas
  • Įterpiamas HttpClient lengvam testavimui su imitaciniais transportais
  • Skirta Java 17+

Reikalavimai

Diegimas

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>

Greitas startas (Kotlin)

1. Inicializuokite klientą

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

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

2. Sukurkite mokėjimą ir nukreipkite į HPP

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. Apdorokite Webhook

// 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
}

Greitas startas (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 nuoroda

NoPaynClient(config, httpClient?)

ParametrasTipasPrivalomasNumatytasis
config.apiKeyStringTaip
config.merchantIdStringTaip
config.baseUrlStringNehttps://api.nopayn.co.uk
httpClientjava.net.http.HttpClientNeNumatytasis klientas

client.createOrder(params): Order (suspend)

Sukuria užsakymą per POST /v1/orders/.

ParametrasTipasPrivalomasAprašymas
amountIntTaipSuma mažiausiu valiutos vienetu (centais)
currencyStringTaipISO 4217 kodas (EUR, GBP, USD, NOK, SEK)
merchantOrderIdString?NeJūsų vidinis užsakymo nuorodos ID
descriptionString?NeUžsakymo aprašymas
returnUrlString?NeNukreipimas po sėkmingo mokėjimo
failureUrlString?NeNukreipimas atšaukimo/galiojimo pabaigos/klaidos atveju
webhookUrlString?NeAsinchroniniai būsenos pakeitimo pranešimai
localeString?NeHPP kalba (en-GB, de-DE, nl-NL ir kt.)
paymentMethodsList<String>?NeFiltruoti HPP mokėjimo būdus
expirationPeriodString?NeISO 8601 trukmė (PT30M)

Prieinami mokėjimo būdai: credit-card, apple-pay, google-pay, vipps-mobilepay

client.getOrder(orderId): Order (suspend)

Gauna užsakymo detales per GET /v1/orders/{id}/.

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

Atlieka pilną arba dalinį grąžinimą per POST /v1/orders/{id}/refunds/.

client.generatePaymentUrl(params): PaymentUrlResult (suspend)

Patogus metodas, kuris sukuria užsakymą ir grąžina:

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

Generuoja HMAC-SHA256 hex parašą. Kanoninė žinutė yra $amount:$currency:$orderId, pasirašyta API raktu.

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

Pastovaus laiko HMAC-SHA256 parašo patikrinimas.

client.verifyWebhook(rawBody): VerifiedWebhook (suspend)

Analizuoja webhook turinį, tada iškviečia GET /v1/orders/{id}/, kad patikrintų tikrąją būseną.

Atskiros HMAC priemonės

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)

Iš Java:

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

Klaidų tvarkymas

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
}

Užsakymo būsenos

BūsenaGalutinė?Aprašymas
newNeUžsakymas sukurtas
processingNeMokėjimas vykdomas
completedTaipMokėjimas sėkmingas — pristatykite prekes
cancelledTaipMokėjimas atšauktas kliento
expiredTaipMokėjimo nuorodos laikas baigėsi
errorTaipTechninė klaida

Webhook geriausios praktikos

  1. Visada patikrinkite per API — webhook turinys pateikia tik užsakymo ID, niekada būsenos. SDK verifyWebhook() tai atlieka automatiškai.
  2. Grąžinkite HTTP 200, kad patvirtintumėte gavimą. Bet koks kitas kodas suaktyvina iki 10 pakartotinių bandymų (kas 2 minutes).
  3. Įgyvendinkite atsarginį tikrintuvą — užsakymams, senesniems nei 10 minučių, kurie nepasiekė galutinės būsenos, naudokite getOrder() kaip saugos tinklą.
  4. Būkite idempotentiški — galite gauti tą patį webhook kelis kartus.

Testinės kortelės

Naudokite šias korteles Cost+ testavimo režimu (testavimo svetainė):

KortelėNumerisPastabos
Visa (sėkminga)4111 1111 1111 1111Bet koks CVV
Mastercard (sėkminga)5544 3300 0003 7Bet koks CVV
Visa (atmesta)4111 1111 1111 1105Do Not Honor
Visa (nepakankamos lėšos)4111 1111 1111 1151Insufficient Funds

Naudokite bet kurią ateities galiojimo datą ir bet kokį 3 skaitmenų CVC.

Demonstracinė programa

Docker pagrįsta demonstracinė programa (Ktor) įtraukta į GitHub saugyklą pilnam mokėjimo proceso testavimui.

Palaikymas

Reikia pagalbos? Kreipkitės į mūsų palaikymo komandą adresu support@costplus.io.

On this page