package jdshopapi import ( "encoding/base64" "encoding/json" "fmt" "git.rosy.net.cn/baseapi/utils" ) type FindShopCategoriesResult struct { CID int64 `json:"cid"` //123456 分类编号 VenderID int `json:"vender_id"` //123456 商家编号 ShopID int `json:"shop_id"` // 123456 店铺编号 ParentCID int64 `json:"parent_cid"` //123456 父分类编号 OrderNo int `json:"order_no"` //1 分类排序 Name string `json:"name"` //分类1 分类名称 IsOpen bool `json:"is_open"` //false 是否展开子分类(false,不展开;true,展开) IsHomeShow bool `json:"is_home_show"` //false 是否在首页展示分类(false,前台不展示,true前台展示 Status int `json:"status"` // 1 状态(1:删除 1:正常) CreateTime int64 `json:"create_time"` //1394089643000 创建时间 ModifyTime int64 `json:"modify_time"` // 修改时间。每修改一次此值都会发生变化。 } type FindVendorCategoriesResult struct { ID int `json:"id"` Fid int `json:"fid"` AliasName string `json:"aliasName"` Lev int `json:"lev"` IndexID int `json:"indexId"` Status int `json:"status"` Created int64 `json:"created"` Name string `json:"name"` Modified int64 `json:"modified"` } type CreateSkuParamWare struct { Title string `json:"title"` //是 无 商品名称(限制50个字符以内) CategoryID int `json:"categoryId"` //是 无 已经授权过的京东“三级”类目(通过商家授权类目接口获取) // MultiCategoryID int `json:"multiCategoryId"` // 否 无 末级类目ID BrandID int `json:"brandId"` // 否 无 不同类目是否必填情况不同,若发布时提示[此类目要求品牌必填],则表示品牌需要必填。品牌ID获取方式通过商家授权类目接口获取。 // TemplateID int `json:"templateId"` // 否 无 发布时不可设置 TransportID int `json:"transportId"` //是 无 运费模板ID WareStatus int `json:"wareStatus"` // 否 新增仅可以使用 1:从未上架 8:在售(上架) 商品状态1:从未上架 2:自主下架 4:系统下架 8:在售 513:从未上架 待审核 514:自主下架 待审核 516:系统下架 待审核 520:在售 待审核 1025:从未上架 审核不通过 暂时没用 1026:自主下架 审核不通过 暂时没用 1028:系统下架 审核不通过 1032:在售 审核不通过 OuterID string `json:"outerId"` // 否 无 商品外部ID,商家自行设置的ID(便于关联京东商品) VenderID int `json:"venderId"` Is7ToReturn int `json:"is7ToReturn"` // 0 不支持,1 支持7天, 2支持90天 // ItemNum string `json:"itemNum"` // 否 无 商品货号 // BarCode string `json:"barCode"` // 否 无 商品的条形码.UPC码,SN码,PLU码统称为条形码 // WareLocation int `json:"wareLocation"` // 否 无 商品产出地区 // Delivery int `json:"delivery"` // 否 无 商品发货地 // PromiseID int `json:"promiseId"` // 否 无 配送时效 // adWords // 否 无 商品广告词对象 (单品页显示的优先级低于促销广告词) // Wrap string `json:"wrap"` //否 无 包装规格(已废弃) // PackListing string `json:"packListing"` // 否 无 商品包装清单 Length int `json:"length"` // 否 无 商品长度,单位mm。根据类目区分 是 否必填 Width int `json:"width"` // 否 无 商品宽度,单位mm。根据类目区分 是 否必填 Height int `json:"height"` // 否 无 商品高度,单位mm。根据类目区分 是 否必填 Weight int `json:"weight"` // 否 无 商品重量,单位kg。根据类目区分 是 否必填 // Props []struct { // AttrID string `json:"attrID"` // 否 无 属性ID // AttrValues string `json:"attrValues"` //否 无 属性值ID数组 // } `json:"props"` // 否 无 属性列表(已废弃 请使用multiCateProps,已经按照类目限制使用3级类目修改,请及时迁移到多级类目) // Features []struct { // Key string `json:"key"` //是 无 特殊属性key // Value string `json:"value"` //否 无 特殊属性value // } `json:"features"` // 否 无 商品维度的特殊属性 目前两个特殊属性 IBS、FBP、FCS、SCF 4种商家类型【规格型号】 model和【销售单位】 unit 字段且为必填(如 个、盒、袋等)请勿填写公司名称。 Images []*CreateSkuParamImages `json:"images"` // 是 无 商品图片列表,发布时必须有主图(颜色为十个0,index为1的图片) ShopCategorys []int `json:"shopCategorys"` // 否 无 商品店内分类(商家接口获取到的最末级的分类) MobileDesc string `json:"mobileDesc"` // 是 无 移动版的商品介绍 长度限制10W个字符 Introduction string `json:"introduction"` // 是 无 PC版的商品介绍 长度限制10W个字符 // AfterSales string `json:"afterSales"` // 否 无 售后服务 JdPrice int `json:"jdPrice"` // 否 无 商品的京东价,人民币单元 是元 MarketPrice int `json:"marketPrice"` // 否 无 商品的市场价,人民币单元 是元 // ZhuangBaID string `json:"zhuangBaId"` // 否 无 商品描述装吧实例ID // IntroductionUseFlag string `json:"introductionUseFlag"` // 否 无 商品描述使用标识 ,0:使用默认的商品描述,1:使用装吧商详 // MobileZhuangBaID string `json:"mobileZhuangBaId"` // 否 无 移动版商品描述装吧实例ID // MobileDescUseFlag string `json:"mobileDescUseFlag"` // 否 无 移动版商品描述使用标识,0:使用默认的移动商详;1:使用装吧移动版商详 // DesignConcept string `json:"designConcept"` // 否 无 商品设计理念,适用范围 是toplife类目 // FitCaseHTMLApp string `json:"fitCaseHtmlApp"` // 否 无 装修案例移动版描述,装修类目才可填写 // FitCaseHTMLPc string `json:"fitCaseHtmlPc"` // 否 无 装修案例PC版描述,装修类目才可填写 // SpecialServices []string `json:"specialServices"` // 否 无 特色服务,装修类目才可填写,装修类必填,最大为5,每个值最长为8个字符 MultiCateProps []*CreateSkuParamAttrs `json:"multiCateProps"` // 否 无 类目属性列表,类目属性中有必填项时,此字段必填;若未设置或设置错误,会有“通用属性必填”等错误提示! } type CreateSkuParamImages struct { ColorID string `json:"colorId"` //是 无 颜色id,颜色id和您设置的销售属性值id对应,使用接口jingdong.category.read.findValuesByAttrIdUnlimit 获取 ,如果没销售属性,则默认为10个0(主图,并且主图必填) ImgIndex int `json:"imgIndex"` //是 无 图片顺序。index值:1N,如果index存在,则直接覆盖相应index图片 ImgURL string `json:"imgUrl"` //是 无 京东图片服务器地址,不包括前缀。例如:jfs/t2116/102/1731643157/81969/c3df941a/5670f868Nc441d4c3.jpg ImgZoneID string `json:"imgZoneId"` //否 无 图片空间中的图片Id } type CreateSkuParamSkus struct { // SkuID int `json:"skuId"` //否 无 skuID(新建商品不需要填写) // SaleAttrs []struct { // AttrValueAlias []string `json:"attrValueAlias"` //否 无 值别名,发布商品时不可设置 // AttrID string `json:"attrId "` // 是 无 属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 传3级分类 type=4获取 // AttrValues []string `json:"attrValues "` //是 无 销售属性值 使用接口jingdong.category.read.findValuesByAttrIdUnlimit获取 // } `json:"saleAttrs"` //是 无 SKU销售属性 // Features []struct { // JdPrice int `json:"jdPrice"` //是 无 京东价必填 单位:元 // OuterID string `json:"outerId"` //否 无 外部ID,系统不保证唯一性,如需唯一性自行保证 // StockNum string `json:"stockNum"` //是 无 总库存数 // BarCode string `json:"barCode"` //否 无 SKU的条形码 // } `json:"features"` //否 无 特殊属性 JdPrice int `json:"jdPrice"` //是 无 京东价必填 单位:元 OuterID string `json:"outerId"` //否 无 外部ID,系统不保证唯一性,如需唯一性自行保证 StockNum int `json:"stockNum"` //是 无 总库存数 // BarCode string `json:"barCode"` //否 无 SKU的条形码 // Props []struct{} `json:"props"` //否 无 SKU属性(已废弃 请使用multiCateProps,已经按照类目限制使用3级类目修改,请及时迁移到多级类目) SaleAttrs []*CreateSkuParamAttrs `json:"saleAttrs"` //否 无 多级SKU属性,仅当属性可以下沉时才能设置,不验证必填!sku维度设置后,以sku上的属性为准! // Capacity string `json:"capacity"` // 否 20L 20T 容量,在有特殊要求的类目下必填!最多支持6位小数。 Type string `json:"type"` //"com.jd.pop.ware.ic.api.domain.sku" Type2 string `json:"@type"` } type CreateSkuParamAttrs struct { // AttrValueAlias []string `json:"attrValueAlias"` //否 无 值别名,发布商品时不可设置 AttrID string `json:"attrId"` //是 无 下沉到sku的属性ID 通过接口 jingdong.category.read.findAttrsByCategoryIdUnlimitCate 获取 features字段中attrLevel=1 AttrValues []string `json:"attrValues"` //是 无 下沉到sku属性值 单选或者多选 通过接口jingdong.category.read.findValuesByAttrIdUnlimit获取 输入类型请手动输入 } type CreateSkuResult struct { WareID int `json:"wareId"` skus []struct { SkuID int `json:"skuId"` saleAttrs []struct { AttrValueAlias []string `json:"attrValueAlias"` AttrID string `json:"attrId"` AttrValues []string `json:"attrValues"` } } } type UpdateWareParam struct { WareID int `json:"wareId"` Title string `json:"title"` //否 标题 商品名称 限制45个字符内 Weight int `json:"weight"` //否 无 商品重量,单位kg } //查询商家所有的店内分类 //https://open.jd.com/home/home#/doc/api?apiCateId=88&apiId=2801&apiName=jingdong.vender.shopcategory.findShopCategoriesByVenderId func (a *API) FindShopCategories() (findShopCategoriesResult []*FindShopCategoriesResult, err error) { result, err := a.AccessAPI("jingdong.vender.shopcategory.findShopCategoriesByVenderId", prodURL, nil) if err == nil { utils.Map2StructByJson(result["jingdong_vender_shopcategory_findShopCategoriesByVenderId_responce"].(map[string]interface{})["shopCategoryResult"].(map[string]interface{})["shop_category_list"], &findShopCategoriesResult, false) } return findShopCategoriesResult, err } //删除店内分类 //https://open.jd.com/home/home#/doc/api?apiCateId=88&apiId=3031&apiName=jingdong.vender.shopcategory.deleteShopCategoryByVenderIdAndCid func (a *API) DeleteShopCategory(cid int64) (uniteResp *UniteResp, err error) { result, err := a.AccessAPI("jingdong.vender.shopcategory.deleteShopCategoryByVenderIdAndCid", prodURL, map[string]interface{}{ "cid": cid, }) if err == nil { utils.Map2StructByJson(result["jingdong_vender_shopcategory_deleteShopCategoryByVenderIdAndCid_responce"].(map[string]interface{})["shopCategoryResult"], &uniteResp, false) if !uniteResp.IsSuccess { return nil, fmt.Errorf(uniteResp.ErrorMsgCn) } } return uniteResp, err } //查询商家所有的类目 //https://open.jd.com/home/home#/doc/api?apiCateId=88&apiId=2727&apiName=jingdong.vender.category.getValidCategoryResultByVenderId func (a *API) FindVendorCategories() (findVendorCategoriesResult []*FindVendorCategoriesResult, err error) { result, err := a.AccessAPI("jingdong.vender.category.getValidCategoryResultByVenderId", prodURL, nil) if err == nil { utils.Map2StructByJson(result["jingdong_vender_category_getValidCategoryResultByVenderId_responce"].(map[string]interface{})["getvalidcategoryresultbyvenderid_result"].(map[string]interface{})["list"], &findVendorCategoriesResult, false) } return findVendorCategoriesResult, err } //京东商城发布商品(创建商品) //https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1379&apiName=jingdong.ware.write.add func (a *API) CreateWare(createSkuParamWare *CreateSkuParamWare, createSkuParamSkus []*CreateSkuParamSkus) (createSkuResult *CreateSkuResult, err error) { wares, _ := json.Marshal(createSkuParamWare) skus, _ := json.Marshal(createSkuParamSkus) result, err := a.AccessAPI2("jingdong.ware.write.add", prodURL, map[string]interface{}{ "ware": string(wares), "skus": string(skus), }) if err == nil { utils.Map2StructByJson(result["jingdong_ware_write_add_responce"].(map[string]interface{})["ware"], &createSkuResult, false) } return createSkuResult, err } type UploadPictureResult struct { ReturnCode int `json:"returnCode"` //返回码:1,操作成功;0,操作失败 Desc string `json:"desc"` //返回码为1时为操作成功,返回码为0时为操作失败原 PictureID string `json:"pictureId "` //上传成功的图片i PictureURL string `json:"pictureUrl"` //上传成功的图片url } //京东商城上传图片 //https://open.jd.com/home/home#/doc/api?apiCateId=61&apiId=164&apiName=jingdong.imgzone.picture.upload func (a *API) UploadPicture(imageData []byte, pictureCateID int, pictureName string) (uploadPictureResult *UploadPictureResult, err error) { result, err := a.AccessAPI("jingdong.imgzone.picture.upload", prodURL, map[string]interface{}{ "image_data": base64.StdEncoding.EncodeToString(imageData), "picture_name": pictureName, }) if err == nil { utils.Map2StructByJson(result["jingdong_imgzone_picture_upload_responce"], &uploadPictureResult, false) } return uploadPictureResult, err } //查询运费模板 //https://open.jd.com/home/home#/doc/api?apiCateId=137&apiId=906&apiName=jingdong.ept.feight.outapi.query func (a *API) GetFeightMb() (err error) { _, err = a.AccessAPI("jingdong.SkuFareTemplateService.getTemplates", prodURL, nil) return err } //类目属性 //https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=1264&apiName=jingdong.category.read.findAttrsByCategoryId func (a *API) GetAttrsByCategoryId(currPage, pageSize int) (err error) { _, err = a.AccessAPI("jingdong.category.read.findAttrsByCategoryId", prodURL, map[string]interface{}{ "currPage": currPage, "pageSize": pageSize, }) return err } //修改商品基础信息 //https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1380&apiName=jingdong.ware.write.updateWare func (a *API) UpdateWare(updateWareParam *UpdateWareParam) (err error) { result2, _ := json.Marshal(utils.Struct2FlatMap(updateWareParam)) result, err := a.AccessAPI("jingdong.ware.write.updateWare", prodURL, map[string]interface{}{ "ware": string(result2), }) if err == nil { if result["jingdong_ware_write_updateWare_responce"].(map[string]interface{})["success"] != "success" { return err } } return err } //删除商品 //https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1250&apiName=jingdong.ware.write.delete func (a *API) DeleteWare(wareId int) (err error) { _, err = a.AccessAPI("jingdong.ware.write.delete", prodURL, map[string]interface{}{ "wareId": wareId, }) return err } //获取类目属性ID //https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=2809&apiName=jingdong.category.read.findAttrsByCategoryIdUnlimitCate func (a *API) FindAttrs(cid int) (err error) { _, err = a.AccessAPI("jingdong.category.read.findAttrsByCategoryIdUnlimitCate", prodURL, map[string]interface{}{ "cid": cid, }) return err } //获取类目属性值 //https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=2821&apiName=jingdong.category.read.findValuesByAttrIdUnlimit func (a *API) FindValuesByAttrId(categoryAttrId int) (err error) { _, err = a.AccessAPI("jingdong.category.read.findValuesByAttrIdUnlimit", prodURL, map[string]interface{}{ "categoryAttrId": categoryAttrId, }) return err } //新增类目属性值 //https://open.jd.com/home/home#/doc/api?apiCateId=62&apiId=1262&apiName=jingdong.category.write.saveVenderAttrValue func (a *API) SaveVenderAttrValue(attValue string, attributeId, categoryId, indexId int) (err error) { _, err = a.AccessAPI("jingdong.category.write.saveVenderAttrValue", prodURL, map[string]interface{}{ "attValue": attValue, "attributeId": attributeId, "categoryId": categoryId, "indexId": indexId, }) return err } //设置sku库存 //https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1224&apiName=jingdong.stock.write.updateSkuStock func (a *API) UpdateSkuStock(skuId, stockNum int) (err error) { _, err = a.AccessAPI("jingdong.stock.write.updateSkuStock", prodURL, map[string]interface{}{ "skuId": skuId, "stockNum": stockNum, }) return err } //设置门店sku库存 //https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=2980&apiName=jingdong.stock.write.updateSkuSiteStock //siteId 门店ID,venderSource 固定传4 func (a *API) UpdateSkuSiteStock(skuId, stockNum, siteId int) (err error) { _, err = a.AccessAPI("jingdong.stock.write.updateSkuSiteStock", prodURL, map[string]interface{}{ "skuId": skuId, "stockNum": stockNum, "siteId": siteId, "venderSource": 4, }) return err } //修改sku京东价 //https://open.jd.com/home/home#/doc/api?apiCateId=48&apiId=1253&apiName=jingdong.price.write.updateSkuJdPrice //单位为元 func (a *API) UpdateSkuJdPrice(skuId, jdPrice int) (err error) { _, err = a.AccessAPI("jingdong.price.write.updateSkuJdPrice", prodURL, map[string]interface{}{ "skuId": skuId, "jdPrice": jdPrice, }) return err }