跳到主要内容

Golang SDK 接入文档

信息

Golang SDK 将服务端API中的签名验证,传输编码等工作进行了封装,提供了Golang开发环境下的更快捷的服务端集成方案,如果您的服务端开发环境不是Golang,请参考 API接入文档 自行实现相关逻辑

引入依赖

在项目的 go.mod 文件中添加对 paynicorn-sdk-golang 的依赖

require (
github.com/Transsion-mios/paynicorn-sdk-golang v1.0.2
)

参考代码

package main

import (
"fmt"
"github.com/Transsion-mios/paynicorn-sdk-golang"
"github.com/gin-gonic/gin"
"net/http"
)

func main() {
var appkey = "PUT_YOUR_APPKEY_HERE"
var merchantkey = "PUT_YOUR_MERCHANT_SECRET_HERE"


//raise a payment request to PAYNICORN
request := paynicorn.InitPaymentRequest{}
request.OrderId="PUT_YOUR_ORDER_ID_HERE"
request.CountryCode="NG"
request.Currency="NGN"
request.Amount="10"
request.CpFrontPage="PUT_YOUR_WEB_REDIRECT_URL_HERE"
request.OrderDescription="TEST GOODS NAME"
response := paynicorn.InitPayment(appkey,merchantkey,request)
if response != nil{
fmt.Println(response)
}



//query a payment status from PAYNICORN
request1 := paynicorn.QueryPaymentRequest{}
request1.OrderId=request.OrderId
request1.TxnType=paynicorn.PAYMENT
response1 := paynicorn.QueryPayment(appkey,merchantkey,request1)
if response1 != nil{
fmt.Println(response1)
}



//receive a payment status postback from PAYNICORN
r := gin.Default()
r.POST("/postback", func(context *gin.Context) {

var req paynicorn.PostbackRequest
if err := context.BindJSON(&req); err != nil{
context.String(http.StatusInternalServerError,"")
}else{
postbackInfo := paynicorn.ReceivePostback(merchantkey,req)
if postbackInfo != nil && postbackInfo.Verified{
fmt.Println(postbackInfo)
context.String(http.StatusOK,"success_"+postbackInfo.TxnId)
}else{
context.String(http.StatusInternalServerError,"")
}
}

})
r.Run(":8080")


}

设置参数

将 PUT_YOUR_APPKEY_HERE 替换成对应支付应用的 appKey,appKey 的获取地址为:https://console.paynicorn.com/#/app/list

PUT_YOUR_MERCHANT_SECRET_HERE 替换成商户的 Merchant secret,Merchant secret 的获取地址为:https://console.paynicorn.com/#/developer

var appkey = "PUT_YOUR_APPKEY_HERE"
var merchantkey = "PUT_YOUR_MERCHANT_SECRET_HERE"

发起支付

使用 paynicorn.InitPaymentRequest 对象和 paynicorn.InitPayment 方法向 Paynicorn 发起一笔新的支付请求,

将 PUT_YOUR_ORDER_ID_HERE 替换成你的商户订单号,

PUT_YOUR_WEB_REDIRECT_URL_HERE 替换成你的商户网站跳转地址或者Android应用的deeplink,用户支付完成后,Paynicorn会调用该地址跳转回到你的商户网站或者Android应用的指定页面

request := paynicorn.InitPaymentRequest{}
request.OrderId="PUT_YOUR_ORDER_ID_HERE"
request.CountryCode="NG"
request.Currency="NGN"
request.Amount="10"
request.CpFrontPage="PUT_YOUR_WEB_REDIRECT_URL_HERE"
request.OrderDescription="TEST GOODS NAME"
response := paynicorn.InitPayment(appkey,merchantkey,request)

根据 paynicorn.InitPaymentResponse 对象返回值判断交易发起状态

type InitPaymentResponse struct {

Code string `json:"code"` // MANDATORY response code represent current request is success response or not refer to https://www.paynicorn.com/#/docs 6.5

Message string `json:"message"` // OPTIONAL response code refer to https://www.paynicorn.com/#/docs 6.5

TxnId string `json:"txnId"`// OPTIONAL unique transaction id generate by paynicorn.you can use it to query your transaction status or wait for a postback

Status string `json:"status"`// OPTIONAL transaction status (1:for success;-1:processing;0:failure)

WebUrl string `json:"webUrl"`// OPTIONAL paynicorn cashier uri
}

如果 InitPaymentResponse 为空,可以直接判断为交易发起失败,

如果 InitPaymentResponse 不为空,获取 InitPaymentResponse 中的 Status 成员状态,判断交易状态,Status=0支付失败,Status=-1支付处理中,Status=1支付成功,

Status 为-1时,标识交易正在处理中,需要用户做进一步动作,此时判断 WebUrl 是否为空,为空无需处理,如果 WebUrl 有值,需要将该 WebUrl 传给客户端进行页面加载,供用户完成后续支付动作

查询支付状态

使用 paynicorn.QueryPaymentRequest 对象和 paynicorn.QueryPayment 方法向 Paynicorn 发起查询订单状态请求,

将 PUT_YOUR_ORDER_ID_HERE 替换成你的商户订单号

request := paynicorn.QueryPaymentRequest{}
request.OrderId="PUT_YOUR_ORDER_ID_HERE"
request.TxnType=paynicorn.PAYMENT
response := paynicorn.QueryPayment(appkey,merchantkey,request)

根据 paynicorn.QueryPaymentResponse 对象返回值判断交易查询状态

type QueryPaymentResponse struct{

Code string `json:"code"` // MANDATORY response code represent current request is success response or not refer to https://www.paynicorn.com/#/docs 6.5

Message string `json:"message"` // MANDATORY response code refer to https://www.paynicorn.com/#/docs 6.5

TxnId string `json:"txnId"`// MANDATORY unique transaction id generate by paynicorn.you can use it to query your transaction status or wait for a postback

Status string `json:"status"`// OPTIONAL transaction status (1:for success;-1:processing;0:failure)

CompleteTime string `json:"completeTime"` //OPTIONAL transaction complete time
}

如果 paynicorn.QueryPaymentResponse 为空,可以判断订单查询失败,

如果 paynicorn.QueryPaymentResponse 不为空,获取 QueryPaymentResponse 中的 Status 成员状态,判断交易状态,Status=0支付失败,Status=-1支付处理中,Status=1支付成功

接收回调通知

用于接收 Paynicorn 的异步回调通知,当支付订单状态有变化时,Paynicorn 会调用该地址进行通知,回调通知地址在每个支付应用的 Callback address 中进行设置:

Postback Address Setting

通过 paynicorn.PostbackInfo 对象的 Verified 成员确认签名验证是否通过,通过后可根据 paynicorn.PostbackInfoStatus 状态更新交易状态,Status=0支付失败,Status=-1支付处理中,Status=1支付成功,

收到通知后,需返回 "success_"+postbackInfo.TxnId 响应给到 Paynicorn 告知通知已成功接收,否则 Paynicorn 会持续进行该笔订单状态变更的通知,直到到达通知次数上限

r := gin.Default()
r.POST("/postback", func(context *gin.Context) {

var req paynicorn.PostbackRequest
if err := context.BindJSON(&req); err != nil{
context.String(http.StatusInternalServerError,"")
}else{
postbackInfo := paynicorn.ReceivePostback(merchantkey,req)
if postbackInfo != nil && postbackInfo.Verified{
fmt.Println(postbackInfo)
context.String(http.StatusOK,"success_"+postbackInfo.TxnId)
}else{
context.String(http.StatusInternalServerError,"")
}
}

})
r.Run(":8080")