package rchgutil import ( "bytes" "crypto/md5" "encoding/hex" "encoding/json" "errors" "fmt" "net/http" "strings" "91porn-server/app/appg" "91porn-server/common" "91porn-server/common/httputil" "91porn-server/common/log" "91porn-server/web/webg" ) var gec = config{ MercID: "10393", AppSecret: "488b521efcfb8780f1e7731b8c1fc3ec", ExeUrl: "https://zrpu.xtdfin.com/api/exchg/order/apply", NotifyUrl: "/3rd/defray/callback/echg/goldfish", QueryUrl: "https://inter.jxjssm.com/api/rechg/order/queryOrder", } // GoldFishExchange 充值订单请求体 type GoldFishExchange struct { MercID string `json:"mercId"` //商户编号 Type string `json:"type"` // 订单充值类型 Money string `json:"money"` // 充值⾦额 TradeNo string `json:"tradeNo"` //商户订单号 NotifyURL string `json:"notifyUrl"` // 回调地址 ReceCardNo string `json:"receCardNo"` //兑换人银行卡号 ReceAlipayAct string `json:"receAlipayAct"` //兑换人支付宝账号 ReceiptName string `json:"receiptName"` //兑款人姓名 Info GoldFishExchangeInfo `json:"info"` // 用户信息 Time string `json:"time"` //UTC时间戳(13位) Sign string `json:"sign"` // 签名 } // GoldFishExchangeInfo 玩家信息 type GoldFishExchangeInfo struct { PlayerID string `json:"playerId"` // 玩家ID PlayerIP string `json:"playerIp"` // 玩家IP DeviceID string `json:"deviceId"` // 玩家设备ID DeviceType string `json:"deviceType"` // 玩家设备类型 ios pc android Name string `json:"name"` // 玩家姓名 Tel string `json:"tel"` // 玩家⼿机号 AlipayAct string `json:"alipayAct"` // 玩家支付宝账号 } // GoldFishExchangeRes 回调函数参数model type GoldFishExchangeRes struct { Code int `json:"code" binding:"required"` //交易状态值 MercID string `json:"mercId" binding:"required"` //商户编号 OID string `json:"oid" binding:"required"` //支付平台订单号 Money string `json:"money" binding:"required"` //兑换金额 TradeNo string `json:"tradeNo" binding:"required"` //商户订单号 Status string `json:"status"` Mark string `json:"mark"` //拒绝兑换理由 Sign string `json:"sign" binding:"required"` //签名 } // ToExchg 支付发起 func (g *GoldFishExchange) ToExchg() (msg ExchgMsg) { g.Fill() code, err := httputil.DefaultClientPostWithRespWithProxy(webg.ProxyCfg, &msg, g.GetURL(), g.GetHeader(), g.GetBody()) if err != nil { msg.Code = UNKNOWError msg.Err = fmt.Sprintf("GoldFishExchange ToPay Http.PostJson fail error:%+v/,data:%+v;", err, g) log.Error(msg.Err) return } if code != http.StatusOK { msg.Code = UNKNOWError msg.Err = fmt.Sprintf("GoldFishExchange ToPay Http.PostJsonhttp code err:%+v/,data:%+v;", err, code) log.Error(msg.Err) return } if msg.Code != 200 { log.Error(fmt.Sprintf("GoldFishExchange http request err :%+v:", msg)) return } return } // QueryOrder 订单状态查询发起 func (g *GoldFishExchangeRes) QueryOrder() (msg QueryMSG, err error) { var res struct { Code int `json:"code"` MSG QueryMSG `json:"msg"` } body := make(map[string]string) body["mercId"] = g.MercID body["tradeNo"] = g.TradeNo code, err := httputil.DefaultClientPostWithRespWithProxy(webg.ProxyCfg, &res, gec.QueryUrl, nil, body) if err != nil || code != 200 { log.Error(fmt.Sprintf("GoldFishExchange QueryOrder http.Get fail error:%+v:", err)) return } if res.Code != 200 { err = errors.New("GoldFishExchange QueryOrder http query fail") return } msg = res.MSG return } // Fill 补全配置信息和签名信息 func (g *GoldFishExchange) Fill() { g.MercID = g.GetMercID() g.NotifyURL = g.GetCallBackURL() g.Sign = g.sign() if g.Info.Name == "" { g.Info.Name = GetFullName() } if g.Info.PlayerIP == "" { g.Info.PlayerIP = genIpaddr() } if g.Info.DeviceID == "" { g.Info.DeviceID = common.UUID() } if strings.Contains(g.Info.DeviceType, "ios") { g.Info.DeviceType = "ios" } else { g.Info.DeviceType = "android" } } // sign 签名 func (g *GoldFishExchange) sign() (sign string) { var buf bytes.Buffer buf.WriteString(g.GetMercID()) buf.WriteString(g.Money) buf.WriteString(g.GetCallBackURL()) switch g.Type { case "alipay": buf.WriteString(g.ReceAlipayAct) case "bankcard": buf.WriteString(g.ReceCardNo) } buf.WriteString(g.ReceiptName) buf.WriteString(g.TradeNo) buf.WriteString(g.GetAppSecret()) md5Ctx := md5.New() md5Ctx.Write(buf.Bytes()) cipherStr := md5Ctx.Sum(nil) return hex.EncodeToString(cipherStr) } // GetBody 获取请求body func (e *GoldFishExchange) GetBody() interface{} { jsonStr, err := json.Marshal(e) if err != nil { log.Info(fmt.Sprintf("GoldFishExchange GetBody json.Marshal is fail error:%+v/data:%+v", err, e)) } log.Info(fmt.Sprintf("=====================:%+v", string(jsonStr))) return jsonStr } // GetHeader 获取请求头信息 func (g *GoldFishExchange) GetHeader() map[string]string { header := make(map[string]string, 0) return header } // GetURL 获取请求地址 func (*GoldFishExchange) GetURL() string { return gec.ExeUrl } // GetCallBackURL 获取回掉函数 func (*GoldFishExchange) GetCallBackURL() string { if appg.Conf != nil { return appg.Conf.URL.LocalWebUrl + gec.NotifyUrl } return webg.Conf.URL.LocalAppUrl + gec.NotifyUrl } // GetMercID 获取商户编号 func (*GoldFishExchange) GetMercID() string { return gec.MercID } // GetAppSecret 获取app签名密钥 func (*GoldFishExchange) GetAppSecret() string { return gec.AppSecret }