package rchgutil import ( "encoding/json" "fmt" "net/http" "strconv" "time" "91porn-server/common/httputil" "91porn-server/common/log" "91porn-server/models/v/wdordmod" "91porn-server/web/webg" ) type Exchg struct { TransNo string `json:"transNo" bson:"transNo"` //订单号 UID string `json:"uid" bson:"uid"` //用户id Name string `json:"name" bson:"name"` //用户名 PayMoney int64 `json:"payMoney" bson:"payMoney"` //实际到账 PayType string `json:"payType" bson:"payType" binding:"required"` //提现方式,alipay,bankcard ActName string `json:"actName" bson:"actName"` //交易账户持有人 Act string `json:"act" bson:"act"` //交易账户 UserIP string `json:"userIp" bson:"userIp"` //用户ip DeviceType string `json:"deviceType" bson:"deviceType"` //设备类型 DevID string `json:"devID" bson:"devID"` //设备id CheckedAt time.Time `json:"checkedAt" bson:"checkedAt"` //审核时间 NotifyUrl string `json:"notifyUrl"` //回调地址 ProductType int `json:"productType"` //支付产品类型 0 站群 1 棋牌 Rate float64 `json:"rate"` //费率 PlatformID string `json:"platformID"` BankCode string `json:"bankCode" bson:"bankCode"` //银行编码 } type ExchgBack struct { OID string `json:"oid" ` //支付平台订单号 Money int64 `json:"money"` //兑换金额 TradeNo string `json:"tradeNo"` //商户订单号 Status string `json:"status"` Mark string `json:"mark"` //拒绝兑换理由 } type ExchgBackMsg struct { Code int `json:"code"` Err string `json:"err"` } type ExchgMsg struct { OID string `json:"oid"` Code int `json:"code"` Err string `json:"err"` Msg string `json:"msg"` } // ToPay 支付发起 func (this *Exchg) ToPay() ExchgMsg { var msg ExchgMsg var errlog string this.fill() code, err := httputil.DefaultClientPostJsonWithResp(&msg, this.GetURL(), this.GetHeader(), this.GetBody()) if err != nil { msg.Code = UNKNOWError errlog = fmt.Sprintf("recharge ToPay Http.PostJson fail error:%+v/,data:%+v;", err, this) msg.Err = errlog log.Error(errlog) return msg } if code != http.StatusOK { msg.Code = UNKNOWError errlog = fmt.Sprintf("recharge ToPay Http.PostJson fail error:%+v/,data:%+v;", err, code) msg.Err = errlog log.Error(errlog) return msg } return msg } func (this *Exchg) fill() { this.PlatformID = "91PO" this.NotifyUrl = webg.Conf.URL.LocalAppUrl + "/3rd/defray/callback/echg/bill" } // GetBody 获取请求body func (this *Exchg) GetBody() interface{} { jsonStr, err := json.Marshal(this) if err != nil { log.Info(fmt.Sprintf("excharge json.Marshal is fail error:%+v/data:%+v", err, this)) } sstr := string(jsonStr) log.Info(fmt.Sprintf("recharg topay json data :%+v", sstr)) return jsonStr } // GetHeader 获取请求头信息 func (this *Exchg) GetHeader() map[string]string { header := make(map[string]string, 0) return header } // GetURL 获取请求地址 func (*Exchg) GetURL() string { return webg.Conf.URL.TransactionUrl + "/api/recharge/withdraw" } // 防洗钱校验 // 提现防洗钱限制, 防止用户用usdt充值, 其它方式提现洗钱 // 例如: 用户usdt充值1000, 则用户只能用usdt提现1000, // // 且, 用户usdt充值1000未提现时, 此时用其它方式提现, // 则, 余额 - 提现金额 >= 1000 // // eType: 提现方式 // allMoney: 可提现总金额 // money: 提现金额 // usdtAmount: usdt可提现额度 // uid: 提现用户id func CheckMoney(eType string, allMoney, money, usdtAmount int64, uid uint64) bool { //usdt方式提现 if eType == wdordmod.TypeUsdt && money*100 > usdtAmount { log.Error("用户: " + strconv.FormatInt(int64(uid), 10) + ", USDT方式可提现余额为: " + strconv.FormatInt(usdtAmount, 10)) return false } //可提现金额 ktx_Amount := allMoney*100 - usdtAmount //非usdt方式提现 if eType != wdordmod.TypeUsdt && ktx_Amount < money*100 { log.Error("用户: " + strconv.FormatInt(int64(uid), 10) + ", 当前方式可提现金额为: " + strconv.FormatInt(ktx_Amount, 10) + ", 其它金额请通过USDT提现!") return false } return true }