fix: for AI review problems

This commit is contained in:
wzxjohn
2025-07-10 20:55:43 +08:00
parent d6ed2ab3e0
commit 8cc747ef22
5 changed files with 24 additions and 35 deletions

View File

@@ -7,20 +7,20 @@ import (
"encoding/hex" "encoding/hex"
) )
func Sha256Raw(data string) []byte { func Sha256Raw(data []byte) []byte {
h := sha256.New() h := sha256.New()
h.Write([]byte(data)) h.Write(data)
return h.Sum(nil) return h.Sum(nil)
} }
func Sha1Raw(data []byte) []byte { func Sha1Raw(data []byte) []byte {
h := sha1.New() h := sha1.New()
h.Write([]byte(data)) h.Write(data)
return h.Sum(nil) return h.Sum(nil)
} }
func Sha1(data string) string { func Sha1(data []byte) string {
return hex.EncodeToString(Sha1Raw([]byte(data))) return hex.EncodeToString(Sha1Raw(data))
} }
func HmacSha256Raw(message, key []byte) []byte { func HmacSha256Raw(message, key []byte) []byte {

View File

@@ -57,8 +57,8 @@ func (*StripeAdaptor) RequestPay(c *gin.Context, req *StripePayRequest) {
c.JSON(200, gin.H{"message": "error", "data": "不支持的支付渠道"}) c.JSON(200, gin.H{"message": "error", "data": "不支持的支付渠道"})
return return
} }
if req.Amount < int64(setting.StripeMinTopUp) { if req.Amount < getStripeMinTopup() {
c.JSON(200, gin.H{"message": fmt.Sprintf("充值数量不能小于 %d", setting.StripeMinTopUp), "data": 10}) c.JSON(200, gin.H{"message": fmt.Sprintf("充值数量不能小于 %d", getStripeMinTopup()), "data": 10})
return return
} }
if req.Amount > 10000 { if req.Amount > 10000 {
@@ -71,7 +71,7 @@ func (*StripeAdaptor) RequestPay(c *gin.Context, req *StripePayRequest) {
chargedMoney := GetChargedAmount(float64(req.Amount), *user) chargedMoney := GetChargedAmount(float64(req.Amount), *user)
reference := fmt.Sprintf("new-api-ref-%d-%d-%s", user.Id, time.Now().UnixMilli(), randstr.String(4)) reference := fmt.Sprintf("new-api-ref-%d-%d-%s", user.Id, time.Now().UnixMilli(), randstr.String(4))
referenceId := "ref_" + common.Sha1(reference) referenceId := "ref_" + common.Sha1([]byte(reference))
payLink, err := genStripeLink(referenceId, user.StripeCustomer, user.Email, req.Amount) payLink, err := genStripeLink(referenceId, user.StripeCustomer, user.Email, req.Amount)
if err != nil { if err != nil {
@@ -181,7 +181,7 @@ func sessionExpired(event stripe.Event) {
return return
} }
if "" == referenceId { if len(referenceId) == 0 {
log.Println("未提供支付单号") log.Println("未提供支付单号")
return return
} }
@@ -257,7 +257,7 @@ func getStripePayMoney(amount float64, group string) float64 {
if !common.DisplayInCurrencyEnabled { if !common.DisplayInCurrencyEnabled {
amount = amount / common.QuotaPerUnit amount = amount / common.QuotaPerUnit
} }
// 别问为什么用float64,问就是这么点钱没必要 // Using float64 for monetary calculations is acceptable here due to the small amounts involved
topupGroupRatio := common.GetTopupGroupRatio(group) topupGroupRatio := common.GetTopupGroupRatio(group)
if topupGroupRatio == 0 { if topupGroupRatio == 0 {
topupGroupRatio = 1 topupGroupRatio = 1

View File

@@ -43,7 +43,7 @@ type User struct {
LinuxDOId string `json:"linux_do_id" gorm:"column:linux_do_id;index"` LinuxDOId string `json:"linux_do_id" gorm:"column:linux_do_id;index"`
Setting string `json:"setting" gorm:"type:text;column:setting"` Setting string `json:"setting" gorm:"type:text;column:setting"`
Remark string `json:"remark,omitempty" gorm:"type:varchar(255)" validate:"max=255"` Remark string `json:"remark,omitempty" gorm:"type:varchar(255)" validate:"max=255"`
StripeCustomer string `json:"stripe_customer" gorm:"column:stripe_customer;index"` StripeCustomer string `json:"stripe_customer" gorm:"type:varchar(64);column:stripe_customer;index"`
} }
func (user *User) ToBaseUser() *UserBase { func (user *User) ToBaseUser() *UserBase {

View File

@@ -14,7 +14,6 @@ import {
removeTrailingSlash, removeTrailingSlash,
showError, showError,
showSuccess, showSuccess,
verifyJSON,
} from '../../../helpers'; } from '../../../helpers';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@@ -60,19 +59,19 @@ export default function SettingsPaymentGateway(props) {
try { try {
const options = [] const options = []
if (inputs.StripeApiSecret !== undefined && inputs.StripeApiSecret !== '') { if (inputs.StripeApiSecret && inputs.StripeApiSecret !== '') {
options.push({ key: 'StripeApiSecret', value: inputs.StripeApiSecret }); options.push({ key: 'StripeApiSecret', value: inputs.StripeApiSecret });
} }
if (inputs.StripeWebhookSecret !== undefined && inputs.StripeWebhookSecret !== '') { if (inputs.StripeWebhookSecret && inputs.StripeWebhookSecret !== '') {
options.push({ key: 'StripeWebhookSecret', value: inputs.StripeWebhookSecret }); options.push({ key: 'StripeWebhookSecret', value: inputs.StripeWebhookSecret });
} }
if (inputs.StripePriceId !== '') { if (inputs.StripePriceId !== '') {
options.push({key: 'StripePriceId', value: inputs.StripePriceId,}); options.push({key: 'StripePriceId', value: inputs.StripePriceId,});
} }
if (inputs.StripeUnitPrice !== '') { if (inputs.StripeUnitPrice !== undefined && inputs.StripeUnitPrice !== null) {
options.push({ key: 'StripeUnitPrice', value: inputs.StripeUnitPrice.toString() }); options.push({ key: 'StripeUnitPrice', value: inputs.StripeUnitPrice.toString() });
} }
if (inputs.StripeMinTopUp !== '') { if (inputs.StripeMinTopUp !== undefined && inputs.StripeMinTopUp !== null) {
options.push({ key: 'StripeMinTopUp', value: inputs.StripeMinTopUp.toString() }); options.push({ key: 'StripeMinTopUp', value: inputs.StripeMinTopUp.toString() });
} }
@@ -96,7 +95,7 @@ export default function SettingsPaymentGateway(props) {
showSuccess(t('更新成功')); showSuccess(t('更新成功'));
// 更新本地存储的原始值 // 更新本地存储的原始值
setOriginInputs({ ...inputs }); setOriginInputs({ ...inputs });
props.refresh && props.refresh(); props.refresh?.();
} }
} catch (error) { } catch (error) {
showError(t('更新失败')); showError(t('更新失败'));
@@ -135,7 +134,7 @@ export default function SettingsPaymentGateway(props) {
</Text> </Text>
<Banner <Banner
type='info' type='info'
description={`Webhook 填:${props.options.ServerAddress ? props.options.ServerAddress : '网站地址'}/api/stripe/webhook`} description={`Webhook 填:${props.options.ServerAddress ? removeTrailingSlash(props.options.ServerAddress) : t('网站地址')}/api/stripe/webhook`}
/> />
<Banner <Banner
type='warning' type='warning'

View File

@@ -293,7 +293,7 @@ const TopUp = () => {
} }
const processStripeCallback = (data) => { const processStripeCallback = (data) => {
location.href = data.pay_link; window.open(data.pay_link, '_blank');
}; };
const getUserQuota = async () => { const getUserQuota = async () => {
@@ -938,21 +938,11 @@ const TopUp = () => {
<> <>
{/* 桌面端显示的自定义金额和支付按钮 */} {/* 桌面端显示的自定义金额和支付按钮 */}
<div className='hidden md:block space-y-4'> <div className='hidden md:block space-y-4'>
{!enableOnlineTopUp?( <Divider style={{ margin: '24px 0' }}>
<Divider style={{ margin: '24px 0' }}> <Text className='text-sm font-medium'>
<Text className='text-sm font-medium'> {t(!enableOnlineTopUp ? '或输入自定义金额' : 'Stripe')}
{t('或输入自定义金额')} </Text>
</Text> </Divider>
</Divider>
) : (
<Divider style={{ margin: '24px 0' }}>
<Text className='text-sm font-medium'>
{t('Stripe')}
</Text>
</Divider>
)
}
<div> <div>
<div className='flex justify-between mb-2'> <div className='flex justify-between mb-2'>
@@ -968,7 +958,7 @@ const TopUp = () => {
)} )}
</div> </div>
<InputNumber <InputNumber
disabled={!enableOnlineTopUp} disabled={!enableStripeTopUp}
placeholder={ placeholder={
t('充值数量,最低 ') + renderQuotaWithAmount(stripeMinTopUp) t('充值数量,最低 ') + renderQuotaWithAmount(stripeMinTopUp)
} }