印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
8.7 KiB

2 months ago
package moneydealernative
import (
"fmt"
"server/config"
"server/util"
"sort"
"strings"
"time"
"github.com/google/uuid"
"github.com/liangdas/mqant/log"
)
var (
baseUrl = "https://testorder.octopus-pay.com"
payURL = "/api/order/create" // 创建订单
queryPayURL = "/api/order/status" // 订单查询
withdrawURL = "/api/order/create"
queryWithdrawURL = "/api/order/status"
projectCode = "p9lrvB5TaojgQxZTXeSnCoQ6IxBMp0z4RGFA0UulDebpwuXb"
apiKey = "ahsxHdAk6oK2577QYkmB9kfjWrTrlplIRev3CfCnHFaXAbgmvNZk738VDD9MoH"
apiSecret = "ESzyeg48ml0CSKKJt7qQhinlnZSYspY3O2sGlJsv4bofTv1YBm91tNPvqvIAw5"
signType = "HMAC-SHA256" // 或者是"MD5" 回调是HMAC-SHA256
)
func init() {
if strings.ToUpper(config.GetBase().ServerFlag) == "B" {
projectCode = "I872cvaUFYkDfVioaFWsrvDJL8FqqqZNvzHD1GwDABTvZ5O1"
apiKey = "IosJgyQur0nvZtb0BKLDrz8VeTEnXEg4alFQ70y5IFnUm77YF9cuPGqdBSQHkZ"
apiSecret = "gXwq6aza5gPvci3nvpgtPOkIDcQQaweQzm5LpcUNXa4YWklHNI3sUifWC4iYmK"
}
}
type PayInfo struct {
ProjectCode string
ApiKey string
ApiSecret string
}
func getPayInfo() PayInfo {
if strings.ToUpper(config.GetBase().ServerFlag) == "B" {
return PayInfo{
ProjectCode: "I872cvaUFYkDfVioaFWsrvDJL8FqqqZNvzHD1GwDABTvZ5O1",
ApiKey: "IosJgyQur0nvZtb0BKLDrz8VeTEnXEg4alFQ70y5IFnUm77YF9cuPGqdBSQHkZ",
ApiSecret: "gXwq6aza5gPvci3nvpgtPOkIDcQQaweQzm5LpcUNXa4YWklHNI3sUifWC4iYmK",
}
//projectCode = "I872cvaUFYkDfVioaFWsrvDJL8FqqqZNvzHD1GwDABTvZ5O1"
//apiKey = "IosJgyQur0nvZtb0BKLDrz8VeTEnXEg4alFQ70y5IFnUm77YF9cuPGqdBSQHkZ"
//apiSecret = "gXwq6aza5gPvci3nvpgtPOkIDcQQaweQzm5LpcUNXa4YWklHNI3sUifWC4iYmK"
} else {
return PayInfo{
ProjectCode: projectCode,
ApiKey: apiKey,
ApiSecret: apiSecret,
}
}
}
func getUrl() string {
if config.GetConfig().Release {
return "https://order.octopus-pay.com"
} else {
return baseUrl
}
}
type PayReq struct {
ProjectCode string `json:"project_code"`
MerchantOrderNo string `json:"merchant_order_no"`
UserUid string `json:"user_uid"`
Amount string `json:"amount"`
Currency string `json:"currency"`
PaymentMode int `json:"payment_mode"` // 支付模式:3-原生代收,2-代付(默认为1)
NotifyUrl string `json:"notify_url"`
ReturnUrl string `json:"return_url"`
ExtraData string `json:"extra_data"`
Phone string `json:"phone"`
}
type UserData struct {
UserName string `json:"userName"`
UserEmail string `json:"userEmail"`
UserPhone string `json:"userPhone"`
}
type PayRespData struct {
OrderNo string `json:"order_no"`
PayUrl string `json:"pay_url"`
MerchantId string `json:"merchant_id"`
ProjectCode string `json:"project_code"`
UserUid string `json:"user_uid"`
Amount string `json:"amount"`
Currency string `json:"currency"`
PaymentMode int `json:"payment_mode"`
Signature string `json:"signature"`
ExtraData string `json:"extra_data"`
ExpiredAt string `json:"expired_at"`
CreatedAt string `json:"created_at"`
}
type PayResp struct {
Code int `json:"code"` // 200表示成功
Msg string `json:"msg"` // 状态描述
Data PayRespData `json:"data"` // 响应数据
}
type PayCallbackReq struct {
OrderNo string `json:"order_no"`
MerchantOrderNo string `json:"merchant_order_no"` // 商户订单号
ProjectCode string `json:"project_code"`
UserUid string `json:"user_uid"`
Amount string `json:"amount"`
Currency string `json:"currency"`
Status int `json:"status"` // 0-待接单,1-已接单,2-已完成,3-已取消,4-已超时
PaymentMode int `json:"payment_mode"`
CreatedAt int `json:"created_at"`
ExtraData string `json:"extra_data"`
Signature string `json:"signature"`
}
type QueryPayReq struct {
OrderNo string `json:"order_no"`
}
type QueryPayResp struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
OrderNo string `json:"order_no"` // 系统订单号
MerchantOrderNo string `json:"merchant_order_no"` // 商户订单号
Status int `json:"status"` // 0-待接单,1-已接单,2-已完成,3-已取消,4-已超时
PaymentMode int `json:"payment_mode"` // 支付模式:1-代收,2-代付
Amount string `json:"amount"` // 订单金额
Signature string `json:"signature"` // 签名
Currency string `json:"currency"` // 币种
CreatedAt int64 `json:"created_at"`
} `json:"data"`
}
type WithdrawPayInfo struct {
AccountType string `json:"account_type"` // 账户类型:UPI/Bank/USDT/Epay
AccountNumber string `json:"account_number"` // 统一账户标识:银行账号/UPI ID/钱包地址/Epay账号
BeneficiaryName string `json:"beneficiary_name"` // 收款人姓名
BeneficiaryPhone string `json:"beneficiary_phone"` // 收款人手机号(10位数字,6-9开头)
BankName string `json:"bank_name"` // 银行名称(account_type=Bank时必填)
BankBranch string `json:"bank_branch"` // 银行分支
Ifsc string `json:"ifsc"` // IFSC代码(account_type=Bank时必填,11位格式)
Remark string `json:"remark"` // 转账备注
}
type WithdrawReq struct {
ProjectCode string `json:"project_code"`
MerchantOrderNo string `json:"merchant_order_no"`
UserUid string `json:"user_uid"`
Amount string `json:"amount"`
Currency string `json:"currency"`
PaymentMode int `json:"payment_mode"` // 支付模式:1-代收,2-代付(默认为1)
NotifyUrl string `json:"notify_url"`
PayoutInfo WithdrawPayInfo `json:"payout_info"`
}
type WithdrawResp struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
OrderNo string `json:"order_no"` // 系统订单号
MerchantOrderNo string `json:"merchant_order_no"` // 商户订单号
Status int `json:"status"` // 0-待处理,1-处理中,2-已完成,3-已失败,4-已取消
PaymentMode int `json:"paymentMode"` // 支付模式:1-代收,2-代付
Amount string `json:"amount"` // 订单金额
Signature string `json:"signature"` // 签名
Currency string `json:"currency"` // 币种
CreatedAt string `json:"created_at"` // 创建时间
} `json:"data"`
}
type WithdrawCallbackReq struct {
OrderNo string `json:"order_no"`
MerchantOrderNo string `json:"merchant_order_no"`
ProjectCode string `json:"project_code"`
UserUid string `json:"user_uid"`
Amount string `json:"amount"`
Currency string `json:"currency"`
Status int `json:"status"` // 0-待处理,1-处理中,2-已完成,3-已失败,4-已取消
PaymentMode int `json:"payment_mode"`
CreatedAt int `json:"created_at"`
ExtraData string `json:"extra_data"`
Signature string `json:"signature"`
}
func Sign(m map[string]interface{}, t int) string {
str := []string{}
if _, ok := m["x-merchant-id"]; !ok {
m["x-merchant-id"] = getPayInfo().ProjectCode
}
if _, ok := m["x-api-key"]; !ok {
m["x-api-key"] = getPayInfo().ApiKey
}
if _, ok := m["x-timestamp"]; !ok {
m["x-timestamp"] = fmt.Sprintf("%d", time.Now().Unix())
}
if _, ok := m["x-nonce"]; !ok {
m["x-nonce"] = uuid.New().String()
}
if _, ok := m["x-sign-type"]; !ok {
m["x-sign-type"] = "MD5"
}
for i := range m {
if i == "x-signature" {
continue
}
str = append(str, i)
}
sort.Strings(str)
signStr := ""
for _, v := range str {
mv := m[v]
signStr += fmt.Sprintf("%v=%v", v, mv)
signStr += "&"
}
if t == 0 {
signStr += "key=" + getPayInfo().ApiSecret
} else {
signStr += "key=" + getPayInfo().ApiSecret
}
log.Debug("signStr:%v", signStr)
return strings.ToUpper(util.CalculateMD5(signStr))
}
type QueryWithdrawReq struct {
OrderNo string `json:"order_no"`
}
type QueryWithdrawResp struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
OrderNo string `json:"order_no"` // 系统订单号
MerchantOrderNo string `json:"merchant_order_no"` // 商户订单号
Status int `json:"status"` // 0-待处理,1-处理中,2-已完成,3-已失败,4-已取消
PaymentMode int `json:"payment_mode"` // 支付模式:1-代收,2-代付
Amount string `json:"amount"` // 订单金额
Signature string `json:"signature"` // 签名
Currency string `json:"currency"` // 币种
CreatedAt int64 `json:"created_at"`
} `json:"data"`
}