Files
hotgo/server/internal/logic/middleware/response.go
2023-05-15 23:17:59 +08:00

122 lines
3.0 KiB
Go
Raw 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 middleware
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
package middleware
import (
"fmt"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/internal/consts"
"hotgo/internal/library/contexts"
"hotgo/internal/library/response"
"hotgo/internal/model/input/payin"
"hotgo/utility/charset"
)
// ResponseHandler HTTP响应预处理
func (s *sMiddleware) ResponseHandler(r *ghttp.Request) {
r.Middleware.Next()
// 模板页面响应
if "text/html" == r.Response.Header().Get("Content-Type") {
r.Middleware.Next()
return
}
// 支付通知响应
if _, ok := s.PayNotifyRoutes[r.Router.Uri]; ok {
s.responsePayNotify(r)
return
}
responseJson(r)
}
// rTemplate 支付通知响应
func (s *sMiddleware) responsePayNotify(r *ghttp.Request) {
var (
ctx = r.Context()
err error
data *payin.PayNotifyModel
)
// 异常
if err = r.GetError(); err != nil {
g.Log("exception").Error(ctx, err)
r.Response.ClearBuffer()
r.Response.WriteStatus(500, err.Error())
return
}
if err = gconv.Scan(r.GetHandlerResponse(), &data); err != nil || data == nil {
g.Log("exception").Errorf(ctx, "middleware.responsePayNotify Scan err:%+v, data:%+v", err, data)
r.Response.ClearBuffer()
r.Response.WriteStatus(500, err.Error())
return
}
switch data.PayType {
case consts.PayTypeAliPay:
response.RText(r, data.Message)
case consts.PayTypeWxPay:
r.Response.ClearBuffer()
r.Response.WriteJson(fmt.Sprintf(`{"code": "%v","message": "%v"}`, data.Code, data.Message))
case consts.PayTypeQQPay:
r.Response.ClearBuffer()
r.Response.Write(`<?xml version="1.0" encoding="UTF-8"?>`)
r.Response.WriteXml(g.Map{
"return_code": data.Message,
})
default:
err = gerror.Newf("无效的支付方式,这可能是没有配置通知回调响应方式导致的:%+v", data)
g.Log("exception").Error(ctx, err)
r.Response.ClearBuffer()
r.Response.WriteStatus(500, err.Error())
}
}
func responseJson(r *ghttp.Request) {
var (
ctx = r.Context()
comResponse = contexts.Get(ctx).Response
code = gcode.CodeOK.Code()
message = "操作成功"
data interface{}
err error
)
// 已存在响应内容且是comResponse返回的时中断运行
if r.Response.BufferLength() > 0 && comResponse != nil {
return
}
if err = r.GetError(); err != nil {
// 记录到自定义错误日志文件
g.Log().Stdout(false).Printf(ctx, "exception:%v", err)
code = gerror.Code(err).Code()
// 是否输出错误到页面
if g.Cfg().MustGet(ctx, "hotgo.debug", true).Bool() {
message = gerror.Current(err).Error()
data = charset.ParseErrStack(err)
} else {
message = consts.ErrorMessage(gerror.Current(err))
}
} else {
data = r.GetHandlerResponse()
}
// 返回固定的友好信息
response.RJson(r, code, message, data)
}