golang集成NOWPayments加密货币支付API插件库go-nowpayments的使用

Golang集成NOWPayments加密货币支付API插件库go-nowpayments的使用

简介

这是一个用于NOWPayments加密货币支付API v1版本的Go语言非官方库。当前实现主要关注支付API功能。

安装

$ go get github.com/matm/go-nowpayments@v1.0.4

使用示例

以下是一个完整的示例代码,展示如何加载配置、检查API状态和获取最近支付记录:

package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/matm/go-nowpayments/config"
	"github.com/matm/go-nowpayments/core"
	"github.com/matm/go-nowpayments/payments"
)

func main() {
      // 加载沙盒环境凭证
	err := config.Load(strings.NewReader(`
{
      "server": "https://api-sandbox.nowpayments.io/v1",
      "login": "some_email@domain.tld",
      "password": "some_password",
      "apiKey": "some_api_key"
}
`))
	if err != nil {
		log.Fatal(err)
	}

	// 使用上面定义的服务器URL
	core.UseBaseURL(core.BaseURL(config.Server()))
	// 使用默认HTTP客户端
	core.UseClient(core.NewHTTPClient())

	st, err := core.Status()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("API status:", st)

	const limit = 2
	ps, err := payments.List(&payments.ListOption{
		Limit: limit,
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Last %d payments: %v\n", limit, ps)
}

功能实现情况

主题 端点 包.方法 是否实现
支付
获取预估价格 payments.EstimatedPrice(…) ✔️
获取最小支付金额 payments.MinimumAmount(…) ✔️
获取支付状态 payments.Status() ✔️
获取支付列表 payments.List(…) ✔️
获取/更新支付预估 payments.RefreshEstimatedPrice(…) ✔️
创建发票 payments.NewInvoice(…) ✔️
创建支付 payments.New(…) ✔️
从发票创建支付 payments.NewFromInvoice(…) ✔️
货币
获取可用货币 currencies.All() ✔️
获取可用选中货币 currencies.Selected() ✔️
API状态
获取API状态 core.Status() ✔️
认证
认证 core.Authenticate(…) ✔️

CLI工具

提供了一个np命令行工具,可以方便地从命令行使用支付API。请确保在这种情况下使用沙盒API服务器。

安装方法:

$ go install github.com/matm/go-nowpayments/cmd/np@latest

可用命令:

Usage of np:
  -a float
        pay amount for new payment/invoice (default 2)
  -c    show list of selected currencies
  -case string
        payment's case (sandbox only) (default "success")
  -debug
        turn debugging on
  -f string
        JSON config file to use
  -i    new invoice
  -l    list all payments
  -n    new payment
  -p string
        status of payment ID
  -pc string
        crypto currency to pay in (default "xmr")
  -pi string
        new payment from invoice ID

使用示例:

$ np -f conf.json -c

配置文件示例:

{
  "server": "https://api-sandbox.nowpayments.io/v1",
  "login": "your_email_adresse",
  "password": "some_password",
  "apiKey": "the API key to use"
}

配置文件说明:

  • server - API服务器地址,可以是:
    • 沙盒环境: https://api-sandbox.nowpayments.io/v1
    • 生产环境: https://api.nowpayments.io/v1
  • loginpassword - 您的NOWPayments凭证
  • apiKey - 在管理员账户中生成的API密钥

更多关于golang集成NOWPayments加密货币支付API插件库go-nowpayments的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang集成NOWPayments加密货币支付API插件库go-nowpayments的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-nowpayments集成NOWPayments加密货币支付API

NOWPayments是一个流行的加密货币支付处理平台,而go-nowpayments是一个非官方的Golang SDK,用于简化与NOWPayments API的集成。下面我将详细介绍如何使用这个库。

安装

首先安装go-nowpayments库:

go get github.com/nowpaymentsio/nowpayments-go

基本使用

1. 初始化客户端

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/nowpaymentsio/nowpayments-go"
)

func main() {
	// 初始化客户端
	client := nowpayments.New(
		"YOUR_API_KEY", // 替换为你的API密钥
		nowpayments.WithTimeout(30*time.Second), // 可选配置
	)

2. 创建支付

	// 创建支付请求
	paymentRequest := &nowpayments.PaymentRequest{
		PriceAmount:      49.99,          // 金额
		PriceCurrency:    "usd",          // 法币类型
		PayCurrency:      "btc",          // 支付加密货币类型
		OrderID:         "order_123456", // 你的订单ID
		IPNCallbackURL: "https://yourdomain.com/ipn", // 回调URL
	}

	// 创建支付
	payment, err := client.CreatePayment(context.Background(), paymentRequest)
	if err != nil {
		log.Fatalf("创建支付失败: %v", err)
	}

	fmt.Printf("支付创建成功:\n支付ID: %s\n支付地址: %s\n支付金额: %f %s\n",
		payment.PaymentID,
		payment.PayAddress,
		payment.PayAmount,
		payment.PayCurrency,
	)

3. 获取支付状态

	// 获取支付状态
	status, err := client.GetPaymentStatus(context.Background(), payment.PaymentID)
	if err != nil {
		log.Fatalf("获取支付状态失败: %v", err)
	}

	fmt.Printf("支付状态: %s\n", status.PaymentStatus)

高级功能

1. 获取可用加密货币列表

	// 获取支持的加密货币列表
	currencies, err := client.GetCurrencies(context.Background())
	if err != nil {
		log.Fatalf("获取加密货币列表失败: %v", err)
	}

	fmt.Println("支持的加密货币:")
	for _, currency := range currencies.Currencies {
		fmt.Println(currency)
	}

2. 获取最小支付金额

	// 获取最小支付金额
	minAmount, err := client.GetMinimumPaymentAmount(context.Background(), "btc", "usd")
	if err != nil {
		log.Fatalf("获取最小支付金额失败: %v", err)
	}

	fmt.Printf("BTC最小支付金额: %f USD\n", minAmount.MinAmount)

3. 处理IPN回调

NOWPayments会发送即时支付通知(IPN)到你的回调URL。你需要创建一个HTTP处理器来处理这些通知:

package main

import (
	"encoding/json"
	"net/http"
)

func IPNHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	var notification nowpayments.IPNNotification
	if err := json.NewDecoder(r.Body).Decode(&notification); err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	// 验证通知
	if notification.Verify("YOUR_IPN_SECRET_KEY") {
		// 处理支付成功逻辑
		switch notification.PaymentStatus {
		case "finished":
			// 支付完成
			log.Printf("订单 %s 支付完成", notification.OrderID)
		case "partially_paid":
			// 部分支付
		case "failed":
			// 支付失败
		}
	} else {
		// 无效的通知
		http.Error(w, "Invalid IPN", http.StatusBadRequest)
		return
	}

	w.WriteHeader(http.StatusOK)
}

最佳实践

  1. 错误处理:NOWPayments API可能返回各种错误,确保正确处理
  2. 重试机制:对于暂时性错误实现指数退避重试
  3. 日志记录:记录所有API交互以便调试
  4. 验证回调:始终验证IPN回调的签名
  5. 监控:监控支付状态和过期时间

完整示例

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/nowpaymentsio/nowpayments-go"
)

func main() {
	// 初始化客户端
	client := nowpayments.New("YOUR_API_KEY")

	// 1. 检查服务状态
	status, err := client.GetStatus(context.Background())
	if err != nil {
		log.Fatalf("服务状态检查失败: %v", err)
	}
	fmt.Printf("服务状态: %s\n", status.Message)

	// 2. 创建支付
	payment, err := client.CreatePayment(context.Background(), &nowpayments.PaymentRequest{
		PriceAmount:      29.99,
		PriceCurrency:    "usd",
		PayCurrency:      "eth",
		OrderID:         "test_order_001",
		IPNCallbackURL:  "https://yourdomain.com/ipn",
	})
	if err != nil {
		log.Fatalf("创建支付失败: %v", err)
	}

	fmt.Printf("请向地址 %s 支付 %f ETH\n", payment.PayAddress, payment.PayAmount)

	// 3. 定期检查支付状态
	ticker := time.NewTicker(30 * time.Second)
	defer ticker.Stop()

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
	defer cancel()

	for {
		select {
		case <-ticker.C:
			status, err := client.GetPaymentStatus(ctx, payment.PaymentID)
			if err != nil {
				log.Printf("获取支付状态错误: %v", err)
				continue
			}

			fmt.Printf("支付状态: %s\n", status.PaymentStatus)
			if status.PaymentStatus == "finished" {
				fmt.Println("支付完成!")
				return
			}
		case <-ctx.Done():
			fmt.Println("支付超时")
			return
		}
	}
}

通过go-nowpayments库,你可以轻松地将NOWPayments加密货币支付集成到你的Golang应用中。记得在生产环境中添加适当的错误处理、日志记录和监控。

回到顶部