[Golang] Dash Payment API

  • Автор темы Автор темы reg1on
  • Дата начала Дата начала
API через сервер ONGG.NET

Код:
package DashPaymentAPI

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "time"
)

const apiUrl = "https://pay.ongg.net"

type PaymentResponse struct {
    PaymentURL string `json:"payment_url"`
}

type WebhookData struct {
    Status     string `json:"status"`
    PaymentID  string `json:"payment_id"`
}

func CreateDashPayment(amountFIAT float64, successURL, cancelURL, webhookURL string) (string, error) {
    data := map[string]interface{}{
        "amount_fiat": amountFIAT,
        "success_url": successURL,
        "cancel_url":  cancelURL,
        "postback_url": webhookURL,
    }

    jsonData, err := json.Marshal(data)
    if err != nil {
        return "", fmt.Errorf("ошибка сериализации данных: %v", err)
    }

    client := &http.Client{
        Timeout: 30 * time.Second,
    }

    req, err := http.NewRequest("POST", apiUrl+"/create-payment", bytes.NewBuffer(jsonData))
    if err != nil {
        return "", fmt.Errorf("ошибка создания запроса: %v", err)
    }

    req.Header.Set("Content-Type", "application/json")

    resp, err := client.Do(req)
    if err != nil {
        return "", fmt.Errorf("не удалось подключиться к серверу оплаты: %v", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", fmt.Errorf("ошибка чтения ответа: %v", err)
    }

    if resp.StatusCode != http.StatusOK {
        return "", fmt.Errorf("сервер вернул ошибку %d: %s", resp.StatusCode, string(body))
    }

    var response PaymentResponse
    if err := json.Unmarshal(body, &response); err != nil {
        return "", fmt.Errorf("ошибка разбора ответа: %v", err)
    }

    if response.PaymentURL == "" {
        return "", fmt.Errorf("ошибка создания платежа: %s", string(body))
    }

    return response.PaymentURL, nil
}

func WebhookHandler(onPaymentSuccess, onPaymentExpired, onPaymentCancelled func(WebhookData)) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if r.Method != http.MethodPost {
            http.Error(w, "Метод не разрешен", http.StatusMethodNotAllowed)
            return
        }

        body, err := ioutil.ReadAll(r.Body)
        if err != nil {
            http.Error(w, `{"error": "Некорректные данные"}`, http.StatusBadRequest)
            return
        }
        defer r.Body.Close()

        var data WebhookData
        if err := json.Unmarshal(body, &data); err != nil {
            http.Error(w, `{"error": "Некорректные данные"}`, http.StatusBadRequest)
            return
        }

        if data.Status == "" || data.PaymentID == "" {
            http.Error(w, `{"error": "Отсутствуют обязательные поля"}`, http.StatusBadRequest)
            return
        }

        switch data.Status {
        case "confirmed":
            if onPaymentSuccess != nil {
                onPaymentSuccess(data)
            }
        case "expired":
            if onPaymentExpired != nil {
                onPaymentExpired(data)
            }
        case "cancelled":
            if onPaymentCancelled != nil {
                onPaymentCancelled(data)
            }
        default:
            w.WriteHeader(http.StatusOK)
            w.Write([]byte("UNK STATUS"))
            return
        }

        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusOK)
        json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
    }
}
 
Назад
Сверху