小程序虚拟支付

This commit is contained in:
李琦
2026-09-17 17:38:45 +08:00
parent 7c106b69d2
commit 7ea8cdd982
32 changed files with 3499 additions and 88 deletions

View File

@@ -77,3 +77,37 @@ func (c *cAdminAuth) FeedbackList(ctx context.Context, req *v1.FeedbackListReq)
func (c *cAdminAuth) FeedbackHandle(ctx context.Context, req *v1.FeedbackHandleReq) (res *v1.FeedbackHandleRes, err error) {
return logic.AdminFeedbackHandle(ctx, req.Id)
}
// ===== 额度配置(次数包 / 额度设置 / 会员套餐 / 用户周期)=====
func (c *cAdminAuth) QuotaPackList(ctx context.Context, req *v1.QuotaPackListReq) (res *v1.QuotaPackListRes, err error) {
return logic.AdminQuotaPackList(ctx)
}
func (c *cAdminAuth) QuotaPackSave(ctx context.Context, req *v1.QuotaPackSaveReq) (res *v1.QuotaPackSaveRes, err error) {
return logic.AdminQuotaPackSave(ctx, req)
}
func (c *cAdminAuth) QuotaPackToggle(ctx context.Context, req *v1.QuotaPackToggleReq) (res *v1.QuotaPackToggleRes, err error) {
return logic.AdminQuotaPackToggle(ctx, req.Id, req.Value)
}
func (c *cAdminAuth) QuotaSettingGet(ctx context.Context, req *v1.QuotaSettingGetReq) (res *v1.QuotaSettingGetRes, err error) {
return logic.AdminQuotaSettingGet(ctx)
}
func (c *cAdminAuth) QuotaSettingSave(ctx context.Context, req *v1.QuotaSettingSaveReq) (res *v1.QuotaSettingSaveRes, err error) {
return logic.AdminQuotaSettingSave(ctx, req.PeriodDays)
}
func (c *cAdminAuth) PlanList(ctx context.Context, req *v1.PlanListReq) (res *v1.PlanListRes, err error) {
return logic.AdminPlanList(ctx)
}
func (c *cAdminAuth) PlanSave(ctx context.Context, req *v1.PlanSaveReq) (res *v1.PlanSaveRes, err error) {
return logic.AdminPlanSave(ctx, req)
}
func (c *cAdminAuth) UserQuotaPeriod(ctx context.Context, req *v1.UserQuotaPeriodReq) (res *v1.UserQuotaPeriodRes, err error) {
return logic.AdminUserQuotaPeriod(ctx, req.UserId, req.PeriodDays)
}

View File

@@ -0,0 +1,50 @@
package controller
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
v1 "tool-api/api/user/v1"
"tool-api/internal/logic"
)
// cMember 会员购买相关接口(需用户登录)
type cMember struct{}
var Member = &cMember{}
func (c *cMember) MemberCenter(ctx context.Context, req *v1.MemberCenterReq) (res *v1.MemberCenterRes, err error) {
return logic.MemberCenter(ctx)
}
func (c *cMember) MemberOrderCreate(ctx context.Context, req *v1.MemberOrderCreateReq) (res *v1.MemberOrderCreateRes, err error) {
return logic.MemberOrderCreate(ctx, req.PlanKey, req.Code)
}
func (c *cMember) MemberOrderCheck(ctx context.Context, req *v1.MemberOrderCheckReq) (res *v1.MemberOrderCheckRes, err error) {
return logic.MemberOrderCheck(ctx, req.OutTradeNo)
}
func (c *cMember) MemberOrders(ctx context.Context, req *v1.MemberOrdersReq) (res *v1.MemberOrdersRes, err error) {
return logic.MemberOrders(ctx, req.Limit)
}
// PayNotify 虚拟支付「发货推送」回调(平台调用,无 token,需在 MP 后台配置该 URL)。
//
// 返回 XML:成功 <ErrCode>0</ErrCode>,失败非 0 触发平台重试(最多 15 次)。
// 这里直接写响应体,Response 中间件检测到已有输出便不再包装成 JSON。
//
// 刻意写成包级函数而不是 cMember 的方法:GoFrame 的 group.Bind 会把控制器上
// 签名为 func(*ghttp.Request) 的方法一并自动注册成路由,那样就会多出一条
// `/pay-notify`(且落在 UserAuth 组里)—— 平台回调不带 token,这条路由纯属多余入口。
func PayNotify(r *ghttp.Request) {
ack, err := logic.PayNotifyHandle(r.Context(), r.GetBody())
if err != nil {
g.Log().Errorf(r.Context(), "[xpay] 发货推送处理异常: %v", err)
ack = logic.XPayNotifyAckFail("internal error")
}
r.Response.Header().Set("Content-Type", "application/xml")
r.Response.Write(ack)
}

View File

@@ -0,0 +1,34 @@
package controller
import (
"context"
v1 "tool-api/api/user/v1"
"tool-api/internal/logic"
)
// cQuota 工具额度与次数包(需登录)
type cQuota struct{}
// Quota 额度相关控制器,绑定在用户鉴权分组下
var Quota = &cQuota{}
func (c *cQuota) QuotaMy(ctx context.Context, req *v1.QuotaMyReq) (res *v1.QuotaMyRes, err error) {
return logic.QuotaMy(ctx)
}
func (c *cQuota) QuotaTool(ctx context.Context, req *v1.QuotaToolReq) (res *v1.QuotaToolRes, err error) {
return logic.QuotaToolOf(ctx, req.ToolKey)
}
func (c *cQuota) QuotaConsume(ctx context.Context, req *v1.QuotaConsumeReq) (res *v1.QuotaConsumeRes, err error) {
return logic.QuotaConsume(ctx, req.ToolKey)
}
func (c *cQuota) QuotaPacks(ctx context.Context, req *v1.QuotaPacksReq) (res *v1.QuotaPacksRes, err error) {
return logic.QuotaPacksFor(ctx, req.ToolKey)
}
func (c *cQuota) QuotaOrderCreate(ctx context.Context, req *v1.QuotaOrderCreateReq) (res *v1.QuotaOrderCreateRes, err error) {
return logic.QuotaOrderCreate(ctx, req.PackKey, req.ToolKey, req.Code)
}