Cost+Docs

Java / Kotlin

Επίσημο Kotlin/Java SDK για την πύλη πληρωμών Cost+

Επίσημο Kotlin SDK για την πύλη πληρωμών Cost+, πλήρως συμβατό με Java. Απλοποιεί τη ροή ανακατεύθυνσης HPP (Φιλοξενούμενη Σελίδα Πληρωμής), την υπογραφή HMAC payload και την επαλήθευση webhook.

Χαρακτηριστικά

  • Kotlin-first, φιλικό στη Java — data classes, coroutines, null safety; fully usable from Java
  • kotlinx.serialization — no Gson/Jackson dependency; automatic snake_case/camelCase mapping
  • HMAC-SHA256 signature generation and constant-time verification
  • Webhook parsing + API-based order verification
  • Suspend functions for non-blocking IO via Kotlin coroutines
  • Injectable HttpClient for easy testing with mock transports
  • Targets Java 17+

Απαιτήσεις

Εγκατάσταση

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>

Γρήγορη Εκκίνηση (Kotlin)

1. Αρχικοποίηση του Client

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

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

2. Δημιουργία Πληρωμής και Ανακατεύθυνση στο 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. Διαχείριση του 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
}

Γρήγορη Εκκίνηση (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

NoPaynClient(config, httpClient?)

ΠαράμετροςΤύποςΑπαιτούμενηΠροεπιλογή
config.apiKeyStringΝαι
config.merchantIdStringΝαι
config.baseUrlStringΌχιhttps://api.nopayn.co.uk
httpClientjava.net.http.HttpClientΌχιΠροεπιλεγμένος client

client.createOrder(params): Order (suspend)

Δημιουργεί παραγγελία μέσω POST /v1/orders/.

ΠαράμετροςΤύποςΑπαιτούμενηΠεριγραφή
amountIntΝαιΠοσό στη μικρότερη μονάδα νομίσματος (λεπτά)
currencyStringΝαιISO 4217 code (EUR, GBP, USD, NOK, SEK)
merchantOrderIdString?ΌχιΗ εσωτερική αναφορά παραγγελίας σας
descriptionString?ΌχιΠεριγραφή παραγγελίας
returnUrlString?ΌχιΑνακατεύθυνση μετά από επιτυχή πληρωμή
failureUrlString?ΌχιΑνακατεύθυνση σε ακύρωση/λήξη/σφάλμα
webhookUrlString?ΌχιΑσύγχρονες ειδοποιήσεις αλλαγής κατάστασης
localeString?ΌχιHPP language (en-GB, de-DE, nl-NL, etc.)
paymentMethodsList<String>?ΌχιΦιλτράρισμα μεθόδων HPP
expirationPeriodString?ΌχιISO 8601 duration (PT30M)

Διαθέσιμες μέθοδοι πληρωμής: credit-card, apple-pay, google-pay, vipps-mobilepay

client.getOrder(orderId): Order (suspend)

Ανακτά λεπτομέρειες παραγγελίας μέσω GET /v1/orders/{id}/.

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

Εκδίδει πλήρη ή μερική επιστροφή χρημάτων μέσω POST /v1/orders/{id}/refunds/.

client.generatePaymentUrl(params): PaymentUrlResult (suspend)

Μέθοδος ευκολίας που δημιουργεί παραγγελία και επιστρέφει:

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. The canonical message is $amount:$currency:$orderId, υπογεγραμμένο με το κλειδί API.

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

Επαλήθευση σταθερού χρόνου υπογραφής HMAC-SHA256.

client.verifyWebhook(rawBody): VerifiedWebhook (suspend)

Αναλύει το σώμα webhook, στη συνέχεια καλεί GET /v1/orders/{id}/ για επαλήθευση πραγματικής κατάστασης.

Αυτόνομα Εργαλεία HMAC

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)

From Java:

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

Διαχείριση Σφαλμάτων

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
}

Καταστάσεις Παραγγελίας

ΚατάστασηΤελική;Περιγραφή
newΌχιΗ παραγγελία δημιουργήθηκε
processingΌχιΠληρωμή σε εξέλιξη
completedΝαιΗ πληρωμή ήταν επιτυχής — παραδώστε τα αγαθά
cancelledΝαιΗ πληρωμή ακυρώθηκε από τον πελάτη
expiredΝαιΟ σύνδεσμος πληρωμής έληξε
errorΝαιΤεχνική αποτυχία

Βέλτιστες Πρακτικές Webhook

  1. Πάντα επαληθεύετε μέσω API — το payload webhook περιέχει μόνο το αναγνωριστικό παραγγελίας, ποτέ την κατάσταση. Η μέθοδος verifyWebhook() του SDK το κάνει αυτόματα.
  2. Επιστρέψτε HTTP 200 για επιβεβαίωση λήψης. Οποιοσδήποτε άλλος κωδικός ενεργοποιεί έως 10 επαναπροσπάθειες (2 λεπτά μεταξύ τους).
  3. Υλοποιήστε εφεδρικό poller — για παραγγελίες παλαιότερες από 10 λεπτά που δεν έχουν φτάσει σε τελική κατάσταση, κάντε polling getOrder() ως δίχτυ ασφαλείας.
  4. Να είστε idempotent — μπορεί να λάβετε το ίδιο webhook πολλές φορές.

Δοκιμαστικές Κάρτες

Χρησιμοποιήστε αυτές τις κάρτες στη δοκιμαστική λειτουργία Cost+ (ιστοσελίδα sandbox):

ΚάρταΑριθμόςΣημειώσεις
Visa (επιτυχία)4111 1111 1111 1111Οποιοδήποτε CVV
Mastercard (επιτυχία)5544 3300 0003 7Οποιοδήποτε CVV
Visa (απόρριψη)4111 1111 1111 1105Do Not Honor
Visa (ανεπαρκές υπόλοιπο)4111 1111 1111 1151Insufficient Funds

Χρησιμοποιήστε οποιαδήποτε μελλοντική ημερομηνία λήξης και οποιοδήποτε 3ψήφιο CVC.

Εφαρμογή Επίδειξης

Μια εφαρμογή επίδειξης βασισμένη σε Docker (Ktor) περιλαμβάνεται στο GitHub repository για δοκιμή πλήρους ροής πληρωμής.

Υποστήριξη

Χρειάζεστε βοήθεια; Επικοινωνήστε με την ομάδα υποστήριξης στο support@costplus.io.

On this page