v1 API 상세: 상품
등록된 상품 정보를 수정해요.
API 엔드포인트
필요 권한: user:product_update
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
product_id |
String | 필수 | 상품 ID (URL 경로) |
name |
String | 선택 | 상품명 |
desc |
String | 선택 | 상품 요약 설명 |
content |
String | 선택 | 상품 상세 설명 (HTML 지원) |
category_id |
String | 선택 | 카테고리 ID (키를 보내고 값을 비우면 해제) |
display_price |
Integer | 선택 | 판매가 |
tax_free_price |
Integer | 선택 | 비과세 가격 |
use_stock |
Boolean | 선택 | 재고 관리 사용 여부 |
stock |
Integer | 선택 | 재고 수량 |
use_discount |
Boolean | 선택 | 할인 사용 여부 |
discount_price |
Integer | 선택 | 할인 금액 또는 할인율. 판매가에서 이만큼 빼요 (discount_price_type 참고) |
discount_price_type |
Integer | 선택 | 할인 단위 — 1 퍼센트 / 2 정액 |
use_subscription |
Boolean | 선택 | 구독 상품 여부 |
subscription_setting_id |
String | 선택 | 구독 설정 템플릿 ID (save_by: 3 필요) |
status_display |
Boolean | 선택 | 쇼핑몰 노출 여부 |
status_sale |
Boolean | 선택 | 판매 상태 |
save_by |
Integer | 선택 | 저장 방식 (1 시스템 임시저장 / 2 사용자 임시저장 / 3 사용자 저장). 구독 설정 연결·검증은 3 일 때만 동작 |
문자열·Boolean 필드와 category_id 는 보내지 않으면 기존 값을 유지해요. category_id 는 키를 보내고 값을 비우면 '카테고리 해제' 로 처리되니, 바꿀 생각이 없으면 키 자체를 빼고 보내요. 숫자 필드는 아래 예외를 확인해요.
구독 설정(subscription_setting_id)을 바꿀 때는 save_by: 3 을 함께 보내야 반영돼요.
지금은 숫자 필드를 빼고 보내면 기존 값이 아니라 0 으로 저장돼요. 해당 필드는 display_price·stock·stock_safe·discount_price·discount_price_type·tax_free_price·tax_type·accumulation_point·accumulation_point_type·setup_fee_value·setup_fee_type·time_sale_discount_percent·type 이에요. 검색 태그는 비워지고, 심사 상태(status_review)는 자동 승인으로 바뀌어요. 일반 상품에서 display_price 를 빼면 SERVER_ERROR(HTTP 500)로 실패해요.
수정할 때는 상품 상세로 현재 값을 읽어 위 숫자 필드를 모두 함께 보내요. 상세 응답에서 type·tax_type·discount_price_type 은 문자열로 오니 숫자 값(discount_price_type 은 위 표, 나머지는 커머스 Enum)으로 바꿔 보내요. 상세에 나오지 않는 accumulation_point·accumulation_point_type·time_sale_discount_percent 는 설정했던 값을 다시 보내요.
코드 예제
const { BootpayCommerce } = require('@bootpay/backend-js')
const commerce = new BootpayCommerce({
client_key: 'your-commerce-client-key',
secret_key: 'your-commerce-secret-key',
mode: 'production'
})
const response = await commerce.product.update('67c95e64d01640bb9859c629', {
name: 'Enterprise 플랜',
display_price: 59900,
desc: '기업용 구독 서비스'
})
console.log(response)javascriptfrom bootpay_backend import BootpayCommerce
commerce = BootpayCommerce(
client_key='your-commerce-client-key',
secret_key='your-commerce-secret-key',
mode='production'
)
response = commerce.product.update(
'67c95e64d01640bb9859c629',
name='Enterprise 플랜',
display_price=59900,
desc='기업용 구독 서비스'
)
print(response)pythonuse Bootpay\ServerPhp\BootpayCommerceApi;
$commerce = new BootpayCommerceApi(
'your-commerce-client-key',
'your-commerce-secret-key'
);
$response = $commerce->productUpdate('67c95e64d01640bb9859c629', [
'name' => 'Enterprise 플랜',
'display_price' => 59900,
'desc' => '기업용 구독 서비스'
]);
print_r($response);phpimport kr.co.bootpay.store.BootpayStore;
import kr.co.bootpay.store.model.request.TokenPayload;
import kr.co.bootpay.store.model.response.BootpayStoreResponse;
import kr.co.bootpay.store.model.pojo.SProduct;
TokenPayload tp = new TokenPayload(
"your-commerce-client-key",
"your-commerce-secret-key"
);
BootpayStore commerce = new BootpayStore(tp).withToken();
SProduct product = new SProduct();
product.productId = "67c95e64d01640bb9859c629";
product.name = "Enterprise 플랜";
product.displayPrice = 59900.0;
// ⚠️ 상품 설명은 Java SDK 로 보낼 수 없어요 — SProduct.description 은 description 키로 나가는데
// 커머스 API 는 desc 를 읽어서 값이 조용히 버려져요. 설명은 관리자 화면이나 REST 직접 호출로 넣어요.
BootpayStoreResponse response = commerce.product.update(product);
System.out.println(response);javarequire 'bootpay'
commerce = BootpayStore::RestClient.new(
client_key: 'your-commerce-client-key',
secret_key: 'your-commerce-secret-key'
)
response = commerce.product_update(
product_id: '67c95e64d01640bb9859c629',
name: 'Enterprise 플랜',
display_price: 59900,
desc: '기업용 구독 서비스'
)
puts responserubycommerce := bootpay.NewCommerceApi(
"your-commerce-client-key",
"your-commerce-secret-key",
)
response, err := commerce.ProductUpdate("67c95e64d01640bb9859c629", map[string]interface{}{
"name": "Enterprise 플랜",
"display_price": 59900,
"desc": "기업용 구독 서비스",
})
fmt.Println(response)gousing Bootpay.Commerce;
var commerce = new BootpayCommerceApi(
"your-commerce-client-key",
"your-commerce-secret-key"
);
var response = await commerce.ProductUpdate("67c95e64d01640bb9859c629", new {
name = "Enterprise 플랜",
display_price = 59900,
desc = "기업용 구독 서비스"
});
Console.WriteLine(response);csharp응답
성공 응답
{
"product_id": "67c95e64d01640bb9859c629",
"save_by": 3
}json수정된 전체 값이 필요하면 상품 상세를 다시 불러요.
에러 코드
인증·권한 관련 에러는 에러 코드표를 참고해요.
| 코드 | 메시지 | 대처 방법 |
|---|---|---|
PRODUCT_NOT_FOUND |
존재하지 않는 상품이에요 | product_id를 확인해요 |
PRODUCT_FROZEN |
판매금지된 상품은 편집/저장 안돼요. 관리자에게 문의해요 | 관리자에게 문의해요 |
문자열·Boolean 필드는 변경할 값만 보내도 돼요. 숫자 필드는 위 초기화 동작을 확인해요.
