Files
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

259 lines
9.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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"` // 用户唯一iduuidv4
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"` // 用户唯一iduuidv4
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"` // 用户唯一iduuidv4
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"` // 用户唯一iduuidv4
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
}