Skip to content

add product.getCateProperty api. #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions src/main/java/com/sdk4/jinritemai/DefaultDoudianClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,56 @@ DoudianAccessToken createAccessToken(String url) {
return accessToken;
}

@Override
public <T extends DoudianResponse> T execute(DoudianGeneralRequest<T> request)
throws ApiException {
makeSureTokenExist();
makeSureTokenValid(request.getResponseClass());
return execute(request.getMethod(),
DoudianUtils.createParamJson(request.getParamJson()),
request.getResponseClass(),
accessToken.getAccessToken());
}

@Override
public <T extends DoudianResponse> T execute(DoudianGeneralRequest<T> request, String accessToken)
throws ApiException {
return execute(request.getMethod(),
DoudianUtils.createParamJson(request.getParamJson()),
request.getResponseClass(),
accessToken);
}

private <T extends DoudianResponse> T execute(String method,
String paramJson,
Class<T> responseClass,
String accessToken)
throws ApiException {
Map<String, String> params = new HashMap<>();
params.put("method", method);
params.put("app_key", appKey);
params.put("param_json", paramJson);
params.put("timestamp", DoudianUtils.getTimeString(new Date()));
params.put("v", version);

try {
params.put("sign", DoudianUtils.signTopRequest(params, appSecret, signMethod));
params.put("sign_method", signMethod);
params.put("access_token", accessToken);

String url = createUrl(serverUrl, method);
String query = WebUtils.buildQuery(params, "UTF-8");
String fullUrl = WebUtils.buildRequestUrl(url, query);
HttpResponseData data = WebUtils
.doPost(fullUrl, new HashMap<>(0), "UTF-8", connectTimeout, readTimeout);
System.out.println("doudian request: " + fullUrl);
System.out.println("doudian response: " + data.getBody());
return JSON.parseObject(data.getBody(), responseClass);
} catch (IOException e) {
throw new ApiException("API_CALL_ERROR", "接口调用失败", e);
}
}

@Override
public <T extends DoudianResponse> T execute(DoudianRequest<T> request) throws ApiException {
if (accessToken == null) {
Expand Down Expand Up @@ -137,6 +187,29 @@ public <T extends DoudianResponse> T execute(DoudianRequest<T> request, String a
}
}

private <T extends DoudianResponse> void makeSureTokenValid(Class<T> resClass)
throws ApiException {
if (!accessToken.isValid()) {
try {
T response = resClass.newInstance();
response.setErrNo(4444);
response.setMessage("access token is invalid");
} catch (Exception e) {
throw new ApiException("API_CALL_ERROR", "接口调用失败", e);
}
}
}

private void makeSureTokenExist() {
if (accessToken == null) {
accessToken = getAccessToken();
}
if (!accessToken.isValid()) {
accessToken = DoudianUtils.isEmpty(accessToken.getRefreshToken()) ? getAccessToken()
: getAccessToken(accessToken.getRefreshToken());
}
}

static String createUrl(String baseUrl, String method) {
StringBuilder url = new StringBuilder();
if (DoudianUtils.isNotEmpty(baseUrl)) {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/sdk4/jinritemai/DoudianClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,9 @@ public interface DoudianClient {
*/
<T extends DoudianResponse> T execute(DoudianRequest<T> request, String accessToken) throws ApiException;


<T extends DoudianResponse> T execute(DoudianGeneralRequest<T> request) throws ApiException;

<T extends DoudianResponse> T execute(DoudianGeneralRequest<T> request, String accessToken)
throws ApiException;
}
13 changes: 13 additions & 0 deletions src/main/java/com/sdk4/jinritemai/DoudianGeneralRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.sdk4.jinritemai;

import lombok.Data;

import java.util.Map;

@Data
public class DoudianGeneralRequest<T extends DoudianResponse> {

private String method;
private Map<String, Object> paramJson;
private Class<T> responseClass;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sdk4.jinritemai.model.bean;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DoudianProductAddV2Result {

private Long productId;
private String createTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.sdk4.jinritemai.model.bean;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

/**
* 商品分类对应的属性列表
*/
@Getter
@Setter
public class DoudianProductGetCateProperty {

private Long propertyId;
private String propertyName;
private List<Option> options;
private Boolean required;

@Data
public static class Option {

private String name;
private String value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sdk4.jinritemai.model.request;

import com.sdk4.jinritemai.DoudianRequest;
import com.sdk4.jinritemai.model.response.DoudianProductGetCatePropertyResponse;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DoudianProductGetCatePropertyRequest implements
DoudianRequest<DoudianProductGetCatePropertyResponse> {

private final String method = "product.getCateProperty";

private String firstCid;
private String secondCid;
private String thirdCid;
private String categoryLeafId;

@Override
public Class<DoudianProductGetCatePropertyResponse> getResponseClass() {
return DoudianProductGetCatePropertyResponse.class;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sdk4.jinritemai.model.response;

import com.sdk4.jinritemai.DoudianResponse;
import com.sdk4.jinritemai.model.bean.DoudianProductAddV2Result;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DoudianProductAddV2Response extends DoudianResponse<DoudianProductAddV2Result> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.sdk4.jinritemai.model.response;

import com.sdk4.jinritemai.DoudianResponse;
import com.sdk4.jinritemai.model.bean.DoudianProductGetCateProperty;
import java.util.List;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DoudianProductGetCatePropertyResponse extends
DoudianResponse<List<DoudianProductGetCateProperty>> {

}
6 changes: 5 additions & 1 deletion src/main/java/com/sdk4/jinritemai/util/DoudianUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ public class DoudianUtils {
}

public static String createParamJson(Object object) {
return JSON.toJSONString(toStringSortMap(object));
String paramJson = JSON.toJSONString(toStringSortMap(object));
paramJson = paramJson.replace("&", "\\u0026");
paramJson = paramJson.replace("<", "\\u003c");
paramJson = paramJson.replace(">", "\\u003e");
return paramJson;
}

public static Map<String, String> toStringSortMap(Object object) {
Expand Down
78 changes: 78 additions & 0 deletions src/test/java/com/sdk4/jinritemai/DoudianProductTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,91 @@
import com.alibaba.fastjson.JSON;
import com.sdk4.jinritemai.exception.ApiException;
import com.sdk4.jinritemai.model.bean.DoudianProduct;
import com.sdk4.jinritemai.model.bean.DoudianProductGetCateProperty;
import com.sdk4.jinritemai.model.bean.DoudianSku;
import com.sdk4.jinritemai.model.bean.DoudianSpec;
import com.sdk4.jinritemai.model.request.*;
import com.sdk4.jinritemai.model.response.*;
import org.testng.annotations.Test;
import org.testng.collections.Maps;

import java.util.List;
import java.util.Map;

public class DoudianProductTest extends DoudianClientTest {
@Test
public void testProductAddV2ByGeneralRequest() throws ApiException {
Map<String, Object> spuParamMap = Maps.newHashMap();
spuParamMap.put("brand_id", ""); //fixme: 填写正确的品牌
spuParamMap.put("category_leaf_id", "22370");
spuParamMap.put("commit", "true");
spuParamMap.put("delivery_delay_day", "2");
spuParamMap.put("description", "https://sf6-ttcdn-tos.pstatp.com/obj/temai/2d5bb85c2e7f919f403ed6372a8ddc9fwww800-800");
spuParamMap.put("discount_price", "9999");
spuParamMap.put("freight_id", "0");
spuParamMap.put("market_price", "9999");
spuParamMap.put("mobile", "13400000001");
spuParamMap.put("name", "[测试] 测试商品,不要上架");
spuParamMap.put("out_product_id", "test-only");
spuParamMap.put("pay_type", "1");
spuParamMap.put("pic", "https://sf6-ttcdn-tos.pstatp.com/obj/temai/2d5bb85c2e7f919f403ed6372a8ddc9fwww800-800");
spuParamMap.put("presell_type", "0");
spuParamMap.put("product_format", "0|11642^419596|17周岁以下^419597|不对称^419598|短裤^419599|树脂固色^419600|原创^419601|71%(含)-80%(含)^419602|^419603|低腰^419604|哈伦裤^419605|桑蚕丝^419606|^419607|超薄");
spuParamMap.put("product_id", "test-wj");
spuParamMap.put("product_type", "0");
spuParamMap.put("recommend_remark", "test only - 不哟啊");
spuParamMap.put("reduce_type", "2");
spuParamMap.put("remark", "test only");
spuParamMap.put("spec_name", "颜色-尺码");
spuParamMap.put("spec_pic", "https://sf6-ttcdn-tos.pstatp.com/obj/temai/2d5bb85c2e7f919f403ed6372a8ddc9fwww800-800");
spuParamMap.put("spec_prices", "[{\"price\":9999,\"spec_detail_name1\":\"亮白\",\"spec_detail_name2\":\"A/S\",\"stock_num\":11}]");
spuParamMap.put("specs", "颜色|亮白^尺码|A/S");
spuParamMap.put("supply_7day_return", "1");
spuParamMap.put("weight", "1");
spuParamMap.put("weight_unit", "0");
DoudianGeneralRequest<DoudianProductAddV2Response> request = new DoudianGeneralRequest<>();
request.setResponseClass(DoudianProductAddV2Response.class);
request.setMethod("product.addV2");
request.setParamJson(spuParamMap);

DoudianProductAddV2Response response = getClient().execute(request);
if (!response.isSuccess()) {
System.err.println("ProductAddV2失败:" + response.getMessage());
} else {
System.out.println(JSON.toJSONString(response.getData()));
}
}

@Test
public void testGetCatePropertyByGeneralRequest() throws ApiException {
DoudianGeneralRequest<DoudianProductGetCatePropertyResponse> generalRequest = new DoudianGeneralRequest<>();
generalRequest.setMethod("product.getCateProperty");
generalRequest.setResponseClass(DoudianProductGetCatePropertyResponse.class);
Map<String, Object> objectObjectMap = Maps.newHashMap();
objectObjectMap.put("category_leaf_id", "20716");
generalRequest.setParamJson(objectObjectMap);
DoudianProductGetCatePropertyResponse response = getClient().execute(generalRequest);
if (!response.isSuccess()) {
System.err.println("根据商品分类获取对应的属性列表失败:" + response.getMessage());
} else {
List<DoudianProductGetCateProperty> properties = response.getData();
System.out.println(JSON.toJSONString(properties));
}
}

@Test
public void testGetCateProperty() throws ApiException {
DoudianProductGetCatePropertyRequest request = new DoudianProductGetCatePropertyRequest();
request.setCategoryLeafId("20716");
DoudianProductGetCatePropertyResponse response = getClient().execute(request);
if (!response.isSuccess()) {
System.err.println("根据商品分类获取对应的属性列表失败:" + response.getMessage());
} else {
List<DoudianProductGetCateProperty> properties = response.getData();
System.out.println(JSON.toJSONString(properties));
}
}

@Test
public void testProductDetail() throws ApiException {
DoudianProductDetailRequest request = new DoudianProductDetailRequest();
Expand Down