diff --git a/modules/pay/base/signmd5.go b/modules/pay/base/signmd5.go index 973987d..1217e87 100644 --- a/modules/pay/base/signmd5.go +++ b/modules/pay/base/signmd5.go @@ -7,8 +7,8 @@ import ( "github.com/liangdas/mqant/log" ) -func (b *Base) SignMD5(send interface{}) string { - signStr := GetSignStr(send) +func (b *Base) SignMD5(send interface{}, pass ...string) string { + signStr := GetSignStr(send, pass...) if b.KeyName == "" { signStr += "&key=" + b.SignKey } else { diff --git a/modules/pay/payplus/base.go b/modules/pay/payplus/base.go index 8e33a9e..aa79798 100644 --- a/modules/pay/payplus/base.go +++ b/modules/pay/payplus/base.go @@ -8,6 +8,8 @@ import ( "server/modules/pay/base" "server/modules/pay/values" "server/pb" + "server/util" + "strings" "github.com/gogo/protobuf/proto" "github.com/liangdas/mqant/log" @@ -22,18 +24,18 @@ func NewSub(b *base.Base) { b.ShouldSignUpper = true b.Channel = values.PayPlus if b.Opt == 1 { - b.Resp = new(PayReq) + b.Resp = new(PayResp) b.ReqURL = payApi } else if b.Opt == 2 { - b.Resp = new(WithdrawReq) + b.Resp = new(WithdrawResp) b.ReqURL = withdrawApi } else if b.Opt == 3 { b.SignPassStr = []string{"sign"} - b.CallbackResp.Msg = "SUCCESS" + b.CallbackResp.Msg = strings.ToLower(statusSuccess) b.CallbackReq = new(PayCallbackReq) } else if b.Opt == 4 { b.SignPassStr = []string{"sign", "msg"} - b.CallbackResp.Msg = "SUCCESS" + b.CallbackResp.Msg = strings.ToLower(statusSuccess) b.CallbackReq = new(WithdrawCallbackReq) } b.Sub = sub @@ -43,7 +45,7 @@ type Sub struct { Base *base.Base } -func (s *Sub) PackHeader(header http.Header) { +func (s *Sub) PackHeader(_ http.Header) { // header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID) } @@ -56,26 +58,30 @@ func (s *Sub) PackReq() interface{} { func (s *Sub) GetResp() (proto.Message, error) { if s.Base.Opt == 1 { - resp := s.Base.Resp.(*PaymentResponse) - if resp.RetCode != StatusSuccess || resp.PayUrl == "" { + resp := s.Base.Resp.(*PayResp) + if resp.RetCode != statusSuccess || resp.PayUrl == "" { return nil, errors.New("pay fail") } return &pb.InnerRechargeResp{APIOrderID: fmt.Sprintf("%v", resp.OrderNo), URL: resp.PayUrl, Channel: uint32(values.PayPlus)}, nil } - resp := s.Base.Resp.(*PayoutResponse) - if s.Base.Status == 0 && resp.RetCode != StatusSuccess { + resp := s.Base.Resp.(*WithdrawResp) + if s.Base.Status == 0 && resp.RetCode != statusSuccess { return nil, errors.New("withdraw fail") } - return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.MchTransNo), Channel: uint32(values.PayPlus)}, nil + return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.PlatOrder), Channel: uint32(values.PayPlus)}, nil } func (s *Sub) PackPayReq() interface{} { r := s.Base.PayReq send := &PayReq{ - Amount: r.Amount, - MchId: "", + MchId: mchId, OrderNo: r.OrderID, + Amount: util.Decimal(float64(r.Amount)/common.DecimalDigits, 2), + Product: indiaUpi, + BankCode: "all", + Goods: fmt.Sprintf("email:%s/name:%s/phone:%s/ip:127.0.0.1", r.Email, r.Name, r.Phone), NotifyUrl: values.GetPayCallback(values.PayPlus), + ReturnUrl: values.GetPayCallback(values.PayPlus), } send.Sign = s.Base.SignMD5(send) return send @@ -86,41 +92,48 @@ func (s *Sub) PackWithdrawReq() interface{} { if r.PayType != int64(common.PayTypeBank) { return nil } + payType := "" + if common.PayType(r.PayType) == common.PayTypeBank { + payType = "bank" + } else if common.PayType(r.PayType) == common.PayTypeUPI { + payType = "upi" + } send := &WithdrawReq{ - Amount: r.Amount, - MchId: "", - OrderNo: r.OrderID, - BankCode: r.PayCode, + Type: "api", + MchId: mchId, + MchTransNo: r.OrderID, + Amount: util.Decimal(float64(r.Amount)/common.DecimalDigits, 2), + NotifyUrl: values.GetWithdrawCallback(values.PayPlus), AccountName: r.Name, AccountNo: r.CardNo, - NotifyUrl: values.GetWithdrawCallback(values.PayPlus), + BankCode: r.PayCode, + RemarkInfo: fmt.Sprintf("email:%s/phone:%s/mode:%s", r.Email, r.Phone, payType), } send.Sign = s.Base.SignMD5(send) return send } -func (s *Sub) CheckSign(str string) bool { - // str += "&key=" + key +func (s *Sub) CheckSign(_ string) bool { checkSign := "" - s.Base.CallbackResp.Msg = "SUCCESS" + s.Base.CallbackResp.Msg = statusFail mySign := "" if s.Base.Opt == 3 { req := s.Base.CallbackReq.(*PayCallbackReq) log.Debug("checkSign pay:%+v", *req) checkSign = req.Sign s.Base.CallbackResp.OrderID = req.OrderNo - s.Base.CallbackResp.Success = req.Status == StatusSuccess + s.Base.CallbackResp.Success = req.Status == 2 mySign = s.Base.SignMD5(req) } else if s.Base.Opt == 4 { req := s.Base.CallbackReq.(*WithdrawCallbackReq) log.Debug("checkSign withdraw:%+v", *req) checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.OrderNo - s.Base.CallbackResp.Success = req.Status == StatusSuccess - s.Base.CallbackResp.APIOrderID = req.TradeNo - s.Base.CallbackResp.FailMessage = "" - mySign = s.Base.SignMD5(req) + s.Base.CallbackResp.OrderID = req.MchTransNo + s.Base.CallbackResp.Success = req.Status == 2 + s.Base.CallbackResp.APIOrderID = req.MchTransNo + s.Base.CallbackResp.FailMessage = req.Msg + mySign = s.Base.SignMD5(req, s.Base.SignPassStr...) } return mySign == checkSign } diff --git a/modules/pay/payplus/values.go b/modules/pay/payplus/values.go index 393f368..26b1c5c 100644 --- a/modules/pay/payplus/values.go +++ b/modules/pay/payplus/values.go @@ -2,24 +2,30 @@ package payplus // 常量定义 const ( - key = "your_secret_key" - StatusSuccess = "SUCCESS" - StatusFail = "FAIL" + key = "QRUQNQ36INNYFFJVRPG8VB394QSWSUG7ZMPDQJ91AMHV6YCBRRAOAQIUCRFMH0F24RGNARLNBYTJBGXPERQHFCPPQAB4THC6ZBMVKRXHRK4LTZE0S1AYDN0GEXBBL0SL" + statusSuccess = "SUCCESS" + statusFail = "FAIL" payApi = "http://api.letspayfast.com/apipay" withdrawApi = "http://api.letspayfast.com/apitrans" + mchId = "723609043726" + indiaUpi = "indiaupi" ) // PayReq 支付请求结构体 type PayReq struct { - MchId string `json:"mchId" binding:"required"` // 商户号 - OrderNo string `json:"orderNo" binding:"required"` // 订单号 - Amount int64 `json:"amount" binding:"required"` // 支付金额 - NotifyUrl string `json:"notifyUrl" binding:"required"` // 支付结果通知的回调URL - Sign string `json:"sign,omitempty"` // 签名,生成后填充 + MchId string `json:"mchId"` // 商户号 + OrderNo string `json:"orderNo"` // 订单号 + Amount float64 `json:"amount"` // 支付金额 + Product string `json:"product"` // 产品号 indiaupi + BankCode string `json:"bankcode"` // 银行代号 + Goods string `json:"goods"` // 物品说明 + NotifyUrl string `json:"notifyUrl"` // 支付结果通知的回调URL + ReturnUrl string `json:"returnUrl"` // 同步通知 + Sign string `json:"sign"` // 签名,生成后填充 } -// PaymentResponse 支付响应结构体 -type PaymentResponse struct { +// PayResp 支付响应结构体 +type PayResp struct { RetCode string `json:"retCode"` PayUrl string `json:"payUrl"` OrderNo string `json:"orderNo"` @@ -30,43 +36,45 @@ type PaymentResponse struct { // PayCallbackReq 支付通知结构体 type PayCallbackReq struct { - MchId string `json:"mchId" binding:"required"` // 商户号 - OrderNo string `json:"orderNo" binding:"required"` // 订单号 - Amount string `json:"amount" binding:"required"` // 支付金额 - TradeNo string `json:"tradeNo" binding:"required"` // 支付平台生成的交易号 - Status string `json:"status" binding:"required"` // 支付状态(如成功、失败) - Sign string `json:"sign" binding:"required"` // 签名,用于验证通知的真实性 + MchId string `json:"mchId" form:"mchId"` // 商户号 + OrderNo string `json:"orderNo" form:"orderNo"` // 订单号 + Amount string `json:"amount" form:"amount"` // 支付金额 + Product string `json:"product" form:"product"` // 产品号 indiaupi + PaySuccTime string `json:"paySuccTime" form:"paySuccTime"` // 成功时间 + Status int `json:"status" form:"status"` // 支付状态 1 支付中,2 成功,5 失效,-1 失败 + Sign string `json:"sign" form:"sign"` // 签名,用于验证通知的真实性 } // WithdrawReq 代付请求结构体 type WithdrawReq struct { - MchId string `json:"mchId" binding:"required"` // 商户号 - OrderNo string `json:"orderNo" binding:"required"` // 订单号 - Amount int64 `json:"amount" binding:"required"` // 代付金额 - BankCode string `json:"bankCode" binding:"required"` // 收款银行代码 - AccountName string `json:"accountName" binding:"required"` // 收款人姓名 - AccountNo string `json:"accountNo" binding:"required"` // 收款账号 - NotifyUrl string `json:"notifyUrl" binding:"required"` // 代付结果通知的回调URL - Sign string `json:"sign,omitempty"` // 签名,生成后填充 + Type string `json:"type"` // 必填字符小写固定字符 api + MchId string `json:"mchId"` // 商户号 + MchTransNo string `json:"mchTransNo"` // o 转账订单号 + Amount float64 `json:"amount"` // 代付金额 + NotifyUrl string `json:"notifyUrl"` // 代付结果通知的回调URL + AccountName string `json:"accountName"` // 收款人姓名 + AccountNo string `json:"accountNo"` // 收款账号 + BankCode string `json:"bankCode"` // 收款银行代码 + RemarkInfo string `json:"remarkInfo"` // 收款银行代码 + Sign string `json:"sign"` // 签名,生成后填充 } -// PayoutResponse 代付响应结构体 -type PayoutResponse struct { +// WithdrawResp 代付响应结构体 +type WithdrawResp struct { RetCode string `json:"retCode"` RetMsg string `json:"retMsg"` MchTransNo string `json:"mchTransNo"` PlatOrder string `json:"platOrder"` - Status string `json:"status"` + Status string `json:"status"` // 1 处理中 3 失败 } // WithdrawCallbackReq 代付通知结构体 type WithdrawCallbackReq struct { - MchId string `json:"mchId" binding:"required"` // 商户号 - OrderNo string `json:"orderNo" binding:"required"` // 订单号 - Amount string `json:"amount" binding:"required"` // 代付金额 - TradeNo string `json:"tradeNo" binding:"required"` // 代付平台生成的交易号 - Status string `json:"status" binding:"required"` // 代付状态(如成功、失败) - AccountName string `json:"accountName" binding:"required"` // 收款人姓名 - AccountNo string `json:"accountNo" binding:"required"` // 收款账号 - Sign string `json:"sign" binding:"required"` // 签名,用于验证通知的真实性 + MchId string `json:"mchId" form:"mchId"` // 商户号 + MchTransNo string `json:"mchTransNo" form:"mchTransNo"` // 转账订单号 + Amount string `json:"amount" form:"amount"` // 代付金额 + Status int `json:"status" form:"status"` // 代付状态(如成功、失败) 1 处理中,2 成功,3 失败 + TransSuccTime string `json:"transSuccTime" form:"transSuccTime"` // 收款人姓名 + Sign string `json:"sign" form:"sign"` // 签名,用于验证通知的真实性 + Msg string `json:"msg" form:"msg"` // 信息描述 }