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"})
}
}