974 lines
24 KiB
Go
974 lines
24 KiB
Go
|
|
package service
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"encoding/json"
|
|||
|
|
"fmt"
|
|||
|
|
"strconv"
|
|||
|
|
"strings"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
v1 "sandc/api/eonline/v1"
|
|||
|
|
"sandc/app/eonline/internal/biz"
|
|||
|
|
"sandc/app/eonline/internal/conf"
|
|||
|
|
"sandc/app/eonline/internal/config"
|
|||
|
|
"sandc/app/eonline/internal/data"
|
|||
|
|
"sandc/pkg/middleware/xhttp"
|
|||
|
|
"sandc/pkg/utils"
|
|||
|
|
|
|||
|
|
"github.com/go-kratos/kratos/v2/log"
|
|||
|
|
"github.com/paemuri/brdoc"
|
|||
|
|
"github.com/shopspring/decimal"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// EonlineService is a eonline service.
|
|||
|
|
type EonlineService struct {
|
|||
|
|
v1.UnimplementedEonlineServer
|
|||
|
|
|
|||
|
|
uc *biz.EonlineUsecase
|
|||
|
|
log *log.Helper
|
|||
|
|
|
|||
|
|
conf *conf.Bootstrap
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
mysqlDB *biz.EonlineUsecase
|
|||
|
|
nowStrSeconds string // 当前时间秒级时间戳字符串
|
|||
|
|
nowStrMilliSeconds string // 当前时间毫秒级时间戳字符串
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// NewEonlineService new a greeter service.
|
|||
|
|
func NewEonlineService(uc *biz.EonlineUsecase, logger log.Logger, conf *conf.Bootstrap) *EonlineService {
|
|||
|
|
nowStrSeconds = strconv.FormatInt(time.Now().Unix(), 10)
|
|||
|
|
nowStrMilliSeconds = strconv.FormatInt(time.Now().UnixMilli(), 10)
|
|||
|
|
|
|||
|
|
mysqlDB = uc
|
|||
|
|
timeoutTimerPer10Second = int64(conf.Server.TimeoutTimerPer10Second)
|
|||
|
|
return &EonlineService{uc: uc, log: log.NewHelper(logger), conf: conf}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func checkStrSeconds(ts string) bool {
|
|||
|
|
if len(ts) == len(nowStrSeconds) {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func checkStrMilliSeconds(ts string) bool {
|
|||
|
|
if len(ts) == len(nowStrMilliSeconds) {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SayHello implements helloworld.EonlineServer
|
|||
|
|
func (s *EonlineService) SayHello(ctx context.Context, in *v1.HelloRequest) (*v1.HelloReply, error) {
|
|||
|
|
s.log.WithContext(ctx).Infof("SayHello Received: %v", in.GetName())
|
|||
|
|
|
|||
|
|
if in.GetName() == "error" {
|
|||
|
|
return nil, v1.ErrorUserNotFound("user not found: %s", in.GetName())
|
|||
|
|
}
|
|||
|
|
return &v1.HelloReply{Message: "Hello " + in.GetName()}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PayInit 初始化支付用户信息
|
|||
|
|
func (s *EonlineService) PayInit(ctx context.Context, req *v1.PayInitReq) (*v1.PayInitReply, error) {
|
|||
|
|
fmt.Printf("PayInit: req[%+v]\n", req)
|
|||
|
|
log.Infof("PayInit: req[%+v]", req)
|
|||
|
|
|
|||
|
|
reply := &v1.PayInitReply{}
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 固定结构体参数
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayInitReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
// return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
reply.Error = 2
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply.Error = 4
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if s.conf.Server.Env != "qa" {
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ver := config.Version2int(&req.Version)
|
|||
|
|
// if ver < config.PublicVersionMin {
|
|||
|
|
// // return nil, fmt.Errorf("version [%s] not support", req.Version)
|
|||
|
|
// reply.Error = 3
|
|||
|
|
// break
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// 获取真实IP地址和国家code
|
|||
|
|
country, currentIp := s.uc.GetCountryCodeByIp(ctx, req.Ip)
|
|||
|
|
req.Ip = currentIp
|
|||
|
|
|
|||
|
|
x, err := s.uc.PayInit(ctx, &biz.PayoutAddtionalReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
DeviceId: req.Deviceid,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Country: country,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("PayInit error: err[%v]", err)
|
|||
|
|
// return nil, err
|
|||
|
|
reply.Error = 1
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成唯一用户ID
|
|||
|
|
uuid := biz.GenPayoutUuid(req.Deviceid)
|
|||
|
|
x2, err := s.uc.CheckInfo(ctx, &biz.CheckInfoReq{
|
|||
|
|
Uuid: uuid,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
})
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("PayInit error: err[%v]", err)
|
|||
|
|
reply.Error = 1
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply = &v1.PayInitReply{
|
|||
|
|
Uuid: x.UUID,
|
|||
|
|
CanCheckSubmit: int32(x2.CanCheckSubmit),
|
|||
|
|
CheckSubmit: x2.CheckSubmit,
|
|||
|
|
CheckResult: x2.CheckResult,
|
|||
|
|
CheckPayout: x2.CheckPayout,
|
|||
|
|
CheckCoin: config.PublicCheckCoin,
|
|||
|
|
CanCheckPayOut: x2.CanCheckPayOut,
|
|||
|
|
CheckResultFailedDesc: x2.CheckResultFailedDesc,
|
|||
|
|
ClientData: x.ClientData,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
items := make([]*v1.PayInitReply_Item, 0)
|
|||
|
|
for _, v := range x.Items {
|
|||
|
|
items = append(items, &v1.PayInitReply_Item{
|
|||
|
|
Id: uint32(v.Id),
|
|||
|
|
Amount: v.Amount,
|
|||
|
|
Status: uint32(v.Status),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var status uint32 // 状态:1可提现 2:条件未达成 3:已提现, 4:禁止提现, 5:提现中
|
|||
|
|
switch reply.CheckPayout { // 提交身份文件奖励5美元领取的情况,0没有提现记录,1提现中,2提现成功,3提现失败
|
|||
|
|
case 0:
|
|||
|
|
status = 2
|
|||
|
|
if reply.CanCheckPayOut != 1 { // 身份文件审核过的提现奖励5美元 能否 提现,0能提现,1条件不满足,不能提现,2当天已经提现过,不能再次提现
|
|||
|
|
status = 1
|
|||
|
|
}
|
|||
|
|
case 1:
|
|||
|
|
status = 5
|
|||
|
|
case 2:
|
|||
|
|
status = 3
|
|||
|
|
case 3:
|
|||
|
|
status = 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
items = append(items, &v1.PayInitReply_Item{
|
|||
|
|
Id: uint32(biz.PayoutItemId4),
|
|||
|
|
Amount: float64(reply.CheckCoin / 100),
|
|||
|
|
Status: status,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
reply.Items = items
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("PayInit: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Name: "WangChuan",
|
|||
|
|
// Phone: "18117858803",
|
|||
|
|
// Email: "w_windysl@foxmail.com",
|
|||
|
|
// Account: "w_windysl@foxmail.com",
|
|||
|
|
// AccountType: "Email",
|
|||
|
|
// Method: "WALLET",
|
|||
|
|
// Channel: "PayPal",
|
|||
|
|
// CustomCode: "custom_chuan9982674851738119",
|
|||
|
|
// FeeBear: "merchant", //beneficiary , merchant
|
|||
|
|
// Amount: "60000",
|
|||
|
|
// SourceCurrency: "USD",
|
|||
|
|
// ArrivalCurrency: "USD",
|
|||
|
|
// NotifyUrl: "https://notify.url",
|
|||
|
|
// AdditionalRemark: "pagsmile payout chuan test",
|
|||
|
|
// Country: "ALB",
|
|||
|
|
|
|||
|
|
// PayOut
|
|||
|
|
func (s *EonlineService) Payout(ctx context.Context, req *v1.PayoutReq) (*v1.PayoutReply, error) {
|
|||
|
|
fmt.Printf("Payout: req[%+v]\n", req)
|
|||
|
|
log.Infof("Payout: req[%+v]", req)
|
|||
|
|
|
|||
|
|
reply := &v1.PayoutReply{}
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 固定结构体参数
|
|||
|
|
uuid := biz.GenPayoutUuid(req.Deviceid)
|
|||
|
|
|
|||
|
|
// account替换左右空格
|
|||
|
|
req.Account = strings.Trim(req.Account, " ")
|
|||
|
|
|
|||
|
|
if req.Uuid != uuid {
|
|||
|
|
// return nil, fmt.Errorf("uuid error")
|
|||
|
|
reply.Error = 4
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayoutReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
Account: req.Account,
|
|||
|
|
Amount: req.Amount,
|
|||
|
|
AdditionalRemark: req.AdditionalRemark,
|
|||
|
|
Uuid: req.Uuid,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
// return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
reply.Error = 2
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply.Error = 24
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if s.conf.Server.Env != "qa" {
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ver := config.Version2int(&req.Version)
|
|||
|
|
if ver < config.PublicVersionMin {
|
|||
|
|
// return nil, fmt.Errorf("version [%s] not support", req.Version)
|
|||
|
|
reply.Error = 3
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理请求
|
|||
|
|
bq := &biz.PayoutReq{
|
|||
|
|
Account: req.Account,
|
|||
|
|
Amount: decimal.NewFromFloat(req.Amount).String(),
|
|||
|
|
AdditionalRemark: req.AdditionalRemark,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 业务参数
|
|||
|
|
opts := &biz.PayoutAddtionalReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
DeviceId: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Amount: req.Amount,
|
|||
|
|
ItemId: req.ItemId,
|
|||
|
|
Account: req.Account,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Email: req.Email,
|
|||
|
|
}
|
|||
|
|
x, err, errCode := s.uc.Payout(ctx, uuid, opts, bq)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("Payout error: err[%v]", err)
|
|||
|
|
// return nil, err
|
|||
|
|
reply.Error = errCode
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply = &v1.PayoutReply{
|
|||
|
|
Id: x.Id,
|
|||
|
|
RecordNo: x.CustomCode,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
fmt.Printf("Payout: reply[%+v]", reply)
|
|||
|
|
log.Infof("Payout: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PayoutBrazil
|
|||
|
|
func (s *EonlineService) PayoutBrazil(ctx context.Context, req *v1.PayoutReq) (*v1.PayoutReply, error) {
|
|||
|
|
// fmt.Printf("Payout: req[%+v]\n", req)
|
|||
|
|
log.Infof("PayoutBrazil: req[%+v]", req)
|
|||
|
|
|
|||
|
|
if req.DataAdjust == nil {
|
|||
|
|
log.Infof("PayoutBrazil error: req.DataAdjust is nil Deviceid[%s]", req.Deviceid)
|
|||
|
|
}
|
|||
|
|
if req.DataShuShu == nil {
|
|||
|
|
log.Infof("PayoutBrazil error: req.DataShuShu is nil Deviceid[%s]", req.Deviceid)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply := &v1.PayoutReply{}
|
|||
|
|
|
|||
|
|
bSend := false
|
|||
|
|
for {
|
|||
|
|
// 固定结构体参数
|
|||
|
|
uuid := biz.GenPayoutUuid(req.Deviceid)
|
|||
|
|
|
|||
|
|
// account替换左右空格
|
|||
|
|
req.Account = strings.Trim(req.Account, " ")
|
|||
|
|
|
|||
|
|
if req.Uuid != uuid {
|
|||
|
|
// return nil, fmt.Errorf("uuid error")
|
|||
|
|
reply.Error = 4
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if len(req.DocumentType) < 3 {
|
|||
|
|
// return nil, fmt.Errorf("document_type length error")
|
|||
|
|
reply.Error = 13
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if len(req.DocumentId) < 11 {
|
|||
|
|
// return nil, fmt.Errorf("document_id length error")
|
|||
|
|
reply.Error = 14
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if len(req.AccountType) < 3 {
|
|||
|
|
// return nil, fmt.Errorf("account_type length error")
|
|||
|
|
reply.Error = 15
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if len(req.Name) < 5 {
|
|||
|
|
// return nil, fmt.Errorf("name length error")
|
|||
|
|
reply.Error = 16
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if req.AccountType == req.DocumentType && req.Account != req.DocumentId {
|
|||
|
|
// return nil, fmt.Errorf("The values of account_type and document_type are the same, but the values of account and document_id are different")
|
|||
|
|
reply.Error = 17
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CPF CNPJ PHONE EMAIL EVP
|
|||
|
|
if req.AccountType == "CPF" {
|
|||
|
|
if len(req.Account) != 11 || !brdoc.IsCPF(req.Account) {
|
|||
|
|
// return nil, fmt.Errorf("account not CPF")
|
|||
|
|
reply.Error = 18
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
} else if req.AccountType == "CNPJ" {
|
|||
|
|
if len(req.Account) != 14 || !brdoc.IsCNPJ(req.Account) {
|
|||
|
|
// return nil, fmt.Errorf("account not CNPJ")
|
|||
|
|
reply.Error = 19
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
} else if req.AccountType == "PHONE" {
|
|||
|
|
} else if req.AccountType == "EMAIL" {
|
|||
|
|
} else if req.AccountType == "EVP" {
|
|||
|
|
} else {
|
|||
|
|
// return nil, fmt.Errorf("account_type error")
|
|||
|
|
reply.Error = 20
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// One of: CPF, CNPJ
|
|||
|
|
if req.DocumentType == "CPF" {
|
|||
|
|
if len(req.DocumentId) != 11 || !brdoc.IsCPF(req.DocumentId) {
|
|||
|
|
// return nil, fmt.Errorf("document_id not CPF")
|
|||
|
|
reply.Error = 22
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
} else if req.DocumentType == "CNPJ" {
|
|||
|
|
if len(req.DocumentId) != 14 || !brdoc.IsCNPJ(req.DocumentId) {
|
|||
|
|
// return nil, fmt.Errorf("document_id not CNPJ")
|
|||
|
|
reply.Error = 23
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
// return nil, fmt.Errorf("document_type error")
|
|||
|
|
reply.Error = 21
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayoutReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
Account: req.Account,
|
|||
|
|
Amount: req.Amount,
|
|||
|
|
AdditionalRemark: req.AdditionalRemark,
|
|||
|
|
Uuid: req.Uuid,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
// return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
reply.Error = 2
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply.Error = 24
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if s.conf.Server.Env != "qa" {
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if len(req.ClientName) > 0 {
|
|||
|
|
// if strings.EqualFold(req.ClientName, "com.capy.cash.earn.money.fast.real.rewards.game") {
|
|||
|
|
} else {
|
|||
|
|
ver := config.Version2int(&req.Version)
|
|||
|
|
if ver < config.PublicVersionMin {
|
|||
|
|
type Cmd_shushu struct {
|
|||
|
|
AdNetwork string `json:"ad_network"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var shushu Cmd_shushu
|
|||
|
|
err = json.Unmarshal([]byte(req.DataShuShu.SsSuperProperties), &shushu)
|
|||
|
|
if err != nil {
|
|||
|
|
reply.Error = 26
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if strings.EqualFold(shushu.AdNetwork, "Organic") {
|
|||
|
|
// return nil, fmt.Errorf("version [%s] not support", req.Version)
|
|||
|
|
reply.Error = 3
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 处理请求
|
|||
|
|
bq := &biz.PayoutReq{
|
|||
|
|
Name: req.Name,
|
|||
|
|
AccountType: req.AccountType,
|
|||
|
|
Account: req.Account,
|
|||
|
|
Document_type: req.DocumentType,
|
|||
|
|
Document_id: req.DocumentId,
|
|||
|
|
Amount: decimal.NewFromFloat(req.Amount).String(),
|
|||
|
|
AdditionalRemark: req.AdditionalRemark,
|
|||
|
|
ClientData: req.ClientData,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 业务参数
|
|||
|
|
opts := &biz.PayoutAddtionalReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
DeviceId: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Amount: req.Amount,
|
|||
|
|
ItemId: req.ItemId,
|
|||
|
|
Account: req.Account,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
}
|
|||
|
|
x, err, errCode := s.uc.PayoutBrazil(ctx, uuid, opts, bq)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("PayoutBrazil error: err[%v] deviceid[%s]", err, req.Deviceid)
|
|||
|
|
// return nil, err
|
|||
|
|
reply.Error = errCode
|
|||
|
|
|
|||
|
|
errStr := err.Error()
|
|||
|
|
if strings.Contains(errStr, "Payout error:") {
|
|||
|
|
var currentIp string
|
|||
|
|
httpCtx := xhttp.RequestFromContext(ctx)
|
|||
|
|
if httpCtx != nil {
|
|||
|
|
// 获取当前的IP地址
|
|||
|
|
currentIp = utils.GetClientPublicIP(httpCtx.Request())
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sendStr := fmt.Sprintf("errCode=%d, %s", errCode, errStr)
|
|||
|
|
|
|||
|
|
adjust := biz.GetAdjustData(req, sendStr, currentIp)
|
|||
|
|
shuShu := biz.GetShuShuData(req, sendStr, currentIp)
|
|||
|
|
biz.SendReport(ctx, adjust, shuShu)
|
|||
|
|
|
|||
|
|
bSend = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// { // 测试用例
|
|||
|
|
// var currentIp string
|
|||
|
|
// httpCtx := xhttp.RequestFromContext(ctx)
|
|||
|
|
// if httpCtx != nil {
|
|||
|
|
// // 获取当前的IP地址
|
|||
|
|
// currentIp = utils.GetClientPublicIP(httpCtx.Request())
|
|||
|
|
// }
|
|||
|
|
// adjust := biz.GetAdjustData(req, "", currentIp)
|
|||
|
|
// shuShu := biz.GetShuShuData(req, "", currentIp)
|
|||
|
|
// if adjust != nil && shuShu != nil {
|
|||
|
|
// shuShu.PayoutId = "TS202309260440574XKGb1AxafqWG"
|
|||
|
|
// shuShu.MerchantReference = "PGS_5c2ca21a78a295b4c10a5bfe0027a4e0"
|
|||
|
|
// biz.AddReportData(shuShu.PayoutId, adjust, shuShu)
|
|||
|
|
// biz.GetReportData(shuShu.PayoutId)
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply = &v1.PayoutReply{
|
|||
|
|
Id: x.Id,
|
|||
|
|
RecordNo: x.CustomCode,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
var currentIp string
|
|||
|
|
httpCtx := xhttp.RequestFromContext(ctx)
|
|||
|
|
if httpCtx != nil {
|
|||
|
|
// 获取当前的IP地址
|
|||
|
|
currentIp = utils.GetClientPublicIP(httpCtx.Request())
|
|||
|
|
}
|
|||
|
|
adjust := biz.GetAdjustData(req, "", currentIp)
|
|||
|
|
shuShu := biz.GetShuShuData(req, "", currentIp)
|
|||
|
|
if adjust != nil && shuShu != nil {
|
|||
|
|
shuShu.PayoutId = x.Id
|
|||
|
|
shuShu.MerchantReference = x.CustomCode
|
|||
|
|
biz.AddReportData(x.Id, adjust, shuShu)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("PayoutBrazil: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
if reply.Error != 0 && !bSend {
|
|||
|
|
var currentIp string
|
|||
|
|
httpCtx := xhttp.RequestFromContext(ctx)
|
|||
|
|
if httpCtx != nil {
|
|||
|
|
// 获取当前的IP地址
|
|||
|
|
currentIp = utils.GetClientPublicIP(httpCtx.Request())
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sendStr := fmt.Sprintf("errCode=%d", reply.Error)
|
|||
|
|
|
|||
|
|
adjust := biz.GetAdjustData(req, sendStr, currentIp)
|
|||
|
|
shuShu := biz.GetShuShuData(req, sendStr, currentIp)
|
|||
|
|
biz.SendReport(ctx, adjust, shuShu)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PayoutCallback
|
|||
|
|
func (s *EonlineService) PayoutCallback(ctx context.Context, req *v1.PayoutCallbackReq) (*v1.PayoutCallbackReply, error) {
|
|||
|
|
// fmt.Printf("PayoutCallback: req[%+v]\n", req)
|
|||
|
|
log.Infof("PayoutCallback: req[%+v]", req)
|
|||
|
|
err := s.uc.PayoutNotify(ctx, &biz.PayoutNotifyReq{
|
|||
|
|
PayoutId: req.PayoutId,
|
|||
|
|
CustomCode: req.CustomCode,
|
|||
|
|
Status: req.Status,
|
|||
|
|
Msg: req.Msg,
|
|||
|
|
Timestamp: req.Timestamp,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
reply := &v1.PayoutCallbackReply{
|
|||
|
|
Message: "success",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("PayoutCallback: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PayoutCheck 检查支付状态
|
|||
|
|
func (s *EonlineService) PayoutCheck(ctx context.Context, req *v1.PayoutCheckReq) (*v1.PayoutCheckReply, error) {
|
|||
|
|
// fmt.Printf("PayoutCheck: req[%+v]\n", req)
|
|||
|
|
log.Infof("PayoutCheck: req[%+v]", req)
|
|||
|
|
|
|||
|
|
reply := &v1.PayoutCheckReply{}
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 固定结构体参数
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayoutCheckReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
// return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
reply.Error = 2
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply.Error = 4
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if s.conf.Server.Env != "qa" {
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ver := config.Version2int(&req.Version)
|
|||
|
|
// if ver < config.PublicVersionMin {
|
|||
|
|
// // return nil, fmt.Errorf("version [%s] not support", req.Version)
|
|||
|
|
// reply.Error = 3
|
|||
|
|
// break
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// 处理请求
|
|||
|
|
status, err := s.uc.PayoutCheck(ctx, req.RecordNo)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("PayoutCheck error: err[%v]", err)
|
|||
|
|
reply.Error = 1
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply = &v1.PayoutCheckReply{
|
|||
|
|
Status: uint32(status),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("PayoutCheck: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (s *EonlineService) GetPayoutUserLst(ctx context.Context, req *v1.PayoutUserLstReq) (*v1.PayoutUserLstReply, error) {
|
|||
|
|
log.Infof("GetPayoutUserLst: req[%+v]", req)
|
|||
|
|
|
|||
|
|
reply := &v1.PayoutUserLstReply{}
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayInitReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: "",
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
reply.Error = 2
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply.Error = 4
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if req.PageIndex > 0 {
|
|||
|
|
req.PageIndex -= 1
|
|||
|
|
}
|
|||
|
|
if req.PageSize <= 0 {
|
|||
|
|
req.PageSize = 2000
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
records, err := s.uc.GetPayoutRecordByAccount(ctx, "", int(req.Status), int(req.PageIndex), int(req.PageSize))
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("GetPayoutRecordByAccount error[%+v]", err)
|
|||
|
|
reply.Error = 3
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, record := range records {
|
|||
|
|
reply.Lst = append(reply.Lst, &v1.PayoutUserOne{
|
|||
|
|
Email: record.Email,
|
|||
|
|
RecordNo: record.RecordNo,
|
|||
|
|
Account: record.Account,
|
|||
|
|
Status: uint32(record.Status),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("GetPayoutUserLst: reply[%+v]", reply)
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (s *EonlineService) SetPayoutStatus(ctx context.Context, req *v1.PayoutStatusReq) (*v1.PayoutStatusReply, error) {
|
|||
|
|
log.Infof("SetPayoutStatus: req[%+v]", req)
|
|||
|
|
|
|||
|
|
reply := &v1.PayoutStatusReply{
|
|||
|
|
RecordNo: req.RecordNo,
|
|||
|
|
Status: req.Status,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayInitReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: "",
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
reply.Error = 2
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply.Error = 4
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var status string
|
|||
|
|
if req.Status == 2 {
|
|||
|
|
status = "PAID"
|
|||
|
|
} else if req.Status == 3 {
|
|||
|
|
status = "REJECTED"
|
|||
|
|
} else {
|
|||
|
|
reply.Error = 5
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err = s.uc.PayoutNotify2(ctx, &biz.PayoutNotifyReq{
|
|||
|
|
PayoutId: "Test",
|
|||
|
|
CustomCode: req.RecordNo,
|
|||
|
|
Status: status,
|
|||
|
|
Msg: req.Fail,
|
|||
|
|
Timestamp: time.Now().Unix(),
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("SetPayoutStatus: PayoutNotify2 err[%v]", err)
|
|||
|
|
reply.Error = 3
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("SetPayoutStatus: reply[%+v]", reply)
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (s *EonlineService) Init(data *data.Data) {
|
|||
|
|
lst := config.GetUserStateData()
|
|||
|
|
|
|||
|
|
log.Infof("EonlineService Init: TbuserState\n%+v", lst)
|
|||
|
|
|
|||
|
|
if len(lst) > 0 {
|
|||
|
|
// 将配置表的审核结果,导入redis
|
|||
|
|
var err error
|
|||
|
|
var key, key2, val string
|
|||
|
|
ctx := context.Background()
|
|||
|
|
for _, v := range lst {
|
|||
|
|
key = biz.GetCheckResultRedisKey(v.Paypal)
|
|||
|
|
val, err = data.GetValue(ctx, key)
|
|||
|
|
if err == nil {
|
|||
|
|
if val != biz.StringNull {
|
|||
|
|
log.Infof("EonlineService Init redis has key[%s] value[%s]", v.Paypal, val)
|
|||
|
|
|
|||
|
|
if val == biz.CheckResultSuccess {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 没有key值的,或者 值为0的,写入新值;以前的值为1的,不写入
|
|||
|
|
if val == biz.StringNull || (val == biz.CheckResultFail && v.State != 0) {
|
|||
|
|
log.Infof("EonlineService Init key[%s] value[%s]=>[%d]", v.Paypal, val, v.State)
|
|||
|
|
err = data.WriteValue(ctx, key, v.State, 0)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("EonlineService Init error: write key[%s] [%d] error[%s]", key, v.State, err.Error())
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if v.State == 0 {
|
|||
|
|
key2 = biz.GetCheckResultFailRedisKey(v.Paypal)
|
|||
|
|
err = data.WriteValue(ctx, key2, v.Couse, 0)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Infof("EonlineService Init error: write key[%s] [%s] error[%s]", key2, v.Couse, err.Error())
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
log.Infof("EonlineService Init error: read key[%s] error[%s]", v.Paypal, err.Error())
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// biz.PayoutItemIdAmountes[biz.PayoutItemId4] = float64(config.PublicCheckCoin / 100)
|
|||
|
|
// log.Infof("PayoutItemIdAmountes[%d]=%f", biz.PayoutItemId4, biz.PayoutItemIdAmountes[biz.PayoutItemId4])
|
|||
|
|
|
|||
|
|
log.Infof("EonlineService Init finished")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提交身份文件验证请求
|
|||
|
|
func (s *EonlineService) SubmitCheck(ctx context.Context, req *v1.SubmitCheckReq) (*v1.SubmitCheckReply, error) {
|
|||
|
|
log.Infof("SubmitCheck: req[%+v]", req)
|
|||
|
|
|
|||
|
|
result, err := s.uc.SubmitCheck(ctx, &biz.SubmitCheckReq{
|
|||
|
|
Account: req.Account,
|
|||
|
|
Uuid: req.Uuid,
|
|||
|
|
})
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply := &v1.SubmitCheckReply{
|
|||
|
|
Result: result.Result,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("SubmitCheck: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (s *EonlineService) CheckInfo(ctx context.Context, req *v1.CheckInfoReq) (*v1.CheckInfoReply, error) {
|
|||
|
|
log.Infof("CheckInfo: req[%+v]", req)
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayInitReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply := &v1.CheckInfoReply{Error: 2}
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
|
|||
|
|
// 生成唯一用户ID
|
|||
|
|
uuid := biz.GenPayoutUuid(req.Deviceid)
|
|||
|
|
|
|||
|
|
if uuid != req.Uuid {
|
|||
|
|
return nil, fmt.Errorf("uuid [%s] error", req.Uuid)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
x, err := s.uc.CheckInfo(ctx, &biz.CheckInfoReq{
|
|||
|
|
Uuid: uuid,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
})
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("error: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply := &v1.CheckInfoReply{
|
|||
|
|
CanCheckSubmit: int32(x.CanCheckSubmit),
|
|||
|
|
CheckSubmit: x.CheckSubmit,
|
|||
|
|
CheckResult: x.CheckResult,
|
|||
|
|
CheckPayout: x.CheckPayout,
|
|||
|
|
CheckCoin: config.PublicCheckCoin,
|
|||
|
|
CanCheckPayOut: x.CanCheckPayOut,
|
|||
|
|
CheckResultFailedDesc: x.CheckResultFailedDesc,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
log.Infof("CheckInfo: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (s *EonlineService) AddChat(ctx context.Context, req *v1.AddChatReq) (*v1.AddChatReply, error) {
|
|||
|
|
log.Infof("AddChat: req[%+v]", req)
|
|||
|
|
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayInitReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
}
|
|||
|
|
if !checkStrSeconds(req.Ts) {
|
|||
|
|
reply := &v1.AddChatReply{Result: 2}
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
if s.conf.Server.Env != "qa" {
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ver := config.Version2int(&req.Version)
|
|||
|
|
// if ver < config.PublicVersionMin {
|
|||
|
|
// return nil, fmt.Errorf("version [%s] not support", req.Version)
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// 生成唯一用户ID
|
|||
|
|
uuid := biz.GenPayoutUuid(req.Deviceid)
|
|||
|
|
|
|||
|
|
if uuid != req.Uuid {
|
|||
|
|
return nil, fmt.Errorf("uuid [%s] error", req.Uuid)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply := &v1.AddChatReply{
|
|||
|
|
Uuid: uuid,
|
|||
|
|
Result: 0,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
biz.AddChat(req)
|
|||
|
|
|
|||
|
|
reply.Lst = biz.GetChat(req.TimeStamp)
|
|||
|
|
|
|||
|
|
// log.Infof("AddChat: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|
|||
|
|
func (s *EonlineService) GetChat(ctx context.Context, req *v1.GetChatReq) (*v1.GetChatReply, error) {
|
|||
|
|
log.Infof("GetChat: req[%+v]", req)
|
|||
|
|
|
|||
|
|
// 验证签名
|
|||
|
|
err := s.validateSignRequest(
|
|||
|
|
v1.PayInitReq{
|
|||
|
|
Platform: req.Platform,
|
|||
|
|
Deviceid: req.Deviceid,
|
|||
|
|
Version: req.Version,
|
|||
|
|
Ip: req.Ip,
|
|||
|
|
Ts: req.Ts,
|
|||
|
|
Sign: req.Sign,
|
|||
|
|
}, biz.SignFixedParameters)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("validate request error: %w", err)
|
|||
|
|
}
|
|||
|
|
if s.conf.Server.Env != "qa" {
|
|||
|
|
req.Ts = strconv.Itoa(int(time.Now().Unix()))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ver := config.Version2int(&req.Version)
|
|||
|
|
// if ver < config.PublicVersionMin {
|
|||
|
|
// return nil, fmt.Errorf("version [%s] not support", req.Version)
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// 生成唯一用户ID
|
|||
|
|
uuid := biz.GenPayoutUuid(req.Deviceid)
|
|||
|
|
|
|||
|
|
if uuid != req.Uuid {
|
|||
|
|
return nil, fmt.Errorf("uuid [%s] error", req.Uuid)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply := &v1.GetChatReply{
|
|||
|
|
Uuid: uuid,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
reply.Lst = biz.GetChat(req.TimeStamp)
|
|||
|
|
|
|||
|
|
// log.Infof("AddChat: reply[%+v]", reply)
|
|||
|
|
|
|||
|
|
return reply, nil
|
|||
|
|
}
|