daShangDao_planA/planB/modules/kfz/kfz.go

249 lines
7.9 KiB
Go

package kfz
import (
"fmt"
"os"
"path/filepath"
"syscall"
"unsafe"
)
// KfzDLL 孔夫子工具DLL结构
type KfzDLL struct {
Dll *syscall.DLL
freeCString *syscall.Proc // 释放C字符串
}
// InitKfzDll 初始化 kfzDLL
func InitKfzDll(url string) (*KfzDLL, error) {
dllPath := filepath.Join(url, "kfz.dll")
if _, err := os.Stat(dllPath); os.IsNotExist(err) {
return nil, fmt.Errorf("kfz DLL 不存在: %s", dllPath)
}
dll, err := syscall.LoadDLL(dllPath)
if err != nil {
return nil, fmt.Errorf("加载pdd DLL 失败: %s", err)
}
gKfzDll := &KfzDLL{
Dll: dll,
freeCString: dll.MustFindProc("FreeCString"),
}
return gKfzDll, nil
}
// PublishGoods 发布商品
func (m *KfzDLL) PublishGoods(appId int, clientSecret, accessToken, goodsAddJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemAdd")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemAdd: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
goodsAddJsonPtr, _ := syscall.BytePtrFromString(goodsAddJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(goodsAddJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// KfzGoodsImageUpload 将图片上传到孔夫子图片空间
func (m *KfzDLL) KfzGoodsImageUpload(appId int, clientSecret, accessToken, filePath string) (string, error) {
proc, err := m.Dll.FindProc("KongfzImageUpload")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzImageUpload: %v", err)
}
//appIdPtr, _ := syscall.BytePtrFromString(appId)
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
goodsAddJsonPtr, _ := syscall.BytePtrFromString(filePath)
savePathPtr, _ := syscall.BytePtrFromString("")
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(goodsAddJsonPtr)),
uintptr(unsafe.Pointer(savePathPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// GetGoodsCategoryList 获取本店商品分类列表
func (m *KfzDLL) GetGoodsCategoryList(appId int, clientSecret, accessToken string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopCategoryNameList")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopCategoryNameList: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// GetCommonCategory 获取公用分类数据
func (m *KfzDLL) GetCommonCategory(appId int, clientSecret, accessToken string) (string, error) {
proc, err := m.Dll.FindProc("KongfzCommonCategory")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzCommonCategory: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// GetGoodsList 获取商品列表
func (m *KfzDLL) GetGoodsList(appId int, clientSecret, accessToken, getGoodsListReqJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemList")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemList: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
getGoodsListReqJsonPtr, _ := syscall.BytePtrFromString(getGoodsListReqJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(getGoodsListReqJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PutOnSale 上架
func (m *KfzDLL) PutOnSale(appId int, clientSecret, accessToken, putOnSaleJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemListing")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemListing: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
putOnSaleJsonPtr, _ := syscall.BytePtrFromString(putOnSaleJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(putOnSaleJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// PutOffSale 下架
func (m *KfzDLL) PutOffSale(appId int, clientSecret, accessToken, putOffSaleJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemDelisting")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemDelisting: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
putOffSaleJsonPtr, _ := syscall.BytePtrFromString(putOffSaleJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(putOffSaleJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// UpdateGoodsStock 修改商品库存
func (m *KfzDLL) UpdateGoodsStock(appId int, clientSecret, accessToken, updateGoodsStockJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemNumberUpdate")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemNumberUpdate: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
updateGoodsStockJsonPtr, _ := syscall.BytePtrFromString(updateGoodsStockJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(updateGoodsStockJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// UpdateGoodsPrice 修改商品价格
func (m *KfzDLL) UpdateGoodsPrice(appId int, clientSecret, accessToken, updateGoodsPriceJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemPriceUpdate")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemPriceUpdate: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
updateGoodsPriceJsonPtr, _ := syscall.BytePtrFromString(updateGoodsPriceJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(updateGoodsPriceJsonPtr)),
)
result := cStr(resultPtr)
return result, nil
}
// DeleteGoods 删除商品
func (m *KfzDLL) DeleteGoods(appId int, clientSecret, accessToken, deleteGoodsJson string) (string, error) {
proc, err := m.Dll.FindProc("KongfzShopItemDelete")
if err != nil {
return "", fmt.Errorf("找不到函数 KongfzShopItemDelete: %v", err)
}
clientSecretPtr, _ := syscall.BytePtrFromString(clientSecret)
accessTokenPtr, _ := syscall.BytePtrFromString(accessToken)
deleteGoodsJsonPtr, _ := syscall.BytePtrFromString(deleteGoodsJson)
resultPtr, _, _ := proc.Call(
uintptr(appId),
uintptr(unsafe.Pointer(clientSecretPtr)),
uintptr(unsafe.Pointer(accessTokenPtr)),
uintptr(unsafe.Pointer(deleteGoodsJsonPtr)),
)
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)
}