Tạo sản phẩm
Sau khi đã lấy được dữ liệu cơ bản của sản phẩm, bạn có thể bắt đầu tạo sản phẩm.
1. Tải lên tệp media
Hình ảnh và video sản phẩm cần được lưu trữ trước trong không gian media của Shopee. Vì vậy bạn cần gọi MediaSpace API để tải lên trước.
1.1 Tải lên hình ảnh
API: v2.media_space.upload_image
Mỗi sản phẩm phải có hình ảnh sản phẩm. Ngoài ra, chúng tôi cũng hỗ trợ chèn hình ảnh vào mô tả sản phẩm. Tệp hình ảnh sản phẩm phải đáp ứng các yêu cầu sau:
- Kích thước hình ảnh: tối đa 10MB
- Định dạng hình ảnh: JPG, JPEG, PNG
Lưu ý:
- API v2.media_space.upload_image chỉ hỗ trợ tải lên tệp hình ảnh, không hỗ trợ URL. Khi hình ảnh được tải lên thành công, bạn sẽ nhận được URL hình ảnh Shopee có thể truy cập ở từng khu vực và một image_id duy nhất. Chúng tôi khuyến nghị bạn liên kết URL hình ảnh Shopee dựa trên khu vực shop. image_id được dùng để tạo sản phẩm và cập nhật thông tin hình ảnh sản phẩm.
- Nếu bạn tải lên hình ảnh sản phẩm, tham số yêu cầu scene phải là normal; nếu bạn tải lên hình ảnh mô tả sản phẩm, tham số yêu cầu scene phải là desc, vì hình ảnh sản phẩm sẽ được xử lý thành hình vuông, còn hình ảnh mô tả sẽ không được xử lý.
1.2 Tải lên video
Video sản phẩm là tùy chọn, chúng tôi hỗ trợ tệp video với các yêu cầu sau:
- Kích thước video: tối đa 30MB
- Độ dài video: 10 giây đến 60 giây
- Định dạng video: mp4
- Yêu cầu pixel video: chiều rộng và chiều cao pixel không vượt quá 1280px * 1280px
Nếu tệp video của bạn lớn hơn 4MB, bạn cần chia nhỏ tệp video, ví dụ video 10MB cần được chia thành các phần 4MB, 4MB và 2MB, vì mỗi phần không được lớn hơn 4MB.
Tải lên video sản phẩm cần thực hiện bốn bước:
- Bước 1: Gọi API v2.media_space.init_video_upload. Tạo tác vụ tải lên video và lấy video_upload_id. Lưu ý rằng dù video của bạn có phân đoạn hay không, file_md5 cần tải lên giá trị md5 của toàn bộ tệp video và file_size cũng là của toàn bộ tệp video.
- Bước 2: Gọi API v2.media_space.upload_video_part. Khi tệp video có phân đoạn, tham số part_seq (bắt đầu từ 0) chỉ ra số thứ tự của phân đoạn, tham số part_content chỉ ra tệp phân đoạn. Vui lòng tải lên tất cả các phân đoạn.
- Bước 3: Gọi API v2.media_space.complete_video_upload. Chuyển mã video. Khi bạn gọi API này, Shopee sẽ chuyển mã tất cả các tệp phân đoạn video bạn đã tải lên. Tham số part_seq_list nhận số thứ tự của tất cả các phần bạn đã tải lên, ví dụ nếu bạn tải lên 2 phần thì part_seq_list sẽ là [0,1]. Đối với trường upload_cost bạn có thể tải lên thời gian sử dụng API upload_video_part cho một tệp video.
- Bước 4: Gọi API v2.media_space.get_video_upload_result. Lấy kết quả chuyển mã video. Do quá trình chuyển mã video mất một khoảng thời gian, bạn có thể lấy kết quả bằng cách gọi API v2.media_space.get_video_upload_result hoặc đăng ký push tải lên video. Chỉ khi trạng thái trả về là SUCCEEDED, bạn mới có thể lấy URL video Shopee và URL hình ảnh bìa video có thể truy cập ở từng thị trường. Lúc đó, video_upload_id có thể được dùng để tạo hoặc cập nhật thông tin video của sản phẩm.
Sau khi tải lên hình ảnh và video, bạn có thể gọi API v2.product.add_item để tạo sản phẩm. Dưới đây sẽ giải thích một số điểm cần lưu ý khi gọi API v2.product.add_item.
2. Tải lên danh mục và thuộc tính
2.1 Tải lên danh mục
Sản phẩm phải có category_id. Bạn chỉ có thể chọn ID danh mục lá trong cây danh mục cho sản phẩm, nếu không API sẽ trả về lỗi Invalid category id.
2.2 Tải lên thuộc tính
Sản phẩm phải tải lên tất cả các thuộc tính bắt buộc (các thuộc tính có "mandatory": true trong phản hồi API "v2.product.get_attribute_tree" được coi là bắt buộc). Bạn có thể tham khảo bài viết "Chuẩn bị tạo sản phẩm" để tìm hiểu thêm về các loại thuộc tính khác nhau. Dưới đây là giải thích cách tải lên các loại thuộc tính khác nhau khi gọi API "v2.product.add_item".
Khi tải lên thuộc tính có "input_type": 1 (SINGLE_DROP_DOWN), bạn chỉ có thể tải lên một "value_id", và "value_id" này phải là một trong các giá trị từ danh sách thuộc tính được trả về bởi API "v2.product.get_attribute_tree".
Ví dụ 1
Json
"attribute_list": [
{
"attribute_id": 100036,
"attribute_value_list": [
{
"value_id": 678
}
]
}
]
Khi tải lên thuộc tính có "input_type": 4 (MULTI_DROP_DOWN), bạn có thể tải lên nhiều giá trị "value_id", và các "value_id" này phải từ danh sách thuộc tính được trả về bởi API "v2.product.get_attribute_tree".
Ví dụ 2
Json
"attribute_list": [
{
"attribute_id": 100036,
"attribute_value_list": [
{
"value_id": 678
},
{
"value_id": 679
}
]
}
]
Khi tải lên thuộc tính có "input_type": 3 (FREE_TEXT_FILED), bạn chỉ có thể tải lên một "value_id" và chỉ định một giá trị tùy chỉnh. Vì vậy, bạn phải tải lên "value_id": 0 và cung cấp giá trị tùy chỉnh trong trường "original_value_name".
Ví dụ 3
Json
"attribute_list": [
{
"attribute_id": 100061,
"attribute_value_list": [
{
"value_id": 0,
"original_value_name": "customized name"
}
]
}
]
i) Nếu thuộc tính có "input_type": 3 (FREE_TEXT_FIELD) và yêu cầu đơn vị, bạn cũng phải tải lên trường "value_unit". (Tức là "input_type": 3 & "format_type": 2 (FORMAT_QUANTITATIVE_WITH_UNIT))
Ví dụ 4
Json
"attribute_list": [
{
"attribute_id": 100061,
"attribute_value_list": [
{
"value_id": 0,
"original_value_name": "12",
"value_unit": "g"
}
]
}
]
ii) Nếu thuộc tính có "input_type": 3 (FREE_TEXT_FIELD) và yêu cầu kiểu ngày tháng, bạn phải tải lên timestamp trong trường "original_value_name". (Tức là "input_type": 3 & "input_validation_type": 4)
Ví dụ 5
Json
"attribute_list": [
{
"attribute_id": 100061,
"attribute_value_list": [
{
"value_id": 0,
"original_value_name": "1634526913"
}
]
}
]
]
Đối với thuộc tính có "input_type": 2 (SINGLE_COMBO_BOX), bạn chỉ có thể tải lên một "value_id". "value_id" này phải là một trong các giá trị từ danh sách thuộc tính được trả về bởi API "v2.product.get_attribute_tree" (tham khảo Ví dụ 1) hoặc một giá trị do người dùng xác định (tham khảo Ví dụ 3). Nếu yêu cầu đơn vị, vui lòng tham khảo Ví dụ 4. Nếu yêu cầu kiểu ngày tháng, vui lòng tham khảo Ví dụ 5.
Đối với thuộc tính có "input_type": 5 (MULTI_COMBO_BOX), bạn có thể tải lên nhiều giá trị "value_id" từ danh sách thuộc tính được trả về bởi API "v2.product.get_attribute_tree", hoặc chỉ định các giá trị tùy chỉnh.
Ví dụ 6
Json
"attribute_list": [
{
"attribute_id": 100061,
"attribute_value_list": [
{
"value_id": 0,
"original_value_name": "customized name"
},
{
"value_id": 678
}
]
}
]
Nếu yêu cầu đơn vị, vui lòng tham khảo Ví dụ 4. Nếu yêu cầu kiểu ngày tháng, vui lòng tham khảo Ví dụ 5.
Tóm tắt:
-
Đối với tất cả các loại thuộc tính, bạn phải tải lên "value_id". Khi tải lên giá trị do người dùng xác định, "value_id" phải là 0 và "original_value_name" là bắt buộc.
-
Bất kể kiểu dữ liệu của giá trị là gì, trường "original_value_name" phải được tải lên ở định dạng chuỗi.
-
Khi "format_type" là 2 và bạn tải lên giá trị do người dùng xác định, bạn cũng phải tải lên trường "value_unit", và đơn vị phải được chọn từ "attribute_unit_list" trong phản hồi của API "v2.product.get_attribute_tree".
3. Tải lên mô tả
*Lưu ý rằng hiện tại chúng tôi hỗ trợ người bán được whitelist sử dụng extended_description. Vui lòng tham khảo FAQ để biết chi tiết cách sử dụng.
4. Tải lên giá
Ngoại trừ các thị trường SG/MY/BR/MX/PL, chúng tôi hỗ trợ người bán tải lên giá có hai chữ số thập phân (original_price). Đối với các thị trường khác, chỉ hỗ trợ số nguyên; nếu người bán điền số thập phân, chúng tôi sẽ làm tròn.
5. Tải lên tồn kho
Nếu người bán không có kho hàng (hiện chỉ được sử dụng bởi người dùng whitelist) thì không cần tải lên trường location_id.
6. Tải lên kênh vận chuyển và phí vận chuyển
Tùy thuộc vào cách kênh tính phí vận chuyển, chúng tôi đã chia các kênh thành một số loại. Bạn có thể lấy fee_type thông qua API v2.logistics.get_channel_list, các loại bao gồm:
- SIZE_SELECTION: Phí vận chuyển được tính dựa trên ID kích cỡ
- SIZE_INPUT: Phí vận chuyển được tính theo kích thước sản phẩm cụ thể, vì vậy đối với loại này, người bán cần tải lên chiều dài, chiều rộng, chiều cao và trọng lượng cho sản phẩm.
- FIXED_DEFAULT_PRICE: Phí vận chuyển cố định.
- CUSTOM_PRICE: Phí vận chuyển có thể được tùy chỉnh bởi người bán.
Người bán có thể chọn nhiều kênh cho sản phẩm.
i) enabled=true nghĩa là sản phẩm mở cho kênh này và người mua có thể chọn.
ii) is_free=true nghĩa là người bán chịu phí vận chuyển, tức là sản phẩm được giao, người mua không cần chịu phí vận chuyển, và tất cả các loại kênh đều hỗ trợ thiết lập miễn phí vận chuyển.
- Đối với kênh SIZE_SELECTION, phải tải lên size_id. size_id có thể lấy thông qua API v2.logistics.get_channel_list.
Ví dụ 1:
"logistic_info":[
{
"sizeid":1,
"enabled":true,
"is\_free":false,
"logistic\_id":80101
\}]
2)Đối với kênh SIZE_INPUT, phải tải lên trọng lượng và kích thước.
Ví dụ 2:
"weight": 1,
"dimension":{
"package\_height":11,
"package\_length":11,
"package\_width":11
},
"logistic_info":[
{
"enabled":true,
"is\_free":false,
"logistic\_id":80101
\}]
3)Đối với kênh CUSTOM_PRICE, phải tải lên shipping_fee.
Ví dụ 3:
"logistic_info":[
\{
"shipping\_fee":23.12,
"enabled":true,
"is\_free":false,
"logistic\_id":80103
\}]
"logistic_info":[
\{
"enabled":true,
"logistic\_id":80103
\}]
7. Tạo biến thể
Khi bạn tạo sản phẩm thành công, v2.product.add_item sẽ trả về item_id, là mã định danh duy nhất của sản phẩm. Nếu bạn cũng cần xác định thông số kỹ thuật và tạo nhiều biến thể tùy chọn, chẳng hạn như màu sắc và kích cỡ, bạn có thể gọi API v2.product.init_tier_variation ở bước tiếp theo. Chúng tôi sẽ tạo model_id cho mỗi biến thể, đây sẽ là mã định danh duy nhất của biến thể.
Tình huống 1: Sản phẩm có thông số kích cỡ và kích cỡ bao gồm XS, S và M. Chúng ta gọi đây là sản phẩm biến thể 1 tầng.
| tier_index | size | price | stock | SKU |
| tier_index[0] | XS | 100 | 10 | sku1 |
| tier_index[1] | S | 200 | 20 | sku2 |
| tier_index[2] | M | 300 | 30 | sku3 |
Ví dụ yêu cầu API v2.product.init_tier_variation:
Json
{
"item_id": 800188562,
"tier_variation": [
{
"name": "size",
"option_list": [
{
"option": "XS",
"image": {"image_id":"82becb4830bd2ee90ad6acf8a9dc26d7"}
},
{
"option": "S",
"image": {"image_id":"72becb4830bd2ee90ad6acf879dc26d7"}
},
{
"option": "M",
"image": {"image_id":"92becb4830bd2ee90ad6acf8a9dc26d7"}
}
]
}
],
"model": [
{
"tier_index": [0],
"original_price": 100,
"model_sku": "sku1",
"normal_stock": 10
},
{
"tier_index": [1],
"original_price": 200,
"model_sku": "sku1",
"normal_stock": 20
},
{
"tier_index": [2],
"original_price": 300,
"model_sku": "sku3",
"normal_stock": 30
}
]
}
Tình huống 2: Sản phẩm có thông số màu sắc và kích cỡ, màu sắc bao gồm đỏ và xanh, và kích cỡ bao gồm XL và L. Chúng ta gọi đây là sản phẩm biến thể 2 tầng.
| tier_index | color | size | price | stock | SKU |
| tier_index[0,0] | Red | XL | 100 | 10 | sku1 |
| tier_index[0,1] | Red | L | 200 | 20 | sku2 |
| tier_index[1,0] | Blue | XL | 300 | 30 | sku3 |
| tier_index[1,1] | Blue | L | 400 | 40 | sku4 |
Ví dụ yêu cầu API v2.product.init_tier_variation:
Json
{
"item_id": 100917481,
"tier_variation": [
{
"name": "color",
"option_list": [
{
"image": {"image_id": "82becb4830bd2ee90ad6acf8a9dc26d7"},
"option": "Red"
},
{
"image": {"image_id": "72becb4830bd2ee90ad6acf879dc26d7"},
"option": "Blue"
}
]
},
{
"name": "size",
"option_list": [
{
"option": "XL"
},
{
"option": "L"
}
]
}
],
"model": [
{
"tier_index": [0,0],
"original_price": 100,
"normal_stock": 10,
"global_model_sku": "sku1"
},
{
"tier_index": [0,1],
"original_price": 200,
"normal_stock": 20,
"global_model_sku": "sku2"
},
{
"tier_index": [1,0],
"original_price": 300,
"normal_stock": 30,
"global_model_sku": "sku3"
},
{
"tier_index": [1,1],
"original_price": 400,
"normal_stock": 40,
"global_model_sku": "sku4"
}
]
}
Lưu ý
-
Các tùy chọn bạn xác định sẽ được hiển thị theo thứ tự trên gian hàng Shopee. Shopee hiện chỉ hỗ trợ xác định biến thể tối đa 2 tầng.
-
Bạn có thể xác định hình ảnh cho mỗi biến thể. Nếu là sản phẩm biến thể 2 tầng, bạn chỉ có thể xác định hình ảnh cho các tùy chọn lớp đầu tiên, tức là trong ví dụ, bạn có thể xác định hình ảnh biến thể theo màu sắc, nhưng không theo kích cỡ. Khi bạn muốn thêm hình ảnh biến thể, tất cả các tùy chọn ở lớp đầu tiên đều cần xác định hình ảnh. Hình ảnh cần được tải lên bằng cách gọi API v2.media_space.upload_image trước.
-
tier_index phải bắt đầu từ 0 và không được vượt quá giới hạn, nếu không sẽ báo lỗi.
*4. Chúng tôi khuyến nghị bạn tạo biến thể sau khoảng 5 giây sau khi tạo sản phẩm, vì có thể có độ trễ trong việc tạo dữ liệu sản phẩm.
- Sau khi tạo thành công, bạn có thể gọi API v2.product.get_model_list để lấy model id tương ứng với mỗi tier_index.