新增顺丰同城的业务代码

This commit is contained in:
Jack 2024-11-18 12:16:46 +08:00
parent 8336994c30
commit 5bcdaf40a7
13 changed files with 396 additions and 5 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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<String, Object> buildCommonParams() {
Map<String, Object> 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<String, Object> 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);
}
}

View File

@ -130,4 +130,9 @@ logstash:
feieyun:
url: http://api.feieyun.cn/Api/Open/
user: 17777525395@163.com
ukey: vuzPtNVghXSxbZmr
ukey: vuzPtNVghXSxbZmr
sf-express:
# 顺丰同城 api 接口配置
appid: 1711573316
appkey: cd57608baa9c00fe1cda5f652b14240d
dev_id: 1711573316

View File

@ -130,4 +130,8 @@ logstash:
feieyun:
url: http://api.feieyun.cn/Api/Open/
user: 17777525395@163.com
ukey: vuzPtNVghXSxbZmr
ukey: vuzPtNVghXSxbZmr
sf-express:
# 顺丰同城 api 接口配置
appid: 1711573316
appkey: cd57608baa9c00fe1cda5f652b14240d

View File

@ -134,4 +134,8 @@ logstash:
feieyun:
url: http://api.feieyun.cn/Api/Open/
user: 17777525395@163.com
ukey: vuzPtNVghXSxbZmr
ukey: vuzPtNVghXSxbZmr
sf-express:
# 顺丰同城 api 接口配置
appid: 1711573316
appkey: cd57608baa9c00fe1cda5f652b14240d

View File

@ -134,4 +134,8 @@ logstash:
feieyun:
url: http://api.feieyun.cn/Api/Open/
user: 17777525395@163.com
ukey: vuzPtNVghXSxbZmr
ukey: vuzPtNVghXSxbZmr
sf-express:
# 顺丰同城 api 接口配置
appid: 1711573316
appkey: cd57608baa9c00fe1cda5f652b14240d

View File

@ -134,4 +134,8 @@ logstash:
feieyun:
url: http://api.feieyun.cn/Api/Open/
user: 17777525395@163.com
ukey: vuzPtNVghXSxbZmr
ukey: vuzPtNVghXSxbZmr
sf-express:
# 顺丰同城 api 接口配置
appid: 1711573316
appkey: cd57608baa9c00fe1cda5f652b14240d