|
@@ -6,11 +6,14 @@ import com.dderp.common.api.flycat.DouyinService;
|
|
|
import com.dderp.common.datas.ERPHeader;
|
|
import com.dderp.common.datas.ERPHeader;
|
|
|
import com.dderp.common.datas.RedisKeys;
|
|
import com.dderp.common.datas.RedisKeys;
|
|
|
import com.dderp.common.entity.invoke.douyin.DouyinCallBody;
|
|
import com.dderp.common.entity.invoke.douyin.DouyinCallBody;
|
|
|
|
|
+import com.dderp.common.entity.order.BusinessOrder;
|
|
|
import com.dderp.common.entity.site.ERPTokenUser;
|
|
import com.dderp.common.entity.site.ERPTokenUser;
|
|
|
|
|
+import com.dderp.common.entity.store.StorePlatform;
|
|
|
import com.dySweetFishPlugin.redis.RedisService;
|
|
import com.dySweetFishPlugin.redis.RedisService;
|
|
|
import com.sweetfish.convert.json.JsonConvert;
|
|
import com.sweetfish.convert.json.JsonConvert;
|
|
|
import com.sweetfish.net.WorkThread;
|
|
import com.sweetfish.net.WorkThread;
|
|
|
import com.sweetfish.net.http.*;
|
|
import com.sweetfish.net.http.*;
|
|
|
|
|
+import com.sweetfish.service.RetResult;
|
|
|
import com.sweetfish.util.AnyValue;
|
|
import com.sweetfish.util.AnyValue;
|
|
|
import com.sweetfish.util.AutoLoad;
|
|
import com.sweetfish.util.AutoLoad;
|
|
|
import org.apache.commons.codec.digest.DigestUtils;
|
|
import org.apache.commons.codec.digest.DigestUtils;
|
|
@@ -18,8 +21,7 @@ import org.apache.logging.log4j.LogManager;
|
|
|
import org.apache.logging.log4j.Logger;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.HashMap;
|
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.ExecutorService;
|
|
|
import java.util.concurrent.ForkJoinPool;
|
|
import java.util.concurrent.ForkJoinPool;
|
|
|
|
|
|
|
@@ -69,34 +71,34 @@ public class OrderCallServlet extends HttpServlet {
|
|
|
//当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
|
|
//当前查看顺丰的回调,没有字段体现出顺丰的接口,大概每个快递平台需要不同的地址提供回调,顺丰的回调可以通过url_index来判断回调的业务
|
|
|
|
|
|
|
|
@HttpMapping(url = "/order/douyinCall", methods = {"POST"}, comment = "回调入口")
|
|
@HttpMapping(url = "/order/douyinCall", methods = {"POST"}, comment = "回调入口")
|
|
|
- public void sfCall(HttpRequest request, HttpResponse response) {
|
|
|
|
|
|
|
+ public void douyinCall(HttpRequest request, HttpResponse response) {
|
|
|
//简单的入口,估计也没多少接口提供出去,这里多加一层方法包一下,是担心后续会修改
|
|
//简单的入口,估计也没多少接口提供出去,这里多加一层方法包一下,是担心后续会修改
|
|
|
logger.info(request);
|
|
logger.info(request);
|
|
|
String body = request.getBodyUTF8();
|
|
String body = request.getBodyUTF8();
|
|
|
- Map<String, Object> bodyMap = jsonConvert.convertFrom(HashMap.class, body);
|
|
|
|
|
|
|
+// Map<String, Object> bodyMap = jsonConvert.convertFrom(HashMap.class, body);
|
|
|
|
|
|
|
|
- response.finish(bodyMap.get("content"));
|
|
|
|
|
|
|
+// response.finish(bodyMap.get("content"));
|
|
|
|
|
|
|
|
- /* 以上为接口接入验证代码,以下为正式带验签代码 */
|
|
|
|
|
|
|
+ /* 以上为接口接入验证代码,以下为正式带验签代码 */
|
|
|
String douyinSign = request.getHeader("X-Douyin-Signature");
|
|
String douyinSign = request.getHeader("X-Douyin-Signature");
|
|
|
String douyinMsgId = request.getHeader("Msg-Id");
|
|
String douyinMsgId = request.getHeader("Msg-Id");
|
|
|
String dataSourceId = request.getHeader(ERPHeader.HTTPHEADER_DATASOURCE);
|
|
String dataSourceId = request.getHeader(ERPHeader.HTTPHEADER_DATASOURCE);
|
|
|
long supplierCode = Long.parseLong(request.getHeader(ERPHeader.HTTPHEADER_SUPPLIER));
|
|
long supplierCode = Long.parseLong(request.getHeader(ERPHeader.HTTPHEADER_SUPPLIER));
|
|
|
|
|
|
|
|
- if (redisService.exists(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode))) {
|
|
|
|
|
|
|
+ if (redisService.exists(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode, true) + douyinMsgId)) {
|
|
|
//重复消息,不处理
|
|
//重复消息,不处理
|
|
|
- response.finish();
|
|
|
|
|
|
|
+ logger.info("收到重复推送信息,不予处理[" + douyinMsgId + "]");
|
|
|
|
|
+ response.finish(200, "success");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
//1小时过期,应该够了吧
|
|
//1小时过期,应该够了吧
|
|
|
- redisService.expire(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode), 3600);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ redisService.setex(keysService.getRedisKey(RedisKeys.KEY_DOUYIN_CALL_MSG_ID, supplierCode, true) + douyinMsgId, 3600, 1);
|
|
|
|
|
|
|
|
String signData = douyinAppSecret + body;
|
|
String signData = douyinAppSecret + body;
|
|
|
String sign = DigestUtils.sha1Hex(signData);
|
|
String sign = DigestUtils.sha1Hex(signData);
|
|
|
if (!sign.equals(douyinSign)) {
|
|
if (!sign.equals(douyinSign)) {
|
|
|
logger.error("[抖音来客]Webhooks推送消息验签失败");
|
|
logger.error("[抖音来客]Webhooks推送消息验签失败");
|
|
|
- response.finish();
|
|
|
|
|
|
|
+ response.finish(200, "success");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -104,40 +106,56 @@ public class OrderCallServlet extends HttpServlet {
|
|
|
logger.info("[抖音来客]Webhooks推送消息:[" + callBody.getEvent() + "]");
|
|
logger.info("[抖音来客]Webhooks推送消息:[" + callBody.getEvent() + "]");
|
|
|
logger.info(callBody.getContent());
|
|
logger.info(callBody.getContent());
|
|
|
|
|
|
|
|
|
|
+ //造一个系统后台用户
|
|
|
|
|
+ ERPTokenUser currentUser = new ERPTokenUser();
|
|
|
|
|
+ currentUser.setId(-100);
|
|
|
|
|
+ currentUser.setUserName("抖音来客");
|
|
|
|
|
+
|
|
|
switch (callBody.getEvent()) {
|
|
switch (callBody.getEvent()) {
|
|
|
case "life_saas_cooperate_auth_with_bind": {
|
|
case "life_saas_cooperate_auth_with_bind": {
|
|
|
//能力授权&门店绑定消息
|
|
//能力授权&门店绑定消息
|
|
|
- storeService.bindStorePlatformDouyin(callBody.getContent(), dataSourceId, supplierCode);
|
|
|
|
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
|
|
+ RetResult<StorePlatform> result = storeService.bindStorePlatformDouyin(callBody.getContent(), dataSourceId, supplierCode, currentUser);
|
|
|
|
|
+ if (result.isSuccess()) logger.info("[抖音来客]平台门店绑定成功");
|
|
|
|
|
+ else logger.error("[抖音来客]平台门店绑定失败:" + result.getRetinfo());
|
|
|
|
|
+ });
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
case "life_takeout_order_pay_success": {
|
|
case "life_takeout_order_pay_success": {
|
|
|
//用户下单消息
|
|
//用户下单消息
|
|
|
- douyinService.importOrderFromDouyin(callBody.getContent(), dataSourceId, supplierCode);
|
|
|
|
|
|
|
+ CompletableFuture.runAsync(() -> {
|
|
|
|
|
+ RetResult<BusinessOrder> result = douyinService.importOrderFromDouyin(callBody.getContent(), dataSourceId, supplierCode, currentUser);
|
|
|
|
|
+ if (result.isSuccess())
|
|
|
|
|
+ logger.info("[抖音来客]客户下单成功,订单编号[" + result.getResult().getOrderCode() + "]");
|
|
|
|
|
+ else logger.error("[抖音来客]客户下单失败:" + result.getRetinfo());
|
|
|
|
|
+ });
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case "life_takeout_order_merchant_receive":{
|
|
|
|
|
|
|
+ case "life_takeout_order_merchant_receive": {
|
|
|
//商户接单消息
|
|
//商户接单消息
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case "life_takeout_order_merchant_refuse":{
|
|
|
|
|
|
|
+ case "life_takeout_order_merchant_refuse": {
|
|
|
//商户拒单消息
|
|
//商户拒单消息
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case "life_trade_refund_complete":{
|
|
|
|
|
|
|
+ case "life_trade_refund_complete": {
|
|
|
//订单已取消消息
|
|
//订单已取消消息
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case "life_trade_takeout_order_finish":{
|
|
|
|
|
|
|
+ case "life_trade_takeout_order_finish": {
|
|
|
//订单完成消息
|
|
//订单完成消息
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- case "life_trade_takeout_order_modify":{
|
|
|
|
|
|
|
+ case "life_trade_takeout_order_modify": {
|
|
|
//订单修改消息,主要是修改配送信息
|
|
//订单修改消息,主要是修改配送信息
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//无论如何,最终还得返回个200
|
|
//无论如何,最终还得返回个200
|
|
|
- response.finish();
|
|
|
|
|
|
|
+ response.finish(200, "success");
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|