golang实现Dusupay支付网关API对接的插件库dusupay-sdk-go的使用
Golang实现Dusupay支付网关API对接的插件库dusupay-sdk-go的使用
描述
非官方的Dusupay支付网关API Go客户端库
安装
go get -u github.com/kachit/dusupay-sdk-go
使用示例
初始化客户端
package main
import (
"fmt"
"context"
dusupay "github.com/kachit/dusupay-sdk-go"
)
func main(){
// 创建客户端实例
cfg := dusupay.NewConfig("Your public key", "Your secret key")
client, err := dusupay.NewClientFromConfig(cfg, nil)
if err != nil {
fmt.Printf("config parameter error " + err.Error())
panic(err)
}
}
获取余额列表
ctx := context.Background()
balances, response, err := client.Merchants().GetBalances(ctx)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(balances.Status)
fmt.Println(balances.Code)
fmt.Println(balances.Message)
fmt.Println((*balances.Data)[0].Currency)
fmt.Println((*balances.Data)[0].Balance)
获取银行列表
ctx := context.Background()
filter := &dusupay.BanksFilter{TransactionType: dusupay.TransactionTypePayout, Country: dusupay.CountryCodeGhana}
banks, response, err := client.Banks().GetList(ctx, filter)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(banks.Status)
fmt.Println(banks.Code)
fmt.Println(banks.Message)
fmt.Println((*banks.Data)[0].Id)
fmt.Println((*banks.Data)[0].Name)
fmt.Println((*banks.Data)[0].BankCode)
获取银行分支机构列表
ctx := context.Background()
filter := &dusupay.BanksBranchesFilter{Country: dusupay.CountryCodeGhana, Bank: "BankCode"}
branches, response, err := client.Banks().GetBranchesList(ctx, filter)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(branches.Status)
fmt.Println(branches.Code)
fmt.Println(branches.Message)
fmt.Println((*branches.Data)[0].Name)
fmt.Println((*branches.Data)[0].Code)
获取提供商列表
ctx := context.Background()
filter := &dusupay.ProvidersFilter{Country: dusupay.CountryCodeUganda, Method: dusupay.TransactionMethodMobileMoney, TransactionType: dusupay.TransactionTypeCollection}
providers, response, err := client.Providers().GetList(ctx, filter)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(providers.Status)
fmt.Println(providers.Code)
fmt.Println(providers.Message)
fmt.Println((*providers.Data)[0].ID)
fmt.Println((*providers.Data)[0].Name)
创建收款请求
ctx := context.Background()
request := &dusupay.CollectionRequest{
Currency: dusupay.CurrencyCodeUGX,
Amount: 10000,
Method: dusupay.TransactionMethodMobileMoney,
ProviderId: "airtel_ug",
MerchantReference: "1234567891",
RedirectUrl: "http://foo.bar",
Narration: "narration",
AccountNumber: "256752000123",
MobileMoneyHpp: true,
}
result, response, err := client.Collections().Create(ctx, request)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(result.Status)
fmt.Println(result.Code)
fmt.Println(result.Message)
fmt.Println((*result.Data).ID)
fmt.Println((*result.Data).PaymentURL)
创建付款请求
ctx := context.Background()
request := &dusupay.PayoutRequest{
Currency: dusupay.CurrencyCodeUGX,
Amount: 10000,
Method: dusupay.TransactionMethodMobileMoney,
ProviderId: "airtel_ug",
MerchantReference: "1234567892",
Narration: "narration",
AccountNumber: "256752000123",
AccountName: "Foo Bar",
}
result, response, err := client.Payouts().Create(ctx, request)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(result.Status)
fmt.Println(result.Code)
fmt.Println(result.Message)
fmt.Println((*result.Data).ID)
创建退款请求
ctx := context.Background()
request := &dusupay.RefundRequest{
Amount: 100,
InternalReference: "DUSUPAY5FNZCVUKZ8C0KZE",
}
result, response, err := client.Refunds().Create(ctx, request)
if err != nil {
fmt.Printf("Wrong API request " + err.Error())
panic(err)
}
// 输出原始响应
fmt.Println(response)
// 输出结果
fmt.Println(result.Status)
fmt.Println(result.Code)
fmt.Println(result.Message)
fmt.Println((*result.Data).ID)
验证Webhook签名
requestPayload := `
{
"id": 226,
"request_amount": 10,
"request_currency": "USD",
"account_amount": 737.9934,
"account_currency": "UGX",
"transaction_fee": 21.4018,
"total_credit": 716.5916,
"customer_charged": false,
"provider_id": "mtn_ug",
"merchant_reference": "76859aae-f148-48c5-9901-2e474cf19b71",
"internal_reference": "DUSUPAY405GZM1G5JXGA71IK",
"transaction_status": "COMPLETED",
"transaction_type": "collection",
"message": "Transaction Completed Successfully"
}
`
requestUri := "https://www.sample-url.com/callback"
signature := "value from 'dusupay-signature' http header"
var webhook dusupay.CollectionWebhook
_ = json.Unmarshal(requestPayload, &webhook)
rawBytes, _ := ioutil.ReadFile("path/to/dusupay-public-key.pem")
validator, _ := dusupay.NewSignatureValidator(rawBytes)
err := validator.ValidateSignature(webhook, requestUri, signature)
更多关于golang实现Dusupay支付网关API对接的插件库dusupay-sdk-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实现Dusupay支付网关API对接的插件库dusupay-sdk-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Dusupay支付网关API对接的Golang SDK使用指南
概述
dusupay-sdk-go
是一个用于对接Dusupay支付网关API的Golang库,它简化了与Dusupay API的交互过程,提供了简洁的接口来处理支付请求、查询交易状态等操作。
安装
首先,使用go get命令安装SDK:
go get github.com/dusupay-sdk/dusupay-sdk-go
初始化客户端
package main
import (
"fmt"
"log"
"github.com/dusupay-sdk/dusupay-sdk-go/dusupay"
)
func main() {
// 初始化Dusupay客户端
client := dusupay.NewClient(
"your-api-key", // 替换为你的API Key
"your-secret-key", // 替换为你的Secret Key
dusupay.SandboxMode, // 使用沙箱环境,生产环境使用 dusupay.ProductionMode
)
// 测试连接
err := client.Ping()
if err != nil {
log.Fatalf("连接Dusupay失败: %v", err)
}
fmt.Println("成功连接到Dusupay API")
}
发起支付请求
创建支付订单
// 创建支付请求
paymentRequest := &dusupay.PaymentRequest{
Amount: 1000, // 金额(单位取决于货币)
Currency: "USD", // 货币代码
Method: "mobile_money", // 支付方法(mobile_money, card, bank等)
ProviderID: "mtn", // 支付提供商ID(如mtn, airtel等)
AccountNumber: "256700000000", // 客户手机号或账户
CountryCode: "UG", // 国家代码
CustomerEmail: "customer@email.com", // 客户邮箱
CustomerName: "John Doe", // 客户姓名
Description: "Product purchase", // 交易描述
MerchantReference: "order123", // 商户参考号
RedirectURL: "https://your-site.com/callback", // 回调URL
}
// 发起支付
paymentResponse, err := client.CreatePayment(paymentRequest)
if err != nil {
log.Fatalf("创建支付失败: %v", err)
}
fmt.Printf("支付创建成功,交易ID: %s\n", paymentResponse.TransactionID)
fmt.Printf("客户支付链接: %s\n", paymentResponse.PaymentURL)
查询交易状态
// 查询交易状态
transactionID := "your-transaction-id" // 替换为实际的交易ID
transaction, err := client.GetTransaction(transactionID)
if err != nil {
log.Fatalf("查询交易失败: %v", err)
}
fmt.Printf("交易状态: %s\n", transaction.Status)
fmt.Printf("交易金额: %.2f %s\n", transaction.Amount, transaction.Currency)
处理回调通知
Dusupay会向你的服务器发送支付结果通知,你需要实现一个HTTP处理器来处理这些回调:
package main
import (
"net/http"
"log"
"github.com/dusupay-sdk/dusupay-sdk-go/dusupay"
)
func callbackHandler(w http.ResponseWriter, r *http.Request) {
// 验证回调签名
isValid, err := dusupay.VerifyCallbackSignature(r, "your-secret-key")
if err != nil {
log.Printf("验证签名错误: %v", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
if !isValid {
log.Println("无效的签名")
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// 解析回调数据
callback, err := dusupay.ParseCallback(r)
if err != nil {
log.Printf("解析回调错误: %v", err)
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
// 处理回调逻辑
switch callback.Status {
case "completed":
log.Printf("交易 %s 已完成", callback.TransactionID)
// 更新你的订单状态为已完成
case "failed":
log.Printf("交易 %s 失败", callback.TransactionID)
// 更新你的订单状态为失败
case "pending":
log.Printf("交易 %s 处理中", callback.TransactionID)
// 更新你的订单状态为处理中
}
// 返回成功响应
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
}
func main() {
http.HandleFunc("/dusupay-callback", callbackHandler)
log.Println("启动回调服务器在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
获取支持的支付方式
// 获取所有支持的支付方式
paymentMethods, err := client.GetPaymentMethods()
if err != nil {
log.Fatalf("获取支付方式失败: %v", err)
}
fmt.Println("支持的支付方式:")
for _, method := range paymentMethods {
fmt.Printf("- %s (%s)\n", method.Name, method.ID)
}
获取支持的货币
// 获取所有支持的货币
currencies, err := client.GetCurrencies()
if err != nil {
log.Fatalf("获取货币列表失败: %v", err)
}
fmt.Println("支持的货币:")
for _, currency := range currencies {
fmt.Printf("- %s (%s)\n", currency.Name, currency.Code)
}
最佳实践
- 错误处理:始终检查SDK方法的返回错误
- 日志记录:记录所有API交互以便调试和审计
- 重试机制:对于暂时性错误实现适当的重试逻辑
- 安全存储:妥善保管API密钥和敏感信息
- 测试环境:先在沙箱环境中测试所有功能
总结
dusupay-sdk-go
为Golang开发者提供了与Dusupay支付网关集成的便捷方式。通过这个SDK,你可以轻松实现支付请求创建、交易状态查询、回调处理等功能,大大简化了支付流程的集成工作。