From 5bcdaf40a7242d0e83d4821638c845242d5fb6f9 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Mon, 18 Nov 2024 12:16:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A1=BA=E4=B8=B0=E5=90=8C?= =?UTF-8?q?=E5=9F=8E=E7=9A=84=E4=B8=9A=E5=8A=A1=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/pojo/req/SFCreateOrderReq.java | 61 ++++++++++++ .../common/pojo/req/SFOrderDetailReq.java | 43 +++++++++ .../pojo/req/SFOrderProductDetailReq.java | 34 +++++++ .../common/pojo/req/SFOrderReceiveReq.java | 40 ++++++++ .../mall/common/pojo/req/SFOrderShopReq.java | 40 ++++++++ .../mall/common/pojo/res/SFExpressApiRes.java | 52 +++++++++++ .../shop/api/service/SFExpressApiService.java | 8 ++ .../service/impl/SFExpressApiServiceImpl.java | 92 +++++++++++++++++++ .../src/main/resources/bootstrap-dev.yml | 7 +- .../src/main/resources/bootstrap-local.yml | 6 +- .../src/main/resources/bootstrap-prod.yml | 6 +- .../src/main/resources/bootstrap-test.yml | 6 +- .../src/main/resources/bootstrap-uat.yml | 6 +- 13 files changed, 396 insertions(+), 5 deletions(-) create mode 100644 mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFCreateOrderReq.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderDetailReq.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderProductDetailReq.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderReceiveReq.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderShopReq.java create mode 100644 mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFCreateOrderReq.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFCreateOrderReq.java new file mode 100644 index 00000000..f94e2043 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFCreateOrderReq.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.pojo.req; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(description = "顺丰同城新建订单信息") +public class SFCreateOrderReq implements Serializable { + @ApiModelProperty("同城开发者ID") + private Integer dev_id; + + @ApiModelProperty("店铺ID") + private String shop_id; + + @ApiModelProperty("商家订单号") + private String shop_order_id; + + @ApiModelProperty("取货序号") + private String order_sequence; + + @ApiModelProperty("用户下单时间,秒级时间戳") + private Long order_time; + + @ApiModelProperty("推单时间,秒级时间戳") + private Long push_time; + + @ApiModelProperty("返回字段控制标志位(二进制),1:商品总价格,2:配送距离,4:物品重量,8:起送时间,16:期望送达时间,32:支付费用,64:实际支付金额,128:优惠券总金额,256:结算方式; 例如全部返回为填入511") + private Integer return_flag; + + @ApiModelProperty("版本号,参照文档主版本号填写,如:文档版本号1.9,version=19,推荐使用版本19") + private Integer version; + + @ApiModelProperty("发货店铺信息") + private SFOrderShopReq shop; + + @ApiModelProperty("订单信息") + private SFOrderDetailReq order_detail; + + @ApiModelProperty("收货人信息") + private SFOrderReceiveReq receive; + + @ApiModelProperty("订单备注") + private String remark; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderDetailReq.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderDetailReq.java new file mode 100644 index 00000000..8450930f --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderDetailReq.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.pojo.req; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(description = "顺丰同城订单订单信息") +public class SFOrderDetailReq implements Serializable { + @ApiModelProperty("用户订单商品总金额(单位:分)") + private Integer total_price; + + @ApiModelProperty("物品类型") + private String product_type; + + @ApiModelProperty("物品重量(单位:克)") + private String weight_gram; + + @ApiModelProperty("物品个数") + private String product_num; + + @ApiModelProperty("物品种类个数") + private Long product_type_num; + + @ApiModelProperty("物品详情;数组结构,详见product_detail结构") + private SFOrderProductDetailReq product_detail; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderProductDetailReq.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderProductDetailReq.java new file mode 100644 index 00000000..72e02217 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderProductDetailReq.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.pojo.req; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(description = "顺丰同城订单商品信息") +public class SFOrderProductDetailReq implements Serializable { + @ApiModelProperty("物品Id") + private Long product_id; + + @ApiModelProperty("物品名称") + private String product_name; + + @ApiModelProperty("物品数量") + private Integer product_num; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderReceiveReq.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderReceiveReq.java new file mode 100644 index 00000000..c537d234 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderReceiveReq.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.pojo.req; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(description = "顺丰同城订单收货人信息") +public class SFOrderReceiveReq implements Serializable { + @ApiModelProperty("收货人名字") + private String user_name; + + @ApiModelProperty("收货人电话") + private String user_phone; + + @ApiModelProperty("收货详细地址") + private String user_address; + + @ApiModelProperty("地址经度") + private String user_lng; + + @ApiModelProperty("地址维度") + private String user_lat; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderShopReq.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderShopReq.java new file mode 100644 index 00000000..9e726b42 --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/req/SFOrderShopReq.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.pojo.req; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(description = "顺丰同城订单发货店铺信息") +public class SFOrderShopReq implements Serializable { + @ApiModelProperty("店铺名字") + private String shop_name; + + @ApiModelProperty("店铺电话") + private String shop_phone; + + @ApiModelProperty("店铺详细地址") + private String shop_address; + + @ApiModelProperty("店铺地址经度") + private String shop_lng; + + @ApiModelProperty("店铺地址维度") + private String shop_lat; +} diff --git a/mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java b/mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java new file mode 100644 index 00000000..3f9a3d0a --- /dev/null +++ b/mall-common/src/main/java/com/suisung/mall/common/pojo/res/SFExpressApiRes.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan. + * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna. + * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus. + * Vestibulum commodo. Ut rhoncus gravida arcu. + */ + +package com.suisung.mall.common.pojo.res; + +/** + * 顺丰同城开放平台 api 返回的数据结构 + */ +public class SFExpressApiRes { + private Integer error_code; + private String error_msg; + private Object result; + public Object error_data; + + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } + + public String getError_msg() { + return error_msg; + } + + public void setError_msg(String error_msg) { + this.error_msg = error_msg; + } + + public Object getError_data() { + return error_data; + } + + public void setError_data(Object error_data) { + this.error_data = error_data; + } + + public Integer getError_code() { + return error_code; + } + + public void setError_code(Integer error_code) { + this.error_code = error_code; + } +} diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/api/service/SFExpressApiService.java b/mall-shop/src/main/java/com/suisung/mall/shop/api/service/SFExpressApiService.java index a36482b5..68001de0 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/api/service/SFExpressApiService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/api/service/SFExpressApiService.java @@ -1,4 +1,12 @@ package com.suisung.mall.shop.api.service; +import com.suisung.mall.common.pojo.res.SFExpressApiRes; + public interface SFExpressApiService { + + /** + * (店铺)创建顺丰同城订单 + * @return + */ + SFExpressApiRes createOrder(); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/SFExpressApiServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/SFExpressApiServiceImpl.java index 62691075..a40cc7b5 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/SFExpressApiServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/api/service/impl/SFExpressApiServiceImpl.java @@ -8,7 +8,15 @@ package com.suisung.mall.shop.api.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.suisung.mall.common.pojo.req.SFCreateOrderReq; +import com.suisung.mall.common.pojo.req.SFOrderDetailReq; +import com.suisung.mall.common.pojo.req.SFOrderReceiveReq; +import com.suisung.mall.common.pojo.req.SFOrderShopReq; +import com.suisung.mall.common.pojo.res.SFExpressApiRes; +import com.suisung.mall.common.utils.JsonUtil; import com.suisung.mall.shop.api.service.SFExpressApiService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,6 +25,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.security.MessageDigest; +import java.util.HashMap; +import java.util.Map; @Service public class SFExpressApiServiceImpl implements SFExpressApiService { @@ -27,7 +37,10 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { private Long appId; @Value("${sf-express.appkey}") private String appKey; + @Value("${sf-express.dev_id}") + private String devId; + private final static String sfExpressApiDomain = "https://openic.sf-express.com/open/api/external/"; /** @@ -86,4 +99,83 @@ public class SFExpressApiServiceImpl implements SFExpressApiService { return false; } + + private Map buildCommonParams() { + Map params = new HashMap<>(); + params.put("dev_id", devId); + params.put("push_time", System.currentTimeMillis() / 1000); + params.put("version", 19); + return params; + } + + /** + * 组装请求地址 + * + * @param urlPath + * @param postData + * @return + */ + private String buildUrl(String urlPath, String postData) { + StringBuilder sb = new StringBuilder(sfExpressApiDomain); + sb.append(urlPath); + sb.append("?sign="); + sb.append(generateOpenSign(postData, appId, appKey)); + return sb.toString(); + } + + @Override + public SFExpressApiRes createOrder() { + // 组织请求参数 +// Map params = buildCommonParams(); +// params.put("app_id", appId); +// params.put("app_key", appKey); +// params.put("device_id", devId); + + Long now = DateUtil.currentSeconds(); + + SFCreateOrderReq param = new SFCreateOrderReq(); + param.setDev_id(1711573316); + param.setVersion(19); + param.setOrder_time(now); + param.setPush_time(now); + param.setRemark("测试顺丰同城发单,请不要通知骑手接单!"); + param.setOrder_sequence("000000123"); + param.setShop_id("3243279847393"); + param.setShop_order_id("DD-20241118-00001"); + param.setReturn_flag(511); + + SFOrderDetailReq orderDetailReq = new SFOrderDetailReq(); + param.setOrder_detail(orderDetailReq); + + SFOrderShopReq shop = new SFOrderShopReq(); + shop.setShop_name("顺丰同城"); + shop.setShop_address("北京市海淀区学清嘉创大厦A座15层"); + shop.setShop_phone("13203559287"); + shop.setShop_lng(""); + shop.setShop_lat(""); + param.setShop(shop); + + + SFOrderReceiveReq receive = new SFOrderReceiveReq(); + receive.setUser_name("顺丰同城"); + receive.setUser_phone("13881979410"); + receive.setUser_address("北京市海淀区学清嘉创大厦A座15层"); + receive.setUser_lng(""); + receive.setUser_lat(""); + param.setReceive(receive); + + + + // 转换 json 字符串参数 + String paramJSON = JsonUtil.toJSONString(param); + + // 根据参数生成请求签名 + String retRespStr = HttpUtil.post(buildUrl("createorder", paramJSON), paramJSON); + if (StrUtil.isEmpty(retRespStr)) { + logger.error("顺丰同城创建订单无返回值!"); + return null; + } + + return JsonUtil.json2object(retRespStr, SFExpressApiRes.class); + } } diff --git a/mall-shop/src/main/resources/bootstrap-dev.yml b/mall-shop/src/main/resources/bootstrap-dev.yml index e06a54e2..742f6435 100644 --- a/mall-shop/src/main/resources/bootstrap-dev.yml +++ b/mall-shop/src/main/resources/bootstrap-dev.yml @@ -130,4 +130,9 @@ logstash: feieyun: url: http://api.feieyun.cn/Api/Open/ user: 17777525395@163.com - ukey: vuzPtNVghXSxbZmr \ No newline at end of file + ukey: vuzPtNVghXSxbZmr +sf-express: + # 顺丰同城 api 接口配置 + appid: 1711573316 + appkey: cd57608baa9c00fe1cda5f652b14240d + dev_id: 1711573316 diff --git a/mall-shop/src/main/resources/bootstrap-local.yml b/mall-shop/src/main/resources/bootstrap-local.yml index e06a54e2..2782a51f 100644 --- a/mall-shop/src/main/resources/bootstrap-local.yml +++ b/mall-shop/src/main/resources/bootstrap-local.yml @@ -130,4 +130,8 @@ logstash: feieyun: url: http://api.feieyun.cn/Api/Open/ user: 17777525395@163.com - ukey: vuzPtNVghXSxbZmr \ No newline at end of file + ukey: vuzPtNVghXSxbZmr +sf-express: + # 顺丰同城 api 接口配置 + appid: 1711573316 + appkey: cd57608baa9c00fe1cda5f652b14240d \ No newline at end of file diff --git a/mall-shop/src/main/resources/bootstrap-prod.yml b/mall-shop/src/main/resources/bootstrap-prod.yml index 7e46ea89..2ee49d17 100644 --- a/mall-shop/src/main/resources/bootstrap-prod.yml +++ b/mall-shop/src/main/resources/bootstrap-prod.yml @@ -134,4 +134,8 @@ logstash: feieyun: url: http://api.feieyun.cn/Api/Open/ user: 17777525395@163.com - ukey: vuzPtNVghXSxbZmr \ No newline at end of file + ukey: vuzPtNVghXSxbZmr +sf-express: + # 顺丰同城 api 接口配置 + appid: 1711573316 + appkey: cd57608baa9c00fe1cda5f652b14240d \ No newline at end of file diff --git a/mall-shop/src/main/resources/bootstrap-test.yml b/mall-shop/src/main/resources/bootstrap-test.yml index 6614cd24..f78a4577 100644 --- a/mall-shop/src/main/resources/bootstrap-test.yml +++ b/mall-shop/src/main/resources/bootstrap-test.yml @@ -134,4 +134,8 @@ logstash: feieyun: url: http://api.feieyun.cn/Api/Open/ user: 17777525395@163.com - ukey: vuzPtNVghXSxbZmr \ No newline at end of file + ukey: vuzPtNVghXSxbZmr +sf-express: + # 顺丰同城 api 接口配置 + appid: 1711573316 + appkey: cd57608baa9c00fe1cda5f652b14240d \ No newline at end of file diff --git a/mall-shop/src/main/resources/bootstrap-uat.yml b/mall-shop/src/main/resources/bootstrap-uat.yml index 6614cd24..f78a4577 100644 --- a/mall-shop/src/main/resources/bootstrap-uat.yml +++ b/mall-shop/src/main/resources/bootstrap-uat.yml @@ -134,4 +134,8 @@ logstash: feieyun: url: http://api.feieyun.cn/Api/Open/ user: 17777525395@163.com - ukey: vuzPtNVghXSxbZmr \ No newline at end of file + ukey: vuzPtNVghXSxbZmr +sf-express: + # 顺丰同城 api 接口配置 + appid: 1711573316 + appkey: cd57608baa9c00fe1cda5f652b14240d \ No newline at end of file