daShangDao_kfzgw-info/pdd/pddDll.go
2025-12-31 17:56:22 +08:00

233 lines
7.2 KiB
Go

package main
import "C"
import (
"fmt"
"os"
"path/filepath"
"syscall"
"unsafe"
)
// pddDLL 拼多多API调用结构体
type pddDLL struct {
dll *syscall.DLL
pddGoodsOuterCatMappingGet *syscall.Proc // 类目预测
pddLogisticsCompaniesGet *syscall.Proc // 快递公司查看
pddErpOrderSync *syscall.Proc // erp打单信息同步
freeCString *syscall.Proc // 释放C字符串
}
// InitPddDLL 初始化pddDLL
func InitPddDLL() (*pddDLL, error) {
dllPath := filepath.Join("pdd", "dll", "pdd.dll")
if _, err := os.Stat(dllPath); os.IsNotExist(err) {
return nil, fmt.Errorf("pdd DLL 不存在: %s", dllPath)
}
if dll, err := syscall.LoadDLL(dllPath); err != nil {
return nil, fmt.Errorf("加载pdd DLL 失败: %s", err)
} else {
return &pddDLL{
dll: dll,
pddGoodsOuterCatMappingGet: dll.MustFindProc("PddGoodsOuterCatMappingGet"),
pddLogisticsCompaniesGet: dll.MustFindProc("PddLogisticsCompaniesGet"),
pddErpOrderSync: dll.MustFindProc("PddErpOrderSync"),
freeCString: dll.MustFindProc("FreeCString"),
}, nil
}
}
// cStr 获取C字符串
func (m *pddDLL) cStr(p uintptr) string {
if p == 0 {
return ""
}
b := []byte{}
for i := uintptr(0); ; i++ {
c := *(*byte)(unsafe.Pointer(p + i))
if c == 0 {
break
}
b = append(b, c)
}
s := string(b)
if m.freeCString != nil {
m.freeCString.Call(p)
}
return s
}
// 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)
info, _, err := 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)),
)
if err != nil && err.Error() != "The operation completed successfully." {
return "", fmt.Errorf("调用函数 PddGoodsOuterCatMappingGet 失败: %v", err)
}
return m.cStr(info), nil
}
// PddLogisticsCompaniesGet 快递公司查看
func (m *pddDLL) PddLogisticsCompaniesGet(clientId, clientSecret string) (string, error) {
proc, err := m.dll.FindProc("PddLogisticsCompaniesGet")
if err != nil {
return "", fmt.Errorf("找不到函数 PddLogisticsCompaniesGet 函数: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
info, _, err := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
)
if err != nil && err.Error() != "The operation completed successfully." {
return "", fmt.Errorf("调用函数 PddGoodsOuterCatMappingGet 失败: %v", err)
}
return m.cStr(info), nil
}
// PddErpOrderSync erp打单信息同步
func (m *pddDLL) PddErpOrderSync(clientId, clientSecret, accessToken, logisticsId,
orderSn, orderState, waybillNo string) (string, error) {
proc, err := m.dll.FindProc("PddErpOrderSync")
if err != nil {
return "", fmt.Errorf("找不到函数 PddErpOrderSync 函数: %v", err)
}
clientIdPtr, _ := syscall.BytePtrFromString(clientId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
logisticsIdPtr, _ := syscall.BytePtrFromString(logisticsId)
orderSnPtr, _ := syscall.BytePtrFromString(orderSn)
orderStatePtr, _ := syscall.BytePtrFromString(orderState)
waybillNoPtr, _ := syscall.BytePtrFromString(waybillNo)
info, _, err := proc.Call(
uintptr(unsafe.Pointer(clientIdPtr)),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(logisticsIdPtr)),
uintptr(unsafe.Pointer(orderSnPtr)),
uintptr(unsafe.Pointer(orderStatePtr)),
uintptr(unsafe.Pointer(waybillNoPtr)),
)
if err != nil && err.Error() != "The operation completed successfully." {
return "", fmt.Errorf("调用函数 PddGoodsOuterCatMappingGet 失败: %v", err)
}
return m.cStr(info), nil
}
func main() {
clientId := "203c5a7ba8bd4b8488d5e26f93052642"
clientSecret := "892ffaa86e12b7a3d8d2942b669d9aa520ad8179"
accessToken := "bd96218bb2a146779701506dc1e5e5c478692539"
//outerCatId := "15543"
//outerCatName := "书籍/杂志/报纸"
//outerGoodsName := "书籍医家金鉴 妇产科学卷"
//logisticsId := 0
//orderSn := ""
//orderState := ""
//waybillNo := ""
//logisticsCompany := "德邦"
// 初始化
//dll, err := InitPddDLL()
//if err != nil {
// fmt.Println(err)
//}
// 类目预测
//info, err := dll.PddGoodsOuterCatMappingGet(clientId, clientSecret, accessToken, outerCatId, outerCatName, outerGoodsName)
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println(info)
// 快递公司查看
//get, err := dll.PddLogisticsCompaniesGet(clientId, clientSecret)
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println(get)
//var logisticsResponse LogisticsResponse
//if err := json.Unmarshal([]byte(get), &logisticsResponse); err != nil {
// fmt.Println(err)
//}
//
//var company string
//var available int
//var code string
//for _, logisticsCompanies := range logisticsResponse.LogisticsCompaniesGetResponse.LogisticsCompanies {
// if strings.Contains(logisticsCompanies.LogisticsCompany, logisticsCompany) {
// company = logisticsCompanies.LogisticsCompany
// logisticsId = logisticsCompanies.ID
// available = logisticsCompanies.Available
// code = logisticsCompanies.Code
// break
// }
//}
//fmt.Println("快递公司名称: ", company)
//fmt.Println("快递公司编码: ", logisticsId)
//fmt.Println("是否有效: ", available)
//fmt.Println("物流公司代码: ", code)
//file := "D:\\isbn_images\\result\\9780007935192.jpg"
//open, err := os.Open(file)
//if err != nil {
// fmt.Println(err)
//}
//defer open.Close()
////base := filepath.Base(file)
//// 商品图片上传接口
//upload, err := pddGoodsImgUpload(clientId, clientSecret, accessToken, file)
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println(upload)
//get, err := pddLogisticsCompaniesGet(clientId, clientSecret)
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println(get)
// 脱敏
jsonStr := `[{"data_tag":"251229-272441044622514","encrypted_data":"~AgAAAAPlscEH0psOJAEXpTdsLOWvDJ9bB7IEjIoqNfiDhhJR9NHOxsdZ+PEFluSSCngCikoDU+CP/sSXZJ92ic7+PdNlJNLA7g/6VUMDWF6RvjW9IeRN+lKNarsjWDQR~0~"}]`
//var records []DataList
//err := json.Unmarshal([]byte(jsonStr), &records)
//if err != nil {
// log.Fatal("解析JSON失败:", err)
//}
batch, err := pddOpenDecryptMaskBatch(clientId, clientSecret, accessToken, jsonStr)
if err != nil {
fmt.Println(err)
}
fmt.Println(batch)
}
type DataList struct {
DataTag string `json:"data_tag"`
EncryptedData string `json:"encrypted_data"`
}