daShangDao_planA/planE/modules/pdd/pdd.go

338 lines
11 KiB
Go
Raw Permalink 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 pdd
import (
"fmt"
"os"
"path/filepath"
"syscall"
"unsafe"
)
var (
gPddDll *PddDLL
)
// PddResponse 定义完整的响应结构(包含成功和失败两种情况)
type PddResponse struct {
SuccessResponse *PddSuccessResponse `json:"outer_cat_mapping_get_response,omitempty"`
ErrorResponse *PddErrorResponse `json:"error_response,omitempty"`
}
type PddSuccessResponse struct {
OuterCatMappingGetResponse PddCategoryMappingResponse `json:"outer_cat_mapping_get_response"`
}
// PddCategoryMappingResponse 定义拼多多API响应结构根据文档规范
type PddCategoryMappingResponse struct {
CatID1 int64 `json:"cat_id1"` // 一级类目 ID
CatID2 int64 `json:"cat_id2"` // 二级类目 ID
CatID3 int64 `json:"cat_id3"` // 三级类目 ID
CatID4 int64 `json:"cat_id4"` // 四级类目 ID
RequestID string `json:"request_id"` // 请求 ID
}
// PddDLL 拼多多工具DLL结构
type PddDLL struct {
Dll *syscall.DLL
pddGoodsOuterCatMappingGet *syscall.Proc // 类目预测
freeCString *syscall.Proc // 释放C字符串
}
type PddErrorResponse struct {
ErrorCode int64 `json:"error_code"` // 错误码
ErrorMsg string `json:"error_msg"` // 错误信息
SubCode *string `json:"sub_code"` // 子错误码
SubMsg string `json:"sub_msg"` // 子错误信息
RequestID string `json:"request_id"` // 请求ID
}
// InitPddDll 初始化 pddDLL
func InitPddDll(url string) (*PddDLL, error) {
dllPath := filepath.Join(url, "pdd.dll")
if _, err := os.Stat(dllPath); os.IsNotExist(err) {
return nil, fmt.Errorf("pdd DLL 不存在: %s", dllPath)
}
dll, err := syscall.LoadDLL(dllPath)
if err != nil {
return nil, fmt.Errorf("加载pdd DLL 失败: %s", err)
}
gPddDll = &PddDLL{
Dll: dll,
pddGoodsOuterCatMappingGet: dll.MustFindProc("PddGoodsOuterCatMappingGet"),
freeCString: dll.MustFindProc("FreeCString"),
}
return gPddDll, nil
}
// PddGoodsOuterCatMappingGet 类目预测
func (m *PddDLL) PddGoodsOuterCatMappingGet(clientId, clientSecret, accessToken,
outerCatId, outerCatName, outerGoodsName string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsOuterCatMappingGet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsOuterCatMappingGet: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
outerCatIdPtr, _ := syscall.BytePtrFromString(outerCatId)
outerCatNamePtr, _ := syscall.BytePtrFromString(outerCatName)
outerGoodsNamePtr, _ := syscall.BytePtrFromString(outerGoodsName)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(outerCatIdPtr)),
uintptr(unsafe.Pointer(outerCatNamePtr)),
uintptr(unsafe.Pointer(outerGoodsNamePtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsAdd 商品新增
func (m *PddDLL) PddGoodsAdd(clientId, clientSecret, accessToken, goodsAddJson string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsAdd")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsAdd: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
goodsAddJsonPtr, _ := syscall.BytePtrFromString(goodsAddJson)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(goodsAddJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// cStr 将 C 字符串指针转换为 Go 字符串
func cStr(ptr uintptr) string {
if ptr == 0 {
return ""
}
var b []byte
for {
c := *(*byte)(unsafe.Pointer(ptr))
if c == 0 {
break
}
b = append(b, c)
ptr++
}
return string(b)
}
// PddGoodsSpecIdGet 生成商家自定义的规格
func (m *PddDLL) PddGoodsSpecIdGet(clientId, clientSecret, accessToken, parentSpecId, specName string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsSpecIdGet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsSpecIdGet: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
parentSpecIdPtr, _ := syscall.BytePtrFromString(parentSpecId)
specNamePtr, _ := syscall.BytePtrFromString(specName)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(parentSpecIdPtr)),
uintptr(unsafe.Pointer(specNamePtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsCommitDetailGet 获取商品提交的商品详情
func (m *PddDLL) PddGoodsCommitDetailGet(clientId, clientSecret, accessToken, goodsCommitId, goodsId string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsCommitDetailGet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsCommitDetailGet: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
goodsCommitIdPtr, _ := syscall.BytePtrFromString(goodsCommitId)
goodsIdPtr, _ := syscall.BytePtrFromString(goodsId)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(goodsCommitIdPtr)),
uintptr(unsafe.Pointer(goodsIdPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddTimeGet 获取拼多多系统时间
func (m *PddDLL) PddTimeGet(clientId, clientSecret, accessToken string) (string, error) {
proc, err := m.Dll.FindProc("PddTimeGet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsCommitDetailGet: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsImageUpload 上传图片
func (m *PddDLL) PddGoodsImageUpload(clientId, clientSecret, accessToken, imgBase64 string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsImageUpload")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsImageUpload: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
imgBase64Ptr, _ := syscall.BytePtrFromString(imgBase64)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(imgBase64Ptr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsListGet 获取店铺商品
func (m *PddDLL) PddGoodsListGet(clientId, clientSecret, accessToken string, params string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsListGet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsListGet: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
paramsPtr, _ := syscall.BytePtrFromString(params)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(paramsPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsSaleStatusSet 设置上下架状态
func (m *PddDLL) PddGoodsSaleStatusSet(clientId, clientSecret, accessToken, params string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsSaleStatusSet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsSaleStatusSet: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
paramsPtr, _ := syscall.BytePtrFromString(params)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(paramsPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddDeleteGoodsCommit 删除商品
func (m *PddDLL) PddDeleteGoodsCommit(clientId, clientSecret, accessToken, params string) (string, error) {
proc, err := m.Dll.FindProc("PddDeleteGoodsCommit")
if err != nil {
return "", fmt.Errorf("找不到函数 PddDeleteGoodsCommit: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
paramsPtr, _ := syscall.BytePtrFromString(params)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(paramsPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsQuantityUpdate 更新库存
func (m *PddDLL) PddGoodsQuantityUpdate(clientId, clientSecret, accessToken, params string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsQuantityUpdate")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsQuantityUpdate: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
paramsPtr, _ := syscall.BytePtrFromString(params)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(paramsPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PddGoodsSkuPriceUpdate 更新价格
func (m *PddDLL) PddGoodsSkuPriceUpdate(clientId, clientSecret, accessToken, params string) (string, error) {
proc, err := m.Dll.FindProc("PddGoodsSkuPriceUpdate")
if err != nil {
return "", fmt.Errorf("找不到函数 PddGoodsSkuPriceUpdate: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
paramsPtr, _ := syscall.BytePtrFromString(params)
resultPtr, _, _ := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(paramsPtr)),
)
result := cStr(resultPtr)
return result, nil
}