Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
L
library
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
stbz
library
Commits
f21630ce
提交
f21630ce
authored
3月 24, 2025
作者:
屈传平
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ikucun
上级
3e6bc5ce
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
202 行增加
和
28 行删除
+202
-28
main.go
main.go
+20
-0
ikucun.go
upstream/ikucun/ikucun.go
+142
-28
ikucun_activity.go
upstream/ikucun/ikucun_activity.go
+40
-0
没有找到文件。
main.go
0 → 100644
浏览文件 @
f21630ce
package
main
import
(
"context"
"gitlab.jxhh.com/stbz/library.git/upstream/ikucun"
)
func
main
()
{
config
:=
ikucun
.
Config
{}
config
.
AppSecret
=
"d6bfa503b81641c88a8ec22ff1728e44"
config
.
AppId
=
"7dca552382b0407f8b7ebc965d53e72e"
config
.
AccessToken
=
"efa79a299fec4ef58a606486544fe30d"
config
.
ApiUrl
=
"https://openapi-stable.akucun.com/route/rest"
ikucun
.
New
(
&
config
)
activityList
:=
ikucun
.
ActivityListReq
{}
activityList
.
PageIndex
=
"1"
activityList
.
PageSize
=
"10"
ikucun
.
Activity
.
List
(
context
.
Background
(),
activityList
)
}
upstream/ikucun/ikucun.go
浏览文件 @
f21630ce
...
...
@@ -2,62 +2,176 @@ package ikucun
import
(
"context"
"github.com/gogf/gf/crypto/gsha1"
"crypto/sha1"
"encoding/hex"
"fmt"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"math/rand"
"net/url"
"sort"
"strings"
"time"
)
var
server
*
Config
func
New
(
req
*
Config
)
{
server
=
req
return
}
const
pkgName
=
"ikucun"
type
Config
struct
{
AppId
string
AppSecret
string
ApiUrl
string
AppId
string
AppSecret
string
ApiUrl
string
AccessToken
string
}
// 生成随机 nonce 字符串 (等效 JS 的 makeNonceStr)
func
makeNonceStr
()
string
{
str
:=
"abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789"
rand
.
Seed
(
time
.
Now
()
.
UnixNano
())
// 初始化随机数种子
// 原始有效字符集(排除易混淆字符)
const
baseStr
=
"abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789"
// 打乱字符串
shuffledStr
:=
shuffleString
(
str
)
// 打乱字符顺序(Go 的稳定洗牌算法)
shuffled
:=
[]
rune
(
baseStr
)
rand
.
Seed
(
time
.
Now
()
.
UnixNano
())
rand
.
Shuffle
(
len
(
shuffled
),
func
(
i
,
j
int
)
{
shuffled
[
i
],
shuffled
[
j
]
=
shuffled
[
j
],
shuffled
[
i
]
})
// 随机截取 10 位字符
start
:=
rand
.
Intn
(
len
(
shuffled
)
-
10
)
return
string
(
shuffled
[
start
:
start
+
10
])
}
// 随机起始位置
startIndex
:=
rand
.
Intn
(
len
(
shuffledStr
)
-
10
)
// 构建签名前字符串 (等效 JS 的 beforeSignBuild)
func
beforeSignBuild
(
nonceStr
,
interfaceName
string
,
queryParams
map
[
string
]
string
,
body
string
)
string
{
// 处理空参数
if
queryParams
==
nil
{
queryParams
=
make
(
map
[
string
]
string
)
}
// 截取 10 位字符
return
shuffledStr
[
startIndex
:
startIndex
+
10
]
// 准备 POST 参数
postParams
:=
make
(
map
[
string
]
string
)
if
body
!=
""
{
postParams
[
"body"
]
=
body
}
// 获取公共参数
appSecret
:=
server
.
AppSecret
timestamp
:=
time
.
Now
()
.
Unix
()
// 直接获取秒级时间戳
commonParams
:=
map
[
string
]
string
{
"appid"
:
queryParams
[
"appid"
],
"noncestr"
:
nonceStr
,
"timestamp"
:
fmt
.
Sprintf
(
"%d"
,
timestamp
),
"version"
:
queryParams
[
"version"
],
"appsecret"
:
appSecret
,
"format"
:
queryParams
[
"json"
],
"interfaceName"
:
interfaceName
,
}
// 合并参数(注意合并顺序)
allParams
:=
make
(
map
[
string
]
string
)
for
k
,
v
:=
range
commonParams
{
allParams
[
k
]
=
v
}
for
k
,
v
:=
range
queryParams
{
allParams
[
k
]
=
v
}
for
k
,
v
:=
range
postParams
{
allParams
[
k
]
=
v
}
// 按键名排序
keys
:=
make
([]
string
,
0
,
len
(
allParams
))
for
k
:=
range
allParams
{
keys
=
append
(
keys
,
k
)
}
sort
.
Strings
(
keys
)
// 构建签名字符串
var
builder
strings
.
Builder
for
i
,
k
:=
range
keys
{
if
i
>
0
{
builder
.
WriteString
(
"&"
)
}
builder
.
WriteString
(
fmt
.
Sprintf
(
"%s=%s"
,
k
,
allParams
[
k
]))
}
return
builder
.
String
()
}
// 打乱字符串
func
shuffleString
(
str
string
)
string
{
strRunes
:=
[]
rune
(
str
)
rand
.
Shuffle
(
len
(
strRunes
),
func
(
i
,
j
int
)
{
strRunes
[
i
],
strRunes
[
j
]
=
strRunes
[
j
],
strRunes
[
i
]
})
return
string
(
strRunes
)
func
getQueryParams
(
interfaceName
,
body
string
)
map
[
string
]
string
{
// 生成 nonce 并添加到查询参数
nonceStr
:=
makeNonceStr
()
timestamp
:=
time
.
Now
()
.
Unix
()
// 直接获取秒级时间戳
queryParams
:=
map
[
string
]
string
{
"appid"
:
server
.
AppId
,
"version"
:
"1.0"
,
"format"
:
"json"
,
"timestamp"
:
fmt
.
Sprintf
(
"%d"
,
timestamp
),
"interfaceName"
:
interfaceName
,
"accessToken"
:
server
.
AccessToken
,
// 其他查询参数...
}
queryParams
[
"noncestr"
]
=
nonceStr
// 构建签名前字符串
signStr
:=
beforeSignBuild
(
nonceStr
,
interfaceName
,
queryParams
,
body
,
)
// 计算 SHA1 签名
hasher
:=
sha1
.
New
()
hasher
.
Write
([]
byte
(
signStr
))
sign
:=
hex
.
EncodeToString
(
hasher
.
Sum
(
nil
))
// 添加签名到查询参数
queryParams
[
"sign"
]
=
sign
//res := gsha1.Encrypt(req)
return
queryParams
}
func
sign
(
req
string
)
string
{
res
:=
gsha1
.
Encrypt
(
req
)
return
res
// 处理 interface{} 类型的值
func
mapToSortedQuery
(
params
map
[
string
]
string
)
string
{
if
len
(
params
)
==
0
{
return
""
}
keys
:=
make
([]
string
,
0
,
len
(
params
))
for
k
:=
range
params
{
keys
=
append
(
keys
,
k
)
}
sort
.
Strings
(
keys
)
var
builder
strings
.
Builder
for
i
,
k
:=
range
keys
{
if
i
>
0
{
builder
.
WriteByte
(
'&'
)
}
builder
.
WriteString
(
url
.
QueryEscape
(
k
))
builder
.
WriteByte
(
'='
)
builder
.
WriteString
(
url
.
QueryEscape
(
params
[
k
]))
}
return
builder
.
String
()
}
func
post
(
ctx
context
.
Context
,
method
string
,
req
interface
{})
(
res
string
,
err
error
)
{
Start
:=
gtime
.
TimestampMilli
()
reqMap
:=
gconv
.
Map
(
req
)
reqMap
[
"appId"
]
=
server
.
AppId
param
:=
gjson
.
New
(
reqMap
)
Url
:=
server
.
ApiUrl
+
method
param
:=
gjson
.
New
(
req
)
queryParam
:=
getQueryParams
(
method
,
param
.
MustToJsonString
())
Url
:=
server
.
ApiUrl
+
"?"
+
mapToSortedQuery
(
queryParam
)
Request
:=
g
.
Client
()
Request
.
SetHeader
(
"Content-Type"
,
"application/json"
)
Request
.
SetHeader
(
"sign"
,
sign
(
param
.
MustToJsonString
()))
resp
,
err
:=
Request
.
Timeout
(
time
.
Second
*
5
)
.
Post
(
Url
,
param
.
MustToJsonString
())
defer
func
()
{
_
=
resp
.
Close
()
...
...
upstream/ikucun/ikucun_activity.go
0 → 100644
浏览文件 @
f21630ce
package
ikucun
import
(
"context"
"github.com/gogf/gf/encoding/gjson"
)
type
activityIkc
struct
{
}
//Activity 活动
var
Activity
=
activityIkc
{}
type
ActivityListReq
struct
{
PageIndex
string
`json:"pageIndex"`
PageSize
string
`json:"pageSize"`
}
type
ActivityListRes
struct
{
Code
string
`json:"code"`
Success
bool
`json:"success"`
Message
string
`json:"message"`
Data
struct
{
ActivityList
[]
struct
{
ActivityId
string
`json:"activityId"`
StartTime
string
`json:"startTime"`
EndTime
string
`json:"endTime"`
ActiveType
int
`json:"activeType"`
UpDownStatus
int
`json:"upDownStatus"`
}
`json:"activityList"`
}
`json:"data"`
}
//List 列表
func
(
*
activityIkc
)
List
(
ctx
context
.
Context
,
req
ActivityListReq
)
(
res
*
ActivityListRes
,
err
error
)
{
method
:=
"mengxiang.supply.consignment.activity.search"
result
,
err
:=
post
(
ctx
,
method
,
req
)
_
=
gjson
.
New
(
result
)
.
Scan
(
&
res
)
return
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论