agropay支付

dev_aagame_provider
zhora 2 months ago
parent de14cc2db6
commit afe78f72e5
  1. 3
      modules/backend/handler/gm/gm.go
  2. 117
      modules/pay/agropay/base.go
  3. 110
      modules/pay/agropay/values.go
  4. 3
      modules/pay/allpay/all.go
  5. 17
      modules/pay/base/signmd5.go
  6. 6
      modules/pay/base/util.go
  7. 8
      modules/web/handler/luckyWheel.go
  8. 4
      modules/web/handler/recharge.go
  9. 4
      modules/web/handler/share.go
  10. 4
      modules/web/handler/withdraw.go
  11. 7
      util/util.go

@ -4,6 +4,7 @@ import (
"fmt"
"server/call"
"server/common"
"server/config"
"server/db"
"server/modules/backend/app"
"server/modules/backend/values"
@ -61,7 +62,7 @@ func GMRecharge(c *gin.Context) {
return
}
order := new(common.RechargeOrder)
id := util.NewOrderID(req.UID)
id := util.NewOrderID(req.UID, config.GetBase().ServerFlag)
order.OrderID = id
order.APIPayID = id
order.UID = req.UID

@ -1,14 +1,16 @@
package agropay
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"server/common"
"server/call"
"server/modules/pay/base"
"server/modules/pay/values"
"server/pb"
"server/util"
"time"
"github.com/gogo/protobuf/proto"
"github.com/liangdas/mqant/log"
@ -57,6 +59,10 @@ func (s *Sub) PackReq() interface{} {
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
}
@ -73,51 +79,98 @@ func (s *Sub) GetResp() (proto.Message, error) {
if s.Base.Status == 0 && resp.Code != 2000 {
return nil, errors.New("withdraw fail")
}
return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.Data.TransferId), Channel: uint32(values.AgroPay)}, nil
return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.Data.TransferId), Channel: uint32(values.AgroPay), 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.Data.TransferId, OrderID: resp.Data.MchOrderNo}
s.Base.QueryWithdrawResp.OrderID = resp.Data.MchOrderNo
s.Base.QueryWithdrawResp.APIOrderID = resp.Data.TransferId
if s.Base.Status == 0 {
if resp.Code == 2000 {
if resp.Data.State == 2 {
s.Base.QueryWithdrawResp.Status = base.QueryStatusOrderSuccess
} else if resp.Data.State == 1 {
s.Base.QueryWithdrawResp.Status = base.QueryStatusSuccess
}
} else {
if resp.Data.State == 3 {
s.Base.QueryWithdrawResp.Status = base.QueryStatusFail
}
}
}
if s.Base.QueryWithdrawResp.Status == 0 {
s.Base.QueryWithdrawResp.Status = base.QueryStatusUnknown
}
return ret, nil
} else if s.Base.Opt == base.OPTQueryPay {
resp := s.Base.Resp.(*QueryPayResp)
log.Debug("QueryPayResp:%+v", resp)
ret := &pb.InnerQueryWithdrawResp{APIOrderID: resp.Data.PayOrderId, OrderID: resp.Data.MchOrderNo}
s.Base.QueryPayResp.OrderID = resp.Data.MchOrderNo
s.Base.QueryPayResp.APIOrderID = resp.Data.PayOrderId
if s.Base.Status == 0 {
if resp.Code == 2000 && resp.Data.State == 2 {
s.Base.QueryPayResp.Status = base.QueryStatusOrderSuccess
}
}
if s.Base.QueryPayResp.Status == 0 {
s.Base.QueryPayResp.Status = base.QueryStatusUnknown
}
return ret, nil
}
return nil, fmt.Errorf("unknow opt")
}
func (s *Sub) PackPayReq() interface{} {
r := s.Base.PayReq
r.Amount /= 100
if len(r.Phone) == 12 {
r.Phone = r.Phone[2:]
}
send := &PayReq{
MchNo: mid,
AppId: appID,
AppID: appID,
MchOrderNo: r.OrderID,
// Amount: fmt.Sprintf("%d", r.Amount),
Amount: float64(r.Amount),
Amount: r.Amount,
Currency: "INR",
UserName: r.Name,
Phone: r.Phone,
Email: r.Email,
Subject: "shop",
Body: "shop buy",
NotifyUrl: values.GetPayCallback(values.AgroPay),
ReturnUrl: values.GetFrontCallback(),
RiskControlExtParam: fmt.Sprintf(`{"userId":%d}`, r.UID),
// NotifyUrl: s.Base.GetPayCallbackURL(),
ReturnURL: values.GetFrontCallback(),
// RiskControlExtParam: fmt.Sprintf(`{"userId":%d}`, r.UID),
EncryptPhone: util.CalculateMD5(r.Phone),
EncryptEmail: util.CalculateMD5(r.Email),
DeviceID: r.DeviceID,
}
send.Sign = s.Base.SignMD5(send)
risk := &RiskControlData{
UID: fmt.Sprintf("%d", r.UID),
}
p, _ := call.GetUserXInfo(int(r.UID), "birth")
risk.RegistrationTime = time.Unix(p.Birth, 0).Format("2006-01-02 15:04:05")
//re := call.GetRechargeInfo(int(r.UID))
send.PayinTimes = 0
// re := call.GetRechargeInfo(int(r.UID))
// risk.TotalRechargeAmount = re.TotalCharge
// risk.TotalNumberOfRecharges = int64(re.TotalChargeCount)
// risk.TotalWithdrawalAmount = re.TotoalWithdraw
// risk.TotalNumberOfWithdrawals = re.TotoalWithdrawCount
byt, _ := json.Marshal(risk)
send.RiskControlExtParam = string(byt)
send.Sign = s.Base.SignMD5Empty(send)
return send
}
func (s *Sub) PackWithdrawReq() interface{} {
r := s.Base.WithdrawReq
r.Amount /= 100
if len(r.Phone) == 12 {
r.Phone = r.Phone[2:]
}
send := &WithdrawReq{
MchNo: mid,
AppId: appID,
MchOrderNo: r.OrderID,
Amount: fmt.Sprintf("%d", r.Amount),
Amount: r.Amount,
Currency: "INR",
// EntryType: ,
// AccountNo: ,
@ -129,25 +182,41 @@ func (s *Sub) PackWithdrawReq() interface{} {
// BankName: ,
ClientIp: r.IP,
TransferDesc: "shop withdraw",
NotifyUrl: values.GetWithdrawCallback(values.AgroPay),
// NotifyUrl: s.Base.GetWithdrawCallbackURL(),
// ChannelExtra
// ExtParam: ,
EncryptPhone: util.CalculateMD5(r.Phone),
EncryptEmail: util.CalculateMD5(r.Email),
DeviceId: r.DeviceID,
}
if r.PayType == int64(common.PayTypeBank) {
send.EntryType = "banks"
send.AccountNo = r.CardNo
send.IfscCode = r.PayCode
send.BankName = r.BankName
} else if r.PayType == int64(common.PayTypeUPI) {
send.EntryType = "upi"
send.AccountNo = r.PayCode
} else {
return nil
send.Sign = s.Base.SignMD5(send)
return send
}
func (s *Sub) PackQueryWithdrawReq() interface{} {
r := s.Base.QueryWithdrawReq
send := &QueryWithdrawReq{
MchNo: mid,
AppId: appID,
MchOrderNo: r.OrderID,
}
send.Sign = s.Base.SignMD5(send)
return send
}
func (s *Sub) PackQueryPayReq() interface{} {
r := s.Base.QueryPayReq
send := &QueryPayReq{
MchNo: mid,
AppId: appID,
MchOrderNo: r.OrderID,
}
send.Sign = s.Base.SignMD5(send)
return send
}

@ -12,24 +12,33 @@ const (
)
type PayReq struct {
MchNo string `json:"mchNo"`
AppId string `json:"appId"`
MchOrderNo string `json:"mchOrderNo"`
Amount float64 `json:"amount"`
Currency string `json:"currency"`
UserName string `json:"userName"`
Phone string `json:"phone"`
Email string `json:"email"`
Subject string `json:"subject"`
Body string `json:"body"`
NotifyUrl string `json:"notifyUrl"`
ReturnUrl string `json:"returnUrl"`
ExtParam string `json:"extParam"`
RiskControlExtParam string `json:"riskControlExtParam"`
EncryptPhone string `json:"encryptPhone"`
EncryptEmail string `json:"encryptEmail"`
DeviceId string `json:"deviceId"`
Sign string `json:"sign"`
MchNo string `json:"mchNo"` // 平台分配的商户号
AppID string `json:"appId"` // 商户应用ID
MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号
Amount int64 `json:"amount"` // 代收订单金额(单位:卢比,最多保留两位小数)
Currency string `json:"currency"` // 货币代码:INR
UserName string `json:"userName"` // 付款人姓名(仅字母和空格)
Phone string `json:"phone"` // 付款人电话(10位数字)
Email string `json:"email"` // 付款人邮箱
Subject string `json:"subject"` // 商品标题
Body string `json:"body"` // 商品描述
ReturnURL string `json:"returnUrl"` // 跳转地址(非必填)
// ExtParam string `json:"extParam"` // 商户扩展参数(非必填)
RiskControlExtParam string `json:"riskControlExtParam"` // 风控扩展参数(JSON格式字符串,非必填)
EncryptPhone string `json:"encryptPhone"` // MD5加密后的真实手机号
EncryptEmail string `json:"encryptEmail"` // MD5加密后的真实邮件地址
DeviceID string `json:"deviceId"` // 用户设备ID
PayinTimes int `json:"payinTimes"` // 充值成功次数
Sign string `json:"sign"` // 签名
}
type RiskControlData struct {
UID string `json:"userId"`
RegistrationTime string `json:"registrationTime"`
// TotalRechargeAmount int64 `json:"totalRechargeAmount"`
// TotalNumberOfRecharges int64 `json:"totalNumberOfRecharges"`
// TotalWithdrawalAmount int64 `json:"totalWithdrawalAmount"`
// TotalNumberOfWithdrawals int64 `json:"totalNumberOfWithdrawals"`
}
type PayResp struct {
@ -47,6 +56,35 @@ type PayResp struct {
Sign string `json:"sign"`
}
type QueryPayReq struct {
MchNo string `json:"mchNo"` // 商户号 String 是 平台分配的商户号
AppId string `json:"appId"` // 商户应用ID String 是 商户应用ID
MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 String 否 商户订单号与平台订单号必须传一个
PayOrderId string `json:"payOrderId"` // 平台订单号 String 否 商户订单号与平台订单号必须传一个
Sign string `json:"sign"` // 签名 String 是 详见签名算法
}
type QueryPayResp struct {
Code int // 返回码 2000:成功(仅代表请求成功,不代表业务成功);2010:系统异常;2011:参数有误;2012:数据库服务异常;9999:自定义业务异常
Msg string // 业务响应信息 成功:success
Data struct {
PayOrderId string // 支付平台订单号
MchOrderNo string // 商户订单号
MchNo string // 商户号
AppId string // 商户应用ID
Amount string // 支付金额 保留两位小数
RealAmount string // 实际支付金额 state=2 时,必须以这个金额为准,其它状态时,值为 0
State int // 订单状态 1 - 支付中 2 - 支付成功 3 - 支付失败 5 - 已退款
ErrCode string // 错误码
ErrMsg string // 错误描述
ExtParam string // 商户扩展参数
SuccessTime int64 // 订单支付成功时间
CreatedAt int64 // 订单创建时间
Sign string // 参数签名
} // 数据对象 成功时返回
Sign string // 签名 详见签名算法(data 中的数据参与签名)
}
type PayCallbackReq struct {
PayOrderId string `json:"payOrderId"` // 支付平台订单号
MchOrderNo string `json:"mchOrderNo"` // 商户订单号
@ -67,7 +105,7 @@ type WithdrawReq struct {
MchNo string `json:"mchNo"` // 商户号 String 是 平台分配的商户号
AppId string `json:"appId"` // 商户应用ID String 是 商户应用ID
MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 String 是 商户保证唯一性
Amount string `json:"amount"` // 代付订单金额 BigDecimal 是 单位:卢比,最多保留两位小数
Amount int64 `json:"amount"` // 代付订单金额 BigDecimal 是 单位:卢比,最多保留两位小数
Currency string `json:"currency"` // 货币代码 String 是 货币代码:INR
EntryType string `json:"entryType"` // 入账方式 String 否 banks,upi,paytm,不传默认 banks(paytm 暂不支持)
AccountNo string `json:"accountNo"` // 收款账号 String 是 收款账号, banks: 银行卡号,upi: UPI 账号,paytm:paytm 账号
@ -79,9 +117,8 @@ type WithdrawReq struct {
BankName string `json:"bankName"` // 开户行名称 String 否 开户行名称
ClientIp string `json:"clientIp"` // 客户端 IP String 否 客户端 IP
TransferDesc string `json:"transferDesc"` // 转账备注 String 是 转账备注
NotifyUrl string `json:"notifyUrl"` // 异步通知地址 String 是 异步通知地址,只支持 https
ChannelExtra string `json:"channelExtra"` // 特定渠道发起额外参数 String 否
ExtParam string `json:"extParam"` // 商户扩展参数 String 否
// ChannelExtra string `json:"channelExtra"` // 特定渠道发起额外参数 String 否
// ExtParam string `json:"extParam"` // 商户扩展参数 String 否
EncryptPhone string `json:"encryptPhone"` // MD5 加密后的真实手机号 String 是 加密方法请参考签名文档中的 MD5 加密方法,用于黑名单校验
EncryptEmail string `json:"encryptEmail"` // MD5 加密后的真实邮件地址 String 是 加密方法请参考签名文档中的 MD5 加密方法,用于黑名单校验
DeviceId string `json:"deviceId"` // 用户设备 ID String 是 设备 ID:用来标识用户当前使用的设备,要求最好是唯一、并且与用户账号无关的。
@ -145,32 +182,3 @@ type QueryWithdrawResp struct {
} `json:"data"`
Sign string `json:"sign"`
}
type QueryPayReq struct {
MchNo string `json:"mchNo"` // 商户号 String 是 平台分配的商户号
AppId string `json:"appId"` // 商户应用ID String 是 商户应用ID
MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 String 否 商户订单号与平台订单号必须传一个
PayOrderId string `json:"payOrderId"` // 平台订单号 String 否 商户订单号与平台订单号必须传一个
Sign string `json:"sign"` // 签名 String 是 详见签名算法
}
type QueryPayResp struct {
Code int // 返回码 2000:成功(仅代表请求成功,不代表业务成功);2010:系统异常;2011:参数有误;2012:数据库服务异常;9999:自定义业务异常
Msg string // 业务响应信息 成功:success
Data struct {
PayOrderId string // 支付平台订单号
MchOrderNo string // 商户订单号
MchNo string // 商户号
AppId string // 商户应用ID
Amount string // 支付金额 保留两位小数
RealAmount string // 实际支付金额 state=2 时,必须以这个金额为准,其它状态时,值为 0
State int // 订单状态 1 - 支付中 2 - 支付成功 3 - 支付失败 5 - 已退款
ErrCode string // 错误码
ErrMsg string // 错误描述
ExtParam string // 商户扩展参数
SuccessTime int64 // 订单支付成功时间
CreatedAt int64 // 订单创建时间
Sign string // 参数签名
} // 数据对象 成功时返回
Sign string // 签名 详见签名算法(data 中的数据参与签名)
}

@ -2,6 +2,7 @@ package allpay
import (
"reflect"
"server/modules/pay/agropay"
"server/modules/pay/antpay"
"server/modules/pay/base"
"server/modules/pay/ddaypay"
@ -126,7 +127,7 @@ func init() {
All.RichPay = richpay.NewSub
All.Moonpay2 = moonpay2.NewSub
All.MoneydealerPay = moneydealer.NewSub
//All.AgroPay = agropay.NewSub
All.Agropay = agropay.NewSub
All.JJPay = jjpay.NewSub
All.AntPay = antpay.NewSub
All.VirgoPay = virgopay.NewSub

@ -55,3 +55,20 @@ func (b *Base) SignMD5WithStrEmpty(str string) string {
}
return ret
}
func (b *Base) SignMD5Empty(send interface{}) string {
signStr := GetSignStrEmpty(send, b.SignPassStr...)
if b.PassKeyName {
signStr += b.SignKey
} else if b.KeyName == "" {
signStr += "&key=" + b.SignKey
} else {
signStr += "&" + b.KeyName + "=" + b.SignKey
}
log.Debug("final signStr:%s", signStr)
ret := util.CalculateMD5(signStr)
if b.ShouldSignUpper {
ret = strings.ToUpper(ret)
}
return ret
}

@ -62,6 +62,12 @@ func GetSignStrEmpty(send interface{}, pass ...string) string {
if shouldPass {
continue
}
switch m[i].(type) {
case string:
if m[i].(string) == "" {
continue
}
}
str = append(str, i)
}
sort.Strings(str)

@ -48,10 +48,10 @@ func LuckyWheelCfg(c *gin.Context) {
update bool
)
for _, wheelCfg := range luckyWheel.WheelCfgStr {
if wheelCfg.LuckyType == 4 &&
rechargeInfo.TotalRecharge < int64(wheelCfg.RechargeAmount[0]*common.DecimalDigits) { // 特殊转盘达到了才能看见
continue
}
//if wheelCfg.LuckyType == 4 &&
// rechargeInfo.TotalRecharge < int64(wheelCfg.RechargeAmount[0]*common.DecimalDigits) { // 特殊转盘达到了才能看见
// continue
//}
lessKey := fmt.Sprintf("l%d", wheelCfg.LuckyType)
for _, rechargeAmount := range wheelCfg.RechargeAmount {
if rechargeAmount == 0 {

@ -405,7 +405,7 @@ type RechargeImp struct {
func (r *RechargeImp) CreateRecharge() error {
if r.Order.OrderID == "" {
r.Order.OrderID = util.NewOrderID(r.UID)
r.Order.OrderID = util.NewOrderID(r.UID, config.GetBase().ServerFlag)
}
// r.Order.UID = r.UID
// r.Order.Status = common.StatusROrderCreate
@ -426,7 +426,7 @@ type PayImp struct {
}
func (p *PayImp) Recharge() int {
orderID := util.NewOrderID(p.base.UID)
orderID := util.NewOrderID(p.base.UID, config.GetBase().ServerFlag)
// product := p.base.product
var resp *pb.InnerRechargeResp
var err error

@ -403,7 +403,7 @@ func ShareNewWithdraw(c *gin.Context) {
}
db.Mysql().Create(&common.RechargeOrder{
UID: uid,
OrderID: util.NewOrderID(uid),
OrderID: util.NewOrderID(uid, config.GetBase().ServerFlag),
APIPayID: "",
// ProductID: common.ActivityIDPddShare,
Amount: one.Amount,
@ -470,7 +470,7 @@ func ShareNewWithdraw(c *gin.Context) {
return
}
orderID := util.NewOrderID(uid)
orderID := util.NewOrderID(uid, config.GetBase().ServerFlag)
order := &common.RechargeOrder{
UID: uid,

@ -360,7 +360,7 @@ func PlayerWithdrawBlock(c *gin.Context) {
}
}
orderID := "USDT" + util.NewOrderID(uid)
orderID := "USDT" + util.NewOrderID(uid, config.GetBase().ServerFlag)
// 第一步,先扣钱
err := call.MineCurrencyProReal(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
@ -507,7 +507,7 @@ func PlayerWithdraw(c *gin.Context) {
}
}
orderID := util.NewOrderID(uid)
orderID := util.NewOrderID(uid, config.GetBase().ServerFlag)
// 第一步,先扣钱
pro := call.MineCurrencyProReal(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{

@ -350,13 +350,16 @@ func RandomToken(uid int) string {
}
// NewOrderID 新生成一个订单id
func NewOrderID(uid int) string {
func NewOrderID(uid int, flag string) string {
orderID := ""
str := strconv.Itoa(uid)
for _, v := range str {
orderID += tokenMap[string(v)]
}
return orderID + strconv.FormatInt(time.Now().Unix(), 10)
if flag == "a" {
flag = ""
}
return orderID + strconv.FormatInt(time.Now().Unix(), 10) + flag
}
// SliceInt2Int32 数组转换

Loading…
Cancel
Save