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 中进行设置:
通过 paynicorn.PostbackInfo
对象的 Verified
成员确认签名验证是否通过,通过后可根据 paynicorn.PostbackInfo
中 Status
状态更新交易状态,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")