package gallopay import ( "errors" "fmt" "net/http" "server/config" "server/modules/pay/base" "server/modules/pay/values" "server/pb" "time" "github.com/gogo/protobuf/proto" "github.com/liangdas/mqant/log" ) func NewSub(b *base.Base) { sub := &Sub{ Base: b, } b.SignKey = key b.HttpType = base.HttpTypeJson // b.ShouldSignUpper = true if b.Opt == base.OPTPay { b.Resp = new(PayResp) b.ReqURL = baseURL + config.GetConfig().Pay.GalloPay.PayUrl } else if b.Opt == base.OPTWithdraw { b.Resp = new(WithdrawResp) b.ReqURL = baseURL + withdrawURL } else if b.Opt == base.OPTPayCB { // b.SignPassStr = []string{"sign"} b.CallbackResp.Msg = "SUCCESS" b.CallbackReq = new(PayCallbackReq) } else if b.Opt == base.OPTWithdrawCB { // b.SignPassStr = []string{"sign", "msg"} b.CallbackResp.Msg = "SUCCESS" b.CallbackReq = new(WithdrawCallbackReq) } else if b.Opt == base.OPTQueryWithdraw { b.Resp = new(QueryWithdrawResp) b.ReqURL = baseURL + queryWithdrawURL } else if b.Opt == base.OPTQueryPay { b.Resp = new(QueryPayResp) b.ReqURL = baseURL + queryPayURL } b.Sub = sub } type Sub struct { Base *base.Base } func (s *Sub) PackHeader(header http.Header) { header.Add("merchantid", mid) header.Add("signature", s.Base.Sign) } func (s *Sub) PackReq() interface{} { if s.Base.Opt == base.OPTPay { return s.PackPayReq() } else if s.Base.Opt == base.OPTWithdraw { return s.PackWithdrawReq() } else if s.Base.Opt == base.OPTQueryWithdraw { return s.PackQueryWithdrawReq() } else if s.Base.Opt == base.OPTQueryPay { return s.PackQueryPayReq() } return nil } func (s *Sub) GetResp() (proto.Message, error) { if s.Base.Opt == 1 { resp := s.Base.Resp.(*PayResp) if resp.Code != "0" || resp.Status == "failed" || resp.PaymentLink == "" { return nil, errors.New("pay fail") } return &pb.InnerRechargeResp{APIOrderID: fmt.Sprintf("%v", resp.GPOrderID), URL: resp.PaymentLink, Channel: uint32(values.GalloPay)}, nil } else if s.Base.Opt == base.OPTWithdraw { resp := s.Base.Resp.(*WithdrawResp) if s.Base.Status == 0 && resp.Code != "0" { return nil, errors.New("withdraw fail") } return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.GPOrderID), Channel: uint32(values.GalloPay), Status: uint32(s.Base.Status)}, nil } else if s.Base.Opt == base.OPTQueryWithdraw { resp := s.Base.Resp.(*QueryWithdrawResp) log.Debug("QueryWithdrawResp:%+v", resp) ret := &pb.InnerQueryWithdrawResp{APIOrderID: resp.GPOrderID, OrderID: resp.OrderID} s.Base.QueryWithdrawResp.OrderID = resp.OrderID s.Base.QueryWithdrawResp.APIOrderID = resp.GPOrderID if s.Base.Status == 0 { if resp.Code == "0" { if resp.Status == "success" { s.Base.QueryWithdrawResp.Status = base.QueryStatusOrderSuccess } // else if resp.Status == 1 { // s.Base.QueryWithdrawResp.Status = base.QueryStatusSuccess // } } else { if resp.Status == "failed" { s.Base.QueryWithdrawResp.Status = base.QueryStatusFail } } } if s.Base.QueryWithdrawResp.Status == 0 { s.Base.QueryWithdrawResp.Status = base.QueryStatusUnknown } return ret, nil } else { resp := s.Base.Resp.(*QueryPayResp) log.Debug("QueryPayResp:%+v", resp) ret := &pb.InnerQueryWithdrawResp{APIOrderID: resp.GPOrderID, OrderID: resp.OrderID} s.Base.QueryPayResp.OrderID = resp.OrderID s.Base.QueryPayResp.APIOrderID = resp.GPOrderID if s.Base.Status == 0 { if resp.Code == "0" && resp.Status == "success" { s.Base.QueryPayResp.Status = base.QueryStatusOrderSuccess } } if s.Base.QueryPayResp.Status == 0 { s.Base.QueryPayResp.Status = base.QueryStatusUnknown } return ret, nil } } func (s *Sub) PackPayReq() interface{} { r := s.Base.PayReq send := &PayReq{ OrderID: r.OrderID, Amount: fmt.Sprintf("%d.00", r.Amount), Name: r.Name, Email: r.Email, CustomerIP: r.IP, Phone: r.Phone, NotifyURL: s.Base.GetPayCallbackURL(), Timestamp: fmt.Sprintf("%d", time.Now().Unix()), } s.Base.Sign = s.Base.SignMD5(send) return send } func (s *Sub) PackWithdrawReq() interface{} { r := s.Base.WithdrawReq send := &WithdrawReq{ OrderID: r.OrderID, Amount: fmt.Sprintf("%d.00", r.Amount), Name: r.Name, Email: r.Email, Phone: r.Phone, // PayMethod: , Address: r.Address, // IFSC: , // Account: , NotifyURL: s.Base.GetWithdrawCallbackURL(), Timestamp: fmt.Sprintf("%d", time.Now().Unix()), } //if fmt.Sprintf("%d", r.PayType) == common.WithdrawTypeBank { send.PayMethod = "imps" send.IFSC = r.PayCode send.Account = r.CardNo //} else if fmt.Sprintf("%d", r.PayType) == common.WithdrawTypeUPI { // send.PayMethod = "upi" // send.Account = r.PayCode // return nil //} s.Base.Sign = s.Base.SignMD5(send) return send } func (s *Sub) PackQueryWithdrawReq() interface{} { r := s.Base.QueryWithdrawReq send := &QueryWithdrawReq{ OrderID: r.OrderID, Timestamp: fmt.Sprintf("%d", time.Now().Unix()), } s.Base.Sign = s.Base.SignMD5(send) return send } func (s *Sub) PackQueryPayReq() interface{} { r := s.Base.QueryPayReq send := &QueryPayReq{ OrderID: r.OrderID, Timestamp: fmt.Sprintf("%d", time.Now().Unix()), } s.Base.Sign = s.Base.SignMD5(send) return send } func (s *Sub) CheckSign(str string) bool { // str += "&key=" + key checkSign := s.Base.C.GetHeader("signature") mySign := s.Base.SignMD5WithStrEmpty(str) // mySign := "" if s.Base.Opt == base.OPTPayCB { req := s.Base.CallbackReq.(*PayCallbackReq) log.Debug("checkSign pay:%+v", *req) s.Base.CallbackResp.OrderID = req.OrderID s.Base.CallbackResp.Success = req.Status == "success" // mySign = s.Base.SignMD5(req) } else if s.Base.Opt == base.OPTWithdrawCB { req := s.Base.CallbackReq.(*WithdrawCallbackReq) log.Debug("checkSign withdraw:%+v", *req) s.Base.CallbackResp.OrderID = req.OrderID s.Base.CallbackResp.Success = req.Status == "success" s.Base.CallbackResp.APIOrderID = req.GPOrderID s.Base.CallbackResp.FailMessage = req.Msg // mySign = s.Base.SignMD5(req) } pass := mySign == checkSign if !pass { log.Error("check sign err,mySign:%s,checkSign:%s", mySign, checkSign) } return pass }