Files
zmkgC/third/thirdParty/tiandon.go
2025-07-07 20:11:59 +08:00

177 lines
6.1 KiB
Go
Raw 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 thirdParty
// @Author 铁憨憨[cory] 2025/7/4 14:06:00
package thirdParty
import (
"bytes"
"context"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/tiger1103/gfast-cache/cache"
commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
"github.com/tiger1103/gfast/v3/library/liberr"
"net/http"
"time"
)
/*
第三方接口:
1、获取token
2、推送第三方数据
3、获取第三方数据
*/
const publicKeyBase64 = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoaejbjbttHyHuEzHL8lIX5GZZ6zIYrqJpEDlPM4V5LHn19rSAYp2FyAr8y5Ctny9uUdaYbkoFiVQgxWrAYo4X/3O0OFDsowE25FMOLQY0Mn5B6CvVR7Sdt3DqzIzM1tUnJCIbVGNfDMgxLrLwFN8RvOW8MPlB6LgOvlGMDbj+OQIDAQAB`
type LoginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
type LoginResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Token string `json:"token"`
}
// CheckIfThereAreTokens redis中获取token没有就获取
func CheckIfThereAreTokens(ctx context.Context) (token string, err error) {
key := "thirdParty:tiandon:token"
prefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String()
gfCache := cache.New(prefix)
get, err := g.Redis().Get(ctx, gfCache.CachePrefix+key)
if err != nil && get.String() != "" {
token = get.String()
return token, err
} else {
token, err = getTheToken(ctx)
//过期时间为30分钟1800秒我这里少300秒防止过期
commonService.Cache().Set(ctx, key, token, time.Duration(1500)*time.Second)
return token, err
}
}
// getTheToken token获取
func getTheToken(ctx context.Context) (token string, err error) {
err = g.Try(ctx, func(ctx g.Ctx) {
// 1、构造加密密码
encryptedPassword, err := rsaEncryptWithBase64PublicKey([]byte("Hkrsoft@#2023"), publicKeyBase64)
if err != nil {
liberr.ErrIsNil(ctx, err, "密码加密失败")
}
// 2、构造 JSON 请求体
data, _ := json.Marshal(LoginRequest{
Username: "zhangweiwei",
Password: encryptedPassword,
})
// 3、构造 HTTP 请求
req, _ := http.NewRequest("POST", "https://claritypm.powerchina.cn/neSmartsite-api/loginCli", bytes.NewReader(data))
req.Header.Set("Content-Type", "application/json; charset=UTF-8")
req.Header.Set("User-Agent", "Mozilla/5.0")
req.Header.Set("Accept", "application/json")
req.Header.Set("Origin", "https://claritypm.powerchina.cn")
req.Header.Set("Referer", "https://claritypm.powerchina.cn/")
// 4、发送请求
resp, err := http.DefaultClient.Do(req)
if err != nil {
liberr.ErrIsNil(ctx, err, "推送第三方数据失败")
}
defer resp.Body.Close()
// 5、解析响应体
var result LoginResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
liberr.ErrIsNil(ctx, err, "解析第三方数据失败")
}
token = result.Token
})
return
}
// rsaEncryptWithBase64PublicKey RSA加密函数
func rsaEncryptWithBase64PublicKey(data []byte, base64PubKey string) (string, error) {
decoded, err := base64.StdEncoding.DecodeString(base64PubKey)
if err != nil {
return "", err
}
pubInterface, err := x509.ParsePKIXPublicKey(decoded)
if err != nil {
return "", err
}
pub := pubInterface.(*rsa.PublicKey)
encrypted, err := rsa.EncryptPKCS1v15(rand.Reader, pub, data)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(encrypted), nil
}
type RealUser struct {
UserName string `json:"userName"`
ClassManagerFlag string `json:"classManagerFlag,omitempty"`
Phone string `json:"phone"`
Sex string `json:"sex"`
CardType string `json:"cardType"`
CardNumber string `json:"cardNumber"`
UserType string `json:"userType"`
CardDept string `json:"cardDept,omitempty"`
Nation string `json:"nation,omitempty"`
Birthday string `json:"birthday,omitempty"` // 格式2025-01-01 00:00:00
Address string `json:"address,omitempty"`
Avatar string `json:"avatar,omitempty"` // 限一张 http 地址
Pic string `json:"pic,omitempty"` // 限一张 http 地址
SafetyEdu string `json:"safetyEdu,omitempty"` // 限一张 http 地址
Technology string `json:"technology,omitempty"` // 限一张 http 地址
CardStartTime string `json:"cardStartTime,omitempty"` // 格式2025-01-01 00:00:00
CardEndTime string `json:"cardEndTime,omitempty"`
StudyLevel string `json:"studyLevel,omitempty"`
PoliticsType string `json:"politicsType,omitempty"`
InsuranceFlag string `json:"insuranceFlag,omitempty"`
DiseaseFlag string `json:"diseaseFlag,omitempty"`
LaborContractFlag string `json:"laborContractFlag,omitempty"`
Contacts string `json:"contacts,omitempty"`
ContactsPhone string `json:"contactsPhone,omitempty"`
MarryRemark string `json:"marryRemark,omitempty"`
}
// SendRy 发送工人信息
func SendRy(ctx context.Context, user []*RealUser) (err error) {
err = g.Try(ctx, func(ctx context.Context) {
//1、获取token
token, err := CheckIfThereAreTokens(ctx)
liberr.ErrIsNil(ctx, err, "获取token失败")
// 2、创建请求
jsonData, _ := json.Marshal(user)
fmt.Println(":::::::::::::::::::::: " + string(jsonData))
req, err := http.NewRequest("POST",
"https://claritypm.powerchina.cn/neSmartsite-api/realUser/tiandong/insertRealUser",
bytes.NewReader(jsonData),
)
liberr.ErrIsNil(ctx, err, "创建客户端失败")
// 3、设置请求头
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("User-Agent", "Mozilla/5.0")
req.Header.Set("Accept", "application/json")
// 4、发送请求
resp, err := http.DefaultClient.Do(req)
if err != nil {
liberr.ErrIsNil(ctx, err, "发送数据到第三方失败")
return
}
defer resp.Body.Close()
var result LoginResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
liberr.ErrIsNil(ctx, err, "解析第三方数据失败")
}
fmt.Println("l111响应状态码:", result.Code)
fmt.Println("c222响应内容:", result.Msg)
})
return err
}