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

最佳实践

  1. 错误处理:始终检查SDK方法的返回错误
  2. 日志记录:记录所有API交互以便调试和审计
  3. 重试机制:对于暂时性错误实现适当的重试逻辑
  4. 安全存储:妥善保管API密钥和敏感信息
  5. 测试环境:先在沙箱环境中测试所有功能

总结

dusupay-sdk-go为Golang开发者提供了与Dusupay支付网关集成的便捷方式。通过这个SDK,你可以轻松实现支付请求创建、交易状态查询、回调处理等功能,大大简化了支付流程的集成工作。

回到顶部