2025-03-18 10:13:57 +08:00
|
|
|
package env
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"log/slog"
|
|
|
|
|
"os"
|
2025-03-18 17:57:07 +08:00
|
|
|
"strconv"
|
2025-03-18 10:13:57 +08:00
|
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2/log"
|
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
|
)
|
|
|
|
|
|
2025-03-18 17:57:07 +08:00
|
|
|
// region app
|
|
|
|
|
|
2025-03-18 10:13:57 +08:00
|
|
|
var (
|
|
|
|
|
AppName = "platform"
|
|
|
|
|
)
|
|
|
|
|
|
2025-03-18 17:57:07 +08:00
|
|
|
func loadApp() {
|
2025-03-18 10:13:57 +08:00
|
|
|
_AppName := os.Getenv("APP_NAME")
|
|
|
|
|
if _AppName != "" {
|
|
|
|
|
AppName = _AppName
|
|
|
|
|
}
|
2025-03-18 17:57:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
|
|
|
|
// region db
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
DbHost = "localhost"
|
|
|
|
|
DbPort = "5432"
|
|
|
|
|
DbName string
|
|
|
|
|
DbUserName string
|
|
|
|
|
DbPassword string
|
|
|
|
|
)
|
2025-03-18 10:13:57 +08:00
|
|
|
|
2025-03-18 17:57:07 +08:00
|
|
|
func loadDb() {
|
2025-03-18 10:13:57 +08:00
|
|
|
_DbHost := os.Getenv("DB_HOST")
|
|
|
|
|
if _DbHost != "" {
|
|
|
|
|
DbHost = _DbHost
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_DbPort := os.Getenv("DB_PORT")
|
|
|
|
|
if _DbPort != "" {
|
|
|
|
|
DbPort = _DbPort
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_DbName := os.Getenv("DB_NAME")
|
|
|
|
|
if _DbName != "" {
|
|
|
|
|
DbName = _DbName
|
|
|
|
|
} else {
|
2025-03-31 09:09:05 +08:00
|
|
|
panic("环境变量 DB_NAME 的值不能为空")
|
2025-03-18 10:13:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_DbUserName := os.Getenv("DB_USERNAME")
|
|
|
|
|
if _DbUserName != "" {
|
|
|
|
|
DbUserName = _DbUserName
|
|
|
|
|
} else {
|
2025-03-31 09:09:05 +08:00
|
|
|
panic("环境变量 DB_USERNAME 的值不能为空")
|
2025-03-18 10:13:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_DbPassword := os.Getenv("DB_PASSWORD")
|
|
|
|
|
if _DbPassword != "" {
|
|
|
|
|
DbPassword = _DbPassword
|
|
|
|
|
} else {
|
2025-03-31 09:09:05 +08:00
|
|
|
panic("环境变量 DB_PASSWORD 的值不能为空")
|
2025-03-18 10:13:57 +08:00
|
|
|
}
|
2025-03-18 17:57:07 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
|
|
|
|
// region redis
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
RedisHost = "localhost"
|
|
|
|
|
RedisPort = "6379"
|
|
|
|
|
RedisDb = 0
|
|
|
|
|
RedisPass = ""
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadRedis() {
|
|
|
|
|
_RedisHost := os.Getenv("REDIS_HOST")
|
|
|
|
|
if _RedisHost != "" {
|
|
|
|
|
RedisHost = _RedisHost
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_RedisPort := os.Getenv("REDIS_PORT")
|
|
|
|
|
if _RedisPort != "" {
|
|
|
|
|
RedisPort = _RedisPort
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_RedisDb := os.Getenv("REDIS_DB")
|
|
|
|
|
if _RedisDb != "" {
|
|
|
|
|
atoi, err := strconv.Atoi(_RedisDb)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic("环境变量 REDIS_DB 的值不是数字")
|
|
|
|
|
}
|
|
|
|
|
RedisDb = atoi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_RedisPass := os.Getenv("REDIS_PASS")
|
|
|
|
|
if _RedisPass != "" {
|
|
|
|
|
RedisPass = _RedisPass
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
2025-03-18 10:13:57 +08:00
|
|
|
|
2025-03-18 17:57:07 +08:00
|
|
|
// region log
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
LogLevel = slog.LevelDebug
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadLog() {
|
2025-03-18 10:13:57 +08:00
|
|
|
_LogLevel := os.Getenv("LOG_LEVEL")
|
|
|
|
|
switch _LogLevel {
|
|
|
|
|
case "debug":
|
|
|
|
|
LogLevel = slog.LevelDebug
|
|
|
|
|
case "info":
|
|
|
|
|
LogLevel = slog.LevelInfo
|
|
|
|
|
case "warn":
|
|
|
|
|
LogLevel = slog.LevelWarn
|
|
|
|
|
case "error":
|
|
|
|
|
LogLevel = slog.LevelError
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-18 17:57:07 +08:00
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
2025-03-31 09:09:05 +08:00
|
|
|
// region remote
|
|
|
|
|
|
|
|
|
|
var (
|
2025-04-16 10:41:04 +08:00
|
|
|
BaiyinAddr = "http://103.139.212.110:9989"
|
|
|
|
|
BaiyinTokenUrl string
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
IdenCallbackUrl string
|
|
|
|
|
IdenAccessKey string
|
|
|
|
|
IdenSecretKey string
|
2025-03-31 09:09:05 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadRemote() {
|
2025-04-16 10:41:04 +08:00
|
|
|
_BaiyinAddr := os.Getenv("BAIYIN_ADDR")
|
|
|
|
|
if _BaiyinAddr != "" {
|
|
|
|
|
BaiyinAddr = _BaiyinAddr
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_BaiyinTokenUrl := os.Getenv("BAIYIN_TOKEN_URL")
|
|
|
|
|
if _BaiyinTokenUrl == "" {
|
|
|
|
|
panic("环境变量 BAIYIN_TOKEN_URL 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
BaiyinTokenUrl = _BaiyinTokenUrl
|
|
|
|
|
|
|
|
|
|
_IdenCallbackUrl := os.Getenv("IDEN_CALLBACK_URL")
|
|
|
|
|
if _IdenCallbackUrl == "" {
|
|
|
|
|
panic("环境变量 IDEN_CALLBACK_URL 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
IdenCallbackUrl = _IdenCallbackUrl
|
|
|
|
|
|
|
|
|
|
_IdenAccessKey := os.Getenv("IDEN_ACCESS_KEY")
|
|
|
|
|
if _IdenAccessKey == "" {
|
|
|
|
|
panic("环境变量 IDEN_ACCESS_KEY 的值不能为空")
|
2025-03-31 09:09:05 +08:00
|
|
|
}
|
2025-04-16 10:41:04 +08:00
|
|
|
IdenAccessKey = _IdenAccessKey
|
2025-03-31 09:09:05 +08:00
|
|
|
|
2025-04-16 10:41:04 +08:00
|
|
|
_IdenSecretKey := os.Getenv("IDEN_SECRET_KEY")
|
|
|
|
|
if _IdenSecretKey == "" {
|
|
|
|
|
panic("环境变量 IDEN_SECRET_KEY 的值不能为空")
|
2025-03-31 09:09:05 +08:00
|
|
|
}
|
2025-04-16 10:41:04 +08:00
|
|
|
IdenSecretKey = _IdenSecretKey
|
2025-03-31 09:09:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
2025-04-16 14:01:30 +08:00
|
|
|
// region alipay
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
AlipayAppId string
|
|
|
|
|
AlipayAppPrivateKey string
|
|
|
|
|
AlipayPublicKey string
|
2025-04-17 18:29:44 +08:00
|
|
|
AlipayApiCert string
|
2025-04-16 14:01:30 +08:00
|
|
|
AlipayProduction = false
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadAlipay() {
|
2025-04-16 18:50:55 +08:00
|
|
|
AlipayAppId = os.Getenv("ALIPAY_APP_ID")
|
2025-04-16 14:01:30 +08:00
|
|
|
if AlipayAppId == "" {
|
|
|
|
|
panic("环境变量 ALIPAY_APP_ID 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-16 18:50:55 +08:00
|
|
|
AlipayAppPrivateKey = os.Getenv("ALIPAY_APP_PRIVATE_KEY")
|
2025-04-16 14:01:30 +08:00
|
|
|
if AlipayAppPrivateKey == "" {
|
|
|
|
|
panic("环境变量 ALIPAY_APP_PRIVATE_KEY 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-16 18:50:55 +08:00
|
|
|
AlipayPublicKey = os.Getenv("ALIPAY_PUBLIC_KEY")
|
2025-04-16 14:01:30 +08:00
|
|
|
if AlipayPublicKey == "" {
|
|
|
|
|
panic("环境变量 ALIPAY_PUBLIC_KEY 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-17 18:29:44 +08:00
|
|
|
AlipayApiCert = os.Getenv("ALIPAY_API_CERT")
|
|
|
|
|
if AlipayApiCert == "" {
|
|
|
|
|
panic("环境变量 ALIPAY_API_CERT 的值不能为空")
|
2025-04-16 14:01:30 +08:00
|
|
|
}
|
2025-04-16 18:50:55 +08:00
|
|
|
|
2025-04-16 14:01:30 +08:00
|
|
|
_AlipayProduction := os.Getenv("ALIPAY_PRODUCTION")
|
|
|
|
|
if _AlipayProduction != "" {
|
|
|
|
|
value, err := strconv.ParseBool(_AlipayProduction)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic("环境变量 ALIPAY_PRODUCTION 的值不是布尔值")
|
|
|
|
|
}
|
|
|
|
|
AlipayProduction = value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
2025-04-17 18:29:44 +08:00
|
|
|
// region wechatpay
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
WechatPayAppId string
|
|
|
|
|
WechatPayMchId string
|
|
|
|
|
WechatPayMchPrivateKeySerial string
|
|
|
|
|
WechatPayMchPrivateKeyPath string
|
|
|
|
|
WechatPayPublicKeyId string
|
|
|
|
|
WechatPayPublicKeyPath string
|
|
|
|
|
WechatPayApiCert string
|
|
|
|
|
WechatPayCallbackUrl string
|
|
|
|
|
WechatPayProduction = false
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadWechatPay() {
|
|
|
|
|
|
|
|
|
|
WechatPayAppId = os.Getenv("WECHATPAY_APP_ID")
|
|
|
|
|
if WechatPayAppId == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_APP_ID 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayMchId = os.Getenv("WECHATPAY_MCH_ID")
|
|
|
|
|
if WechatPayMchId == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_MCH_ID 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayMchPrivateKeySerial = os.Getenv("WECHATPAY_MCH_PRIVATE_KEY_SERIAL")
|
|
|
|
|
if WechatPayMchPrivateKeySerial == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_MCH_PRIVATE_KEY_SERIAL 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayMchPrivateKeyPath = os.Getenv("WECHATPAY_MCH_PRIVATE_KEY_PATH")
|
|
|
|
|
if WechatPayMchPrivateKeyPath == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_MCH_PRIVATE_KEY_PATH 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayPublicKeyId = os.Getenv("WECHATPAY_PUBLIC_KEY_ID")
|
|
|
|
|
if WechatPayPublicKeyId == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_PUBLIC_KEY_ID 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayPublicKeyPath = os.Getenv("WECHATPAY_PUBLIC_KEY_PATH")
|
|
|
|
|
if WechatPayPublicKeyPath == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_PUBLIC_KEY_PATH 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayApiCert = os.Getenv("WECHATPAY_API_CERT")
|
|
|
|
|
if WechatPayApiCert == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_API_CERT 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WechatPayCallbackUrl = os.Getenv("WECHATPAY_CALLBACK_URL")
|
|
|
|
|
if WechatPayCallbackUrl == "" {
|
|
|
|
|
panic("环境变量 WECHATPAY_CALLBACK_URL 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_WechatPayProduction := os.Getenv("WECHATPAY_PRODUCTION")
|
|
|
|
|
if _WechatPayProduction != "" {
|
|
|
|
|
value, err := strconv.ParseBool(_WechatPayProduction)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic("环境变量 WECHATPAY_PRODUCTION 的值不是布尔值")
|
|
|
|
|
}
|
|
|
|
|
WechatPayProduction = value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
2025-04-18 17:47:54 +08:00
|
|
|
// region aliyun
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
AliyunAccessKey string
|
|
|
|
|
AliyunAccessKeySecret string
|
|
|
|
|
AliyunSmsSignature string
|
|
|
|
|
AliyunSmsTemplateLogin string
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadAliyun() {
|
|
|
|
|
AliyunAccessKey = os.Getenv("ALIYUN_ACCESS_KEY")
|
|
|
|
|
if AliyunAccessKey == "" {
|
|
|
|
|
panic("环境变量 ALIYUN_ACCESS_KEY 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AliyunAccessKeySecret = os.Getenv("ALIYUN_ACCESS_KEY_SECRET")
|
|
|
|
|
if AliyunAccessKeySecret == "" {
|
|
|
|
|
panic("环境变量 ALIYUN_ACCESS_KEY_SECRET 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AliyunSmsSignature = os.Getenv("ALIYUN_SMS_SIGNATURE")
|
|
|
|
|
if AliyunSmsSignature == "" {
|
|
|
|
|
panic("环境变量 ALIYUN_SMS_SIGNATURE 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AliyunSmsTemplateLogin = os.Getenv("ALIYUN_SMS_TEMPLATE_LOGIN")
|
|
|
|
|
if AliyunSmsTemplateLogin == "" {
|
|
|
|
|
panic("环境变量 ALIYUN_SMS_TEMPLATE_LOGIN 的值不能为空")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
2025-03-31 09:09:05 +08:00
|
|
|
// region debug
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
// DebugHttpDump 是否打印请求和响应的原始数据
|
|
|
|
|
DebugHttpDump = false
|
|
|
|
|
// DebugExternalChange 是否实际执行非幂等外部接口的调用。
|
|
|
|
|
// 例如外部数据修改接口,在内部接口调试时可以关闭,避免对外部数据产生影响
|
|
|
|
|
DebugExternalChange = true
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func loadDebug() {
|
|
|
|
|
debugHttpDump := os.Getenv("DEBUG_HTTP_DUMP")
|
|
|
|
|
if debugHttpDump != "" {
|
|
|
|
|
value, err := strconv.ParseBool(debugHttpDump)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic("环境变量 DEBUG_HTTP_DUMP 的值不是布尔值")
|
|
|
|
|
}
|
|
|
|
|
DebugHttpDump = value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
debugExternalChange := os.Getenv("DEBUG_EXTERNAL_CHANGE")
|
|
|
|
|
if debugExternalChange != "" {
|
|
|
|
|
value, err := strconv.ParseBool(debugExternalChange)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic("环境变量 DEBUG_EXTERNAL_CHANGE 的值不是布尔值")
|
|
|
|
|
}
|
|
|
|
|
DebugExternalChange = value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// endregion
|
|
|
|
|
|
2025-03-18 17:57:07 +08:00
|
|
|
func Init() {
|
|
|
|
|
err := godotenv.Load()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Debug("❓ 没有本地环境变量")
|
|
|
|
|
} else {
|
|
|
|
|
log.Debug("✔ 加载本地环境变量")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
loadApp()
|
|
|
|
|
loadDb()
|
|
|
|
|
loadRedis()
|
|
|
|
|
loadLog()
|
2025-03-31 09:09:05 +08:00
|
|
|
loadDebug()
|
|
|
|
|
loadRemote()
|
2025-04-16 14:01:30 +08:00
|
|
|
loadAlipay()
|
2025-04-17 18:29:44 +08:00
|
|
|
// loadWechatPay()
|
2025-04-18 17:47:54 +08:00
|
|
|
loadAliyun()
|
2025-03-18 17:57:07 +08:00
|
|
|
}
|