package env import ( "log/slog" "os" "strconv" "github.com/gofiber/fiber/v2/log" "github.com/joho/godotenv" ) // region app const ( RunModeDev = "debug" RunModeProd = "production" ) var ( RunMode = RunModeDev ) func loadApp() { _RunMode := os.Getenv("RUN_MODE") switch _RunMode { case RunModeDev, RunModeProd: RunMode = _RunMode case "": break default: panic("环境变量 RUN_MODE 的值只能是 " + RunModeDev + " 或 " + RunModeProd) } } // endregion // region auth var ( SessionAccessExpire = 60 * 60 * 2 // 2小时 SessionRefreshExpire = 60 * 60 * 24 * 7 // 7天 ) func loadAuth() { _SessionAccessExpire := os.Getenv("SESSION_ACCESS_EXPIRE") if _SessionAccessExpire != "" { value, err := strconv.Atoi(_SessionAccessExpire) if err != nil { panic("环境变量 SESSION_ACCESS_EXPIRE 的值不是数字") } SessionAccessExpire = value } _SessionRefreshExpire := os.Getenv("SESSION_REFRESH_EXPIRE") if _SessionRefreshExpire != "" { value, err := strconv.Atoi(_SessionRefreshExpire) if err != nil { panic("环境变量 SESSION_REFRESH_EXPIRE 的值不是数字") } SessionRefreshExpire = value } } // endregion // region db var ( DbHost = "localhost" DbPort = "5432" DbName string DbUserName string DbPassword string ) func loadDb() { _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 { panic("环境变量 DB_NAME 的值不能为空") } _DbUserName := os.Getenv("DB_USERNAME") if _DbUserName != "" { DbUserName = _DbUserName } else { panic("环境变量 DB_USERNAME 的值不能为空") } _DbPassword := os.Getenv("DB_PASSWORD") if _DbPassword != "" { DbPassword = _DbPassword } else { panic("环境变量 DB_PASSWORD 的值不能为空") } } // 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 // region log var ( LogLevel = slog.LevelDebug ) func loadLog() { _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 } } // endregion // region remote var ( BaiyinAddr = "http://103.139.212.110:9989" BaiyinTokenUrl string ) var ( IdenCallbackUrl string IdenAccessKey string IdenSecretKey string ) func loadRemote() { _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 的值不能为空") } IdenAccessKey = _IdenAccessKey _IdenSecretKey := os.Getenv("IDEN_SECRET_KEY") if _IdenSecretKey == "" { panic("环境变量 IDEN_SECRET_KEY 的值不能为空") } IdenSecretKey = _IdenSecretKey } // endregion // region alipay var ( AlipayAppId string AlipayAppPrivateKey string AlipayPublicKey string AlipayApiCert string AlipayProduction = false ) func loadAlipay() { AlipayAppId = os.Getenv("ALIPAY_APP_ID") if AlipayAppId == "" { panic("环境变量 ALIPAY_APP_ID 的值不能为空") } AlipayAppPrivateKey = os.Getenv("ALIPAY_APP_PRIVATE_KEY") if AlipayAppPrivateKey == "" { panic("环境变量 ALIPAY_APP_PRIVATE_KEY 的值不能为空") } AlipayPublicKey = os.Getenv("ALIPAY_PUBLIC_KEY") if AlipayPublicKey == "" { panic("环境变量 ALIPAY_PUBLIC_KEY 的值不能为空") } AlipayApiCert = os.Getenv("ALIPAY_API_CERT") if AlipayApiCert == "" { panic("环境变量 ALIPAY_API_CERT 的值不能为空") } _AlipayProduction := os.Getenv("ALIPAY_PRODUCTION") if _AlipayProduction != "" { value, err := strconv.ParseBool(_AlipayProduction) if err != nil { panic("环境变量 ALIPAY_PRODUCTION 的值不是布尔值") } AlipayProduction = value } } // endregion // region wechatpay var ( WechatPayAppId string WechatPayMchId string WechatPayMchPrivateKeySerial string WechatPayMchPrivateKey string WechatPayPublicKeyId string WechatPayPublicKey string WechatPayApiCert string WechatPayCallbackUrl string ) 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 的值不能为空") } WechatPayMchPrivateKey = os.Getenv("WECHATPAY_MCH_PRIVATE_KEY") if WechatPayMchPrivateKey == "" { panic("环境变量 WECHATPAY_MCH_PRIVATE_KEY 的值不能为空") } WechatPayPublicKeyId = os.Getenv("WECHATPAY_PUBLIC_KEY_ID") if WechatPayPublicKeyId == "" { panic("环境变量 WECHATPAY_PUBLIC_KEY_ID 的值不能为空") } WechatPayPublicKey = os.Getenv("WECHATPAY_PUBLIC_KEY") if WechatPayPublicKey == "" { panic("环境变量 WECHATPAY_PUBLIC_KEY 的值不能为空") } WechatPayApiCert = os.Getenv("WECHATPAY_API_CERT") if WechatPayApiCert == "" { panic("环境变量 WECHATPAY_API_CERT 的值不能为空") } WechatPayCallbackUrl = os.Getenv("WECHATPAY_CALLBACK_URL") if WechatPayCallbackUrl == "" { panic("环境变量 WECHATPAY_CALLBACK_URL 的值不能为空") } } // endregion // 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 // region 商福通 var ( SftPayEnable = false SftPayAppId string SftPayRouteId string SftPayAppPrivateKey string SftPayPublicKey string ) func loadSftPay() { var value string value = os.Getenv("SFTPAY_ENABLE") if value != "" { enabled, err := strconv.ParseBool(value) if err != nil { panic("环境变量 SFTPAY_ENABLE 的值不是布尔值") } SftPayEnable = enabled } value = os.Getenv("SFTPAY_APP_ID") if value == "" { panic("环境变量 ALIYUN_SMS_TEMPLATE_LOGIN 的值不能为空") } else { SftPayAppId = value } value = os.Getenv("SFTPAY_ROUTE_ID") if value != "" { SftPayRouteId = value } value = os.Getenv("SFTPAY_APP_PRIVATE_KEY") if value == "" { panic("环境变量 SFTPAY_APP_PRIVATE_KEY 的值不能为空") } else { SftPayAppPrivateKey = value } value = os.Getenv("SFTPAY_PUBLIC_KEY") if value == "" { panic("环境变量 SFTPAY_PUBLIC_KEY 的值不能为空") } else { SftPayPublicKey = value } } // endregion // 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 func Init() { err := godotenv.Load() if err != nil { log.Debug("❓ 没有本地环境变量") } else { log.Debug("✔ 加载本地环境变量") } loadApp() loadAuth() loadDb() loadRedis() loadLog() loadDebug() loadRemote() loadAlipay() loadWechatPay() loadAliyun() loadSftPay() }