diff --git a/api/core/types/config.go b/api/core/types/config.go index ca11d3a0..199afc60 100644 --- a/api/core/types/config.go +++ b/api/core/types/config.go @@ -25,6 +25,7 @@ type AppConfig struct { AlipayConfig AlipayConfig HuPiPayConfig HuPiPayConfig SmtpConfig SmtpConfig // 邮件发送配置 + JPayConfig JPayConfig // payjs 支付配置 } type SmtpConfig struct { @@ -35,6 +36,15 @@ type SmtpConfig struct { Password string // 发件人邮箱密码 } +// JPayConfig PayJs 支付配置 +type JPayConfig struct { + Enabled bool + AppId string // 商户 ID + PrivateKey string // 私钥 + ApiURL string // API 网关 + NotifyURL string // 异步回调地址 +} + type ChatPlusApiConfig struct { ApiURL string AppId string diff --git a/api/handler/prompt_handler.go b/api/handler/prompt_handler.go index 2d01fad3..13aea57a 100644 --- a/api/handler/prompt_handler.go +++ b/api/handler/prompt_handler.go @@ -5,6 +5,8 @@ import ( "chatplus/core/types" "chatplus/utils" "chatplus/utils/resp" + "fmt" + "github.com/gin-gonic/gin" "gorm.io/gorm" ) @@ -33,7 +35,7 @@ func (h *PromptHandler) Rewrite(c *gin.Context) { return } - content, err := utils.OpenAIRequest(h.db, data.Prompt, rewritePromptTemplate) + content, err := utils.OpenAIRequest(h.db, fmt.Sprintf(rewritePromptTemplate, data.Prompt), h.App.Config.ProxyURL) if err != nil { resp.ERROR(c, err.Error()) return @@ -51,7 +53,7 @@ func (h *PromptHandler) Translate(c *gin.Context) { return } - content, err := utils.OpenAIRequest(h.db, data.Prompt, translatePromptTemplate) + content, err := utils.OpenAIRequest(h.db, fmt.Sprintf(translatePromptTemplate, data.Prompt), h.App.Config.ProxyURL) if err != nil { resp.ERROR(c, err.Error()) return diff --git a/api/handler/test_handler.go b/api/handler/test_handler.go index 58c30422..a8d90999 100644 --- a/api/handler/test_handler.go +++ b/api/handler/test_handler.go @@ -6,6 +6,7 @@ import ( "chatplus/utils" "chatplus/utils/resp" "fmt" + "github.com/gin-gonic/gin" "gorm.io/gorm" ) @@ -20,7 +21,7 @@ func NewTestHandler(db *gorm.DB, snowflake *service.Snowflake) *TestHandler { } func (h *TestHandler) Test(c *gin.Context) { - h.initMjTaskId(c) + h.initUserNickname(c) } func (h *TestHandler) initUserNickname(c *gin.Context) { diff --git a/api/service/payment/payjs_service.go b/api/service/payment/payjs_service.go new file mode 100644 index 00000000..60db4a91 --- /dev/null +++ b/api/service/payment/payjs_service.go @@ -0,0 +1,81 @@ +package payment + +import ( + "chatplus/core/types" + "chatplus/utils" + "crypto/md5" + "encoding/hex" + "fmt" + "io" + "net/http" + "net/url" + "sort" + "strings" +) + +type PayJS struct { + config *types.JPayConfig +} + +func NewPayJS(appConfig *types.AppConfig) *PayJS { + return &PayJS{ + config: &appConfig.JPayConfig, + } +} + +type JPayReq struct { + TotalFee int `json:"total_fee"` + OutTradeNo string `json:"out_trade_no"` + Body string `json:"body"` + NotifyURL string `json:"notify_url"` +} + +func sign(params url.Values, priKey string) string { + params.Del(`sign`) + var keys = make([]string, 0, 0) + for key := range params { + if params.Get(key) != `` { + keys = append(keys, key) + } + } + sort.Strings(keys) + + var pList = make([]string, 0, 0) + for _, key := range keys { + var value = strings.TrimSpace(params.Get(key)) + if len(value) > 0 { + pList = append(pList, key+"="+value) + } + } + var src = strings.Join(pList, "&") + src += "&key=" + priKey + + md5bs := md5.Sum([]byte(src)) + md5res := hex.EncodeToString(md5bs[:]) + return strings.ToUpper(md5res) +} + +func (pj *PayJS) Pay(param JPayReq) (string, error) { + var p = url.Values{} + encode := utils.JsonEncode(param) + m := make(map[string]interface{}) + _ = utils.JsonDecode(encode, &m) + for k, v := range m { + p.Add(k, fmt.Sprintf("%v", v)) + } + p.Add("mchid", pj.config.AppId) + + p.Add("sign", sign(p, pj.config.PrivateKey)) + + cli := http.Client{} + r, err := cli.PostForm(pj.config.ApiURL, p) + if err != nil { + return "", err + } + defer r.Body.Close() + bs, err := io.ReadAll(r.Body) + if err != nil { + return "", err + } + return string(bs), nil +}