Files
web/server/handlers/payment_config.go
2026-03-17 01:00:11 +08:00

129 lines
3.2 KiB
Go
Raw Permalink 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 handlers
import (
"context"
"net/http"
"time"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
"yh_web/server/config"
"yh_web/server/models"
"github.com/gin-gonic/gin"
)
const paymentConfigDocID = "payment"
// GetPaymentConfig 获取支付配置(仅 role_id=9527, role=admin
func GetPaymentConfig(c *gin.Context) {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
coll := config.GetDB(config.DBName).Collection("system_config")
var cfg models.PaymentConfig
err := coll.FindOne(ctx, bson.M{"_id": paymentConfigDocID}).Decode(&cfg)
if err != nil {
if err == mongo.ErrNoDocuments {
c.JSON(http.StatusOK, models.PaymentConfig{})
return
}
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, cfg)
}
// PaymentConfigUpdateInput 支付配置更新
type PaymentConfigUpdateInput struct {
Wechat *WechatPayUpdateInput `json:"wechat"`
Alipay *AlipayUpdateInput `json:"alipay"`
}
type WechatPayUpdateInput struct {
AppID string `json:"app_id"`
MchID string `json:"mch_id"`
APIKey string `json:"api_key"`
APIKeyV3 string `json:"api_key_v3"`
Enabled *bool `json:"enabled"`
}
type AlipayUpdateInput struct {
AppID string `json:"app_id"`
PrivateKey string `json:"private_key"`
AlipayPublicKey string `json:"alipay_public_key"`
Enabled *bool `json:"enabled"`
}
// UpdatePaymentConfig 更新支付配置
func UpdatePaymentConfig(c *gin.Context) {
var input PaymentConfigUpdateInput
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
coll := config.GetDB(config.DBName).Collection("system_config")
set := bson.M{}
if input.Wechat != nil {
w := bson.M{}
if input.Wechat.AppID != "" {
w["app_id"] = input.Wechat.AppID
}
if input.Wechat.MchID != "" {
w["mch_id"] = input.Wechat.MchID
}
if input.Wechat.APIKey != "" {
w["api_key"] = input.Wechat.APIKey
}
if input.Wechat.APIKeyV3 != "" {
w["api_key_v3"] = input.Wechat.APIKeyV3
}
if input.Wechat.Enabled != nil {
w["enabled"] = *input.Wechat.Enabled
}
for k, v := range w {
set["wechat."+k] = v
}
}
if input.Alipay != nil {
a := bson.M{}
if input.Alipay.AppID != "" {
a["app_id"] = input.Alipay.AppID
}
if input.Alipay.PrivateKey != "" {
a["private_key"] = input.Alipay.PrivateKey
}
if input.Alipay.AlipayPublicKey != "" {
a["alipay_public_key"] = input.Alipay.AlipayPublicKey
}
if input.Alipay.Enabled != nil {
a["enabled"] = *input.Alipay.Enabled
}
for k, v := range a {
set["alipay."+k] = v
}
}
if len(set) == 0 {
c.JSON(http.StatusBadRequest, gin.H{"error": "无有效更新字段"})
return
}
opts := options.UpdateOne().SetUpsert(true)
_, err := coll.UpdateOne(ctx, bson.M{"_id": paymentConfigDocID}, bson.M{"$set": set}, opts)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"message": "配置已保存"})
}