diff --git a/lib/boc/api_macao.go b/lib/boc/api_macao.go index 7a2cdb3..d09b657 100644 --- a/lib/boc/api_macao.go +++ b/lib/boc/api_macao.go @@ -126,3 +126,21 @@ func CreateQRTradeReq(prd bool, privateKeyStr, merchantId, terminalNo string, cr resp, _ := php2go.URLDecode(send) 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 +} diff --git a/lib/luso_bank/macao_luso.go b/lib/luso_bank/macao_luso.go new file mode 100644 index 0000000..9cc9b9a --- /dev/null +++ b/lib/luso_bank/macao_luso.go @@ -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 +} diff --git a/md/boc.go b/md/boc.go index 52e854e..d6abdb3 100644 --- a/md/boc.go +++ b/md/boc.go @@ -146,3 +146,19 @@ type OfflineResultResponse struct { Reserved2 string `json:"reserved2" name:"商戶備用字段2" 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-訂單已撤銷"` +} diff --git a/test/boc_pay_test.go b/test/boc_pay_test.go index 415022e..0d9c6f9 100644 --- a/test/boc_pay_test.go +++ b/test/boc_pay_test.go @@ -5,7 +5,7 @@ import ( "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" "fmt" - "github.com/syyongx/php2go" + "github.com/shopspring/decimal" "testing" "time" ) @@ -16,41 +16,12 @@ func TestJoinStringsInASCII(t *testing.T) { 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) { var createBocPayAppTradeReq md.CreateBocPayAppTradeReq //按照接口类型选填信息 createBocPayAppTradeReq.Amount = "100" createBocPayAppTradeReq.OriginalAmount = "100" - createBocPayAppTradeReq.MercOrderNo = "2022101404" + createBocPayAppTradeReq.MercOrderNo = "2022102102" createBocPayAppTradeReq.OrderDate = time.Now().Format("20060102") createBocPayAppTradeReq.OrderTime = time.Now().Format("150105") createBocPayAppTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" @@ -69,7 +40,7 @@ func TestCreateWeChatTradeReq(t *testing.T) { //按照接口类型选填信息 CreateWeChatTradeReqReq.Amount = "100" CreateWeChatTradeReqReq.OriginalAmount = "100" - CreateWeChatTradeReqReq.MercOrderNo = "2022101404" + CreateWeChatTradeReqReq.MercOrderNo = "2022101405" CreateWeChatTradeReqReq.OrderDate = time.Now().Format("20060102") CreateWeChatTradeReqReq.OrderTime = time.Now().Format("150105") CreateWeChatTradeReqReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" @@ -93,14 +64,14 @@ func TestCreateQRTradeReq(t *testing.T) { createQRTradeReq.OriginalAmount = "100" createQRTradeReq.PayChannel = "WECHATPAY" createQRTradeReq.ProductCode = "PCWEB" - createQRTradeReq.MercOrderNo = "2022101405" + createQRTradeReq.MercOrderNo = "2022102101" createQRTradeReq.OrderDate = time.Now().Format("20060102") createQRTradeReq.OrderTime = time.Now().Format("150105") createQRTradeReq.NotifyUrl = "/api/v1/mall/pay/ada/sub_callback" createQRTradeReq.Reserved1 = zhios_pay_utils.SerializeStr(map[string]string{ "mid": "123456", }) - createQRTradeReq.Supplier = "澳門世寶一人有限公司" + createQRTradeReq.Supplier = "测试" createQRTradeReq.ReferUrl = "https://www.baidu.com" createQRTradeReq.BusinessType = "4" createQRTradeReq.GoodsInfo = "测试商品^1" @@ -111,3 +82,24 @@ func TestCreateQRTradeReq(t *testing.T) { } 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) +} diff --git a/test/luso_pay_test.go b/test/luso_pay_test.go new file mode 100644 index 0000000..dfd7b19 --- /dev/null +++ b/test/luso_pay_test.go @@ -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) +}