259 lines
9.4 KiB
Go
259 lines
9.4 KiB
Go
package aiMate
|
||
|
||
import (
|
||
"crypto/md5"
|
||
"encoding/hex"
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
"strconv"
|
||
"strings"
|
||
|
||
"91porn-server/common/httputil"
|
||
"91porn-server/common/log"
|
||
)
|
||
|
||
const (
|
||
req_doman = "https://www.gpt4novel.com" //请求域名
|
||
access_doman = "https://www.saibolaopo.com/tg-login" //访问域名
|
||
get_token_url = "/api/dzmm/get-jwt-for-organization-subaccount" //获取用户登陆token
|
||
transfer_points_url = "/api/dzmm/transfer-all-user-credit-to-organization" //转出用户所有积分
|
||
get_points_url = "/api/dzmm/get-organization-user-balance" //获取用户积分
|
||
get_transactions_url = "/api/dzmm/get-user-credit-transactions" //获取用户消费记录
|
||
access_key = "c1c5f394-1a6a-4834-8ee8-cb2fb6325969" //密钥
|
||
organization_id = "65443ba4-480a-4c62-8276-f5380bccc739" //组织id
|
||
)
|
||
|
||
// 获取token请求参数
|
||
type GetTokenReq struct {
|
||
OrganizationId string `json:"organizationId"` // 组织id
|
||
OrganizationExternalId string `json:"organizationExternalId"` // 用户唯一id,uuidv4
|
||
First_name string `json:"first_name"` // 用户名
|
||
Avatar_url string `json:"avatar_url"` // 用户头像
|
||
Bio string `json:"bio"` // 简介
|
||
CreditToUser float64 `json:"creditToUser"` // 转移给用户的积分数
|
||
Sign string `json:"sign"` // sign
|
||
}
|
||
|
||
// 获取token返回参数
|
||
type GetTokenResp struct {
|
||
StatusCode int `json:"statusCode"` // 状态码
|
||
Message string `json:"message"` // 描述
|
||
Error string `json:"error"` // 错误
|
||
Jwt string `json:"jwt"` // jwt
|
||
}
|
||
|
||
// 获取用户访问Ai女友的链接
|
||
func GetUserAccessAiUrl(uid uint64, uuid, name string, amount float64) (access_url string, err error) {
|
||
var (
|
||
//请求参数
|
||
req = GetTokenReq{
|
||
OrganizationId: organization_id,
|
||
OrganizationExternalId: uuid,
|
||
First_name: "91PORN-" + name,
|
||
Bio: "AiMate",
|
||
Avatar_url: "https://example.com/avatar.jpg",
|
||
CreditToUser: amount,
|
||
}
|
||
//返回参数
|
||
resp = GetTokenResp{}
|
||
//加密字符串
|
||
signStr = "avatar_url=" + req.Avatar_url + "&bio=" + req.Bio + "&creditToUser=" + strconv.FormatFloat(req.CreditToUser, 'f', -1, 64) + "&first_name=" + req.First_name + "&organizationExternalId=" + req.OrganizationExternalId + "&organizationId=" + req.OrganizationId + access_key
|
||
)
|
||
//参数加密
|
||
h := md5.New()
|
||
h.Write([]byte(signStr))
|
||
cipherStr := h.Sum(nil)
|
||
req.Sign = hex.EncodeToString(cipherStr)
|
||
//请求
|
||
url := req_doman + get_token_url
|
||
bodyStr, _ := json.Marshal(req)
|
||
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
|
||
if err != nil {
|
||
log.Error("GetUserAccessAiUrl POSTWithJResp ", log.Any("url", url), log.Any("uid:", uid), log.E(err))
|
||
return
|
||
}
|
||
if code != http.StatusCreated {
|
||
log.Error("GetUserAccessAiUrl response status ", log.Any("code", code), log.Any("uid", uid))
|
||
if strings.Contains(resp.Message, "积分不足") {
|
||
err = fmt.Errorf("insufficient organization points")
|
||
return
|
||
}
|
||
err = fmt.Errorf("response status err")
|
||
return
|
||
}
|
||
//访问链接
|
||
access_url = access_doman + "?token=" + resp.Jwt
|
||
log.Info("GetUserAccessAiUrl success", log.Any("uid", uid))
|
||
return
|
||
}
|
||
|
||
// 划转积分请求参数
|
||
type TransferIntegralReq struct {
|
||
OrganizationId string `json:"organizationId"` // 组织id
|
||
SourceAccountId string `json:"sourceAccountId"` // 用户唯一id,uuidv4
|
||
Note string `json:"note"` // 备注
|
||
Sign string `json:"sign"` // sign
|
||
}
|
||
|
||
// 划转积分返回参数
|
||
type TransferIntegralResp struct {
|
||
StatusCode int `json:"statusCode"` // 状态码
|
||
Message string `json:"message"` // 描述
|
||
Error string `json:"error"` // 错误
|
||
NewBalance float64 `json:"newBalance"` // 最新余额
|
||
TransferredAmount float64 `json:"transferredAmount"` // 划转余额
|
||
}
|
||
|
||
// 用户划转积分,从第三方转出用户所有积分
|
||
func UserAiTransferIntegral(uid uint64, uuid string) (transferredAmount float64, err error) {
|
||
var (
|
||
//请求参数
|
||
req = TransferIntegralReq{
|
||
SourceAccountId: uuid,
|
||
OrganizationId: organization_id,
|
||
Note: "transfer-user-all-integral",
|
||
}
|
||
//返回参数
|
||
resp = TransferIntegralResp{}
|
||
//加密字符串
|
||
signStr = "note=" + req.Note + "&organizationId=" + req.OrganizationId + "&sourceAccountId=" + req.SourceAccountId + access_key
|
||
)
|
||
//参数加密
|
||
h := md5.New()
|
||
h.Write([]byte(signStr))
|
||
cipherStr := h.Sum(nil)
|
||
req.Sign = hex.EncodeToString(cipherStr)
|
||
//请求
|
||
url := req_doman + transfer_points_url
|
||
bodyStr, _ := json.Marshal(req)
|
||
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
|
||
if err != nil {
|
||
log.Error("UserAiTransferIntegral POSTWithJResp ", log.Any("url", url), log.Any("uid:", uid), log.E(err))
|
||
return
|
||
}
|
||
if code != http.StatusCreated {
|
||
log.Error("UserAiTransferIntegral response status ", log.Any("code", code), log.Any("uid", uid))
|
||
err = fmt.Errorf("response status err")
|
||
return
|
||
}
|
||
log.Info("UserAiTransferIntegral success", log.Any("uid", uid))
|
||
transferredAmount = resp.TransferredAmount
|
||
return
|
||
}
|
||
|
||
// 获取用户余额请求参数
|
||
type GetUserAiBalanceReq struct {
|
||
OrganizationId string `json:"organizationId"` // 组织id
|
||
ExternalUserId string `json:"externalUserId"` // 用户唯一id,uuidv4
|
||
Sign string `json:"sign"` // sign
|
||
}
|
||
|
||
// 获取用户余额返回参数
|
||
type GetUserAiBalanceResp struct {
|
||
StatusCode int `json:"statusCode"` // 状态码
|
||
Message string `json:"message"` // 描述
|
||
Error string `json:"error"` // 错误
|
||
Balance float64 `json:"balance"` // 余额
|
||
}
|
||
|
||
// 获取用户余额
|
||
func GetUserAiBalance(uid uint64, uuid string) (balance float64, err error) {
|
||
var (
|
||
//请求参数
|
||
req = GetUserAiBalanceReq{
|
||
OrganizationId: organization_id,
|
||
ExternalUserId: uuid,
|
||
}
|
||
//返回参数
|
||
resp = GetUserAiBalanceResp{}
|
||
//加密字符串
|
||
signStr = "externalUserId=" + req.ExternalUserId + "&organizationId=" + req.OrganizationId + access_key
|
||
)
|
||
//参数加密
|
||
h := md5.New()
|
||
h.Write([]byte(signStr))
|
||
cipherStr := h.Sum(nil)
|
||
req.Sign = hex.EncodeToString(cipherStr)
|
||
//请求
|
||
url := req_doman + get_points_url
|
||
bodyStr, _ := json.Marshal(req)
|
||
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
|
||
if err != nil {
|
||
log.Error("GetUserAiBalanceReq POSTWithJResp ", log.Any("url", url), log.Any("uid:", uid), log.E(err))
|
||
return
|
||
}
|
||
if code != http.StatusCreated && code != 0 {
|
||
log.Error("GetUserAiBalanceReq response status ", log.Any("code", code), log.Any("uid", uid))
|
||
err = fmt.Errorf("response status err")
|
||
return
|
||
}
|
||
log.Info("GetUserAiBalanceReq success", log.Any("uid", uid))
|
||
balance = resp.Balance
|
||
return
|
||
}
|
||
|
||
// 获取用户交易记录请求参数
|
||
type GetUserTransactionsReq struct {
|
||
OrganizationId string `json:"organizationId"` // 组织id
|
||
ExternalUserId string `json:"externalUserId"` // 用户唯一id,uuidv4
|
||
Sign string `json:"sign"` // sign
|
||
}
|
||
|
||
// 获取用户交易记录返回参数
|
||
type GetUserTransactionsResp struct {
|
||
StatusCode int `json:"statusCode"` // 状态码
|
||
Message string `json:"message"` // 描述
|
||
Error string `json:"error"` // 错误
|
||
TotalCount int `json:"totalCount"` // 总条数
|
||
Transactions []TransactionsInfo `json:"transactions"` // 交易列表
|
||
}
|
||
|
||
// 用户交易记录对象
|
||
type TransactionsInfo struct {
|
||
OrderId int `json:"orderId"` // 订单Id
|
||
Credit_delta string `json:"credit_delta"` // 此次操作积分数
|
||
Post_credit string `json:"post_credit"` // 操作后剩余积分数
|
||
Created_at string `json:"created_at"` // 操作时间
|
||
Operation_type string `json:"operation_type"` // 操作类型
|
||
}
|
||
|
||
// 获取用户交易记录
|
||
func GetUserTransactions(uid uint64, uuid string) (totalCount int, list []TransactionsInfo, err error) {
|
||
var (
|
||
//请求参数
|
||
req = GetUserTransactionsReq{
|
||
OrganizationId: organization_id,
|
||
ExternalUserId: uuid,
|
||
}
|
||
//返回参数
|
||
resp = GetUserTransactionsResp{}
|
||
//加密字符串
|
||
signStr = "externalUserId=" + req.ExternalUserId + "&organizationId=" + req.OrganizationId + access_key
|
||
)
|
||
log.Info("GetUserTransactionsReq req", log.Any("signStr:", signStr), log.Any("uid:", uid))
|
||
//参数加密
|
||
h := md5.New()
|
||
h.Write([]byte(signStr))
|
||
cipherStr := h.Sum(nil)
|
||
req.Sign = hex.EncodeToString(cipherStr)
|
||
log.Info("GetUserTransactionsReq req", log.Any("params:", req), log.Any("uid:", uid))
|
||
//请求
|
||
url := req_doman + get_transactions_url
|
||
bodyStr, _ := json.Marshal(req)
|
||
code, err := httputil.DefaultClientPostJsonWithResp(&resp, url, nil, bodyStr)
|
||
if err != nil {
|
||
log.Error("GetUserTransactionsReq POSTWithJResp ", log.Any("url", url), log.Any("uid:", uid), log.E(err))
|
||
return
|
||
}
|
||
if code != http.StatusCreated && code != 0 {
|
||
log.Error("GetUserTransactionsReq response status ", log.Any("code", code), log.Any("uid:", uid), log.Any("resp", resp))
|
||
err = fmt.Errorf("response status err")
|
||
return
|
||
}
|
||
log.Info("GetUserTransactionsReq http", log.Any("resp:", resp), log.Any("uid:", uid))
|
||
totalCount = resp.TotalCount
|
||
list = resp.Transactions
|
||
return
|
||
}
|