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
- 沙盒环境:
login
和password
- 您的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(¬ification); 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)
}
最佳实践
- 错误处理:NOWPayments API可能返回各种错误,确保正确处理
- 重试机制:对于暂时性错误实现指数退避重试
- 日志记录:记录所有API交互以便调试
- 验证回调:始终验证IPN回调的签名
- 监控:监控支付状态和过期时间
完整示例
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应用中。记得在生产环境中添加适当的错误处理、日志记录和监控。