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 }