refactor(card_redeem): 重构卡密兑换模块以支持多品类下单

- 更新 gerror 包引用路径至 v2 版本- 新增 RedeemOrderCardCategory 类型定义,支持 apple、cTrip、walmart 品类- 修改 CardRedeemCookiePlaceOrderInput 结构体字段,使用 OrderId 和 Category 替代 BankOrderId
- 调整 PlaceOrder 控制器逻辑,移除订单查询及金额校验,直接使用请求参数下单-优化 JD 客户端 AppleRecharge 方法实现,更新响应数据解析逻辑
- 升级 go.mod 中 otel 相关依赖版本至 v1.38.0
- 清理 go.mod 和 go.sum 中的冗余依赖项- 重命名 QueryCard 方法注释以提高可读性
This commit is contained in:
danial
2025-10-08 17:36:48 +08:00
parent a3b8e60acf
commit f35dfacbc2
23 changed files with 141 additions and 113 deletions

56
CODEBUDDY.md Normal file
View File

@@ -0,0 +1,56 @@
卡密兑换平台
# CODEBUDDY.md
Commands
- make build
- go run main.go
- make up
- go test ./...
- go test -v ./internal/logic/...
- make image
- make image.push
Architecture
- Entry: main.go initializes OpenTelemetry and starts internal/cmd.Main
- HTTP server and routes: internal/cmd/cmd.go binds controllers under /api with middleware
- Controllers: internal/controller/* grouped by domains (order, merchant, channel, road, road_pool, sys_user_login,
sysUser, sys_payment, user_center, restriction, card_info_*) expose HTTP endpoints
- Business logic: internal/logic/* implements domain logic; heavy use of GoFrame generators (dao/service/enums)
- Data access: internal/dao, internal/model/{do,entity} generated by GoFrame DAO/ORM; MySQL driver enabled in main.go
- SystemV2: internal/systemV2/* newer modules with dao/logic/model/service mirroring v1
- Utilities: utility/* for config, cache (Redis), cron, otel tracing, limiter, notify, token, integrations (tmall, jd,
walmart, ctrip, originalJd)
- Middleware: internal/middleware/* for auth and error handling
- Boot: internal/boot for app init; packed resources under internal/packed
Environments & Running
- Configuration via GoFrame config files under manifest/config and env vars (e.g., serverName)
- Docker Compose profiles provided in docker-compose.yml; backend maps 12401->22401 and mounts manifest/config and logs
- Make tasks rely on GoFrame CLI (gf); Makefile includes hack/hack.mk and auto-installs gf if missing
Code Generation Conventions
- Controllers: make ctrl
- DAO/DO/Entity: make dao
- Services: make service
- Enums: make enums
- Protobuf: make pb / make pbentity
Testing Notes
- Focused tests exist in internal/logic/* (e.g., card_apple_account, card_t_mall_order, limiter)
- Use go test -run to target specific tests when needed
Observability
- OpenTelemetry configured in main.go with service name composed from env serverName; utility/otel handles setup
- Health check endpoints and monitor tasks registered via internal/controller/monitor and utility/monitor
Deployment
- Docker image build/tag via make image; push with make image.push
- Kubernetes kustomize deploy supported via make deploy with overlays under manifest/deploy/kustomize

View File

@@ -29,9 +29,10 @@ type OrderListRes struct {
// PlaceOrderReq 下单接口
type PlaceOrderReq struct {
g.Meta `path:"/cookieInfo/jd/order/placeOrder" tags:"京东ck订单" method:"post" summary:"下单"`
MerchantOrderId string `json:"merchantOrderId" v:"required#merchantOrderId不能为空" description:"银行订单id"`
OrderAmount float64 `json:"orderAmount" v:"required#orderAmount不能为空" description:"订单金额"`
UserAgent string `json:"userAgent" description:"用户代理"`
MerchantOrderId string `json:"merchantOrderId" v:"required#merchantOrderId不能为空" description:"银行订单id"`
OrderAmount float64 `json:"orderAmount" v:"required#orderAmount不能为空" description:"订单金额"`
UserAgent string `json:"userAgent" description:"用户代理"`
Category consts.RedeemOrderCardCategory `json:"category" v:"required|in:apple,cTrip,walmart#类型不能为空|类型不正确" description:"分类"`
}
type PlaceOrderRes struct {

View File

@@ -3,8 +3,8 @@ package v1
import (
"kami/internal/model/entity"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
type LoginUserRecord struct {

5
go.mod
View File

@@ -7,7 +7,6 @@ require (
github.com/bytedance/sonic v1.14.1
github.com/casbin/casbin/v2 v2.127.0
github.com/duke-git/lancet/v2 v2.3.7
github.com/gogf/gf v1.16.9
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3
github.com/gogf/gf/contrib/metric/otelmetric/v2 v2.9.3
github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.3
@@ -25,7 +24,7 @@ require (
github.com/xuri/excelize/v2 v2.9.1
go.opentelemetry.io/otel v1.38.0
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0
go.opentelemetry.io/otel/log v0.14.0
go.opentelemetry.io/otel/sdk v1.38.0
go.opentelemetry.io/otel/sdk/log v0.14.0
@@ -88,7 +87,7 @@ require (
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect

36
go.sum
View File

@@ -1,6 +1,5 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Lofanmi/pinyin-golang v0.0.0-20250305082105-87d20ae3d695 h1:fJzpypkkFwbTiet3kXtZf8BZQi5bk27BGGR0RNkF8Ac=
@@ -29,8 +28,6 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 h1:LdXxtjzvZYhhUaonAaAKArG3pyC67kGL3YY+6hGG8G4=
github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
@@ -44,10 +41,8 @@ github.com/duke-git/lancet/v2 v2.3.7 h1:nnNBA9KyoqwbPm4nFmEFVIbXeAmpqf6IDCH45+HH
github.com/duke-git/lancet/v2 v2.3.7/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
@@ -57,11 +52,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/gogf/gf v1.16.9 h1:Q803UmmRo59+Ws08sMVFOcd8oNpkSWL9vS33hlo/Cyk=
github.com/gogf/gf v1.16.9/go.mod h1:8Q/kw05nlVRp+4vv7XASBsMe9L1tsVKiGoeP2AHnlkk=
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3 h1:P4jrnp+Vmh3kDeaH/kyHPI6rfoMmQD+sPJa716aMbS0=
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3/go.mod h1:yEhfx78wgpxUJhH9C9bWJ7I3JLcVCzUg11A4ORYTKeg=
github.com/gogf/gf/contrib/metric/otelmetric/v2 v2.9.3 h1:PcB+Ugv00fxFGGUyLDRtJ/XJ+pQv5tKku7sZWn8nqJE=
@@ -78,8 +70,6 @@ github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/gomodule/redigo v1.8.5 h1:nRAxCa+SVsyjSBrtZmG/cqb6VbTmuRzpg/PoTFlpumc=
github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -87,10 +77,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
@@ -111,13 +99,10 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg=
@@ -130,7 +115,6 @@ github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5
github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/olekukonko/tablewriter v1.0.9 h1:XGwRsYLC2bY7bNd93Dk51bcPZksWZmLYuaTHR0FqfL8=
github.com/olekukonko/tablewriter v1.0.9/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -171,8 +155,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
@@ -203,15 +185,14 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0 h1:ZIt0ya9/y4WyRIzfLC8hQRRsWg0J9M9GyaGtIMiElZI=
go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0/go.mod h1:F1aJ9VuiKWOlWwKdTYDUp1aoS0HzQxg38/VLxKmhm5U=
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk=
go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ=
go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs=
go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM=
@@ -226,7 +207,6 @@ go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4Y
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA=
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
@@ -255,7 +235,6 @@ golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
@@ -273,12 +252,8 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -301,7 +276,6 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
@@ -335,8 +309,6 @@ google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXn
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -373,6 +373,10 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+n
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk=
go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
@@ -426,6 +430,7 @@ golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY=
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=

View File

@@ -242,3 +242,11 @@ const (
RedeemOrderCallbackStatusSuccess RedeemOrderCallbackStatus = 1
RedeemOrderCallbackStatusFail RedeemOrderCallbackStatus = 2
)
type RedeemOrderCardCategory string
const (
RedeemOrderCardCategoryApple RedeemOrderCardCategory = "apple"
RedeemOrderCardCategoryCTrip RedeemOrderCardCategory = "cTrip"
RedeemOrderCardCategoryWalmart RedeemOrderCardCategory = "walmart"
)

View File

@@ -7,8 +7,8 @@ import (
"kami/internal/errHandler"
tmall "kami/utility/integration/tmall/api"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/glog"
)

View File

@@ -11,7 +11,7 @@ import (
"kami/internal/service"
"github.com/duke-git/lancet/v2/slice"
"github.com/gogf/gf/errors/gcode"
"github.com/gogf/gf/v2/errors/gcode"
)
func (c *ControllerV1) AccountList(ctx context.Context, req *v1.AccountListReq) (res *v1.AccountListRes, err error) {

View File

@@ -14,34 +14,24 @@ import (
)
func (c *ControllerV1) PlaceOrder(ctx context.Context, req *v1.PlaceOrderReq) (res *v1.PlaceOrderRes, err error) {
// 查询订单是否存在
order, err := service.OrderSummary().GetOneByMerchantUid(ctx, req.MerchantOrderId)
if err != nil || order.Id == 0 {
glog.Error(ctx, "订单不存在", "merchantOrderId", req.MerchantOrderId, err)
return nil, gerror.NewCode(gcode.CodeNotFound, "订单不存在")
}
orderAmount, ok := order.ShowAmount.Float64()
if !ok {
glog.Error(ctx, "订单金额错误", "merchantOrderId", req.MerchantOrderId, "orderAmount", order.ShowAmount)
return nil, gerror.NewCode(gcode.CodeInvalidRequest, "订单金额错误")
}
glog.Info(ctx, "下单", "merchantOrderId", req.MerchantOrderId, "bankOrderId", order.BankOrderId, "orderAmount", orderAmount)
// 下单
orderInfo, err := service.CardRedeemCookie().PlaceOrder(ctx, &model.CardRedeemCookiePlaceOrderInput{
BankOrderId: order.BankOrderId,
OrderAmount: orderAmount,
OrderId: req.MerchantOrderId,
OrderAmount: req.OrderAmount,
UserAgent: req.UserAgent,
Category: req.Category,
}, nil)
if err != nil {
glog.Error(ctx, "下单失败", "merchantOrderId", req.MerchantOrderId, err)
glog.Error(ctx, "下单失败", req.MerchantOrderId, err)
return res, gerror.NewCode(gcode.CodeOperationFailed, "下单失败")
}
if orderInfo.JdOrder.WebPayLink == "" {
glog.Error(ctx, "下单失败", req.MerchantOrderId)
return res, gerror.NewCode(gcode.CodeOperationFailed, "下单失败")
}
glog.Info(ctx, "下单成功", "merchantOrderId", req.MerchantOrderId, "orderInfo", orderInfo)
glog.Info(ctx, "下单成功", req.MerchantOrderId, orderInfo)
res = &v1.PlaceOrderRes{
WxPay: orderInfo.JdOrder.WebPayLink,

View File

@@ -9,11 +9,11 @@ import (
"kami/utility/config"
"time"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtime"
"github.com/duke-git/lancet/v2/pointer"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/v2/database/gdb"
)

View File

@@ -21,12 +21,13 @@ import (
// PlaceOrder 下单
func (s *sCardRedeemCookie) PlaceOrder(ctx context.Context, input *model.CardRedeemCookiePlaceOrderInput, tx gdb.TX) (output *model.CardRedeemCookePlaceOrderOutput, err error) {
gmlock.Lock("card_redeem_cookie_order_place_order_" + input.BankOrderId)
defer gmlock.Unlock("card_redeem_cookie_order_place_order_" + input.BankOrderId)
gmlock.Lock("card_redeem_cookie_order_place_order_" + input.OrderId)
defer gmlock.Unlock("card_redeem_cookie_order_place_order_" + input.OrderId)
output = &model.CardRedeemCookePlaceOrderOutput{}
orderInfo, _ := s.GetOrderByBankOrderId(ctx, input.BankOrderId, tx)
orderInfo, _ := s.GetOrderByBankOrderId(ctx, input.OrderId, tx)
if pointer.IsNil(orderInfo) || orderInfo.Id <= 0 {
orderInfo, _ = s.placeNewOrder(ctx, input, nil)
orderInfo, _ = s.placeNewOrder(ctx, input, input.Category, nil)
}
if consts.CardRedeemCookieOrderStatus(orderInfo.Status) == consts.CardRedeemCookieOrderStatusPlaceSuccess {
output.V1CardRedeemCookieOrder = *orderInfo
@@ -34,14 +35,14 @@ func (s *sCardRedeemCookie) PlaceOrder(ctx context.Context, input *model.CardRed
output.JdOrder = *jdOrder
return
}
orderInfo, _ = s.placeExistOrder(ctx, input.UserAgent, orderInfo, tx)
orderInfo, _ = s.placeExistOrder(ctx, input.UserAgent, orderInfo, input.Category, tx)
output.V1CardRedeemCookieOrder = *orderInfo
return
}
// 处理已有订单
func (s *sCardRedeemCookie) placeExistOrder(ctx context.Context, userAgent string, input *entity.V1CardRedeemCookieOrder, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
cookieInfo, jdOrder, err := s.placeJdOrder(ctx, input.OrderNo, userAgent, input.OrderAmount, tx)
func (s *sCardRedeemCookie) placeExistOrder(ctx context.Context, userAgent string, input *entity.V1CardRedeemCookieOrder, category consts.RedeemOrderCardCategory, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
cookieInfo, jdOrder, err := s.placeJdOrder(ctx, input.OrderNo, userAgent, input.OrderAmount, category, tx)
if pointer.IsNil(cookieInfo) {
cookieInfo = &entity.V1CardRedeemCookieInfo{}
@@ -76,20 +77,18 @@ func (s *sCardRedeemCookie) placeExistOrder(ctx context.Context, userAgent strin
}
// 处理新订单
func (s *sCardRedeemCookie) placeNewOrder(ctx context.Context, input *model.CardRedeemCookiePlaceOrderInput, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
func (s *sCardRedeemCookie) placeNewOrder(ctx context.Context, input *model.CardRedeemCookiePlaceOrderInput, category consts.RedeemOrderCardCategory, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
orderNo := utils.GenerateRandomUUID()
m := dao.V1CardRedeemCookieOrder.Ctx(ctx).DB(config.GetDatabaseV1())
if tx != nil {
m = m.TX(tx)
}
err = m.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
status := consts.CardRedeemCookieOrderStatusInit
_, err = m.Ctx(ctx).TX(tx).Insert(do.V1CardRedeemCookieOrder{
OrderNo: orderNo,
Status: status,
BankOrderId: input.BankOrderId,
BankOrderId: input.OrderId,
OrderAmount: input.OrderAmount,
})
if err != nil {
@@ -104,13 +103,13 @@ func (s *sCardRedeemCookie) placeNewOrder(ctx context.Context, input *model.Card
orderInfo := do.V1CardRedeemCookieOrder{}
accountInfo, jdOrder, err := s.placeJdOrder(ctx, orderNo, input.UserAgent, input.OrderAmount, tx)
accountInfo, jdOrder, err := s.placeJdOrder(ctx, orderNo, input.UserAgent, input.OrderAmount, category, tx)
if err != nil {
orderInfo.Note = err.Error()
glog.Error(ctx, "下单失败", err)
orderInfo.Status = consts.CardRedeemCookieOrderStatusPlaceFail
} else if pointer.IsNil(jdOrder) || pointer.IsNil(accountInfo) {
glog.Error(ctx, "下单失败jdOrder", jdOrder)
glog.Error(ctx, "下单失败", jdOrder)
orderInfo.Status = consts.CardRedeemCookieOrderStatusPlaceFail
} else {
orderInfo.Status = consts.CardRedeemCookieOrderStatusPlaceSuccess

View File

@@ -2,7 +2,6 @@ package cardredeemcookie
import (
"context"
"fmt"
v1 "kami/api/card_info_apple/v1"
"kami/internal/consts"
"kami/internal/dao"
@@ -15,18 +14,18 @@ import (
"kami/utility/utils"
"time"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gtime"
"github.com/duke-git/lancet/v2/pointer"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/os/glog"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/util/gconv"
)
// 京东订单相关
func (s *sCardRedeemCookie) placeJdOrder(ctx context.Context, orderNo string, userAgent string, orderAmount float64, tx gdb.TX) (accountInfo *entity.V1CardRedeemCookieInfo, output *originalJd.AppleRechargeResp, err error) {
func (s *sCardRedeemCookie) placeJdOrder(ctx context.Context, orderNo string, userAgent string, orderAmount float64, category consts.RedeemOrderCardCategory, tx gdb.TX) (accountInfo *entity.V1CardRedeemCookieInfo, output *originalJd.AppleRechargeResp, err error) {
accountInfo, err = s.ScheduleAccount(ctx, tx)
if err != nil {
return accountInfo, output, err
@@ -61,16 +60,17 @@ func (s *sCardRedeemCookie) placeJdOrder(ctx context.Context, orderNo string, us
_, _ = m.Insert(jdCookieInfo)
}()
glog.Info(ctx, "开始下单", "cookie", accountInfo, "orderNo", orderNo, "orderAmount", orderAmount)
glog.Info(ctx, "开始下单", accountInfo, orderNo, orderAmount, category)
// 下单
jdOrder, err := originalJd.NewClient().AppleRecharge(ctx, &originalJd.AppleRechargeReq{
FacePrice: fmt.Sprintf("%f", orderAmount),
FacePrice: orderAmount,
OrderNum: orderNo,
Category: category,
UserClient: utils.GetClientTypeFromUserAgent(userAgent),
Cookies: accountInfo.Cookie,
})
glog.Info(ctx, "下单成功", "jdOrder", jdOrder)
glog.Info(ctx, jdOrder)
if pointer.IsNil(jdOrder) || jdOrder == nil {
jdOrder = &originalJd.AppleRechargeResp{
Code: consts.CardCookieJDStatusNormalFailed,

View File

@@ -14,7 +14,7 @@ import (
"kami/utility/utils"
"github.com/duke-git/lancet/v2/slice"
"github.com/gogf/gf/container/gset"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/text/gstr"

View File

@@ -49,7 +49,8 @@ type CardRedeemCookieDeleteInput struct {
}
type CardRedeemCookiePlaceOrderInput struct {
BankOrderId string `json:"bankOrderId"`
Category consts.RedeemOrderCardCategory
OrderId string `json:"orderId"`
OrderAmount float64 `json:"orderAmount"`
UserAgent string `json:"userAgent"`
}

View File

@@ -5,9 +5,9 @@ import (
"fmt"
"kami/utility/config"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
)
// GenerateCallbackSign 验证回调签名

View File

@@ -3,41 +3,38 @@ package originalJd
import (
"context"
"encoding/json"
"errors"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/glog"
)
// AppleRecharge 苹果权益充值——下单接口
// AppleRecharge 所有权益充值——下单接口
func (c *Client) AppleRecharge(ctx context.Context, input *AppleRechargeReq) (*AppleRechargeResp, error) {
resp := &AppleRechargeResp{
Status: false,
}
glog.Info(ctx, "苹果权益充值", "input", input)
response, err := c.Client.ContentJson().Post(ctx, "http://jd_babel_channel:8289/jd/app/store", input)
glog.Info(ctx, "苹果权益充值", input)
response, err := c.Client.ContentJson().Post(ctx, "http://jd_babel_channel:8289/jd/app/placeOrder", input)
if err != nil {
return resp, err
}
clientResp := &AppleRechargeClientResp{}
err = json.Unmarshal(response.ReadAll(), clientResp)
glog.Info(ctx, "苹果权益充值", "clientResp", clientResp, response.ReadAllString())
glog.Info(ctx, "苹果权益充值", response.ReadAllString())
if err != nil {
return resp, err
}
resp.Msg = clientResp.Msg
resp.Code = clientResp.Code.JDOrderStatus()
if clientResp.Code != Success {
return resp, errors.New("苹果权益充值失败")
resp = &AppleRechargeResp{
Status: true,
Code: clientResp.Code.JDOrderStatus(),
Deeplink: clientResp.Data.Deeplink,
OrderId: clientResp.Data.OrderId,
PayId: clientResp.Data.PayId,
FacePrice: clientResp.Data.FacePrice,
}
if clientResp.Code != Success {
return resp, gerror.New("苹果权益充值失败")
}
resp.Status = true
resp.Deeplink = clientResp.Data.Deeplink
resp.OrderId = clientResp.Data.OrderId
resp.PayId = clientResp.Data.PayId
resp.FacePrice = clientResp.Data.FacePrice
return resp, nil
}

View File

@@ -68,7 +68,7 @@ func (c *Client) SmsLogin(ctx context.Context, input *SmsLoginReq) (*SmsLoginRes
return resp, nil
}
// 查询卡密
// QueryCard 查询卡密
func (c *Client) QueryCard(ctx context.Context, input *QueryCardReq) (*QueryCardResp, error) {
resp := &QueryCardResp{}

View File

@@ -1,4 +1,3 @@
// 下单模型
package originalJd
import "kami/internal/consts"
@@ -45,10 +44,11 @@ type SmsLoginClientResp struct {
}
type AppleRechargeReq struct {
FacePrice string `json:"face_price"`
OrderNum string `json:"order_num"`
Cookies string `json:"cookies"`
UserClient string `json:"user_client"`
FacePrice float64 `json:"face_price"`
Category consts.RedeemOrderCardCategory `json:"category"`
OrderNum string `json:"order_num"`
Cookies string `json:"cookies"`
UserClient string `json:"user_client"`
}
type AppleRechargeClientResp struct {

View File

@@ -10,12 +10,12 @@ import (
"kami/utility/utils"
"time"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/gclient"
"github.com/gogf/gf/v2/net/gtrace"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"

View File

@@ -14,11 +14,11 @@ import (
"github.com/duke-git/lancet/v2/pointer"
"github.com/duke-git/lancet/v2/retry"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/gclient"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
)

View File

@@ -8,8 +8,7 @@ import (
"strconv"
"time"
"github.com/gogf/gf/util/grand"
"github.com/gogf/gf/v2/util/grand"
"github.com/skip2/go-qrcode"
"github.com/xlzd/gotp"
)

View File

@@ -1,16 +1,17 @@
package utils
import (
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/os/gmlock"
"github.com/gogf/gf/v2/text/gstr"
"github.com/google/uuid"
)
func GenerateRandomUUID() string {
gmlock.Lock("uuid")
defer gmlock.Unlock("uuid")
return gstr.Replace(uuid.NewString(), "-", "")
uid, _ := uuid.NewV7()
return gstr.Replace(uid.String(), "-", "")
}
// TmpEncrypt 临时加密