diff --git a/common/hash.go b/common/hash.go index 4d298192..50191938 100644 --- a/common/hash.go +++ b/common/hash.go @@ -7,20 +7,20 @@ import ( "encoding/hex" ) -func Sha256Raw(data string) []byte { +func Sha256Raw(data []byte) []byte { h := sha256.New() - h.Write([]byte(data)) + h.Write(data) return h.Sum(nil) } func Sha1Raw(data []byte) []byte { h := sha1.New() - h.Write([]byte(data)) + h.Write(data) return h.Sum(nil) } -func Sha1(data string) string { - return hex.EncodeToString(Sha1Raw([]byte(data))) +func Sha1(data []byte) string { + return hex.EncodeToString(Sha1Raw(data)) } func HmacSha256Raw(message, key []byte) []byte { diff --git a/controller/topup_stripe.go b/controller/topup_stripe.go index c7aa3875..eb320809 100644 --- a/controller/topup_stripe.go +++ b/controller/topup_stripe.go @@ -57,8 +57,8 @@ func (*StripeAdaptor) RequestPay(c *gin.Context, req *StripePayRequest) { c.JSON(200, gin.H{"message": "error", "data": "不支持的支付渠道"}) return } - if req.Amount < int64(setting.StripeMinTopUp) { - c.JSON(200, gin.H{"message": fmt.Sprintf("充值数量不能小于 %d", setting.StripeMinTopUp), "data": 10}) + if req.Amount < getStripeMinTopup() { + c.JSON(200, gin.H{"message": fmt.Sprintf("充值数量不能小于 %d", getStripeMinTopup()), "data": 10}) return } if req.Amount > 10000 { @@ -71,7 +71,7 @@ func (*StripeAdaptor) RequestPay(c *gin.Context, req *StripePayRequest) { chargedMoney := GetChargedAmount(float64(req.Amount), *user) 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) if err != nil { @@ -181,7 +181,7 @@ func sessionExpired(event stripe.Event) { return } - if "" == referenceId { + if len(referenceId) == 0 { log.Println("未提供支付单号") return } @@ -257,7 +257,7 @@ func getStripePayMoney(amount float64, group string) float64 { if !common.DisplayInCurrencyEnabled { amount = amount / common.QuotaPerUnit } - // 别问为什么用float64,问就是这么点钱没必要 + // Using float64 for monetary calculations is acceptable here due to the small amounts involved topupGroupRatio := common.GetTopupGroupRatio(group) if topupGroupRatio == 0 { topupGroupRatio = 1 diff --git a/model/user.go b/model/user.go index bde2b8a9..6021f495 100644 --- a/model/user.go +++ b/model/user.go @@ -43,7 +43,7 @@ type User struct { LinuxDOId string `json:"linux_do_id" gorm:"column:linux_do_id;index"` Setting string `json:"setting" gorm:"type:text;column:setting"` 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 { diff --git a/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js b/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js index c8cf3667..4c4a1af6 100644 --- a/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js +++ b/web/src/pages/Setting/Payment/SettingsPaymentGatewayStripe.js @@ -14,7 +14,6 @@ import { removeTrailingSlash, showError, showSuccess, - verifyJSON, } from '../../../helpers'; import { useTranslation } from 'react-i18next'; @@ -60,19 +59,19 @@ export default function SettingsPaymentGateway(props) { try { const options = [] - if (inputs.StripeApiSecret !== undefined && inputs.StripeApiSecret !== '') { + if (inputs.StripeApiSecret && 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 }); } if (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() }); } - if (inputs.StripeMinTopUp !== '') { + if (inputs.StripeMinTopUp !== undefined && inputs.StripeMinTopUp !== null) { options.push({ key: 'StripeMinTopUp', value: inputs.StripeMinTopUp.toString() }); } @@ -96,7 +95,7 @@ export default function SettingsPaymentGateway(props) { showSuccess(t('更新成功')); // 更新本地存储的原始值 setOriginInputs({ ...inputs }); - props.refresh && props.refresh(); + props.refresh?.(); } } catch (error) { showError(t('更新失败')); @@ -135,7 +134,7 @@ export default function SettingsPaymentGateway(props) { { } const processStripeCallback = (data) => { - location.href = data.pay_link; + window.open(data.pay_link, '_blank'); }; const getUserQuota = async () => { @@ -938,21 +938,11 @@ const TopUp = () => { <> {/* 桌面端显示的自定义金额和支付按钮 */}
- {!enableOnlineTopUp?( - - - {t('或输入自定义金额')} - - - ) : ( - - - {t('Stripe')} - - - ) - } - + + + {t(!enableOnlineTopUp ? '或输入自定义金额' : 'Stripe')} + +
@@ -968,7 +958,7 @@ const TopUp = () => { )}