162 lines
5.8 KiB
Go
162 lines
5.8 KiB
Go
package system
|
||
|
||
import (
|
||
"database/sql/driver"
|
||
"encoding/json"
|
||
|
||
"git.echol.cn/loser/lckt/global"
|
||
)
|
||
|
||
// StringArray 字符串数组类型,用于存储JSON数组
|
||
type StringArray []string
|
||
|
||
// Scan 实现 sql.Scanner 接口
|
||
func (s *StringArray) Scan(value interface{}) error {
|
||
if value == nil {
|
||
*s = nil
|
||
return nil
|
||
}
|
||
bytes, ok := value.([]byte)
|
||
if !ok {
|
||
*s = nil
|
||
return nil
|
||
}
|
||
// 空字符串或 "null" 视为 nil
|
||
if len(bytes) == 0 || string(bytes) == "null" {
|
||
*s = nil
|
||
return nil
|
||
}
|
||
return json.Unmarshal(bytes, s)
|
||
}
|
||
|
||
// Value 实现 driver.Valuer 接口
|
||
func (s StringArray) Value() (driver.Value, error) {
|
||
// 如果是 nil slice,返回 NULL
|
||
if s == nil {
|
||
return nil, nil
|
||
}
|
||
// 否则序列化为 JSON(包括空数组 [])
|
||
return json.Marshal(s)
|
||
}
|
||
|
||
// MarshalJSON 实现 json.Marshaler 接口
|
||
func (s StringArray) MarshalJSON() ([]byte, error) {
|
||
if s == nil {
|
||
return []byte("[]"), nil
|
||
}
|
||
return json.Marshal([]string(s))
|
||
}
|
||
|
||
// PayConfig 支付配置模型
|
||
type PayConfig struct {
|
||
global.GVA_MODEL
|
||
// Name 支付名称(用于显示)
|
||
Name string `gorm:"column:name;type:varchar(50);not null;comment:支付名称" json:"name"`
|
||
// Code 支付编码(唯一标识)
|
||
Code string `gorm:"column:code;type:varchar(50);not null;uniqueIndex;comment:支付编码" json:"code"`
|
||
// Type 支付类型: wechat微信支付, shenqi神奇支付
|
||
Type string `gorm:"column:type;type:varchar(20);not null;comment:支付类型" json:"type"`
|
||
// Enable 是否启用
|
||
Enable bool `gorm:"column:enable;default:false;comment:是否启用" json:"enable"`
|
||
// EnabledModes 启用的支付模式(JSON数组),如 ["h5","jsapi"] 或 ["alipay","wxpay"]
|
||
EnabledModes StringArray `gorm:"column:enabled_modes;type:json;comment:启用的支付模式" json:"enabledModes"`
|
||
// Sort 排序
|
||
Sort int `gorm:"column:sort;default:0;comment:排序" json:"sort"`
|
||
// Remark 备注
|
||
Remark string `gorm:"column:remark;type:varchar(255);comment:备注" json:"remark"`
|
||
|
||
// ========== 微信支付配置字段 ==========
|
||
WechatAppID string `gorm:"column:wechat_app_id;type:varchar(50);comment:微信AppID" json:"wechatAppId"`
|
||
WechatMchID string `gorm:"column:wechat_mch_id;type:varchar(50);comment:微信商户号" json:"wechatMchId"`
|
||
WechatMchApiV3Key string `gorm:"column:wechat_mch_api_v3_key;type:varchar(255);comment:微信APIV3密钥" json:"wechatMchApiV3Key"`
|
||
WechatPrivateKey string `gorm:"column:wechat_private_key;type:text;comment:微信商户私钥" json:"wechatPrivateKey"`
|
||
WechatSerialNo string `gorm:"column:wechat_serial_no;type:varchar(100);comment:微信证书序列号" json:"wechatSerialNo"`
|
||
WechatNotifyURL string `gorm:"column:wechat_notify_url;type:varchar(255);comment:微信回调地址" json:"wechatNotifyUrl"`
|
||
|
||
// ========== 神奇支付配置字段 ==========
|
||
ShenqiPID int `gorm:"column:shenqi_pid;comment:神奇支付商户ID" json:"shenqiPid"`
|
||
ShenqiPrivateKey string `gorm:"column:shenqi_private_key;type:text;comment:神奇支付商户私钥" json:"shenqiPrivateKey"`
|
||
ShenqiPlatformPubKey string `gorm:"column:shenqi_platform_pub_key;type:text;comment:神奇支付平台公钥" json:"shenqiPlatformPubKey"`
|
||
ShenqiNotifyURL string `gorm:"column:shenqi_notify_url;type:varchar(255);comment:神奇支付回调地址" json:"shenqiNotifyUrl"`
|
||
ShenqiReturnURL string `gorm:"column:shenqi_return_url;type:varchar(255);comment:神奇支付同步跳转地址" json:"shenqiReturnUrl"`
|
||
ShenqiBaseURL string `gorm:"column:shenqi_base_url;type:varchar(255);comment:神奇支付API地址" json:"shenqiBaseUrl"`
|
||
}
|
||
|
||
func (PayConfig) TableName() string {
|
||
return "sys_pay_config"
|
||
}
|
||
|
||
// GetAvailableModes 获取可用的支付模式
|
||
// 如果 EnabledModes 为空,返回该支付类型的所有默认模式
|
||
func (p *PayConfig) GetAvailableModes() []string {
|
||
// 如果已配置启用的模式,直接返回
|
||
if len(p.EnabledModes) > 0 {
|
||
return p.EnabledModes
|
||
}
|
||
|
||
// 否则返回默认的所有模式
|
||
switch p.Type {
|
||
case "wechat":
|
||
return []string{"h5", "jsapi"}
|
||
case "shenqi":
|
||
return []string{"alipay", "wxpay"}
|
||
default:
|
||
return []string{}
|
||
}
|
||
}
|
||
|
||
// IsModeEnabled 检查指定模式是否启用
|
||
func (p *PayConfig) IsModeEnabled(mode string) bool {
|
||
availableModes := p.GetAvailableModes()
|
||
for _, m := range availableModes {
|
||
if m == mode {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
// GetWechatConfig 获取微信支付配置
|
||
func (p *PayConfig) GetWechatConfig() *WechatPayConfig {
|
||
return &WechatPayConfig{
|
||
AppID: p.WechatAppID,
|
||
MchID: p.WechatMchID,
|
||
MchApiV3Key: p.WechatMchApiV3Key,
|
||
PrivateKey: p.WechatPrivateKey,
|
||
SerialNo: p.WechatSerialNo,
|
||
NotifyURL: p.WechatNotifyURL,
|
||
}
|
||
}
|
||
|
||
// GetShenqiConfig 获取神奇支付配置
|
||
func (p *PayConfig) GetShenqiConfig() *ShenqiPayConfig {
|
||
return &ShenqiPayConfig{
|
||
PID: p.ShenqiPID,
|
||
PrivateKey: p.ShenqiPrivateKey,
|
||
PlatformPubKey: p.ShenqiPlatformPubKey,
|
||
NotifyURL: p.ShenqiNotifyURL,
|
||
ReturnURL: p.ShenqiReturnURL,
|
||
BaseURL: p.ShenqiBaseURL,
|
||
}
|
||
}
|
||
|
||
// WechatPayConfig 微信支付配置
|
||
type WechatPayConfig struct {
|
||
AppID string `json:"appId"` // 小程序/公众号AppID
|
||
MchID string `json:"mchId"` // 商户号
|
||
MchApiV3Key string `json:"mchApiV3Key"` // API V3密钥
|
||
PrivateKey string `json:"privateKey"` // 商户私钥
|
||
SerialNo string `json:"serialNo"` // 证书序列号
|
||
NotifyURL string `json:"notifyUrl"` // 回调地址
|
||
}
|
||
|
||
// ShenqiPayConfig 神奇支付配置
|
||
type ShenqiPayConfig struct {
|
||
PID int `json:"pid"` // 商户ID
|
||
PrivateKey string `json:"privateKey"` // 商户私钥
|
||
PlatformPubKey string `json:"platformPubKey"` // 平台公钥
|
||
NotifyURL string `json:"notifyUrl"` // 回调地址
|
||
ReturnURL string `json:"returnUrl"` // 同步跳转地址
|
||
BaseURL string `json:"baseUrl"` // API地址
|
||
}
|