100 lines
2.9 KiB
Go
100 lines
2.9 KiB
Go
package pay
|
|
|
|
import (
|
|
"context"
|
|
"encoding/hex"
|
|
"strings"
|
|
|
|
"qnc-server/app/user/cmd/api/internal/svc"
|
|
"qnc-server/app/user/cmd/api/internal/types"
|
|
"qnc-server/common/xerr"
|
|
"qnc-server/pkg/lzkit/crypto"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
)
|
|
|
|
type QueryPaymentCheckLogic struct {
|
|
logx.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
func NewQueryPaymentCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryPaymentCheckLogic {
|
|
return &QueryPaymentCheckLogic{
|
|
Logger: logx.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
func (l *QueryPaymentCheckLogic) QueryPaymentCheck(req *types.QueryPaymentCheckReq) (resp *types.QueryPaymentCheckResp, err error) {
|
|
order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询订单失败: %v", err)
|
|
}
|
|
product, err := l.svcCtx.ProductModel.FindOne(l.ctx, order.ProductId)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询产品失败: %v", err)
|
|
}
|
|
resp = new(types.QueryPaymentCheckResp)
|
|
resp.OrderStatus = order.Status
|
|
resp.ProductName = product.ProductName
|
|
if order.Status == "paid" {
|
|
authorization, err := l.svcCtx.AuthorizationModel.FindOneByOrderId(l.ctx, order.Id)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询授权信息失败: %v", err)
|
|
}
|
|
resp.AuthorizationStatus = authorization.Status
|
|
key, decodeErr := hex.DecodeString(l.svcCtx.Config.Encrypt.SecretKey)
|
|
if decodeErr != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询授权信息失败: %v", decodeErr)
|
|
}
|
|
decryptName, err := crypto.AesDecrypt(authorization.TargetName, key)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询授权信息失败: %v", err)
|
|
}
|
|
idCard, err := crypto.AesDecrypt(authorization.TargetIdcard, key)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询授权信息失败: %v", err)
|
|
}
|
|
resp.Name = maskName(string(decryptName))
|
|
resp.IdCard = maskIDCard(string(idCard))
|
|
}
|
|
|
|
return resp, nil
|
|
}
|
|
|
|
// 姓名脱敏
|
|
func maskName(name string) string {
|
|
// 将字符串转换为rune切片以正确处理中文字符
|
|
runes := []rune(name)
|
|
length := len(runes)
|
|
|
|
if length <= 1 {
|
|
return name
|
|
}
|
|
|
|
if length == 2 {
|
|
// 两个字:保留第一个字,第二个字用*替代
|
|
return string(runes[0]) + "*"
|
|
}
|
|
|
|
// 三个字及以上:保留首尾字,中间用*替代
|
|
first := string(runes[0])
|
|
last := string(runes[length-1])
|
|
mask := strings.Repeat("*", length-2)
|
|
|
|
return first + mask + last
|
|
}
|
|
|
|
// 身份证号脱敏
|
|
func maskIDCard(idCard string) string {
|
|
length := len(idCard)
|
|
if length <= 10 {
|
|
return idCard // 如果长度太短,可能不是身份证,不处理
|
|
}
|
|
// 保留前3位和后4位
|
|
return idCard[:3] + strings.Repeat("*", length-7) + idCard[length-4:]
|
|
}
|