146 lines
4.5 KiB
Go
146 lines
4.5 KiB
Go
|
package youchu
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
mrand "math/rand"
|
||
|
"qteam/app/constants/errorcode"
|
||
|
"qteam/app/http/entities/front"
|
||
|
"qteam/app/models/ordersmodel"
|
||
|
"qteam/app/utils"
|
||
|
"qteam/app/utils/postbank"
|
||
|
"qteam/config"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func NewYouChuClient(cfg config.YouChuConfig) *YouChuClient {
|
||
|
return &YouChuClient{
|
||
|
cfg: cfg,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (this *YouChuClient) Login(code string) (res YouChuResponse, err error) {
|
||
|
partnerTxSriNo := time.Now().Format("20060102150405") + fmt.Sprintf("%10d", mrand.Intn(10000))
|
||
|
url := this.cfg.MerchantId + ".html?partnerTxSriNo=" + partnerTxSriNo
|
||
|
request := YouChuSendRequest{
|
||
|
CustNo: this.cfg.MerchantId,
|
||
|
ReqTransTime: time.Now().Format("20060102150405"),
|
||
|
Code: code,
|
||
|
}
|
||
|
bytes, err := json.Marshal(request)
|
||
|
if err != nil {
|
||
|
return res, err
|
||
|
}
|
||
|
data, err := this.doPost(url, partnerTxSriNo, "crecard.getCustomerInfo", bytes)
|
||
|
if err != nil {
|
||
|
return res, err
|
||
|
}
|
||
|
err = json.Unmarshal(data, &res)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (this *YouChuClient) OrderQuery(order ordersmodel.Orders) (code int, response front.YouChuOrderQueryResponse) {
|
||
|
var BusiMainId = time.Now().Format("20060102150405") + utils.RandomString(10)
|
||
|
request := front.YouChuRequestBody{
|
||
|
Body: front.YouChuOrderRequest{
|
||
|
BusiMainId: BusiMainId,
|
||
|
ReqTransTime: order.CreateTime.Format("2006-01-02 15:04:05"),
|
||
|
Data: front.OrderQuery{
|
||
|
TxnCode: "1004",
|
||
|
SourceId: "16",
|
||
|
ReqTraceId: order.OrderNo,
|
||
|
ReqDate: time.Now().Format("20060102150405"),
|
||
|
TxnDt: time.Now().Format("20060102"),
|
||
|
MchtNo: config.GetConf().YouChu.MchtNo,
|
||
|
OldSeqNo: utils.GenerateRequestNumber(),
|
||
|
},
|
||
|
},
|
||
|
Head: front.YouChuRequestHeader{
|
||
|
PartnerTxSriNo: BusiMainId,
|
||
|
AccessType: "API",
|
||
|
Reserve: "",
|
||
|
Method: "b2c.gatewaypay.orderQuery",
|
||
|
Version: "1",
|
||
|
MerchantId: config.GetConf().YouChu.MerchantId,
|
||
|
AppID: config.GetConf().YouChu.AppID,
|
||
|
},
|
||
|
}
|
||
|
url := config.GetConf().YouChu.MerchantId + ".html?partnerTxSriNo=" + request.Body.BusiMainId
|
||
|
requestData := EncryptRequest(request)
|
||
|
bytes, err := json.Marshal(requestData)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, response
|
||
|
}
|
||
|
post, err := this.doPost(url, request.Body.BusiMainId, "b2c.gatewaypay.orderQuery", bytes)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, response
|
||
|
}
|
||
|
err = json.Unmarshal(post, &response)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, front.YouChuOrderQueryResponse{}
|
||
|
}
|
||
|
return errorcode.Success, response
|
||
|
}
|
||
|
|
||
|
func (this *YouChuClient) OrderRefund(order ordersmodel.Orders) (code int, response front.YouChuOrderRefundResponse) {
|
||
|
var BusiMainId = time.Now().Format("20060102150405") + utils.RandomString(10)
|
||
|
request := front.YouChuOrderRefundRequest{
|
||
|
Head: front.YouChuRequestHeader{
|
||
|
PartnerTxSriNo: BusiMainId,
|
||
|
AccessType: "API",
|
||
|
Reserve: "",
|
||
|
Method: "b2c.gatewaypay.orderRefund",
|
||
|
Version: "1",
|
||
|
MerchantId: config.GetConf().YouChu.MerchantId,
|
||
|
AppID: config.GetConf().YouChu.AppID,
|
||
|
},
|
||
|
Body: front.RefundRequestBody{
|
||
|
BusiMainId: BusiMainId,
|
||
|
ReqTransTime: order.CreateTime.Format("2006-01-02 15:04:05"),
|
||
|
Data: front.RefundRequestData{
|
||
|
TxnCode: "1003",
|
||
|
SourceId: "16",
|
||
|
ReqTraceId: order.OrderNo,
|
||
|
ReqDate: time.Now().Format("20060102150405"),
|
||
|
MchtNo: config.GetConf().YouChu.MchtNo,
|
||
|
OrgTxnSeq: order.OrgTxnSeq,
|
||
|
TxnAmt: order.Price,
|
||
|
OrgTxnAmt: order.Price,
|
||
|
RefundDesc: "用户主动退款",
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
url := config.GetConf().YouChu.MerchantId + ".html?partnerTxSriNo=" + request.Body.BusiMainId
|
||
|
requestData := EncryptRequest(request)
|
||
|
bytes, err := json.Marshal(requestData)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, response
|
||
|
}
|
||
|
post, err := this.doPost(url, request.Body.BusiMainId, "b2c.gatewaypay.orderRefund", bytes)
|
||
|
utils.Log(nil, "b2c.orderRefund", post)
|
||
|
if err != nil {
|
||
|
return errorcode.YouChuOrderRefundFail, response
|
||
|
}
|
||
|
err = json.Unmarshal(post, &response)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, front.YouChuOrderRefundResponse{}
|
||
|
}
|
||
|
return errorcode.Success, response
|
||
|
}
|
||
|
|
||
|
func EncryptRequest(request interface{}) (RequestData front.YouChuRequest) {
|
||
|
input, _ := json.Marshal(request)
|
||
|
MerchantId := config.GetConf().YouChu.MerchantId
|
||
|
PrivateKey := config.GetConf().Sm2.PrivateKey
|
||
|
PublicKey := config.GetConf().Sm2.PublicKey
|
||
|
encrypt, err := postbank.Encrypt(MerchantId, PrivateKey, PublicKey, string(input), "", true)
|
||
|
if err != nil {
|
||
|
return front.YouChuRequest{}
|
||
|
}
|
||
|
err = json.Unmarshal([]byte(encrypt), &RequestData)
|
||
|
if err != nil {
|
||
|
return front.YouChuRequest{}
|
||
|
}
|
||
|
return RequestData
|
||
|
}
|