init
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package payssion
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/md5"
|
||||
"github.com/pkg/errors"
|
||||
"go.uber.org/zap"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type Order struct {
|
||||
Name string
|
||||
OrderNo string
|
||||
Amount float64
|
||||
NotifyUrl string
|
||||
ReturnUrl string
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
Name string
|
||||
ApiKey string
|
||||
SecretKey string
|
||||
QueryUrl string
|
||||
CreateUrl string
|
||||
PmId string
|
||||
Currency string
|
||||
}
|
||||
|
||||
func NewClient(apiKey string, secretKey, pmId, currency, queryUrl, createUrl string) *Client {
|
||||
return &Client{
|
||||
ApiKey: apiKey,
|
||||
SecretKey: secretKey,
|
||||
PmId: pmId,
|
||||
Currency: currency,
|
||||
QueryUrl: queryUrl,
|
||||
CreateUrl: createUrl,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) CreateOrder(order Order) (string, error) {
|
||||
content := fmt.Sprintf("%s|%s|%.2f|%s|%s|%s", c.ApiKey, c.PmId, order.Amount, "USD", order.OrderNo, c.SecretKey)
|
||||
sign := md5.Sign(content)
|
||||
params := map[string]string{
|
||||
"api_key": c.ApiKey,
|
||||
"pm_id": c.PmId,
|
||||
"amount": fmt.Sprintf("%.2f", order.Amount),
|
||||
"currency": "USD",
|
||||
"description": "shop",
|
||||
"order_id": order.OrderNo,
|
||||
"api_sig": sign,
|
||||
"return_url": order.ReturnUrl,
|
||||
}
|
||||
marshal, _ := json.Marshal(params)
|
||||
resp, err := http.Post(c.CreateUrl, "application/json", bytes.NewBuffer(marshal))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
all, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
log.Println(string(all))
|
||||
result := make(map[string]interface{})
|
||||
err = json.Unmarshal(all, &result)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
result_code := result["result_code"]
|
||||
if fmt.Sprintf("%v", result_code) != "200" {
|
||||
return "", errors.New(result["description"].(string))
|
||||
}
|
||||
url := result["redirect_url"]
|
||||
if url == nil {
|
||||
return "", errors.New(string(all))
|
||||
}
|
||||
return url.(string), nil
|
||||
}
|
||||
|
||||
func (c *Client) QueryOrder(orderNo string) (queryResult *QueryResult, err error) {
|
||||
content := fmt.Sprintf("%s|%s|%s", c.ApiKey, orderNo, c.SecretKey)
|
||||
sign := md5.Sign(content)
|
||||
params := map[string]string{
|
||||
"api_key": c.ApiKey,
|
||||
"order_id": orderNo,
|
||||
"api_sig": sign,
|
||||
}
|
||||
marshal, _ := json.Marshal(params)
|
||||
resp, err := http.Post(c.QueryUrl, "application/json", bytes.NewBuffer(marshal))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
all, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
zap.S().Infof("Payssion QueryOrderDetail result: %s", string(all))
|
||||
err = json.Unmarshal(all, &queryResult)
|
||||
return queryResult, err
|
||||
}
|
||||
|
||||
type QueryResult struct {
|
||||
Transaction struct {
|
||||
TransactionID string `json:"transaction_id"`
|
||||
Description string `json:"description"`
|
||||
AppName string `json:"app_name"`
|
||||
PmID string `json:"pm_id"`
|
||||
Amount string `json:"amount"`
|
||||
Currency string `json:"currency"`
|
||||
OrderID string `json:"order_id"`
|
||||
Paid string `json:"paid"`
|
||||
Net string `json:"net"`
|
||||
State string `json:"state"`
|
||||
Fee string `json:"fee"`
|
||||
Refund string `json:"refund"`
|
||||
RefundFee string `json:"refund_fee"`
|
||||
Created int64 `json:"created"`
|
||||
Updated int64 `json:"updated"`
|
||||
Fees string `json:"fees"`
|
||||
FeesAdd string `json:"fees_add"`
|
||||
RefundFees string `json:"refund_fees"`
|
||||
} `json:"transaction"`
|
||||
ResultCode int64 `json:"result_code"`
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package payssion
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestCreateOrder(t *testing.T) {
|
||||
client := Client{
|
||||
ApiKey: "",
|
||||
PmId: "",
|
||||
SecretKey: "",
|
||||
QueryUrl: "http://sandbox.payssion.com/api/v1/payment/getDetail",
|
||||
CreateUrl: "http://sandbox.payssion.com/api/v1/payments",
|
||||
}
|
||||
order := Order{
|
||||
Name: "shop",
|
||||
OrderNo: "123",
|
||||
Amount: 1000,
|
||||
}
|
||||
createOrder, err := client.CreateOrder(order)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
fmt.Println(createOrder)
|
||||
queryOrder, err := client.QueryOrder(order.OrderNo)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
fmt.Println(queryOrder.Transaction.State)
|
||||
}
|
||||
Reference in New Issue
Block a user