// 增加商品
func (c *Client) MerchantProductAdd(_product *product.Product) (productId string, err error) {
	if _product == nil {
		err = errors.New("_product == nil")
		return
	}

	_product.Id = "" // 这个时候还没有 product id

	token, err := c.Token()
	if err != nil {
		return
	}
	_url := merchantProductAddURL(token)

	var result struct {
		Error
		ProductId string `json:"product_id"`
	}
	if err = c.postJSON(_url, _product, &result); err != nil {
		return
	}

	if result.ErrCode != 0 {
		err = &result.Error
		return
	}

	productId = result.ProductId
	return
}
// 增加商品
//  NOTE: 无需指定 Id 和 Status 字段
func (c *Client) MerchantProductAdd(_product *product.Product) (productId string, err error) {
	if _product == nil {
		err = errors.New("_product == nil")
		return
	}

	// 无需指定 Id 和 Status 字段
	_product.Id = ""
	_product.Status = 0

	var result struct {
		Error
		ProductId string `json:"product_id"`
	}

	hasRetry := false
RETRY:
	token, err := c.Token()
	if err != nil {
		return
	}
	_url := merchantProductAddURL(token)
	if err = c.postJSON(_url, _product, &result); err != nil {
		return
	}

	switch result.ErrCode {
	case errCodeOK:
		productId = result.ProductId
		return

	case errCodeTimeout:
		if !hasRetry {
			hasRetry = true
			timeoutRetryWait()
			goto RETRY
		}
		fallthrough

	default:
		err = &result.Error
		return
	}
}