@@ -126,3 +126,21 @@ func CreateQRTradeReq(prd bool, privateKeyStr, merchantId, terminalNo string, cr | |||||
resp, _ := php2go.URLDecode(send) | resp, _ := php2go.URLDecode(send) | ||||
return resp, nil | return resp, nil | ||||
} | } | ||||
func OrderQueryReq(prd bool, privateKeyStr, merchantId, terminalNo string, orderQueryReq *md.OrderQueryReq) (string, error) { | |||||
//基础信息,必填 | |||||
orderQueryReq.Version = Version | |||||
orderQueryReq.Service = OrderQuery | |||||
orderQueryReq.SignType = SignType | |||||
orderQueryReq.MerchantId = merchantId | |||||
orderQueryReq.TerminalNo = terminalNo | |||||
orderQueryReq.RequestId = zhios_pay_utils.AnyToString(time.Now().Unix()) | |||||
param := make(map[string]string) | |||||
zhios_pay_utils.Unserialize(zhios_pay_utils.Serialize(orderQueryReq), ¶m) | |||||
send, err := Send(prd, privateKeyStr, param) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
resp, _ := php2go.URLDecode(send) | |||||
return resp, nil | |||||
} |
@@ -0,0 +1,75 @@ | |||||
package luso_bank | |||||
import ( | |||||
zhios_pay_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/utils" | |||||
"encoding/base64" | |||||
"fmt" | |||||
"github.com/syyongx/php2go" | |||||
"math/rand" | |||||
"time" | |||||
) | |||||
const ( | |||||
MerchantId = "30010" | |||||
TerminalNo = "98036140" | |||||
PrivateKeyStr = "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDSYivjR7nXUazy\nf+F1i/nvuy/doiHRsiTSwavHIwKF88kzM95Eh5wGiXq6TXwFPhB5yeV8l3tFQxeu\nPycZeKmp0VBge+U+/UhR1rQwEX9U9LeKhVdjbNU0U8kNpO8qX/QqHSS7MCRILL2a\nS4F5U/wvYGkbqJ+qMUNmEMGwEkiVuDaO/Q4I3lMPNtLO+mizgq9jggEkVh+xG50p\nFATWd6CJh0mddBBgGG3/aG1ybV/IYRRP0sS+dbYKmKghbK2d/LztIM8ba7lA16H9\nxLY8oy8SvwGqkq2Gea9K2AIEjociac4i0Q/Ka2U881rJCrDUMg3gDhIundaa971M\nglS5cRe9AgMBAAECggEBALe9P6FHIlqYHZjI8QqtToL+E6bYk/rFP/3FYZYQ0IJW\n0NDkKunlGfJnnYUaaQdXFiKXntJ6phFusD7hLu/C/0Kt6Snq6uNhaAj5n/MfRPrY\no3faTuEpyubhigVdl/eFSASD4XGOcRGL6afY6+If5G8oH4QleBS246s/VTnGLhh6\n7cWv2PvFQOU6WzayYzs+8wIYPlVlhKIfuU7vbQF7sWIFfJg8zqVFe2lNXwGS3D2f\ns8AjjN9lMemWF/t9OIA4l9b/Mr2D1wc71AznTUXgBWqm747tWAYyEQ+r1PimbPMB\nEUi6qllpB0qhoEmSVQxONcR3GIep0IwDj8PHQtP55qECgYEA7cnP0yNcc1if7Dd/\nBh0xWGafMVkHIPbbBVOgR3FakaTuC5g0OQ7LP5O8OCW1pchyJY0HXLCEiRVSj5O7\n3MY59eIbdqpcBI7a+ZxOyBHEN2IqZ4EVZmkCxd7w7XA12D+mT19rc//F03FT78e5\neYniSWmj0ku1bSJ7oYb1g4mPf6kCgYEA4n8MKlYIf0JALvMgws78M75JMVpSVgDs\nOngZvMF7z7x4gkBxXxxc5ABe6k/RXCuz59n2IQU3NzS0Y3HxCvZyeJzh1X5ENSdD\nsyJVFkb4oC8nhKvztXT8CwH1vSIGMRUJNE3Gn8IrX8QdEWdvADz/+Iw81HtOh7lr\nAGyreWyLc/UCgYBBFaXuspURdUaAj0gTUlY5Tg1wol+TJD4anSMXqu0RREVrowNY\nQrZa9oLkE14+vDiSEqHbOu1r4AwzBEq9SPyAUp0Vw9df4AILpD7kAAjm59WXcvt6\nhm+d3UGwm7ABOpq4yvNMUsvA7hn9XXtkytrHIUUXwGUuM+wG8Duu/y3p0QKBgQC3\nsZKMQ3pgu7qSWV0YogapcIqsHDTqy5TLVtyI2eMweArEmL9aBAbSY/qWzmVd+5PN\nVljoLvK5M2WZwa9c1MPCTnpaTC3FbjLZ9d5MUwMR5yyFzW+6m0ZPJyfGXPHonMb6\nRJnyt+e1o7hvhRPhfZecXSB4tAjcyuSdU4U+1WnEgQKBgAUZFTYeIyC/bnIca5m8\nzh2wIW0KusCLPa9e3VGTARJG5WP6nx8BPVx71Er/wquBLLquoH0XlTmpdj80QF+s\nHlnKE9CfXVu23ci2S0WalbX/8CYGlO5iCct9o0KR0inrXKfqFzuSKkpg6JyXVMk0\nMT1+EUSD25ATIRsNGFWigNHL\n-----END PRIVATE KEY-----" | |||||
MchtStoreNm = "世寶商城" | |||||
) | |||||
type PayParam struct { | |||||
Data string `json:"data"` | |||||
Sign string `json:"sign"` | |||||
} | |||||
type DataParam struct { | |||||
Head struct { | |||||
MchtNo string `json:"mchtNo" explain:"商户编号"` | |||||
ReqTime string `json:"reqTime" explain:"请求时间戳(yyyyMMddHHmmss)"` | |||||
MsgId string `json:"msgId" explain:"请求消息唯一编号"` | |||||
Attach string `json:"attach" explain:"附加数据(附加数据,用于在同步应答或异步通知时原样返回)"` | |||||
} `json:"head"` | |||||
ReqBody map[string]string `json:"reqBody"` | |||||
} | |||||
type signParam struct { | |||||
PayParam *PayParam | |||||
} | |||||
func (payParam *PayParam) SetData(dataParam DataParam) *signParam { | |||||
now := time.Now() | |||||
rand.Seed(now.UnixNano()) | |||||
randomInt := rand.Intn(100) | |||||
dataParam.Head.MsgId = zhios_pay_utils.AnyToString(randomInt) + dataParam.Head.MchtNo + now.Format("20060102150405") | |||||
dataParam.Head.ReqTime = now.Format("20060102150405") | |||||
payParam.Data = zhios_pay_utils.SerializeStr(dataParam) | |||||
var signs signParam | |||||
signs.PayParam = payParam | |||||
return &signs | |||||
} | |||||
func (s *signParam) SetSign(privateKeyStr string) error { | |||||
dataParamBase64Str := base64.StdEncoding.EncodeToString([]byte(s.PayParam.Data)) | |||||
signStr, err := zhios_pay_utils.GetSign(privateKeyStr, dataParamBase64Str) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
s.PayParam.Sign = signStr | |||||
return nil | |||||
} | |||||
func (payParam *PayParam) Send(prd bool) (string, error) { | |||||
url := "https://qrpaytest.lusobank.com.mo:443" | |||||
if prd { | |||||
url = "https://qrpaytest.lusobank.com.mo:8443" | |||||
} | |||||
headers := map[string]string{ | |||||
"Content-Type": "application/json", | |||||
} | |||||
zhios_pay_utils.CurlDebug = true | |||||
res, err := zhios_pay_utils.CurlPost(url, php2go.URLEncode(zhios_pay_utils.SerializeStr(payParam)), headers) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
fmt.Println(string(res)) | |||||
return string(res), nil | |||||
} |
@@ -146,3 +146,19 @@ type OfflineResultResponse struct { | |||||
Reserved2 string `json:"reserved2" name:"商戶備用字段2" label:"交易成功后原樣返回給商戶"` | Reserved2 string `json:"reserved2" name:"商戶備用字段2" label:"交易成功后原樣返回給商戶"` | ||||
Reserved3 string `json:"reserved3" name:"商戶備用字段3" label:"交易成功后原樣返回給商戶"` | Reserved3 string `json:"reserved3" name:"商戶備用字段3" label:"交易成功后原樣返回給商戶"` | ||||
} | } | ||||
type OrderQueryReq struct { | |||||
MacaoBOCPublicParameter | |||||
QueryNo string `json:"queryNo" name:"商戶系統訂單號" label:"商戶系統消費、退款、撤單的訂單號,本欄不可與queryLogNo同時爲空"` | |||||
QueryLogNo string `json:"queryLogNo" name:"平臺返回訂單號" label:"原交易中銀智慧付返回訂單號logNo,本欄不可與queryNo同時爲空。都不爲空則以queryLogNo爲准。"` | |||||
LogNo string `json:"logNo" name:"系統流水號" label:"該筆交易返回的平臺流水號"` | |||||
OrderDate string `json:"orderDate" name:"訂單日期" label:"訂單建立日期,格式yyyyMMdd"` | |||||
OrderTime string `json:"orderTime" name:"訂單創建時間" label:"格式:HHmmss"` | |||||
TxnFlag string `json:"txnFlag" name:"交易類型" label:"P-消費 R-退款"` | |||||
Result string `json:"result" name:"商品描述" label:"S-交易成功 | |||||
F-交易失敗 | |||||
A-等待付款 | |||||
Z-交易未明 | |||||
W-退款中 | |||||
D-訂單已撤銷"` | |||||
} |
@@ -5,7 +5,7 @@ import ( | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/md" | "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/md" | ||||
zhios_pay_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/utils" | zhios_pay_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/utils" | ||||
"fmt" | "fmt" | ||||
"github.com/syyongx/php2go" | |||||
"github.com/shopspring/decimal" | |||||
"testing" | "testing" | ||||
"time" | "time" | ||||
) | ) | ||||
@@ -16,41 +16,12 @@ func TestJoinStringsInASCII(t *testing.T) { | |||||
fmt.Println(ascii) | fmt.Println(ascii) | ||||
} | } | ||||
func TestBocSend(t *testing.T) { | |||||
var createBocPayAppTradeReq md.CreateBocPayAppTradeReq | |||||
//基础信息,必填 | |||||
createBocPayAppTradeReq.Version = boc.Version | |||||
createBocPayAppTradeReq.Service = boc.CreateBocPayAppTrade | |||||
createBocPayAppTradeReq.SignType = boc.SignType | |||||
createBocPayAppTradeReq.MerchantId = boc.MerchantId | |||||
createBocPayAppTradeReq.TerminalNo = boc.TerminalNo | |||||
createBocPayAppTradeReq.RequestId = "2022101401" + zhios_pay_utils.AnyToString(time.Now().Unix()) | |||||
//按照接口类型选填信息 | |||||
createBocPayAppTradeReq.Amount = "100" | |||||
createBocPayAppTradeReq.OriginalAmount = "100" | |||||
createBocPayAppTradeReq.MercOrderNo = "2022101401" | |||||
createBocPayAppTradeReq.OrderDate = "20221013" | |||||
createBocPayAppTradeReq.OrderTime = "175600" | |||||
createBocPayAppTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | |||||
createBocPayAppTradeReq.Reserved1 = zhios_pay_utils.SerializeStr(map[string]string{ | |||||
"mid": "123456", | |||||
}) | |||||
param := make(map[string]string) | |||||
zhios_pay_utils.Unserialize(zhios_pay_utils.Serialize(createBocPayAppTradeReq), ¶m) | |||||
send, err := boc.Send(false, boc.PrivateKeyStr, param) | |||||
if err != nil { | |||||
t.Error(err) | |||||
} | |||||
t.Logf("回调信息1:%s", send) | |||||
resp, _ := php2go.URLDecode(send) | |||||
t.Logf("回调信息:%s", resp) | |||||
} | |||||
func TestCreateBocPayAppTradeReq(t *testing.T) { | func TestCreateBocPayAppTradeReq(t *testing.T) { | ||||
var createBocPayAppTradeReq md.CreateBocPayAppTradeReq | var createBocPayAppTradeReq md.CreateBocPayAppTradeReq | ||||
//按照接口类型选填信息 | //按照接口类型选填信息 | ||||
createBocPayAppTradeReq.Amount = "100" | createBocPayAppTradeReq.Amount = "100" | ||||
createBocPayAppTradeReq.OriginalAmount = "100" | createBocPayAppTradeReq.OriginalAmount = "100" | ||||
createBocPayAppTradeReq.MercOrderNo = "2022101404" | |||||
createBocPayAppTradeReq.MercOrderNo = "2022102102" | |||||
createBocPayAppTradeReq.OrderDate = time.Now().Format("20060102") | createBocPayAppTradeReq.OrderDate = time.Now().Format("20060102") | ||||
createBocPayAppTradeReq.OrderTime = time.Now().Format("150105") | createBocPayAppTradeReq.OrderTime = time.Now().Format("150105") | ||||
createBocPayAppTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | createBocPayAppTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | ||||
@@ -69,7 +40,7 @@ func TestCreateWeChatTradeReq(t *testing.T) { | |||||
//按照接口类型选填信息 | //按照接口类型选填信息 | ||||
CreateWeChatTradeReqReq.Amount = "100" | CreateWeChatTradeReqReq.Amount = "100" | ||||
CreateWeChatTradeReqReq.OriginalAmount = "100" | CreateWeChatTradeReqReq.OriginalAmount = "100" | ||||
CreateWeChatTradeReqReq.MercOrderNo = "2022101404" | |||||
CreateWeChatTradeReqReq.MercOrderNo = "2022101405" | |||||
CreateWeChatTradeReqReq.OrderDate = time.Now().Format("20060102") | CreateWeChatTradeReqReq.OrderDate = time.Now().Format("20060102") | ||||
CreateWeChatTradeReqReq.OrderTime = time.Now().Format("150105") | CreateWeChatTradeReqReq.OrderTime = time.Now().Format("150105") | ||||
CreateWeChatTradeReqReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | CreateWeChatTradeReqReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | ||||
@@ -93,14 +64,14 @@ func TestCreateQRTradeReq(t *testing.T) { | |||||
createQRTradeReq.OriginalAmount = "100" | createQRTradeReq.OriginalAmount = "100" | ||||
createQRTradeReq.PayChannel = "WECHATPAY" | createQRTradeReq.PayChannel = "WECHATPAY" | ||||
createQRTradeReq.ProductCode = "PCWEB" | createQRTradeReq.ProductCode = "PCWEB" | ||||
createQRTradeReq.MercOrderNo = "2022101405" | |||||
createQRTradeReq.MercOrderNo = "2022102101" | |||||
createQRTradeReq.OrderDate = time.Now().Format("20060102") | createQRTradeReq.OrderDate = time.Now().Format("20060102") | ||||
createQRTradeReq.OrderTime = time.Now().Format("150105") | createQRTradeReq.OrderTime = time.Now().Format("150105") | ||||
createQRTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | createQRTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" | ||||
createQRTradeReq.Reserved1 = zhios_pay_utils.SerializeStr(map[string]string{ | createQRTradeReq.Reserved1 = zhios_pay_utils.SerializeStr(map[string]string{ | ||||
"mid": "123456", | "mid": "123456", | ||||
}) | }) | ||||
createQRTradeReq.Supplier = "澳門世寶一人有限公司" | |||||
createQRTradeReq.Supplier = "测试" | |||||
createQRTradeReq.ReferUrl = "https://www.baidu.com" | createQRTradeReq.ReferUrl = "https://www.baidu.com" | ||||
createQRTradeReq.BusinessType = "4" | createQRTradeReq.BusinessType = "4" | ||||
createQRTradeReq.GoodsInfo = "测试商品^1" | createQRTradeReq.GoodsInfo = "测试商品^1" | ||||
@@ -111,3 +82,24 @@ func TestCreateQRTradeReq(t *testing.T) { | |||||
} | } | ||||
t.Logf("回调信息:%s", send) | t.Logf("回调信息:%s", send) | ||||
} | } | ||||
func TestOrderQueryReq(t *testing.T) { | |||||
var orderQueryReq md.OrderQueryReq | |||||
//按照接口类型选填信息 | |||||
orderQueryReq.QueryNo = "100173316661476707" | |||||
send, err := boc.OrderQueryReq(false, boc.PrivateKeyStr, boc.MerchantId, boc.TerminalNo, &orderQueryReq) | |||||
if err != nil { | |||||
t.Error(err) | |||||
} | |||||
t.Logf("回调信息:%s", send) | |||||
} | |||||
func TestFloat(t *testing.T) { | |||||
rateD, _ := decimal.NewFromString("155") | |||||
rateD = rateD.Div(decimal.NewFromInt(100)) | |||||
rateF, exact := rateD.Float64() | |||||
t.Logf("数目:%g", rateF) | |||||
if !exact { | |||||
rateF = 0.5 | |||||
} | |||||
t.Logf("数目:%g", rateF) | |||||
} |
@@ -0,0 +1,39 @@ | |||||
package test | |||||
import ( | |||||
luso "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/lib/luso_bank" | |||||
zhios_pay_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/utils" | |||||
"testing" | |||||
) | |||||
func TestLusoPay(t *testing.T) { | |||||
var ( | |||||
payParam luso.PayParam | |||||
dataParam luso.DataParam | |||||
) | |||||
req := map[string]string{ | |||||
"mchtOrderId": "202211041102", | |||||
"payScene ": "AS_MWEB", | |||||
"mdseDesc ": "澳门世寶-自營購物", | |||||
"transAmount ": "100", | |||||
"transCur ": "MOP", | |||||
"subMchtNm ": "世寶商城", | |||||
"notifyUrl ": "http://inapi.izhyin.cn:80/pay/boc/callback", | |||||
"extMsg ": zhios_pay_utils.SerializeStr(map[string]string{ | |||||
"mid": "123456", | |||||
"ord_type": "mall_goods", | |||||
}), | |||||
} | |||||
dataParam.Head.MchtNo = luso.MerchantId | |||||
dataParam.ReqBody = req | |||||
client := payParam.SetData(dataParam) | |||||
err := client.SetSign(luso.PrivateKeyStr) | |||||
if err != nil { | |||||
t.Error(err) | |||||
} | |||||
resp, err := client.PayParam.Send(false) | |||||
if err != nil { | |||||
t.Error(err) | |||||
} | |||||
t.Logf("回調信息:%s", resp) | |||||
} |