Forráskód Böngészése

360 点睛平台数据回传.

chenbiao 3 éve
szülő
commit
0e40e71eb4

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/mapper/order/OrderDonPostMapper.java

@@ -0,0 +1,16 @@
+package com.cyksj.mapper.order;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDonPost;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+/**
+ * @author chan
+ * @date 2023/7/10 14:43
+ */
+public interface OrderDonPostMapper extends BaseMapper<OrderDonPost> {
+
+    @Update("update order_don_post o set o.status = 1  where o.order_id = #{orderId}")
+    void updateStatus(@Param("orderId") Long orderId);
+}

+ 127 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonPost.java

@@ -0,0 +1,127 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.Getter;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.stream.Stream;
+
+@TableName(value ="order_don_post")
+@Data
+@Accessors(chain = true)
+public class OrderDonPost extends BaseEntity implements Serializable {
+
+    /**
+     * 
+     */
+    private Long orderId;
+
+    /**
+     * 回传参数
+     */
+    private String callback;
+
+    /**
+     * 状态 true 已回传 false 未回传
+     */
+    private Boolean status;
+
+    /**
+     * Ks 快手 Dy抖音
+     */
+    private Type type;
+
+    /**
+     * 回传类型
+     */
+    private String evenType;
+
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 回传渠道类型
+     */
+    @Getter
+    public enum Type {
+
+        /**
+         * 抖音
+         */
+        DY("抖音回传", "Dy", "2"),
+
+        /**
+         * 微信
+         */
+        WeChat("微信回传", "WeChat", "PURCHASE"),
+
+        /**
+         * adq
+         */
+        adq("腾讯回传", "adq", "PURCHASE"),
+
+        /**
+         * 360点睛
+         */
+        DJ("360点睛", "dj","ORDER")
+
+        ;
+
+        /**
+         * 描述
+         */
+        private String desc;
+
+        /**
+         * 回传类型
+         */
+        private String type;
+
+        /**
+         * 类型 表单提交
+         */
+        private String evenType;
+
+
+        Type(String desc, String type, String evenType) {
+            this.desc = desc;
+            this.type = type;
+            this.evenType = evenType;
+        }
+
+        /**
+         * 根据type 获取
+         *
+         * @param type
+         * @return
+         */
+        @SuppressWarnings("rawtypes")
+        public static Type getByType(String type) {
+            return Stream.of(Type.values())
+                    .filter((enums) -> enums.getType().equals(type)).findFirst().get();
+
+        }
+
+        /**
+         * 根据type
+         *
+         * @param type
+         * @return
+         */
+        @SuppressWarnings("rawtypes")
+        public static Boolean verify(String type) {
+            if (StringUtils.isBlank(type)) {
+                return Boolean.FALSE;
+            }
+            return Stream.of(Type.values())
+                    .anyMatch((enums) -> enums.getType().equals(type));
+        }
+
+
+    }
+}

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -94,4 +94,8 @@ public class OrderPayRequest {
      * 余额支付
      */
     private BigDecimal balance;
+
+    private String callback;
+
+    private String callbackType;
 }

+ 2 - 9
netflix-service/src/main/java/com/cyksj/service/advertisement/impl/AdvertisementOrderPostServiceImpl.java

@@ -1,24 +1,17 @@
 package com.cyksj.service.advertisement.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.cyksj.common.util.Jsons;
-import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.advertisement.AdvertisementOrderPostMapper;
 import com.cyksj.model.entity.AdvertisementOrderPost;
 import com.cyksj.service.advertisement.AdvertisementOrderPostService;
-import com.cyksj.service.advertisement.postdata.AbstractPostDataService;
-import com.cyksj.service.advertisement.postdata.PostDataFactory;
+import com.cyksj.service.order.post.AbstractPostDataService;
+import com.cyksj.service.order.post.PostDataFactory;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * @author chan
  * @date 2023/5/16 11:05 AM

+ 0 - 220
netflix-service/src/main/java/com/cyksj/service/advertisement/postdata/impl/WeChatPostDataService.java

@@ -1,220 +0,0 @@
-package com.cyksj.service.advertisement.postdata.impl;
-
-import cn.hutool.http.HttpUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.cyksj.common.util.*;
-import com.cyksj.mapper.advertisement.AdvertisementOrderDonMapper;
-import com.cyksj.mapper.advertisement.AdvertisementOrderPostMapper;
-import com.cyksj.mapper.advertisement.AdvertisementPopularizeMapper;
-import com.cyksj.model.entity.*;
-import com.cyksj.service.advertisement.postdata.AbstractPostDataService;
-import com.cyksj.service.advertisement.postdata.PostDataFactory;
-import com.cyksj.service.advertisement.tencent.TenCentActionSetService;
-import com.cyksj.service.advertisement.tencent.TenCentUserAccessTokenService;
-import com.cyksj.service.advertisement.tencent.TenCentUserService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.math.BigDecimal;
-import java.net.URLDecoder;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-/**
- * @author chan
- * @className DyPostDataService
- * @description 微信回传
- * @date 2020/12/15 1:35 下午
- */
-
-@Slf4j
-@Service("WeChatPostDataService")
-@RequiredArgsConstructor
-public class WeChatPostDataService extends AbstractPostDataService {
-
-
-    private final AdvertisementOrderPostMapper orderPostMapper;
-
-    private final AdvertisementPopularizeMapper popularizeMapper;
-
-    private final AdvertisementOrderDonMapper orderDonMapper;
-
-    private final TenCentActionSetService tenCentActionSetService;
-
-    private final TenCentUserAccessTokenService tenCentUserAccessTokenService;
-
-    private final TenCentUserService tenCentUserService;
-
-
-    @Override
-    public void postData(Long orderId, String callback, String evenType) throws Exception {
-
-        callback = callback.replaceAll("#", "");
-        log.info("腾讯广告回传入参id:{}", orderId);
-
-        callback = URLDecoder.decode(callback, IoKit.Charsets.UTF_8.getCharset());
-
-        Map<String, String> paramMap = HttpUtil.decodeParamMap(callback, StandardCharsets.UTF_8);
-        AdvertisementOrderDon orderDon = orderDonMapper.selectById(orderId);
-        AdvertisementPopularize popularize = popularizeMapper.selectById(orderDon.getPopularizeId());
-
-        String dataId = popularize.getDataId() != null ? StringUtil.getString(popularize.getDataId()) : paramMap.get("dataId");
-        //adq
-        if (dataId != null) {
-            String clickId = Optional.ofNullable(paramMap.get("click_id")).orElse(Optional.ofNullable(paramMap.get("qz_gdt")).orElse(Optional.ofNullable(paramMap.get("gdt_vid")).orElse("")));
-
-            TencentActionSet actionSet = tenCentActionSetService.getOne(Wrappers.lambdaQuery(TencentActionSet.class).eq(TencentActionSet::getUserActionSetId, dataId));
-            AdvertisementOrderPost orderPost = orderPostMapper.selectOne(Wrappers.lambdaQuery(AdvertisementOrderPost.class).eq(AdvertisementOrderPost::getOrderId, orderId));
-            orderPost.setType(AdvertisementOrderPost.Type.adq);
-            orderPostMapper.updateById(orderPost);
-            if (actionSet != null) {
-
-                TencentUser tencentUser = tenCentUserService.getById(actionSet.getUserId());
-                TencentUserAccessToken accessToken = tenCentUserAccessTokenService.getOne(new QueryWrapper<TencentUserAccessToken>().lambda().eq(TencentUserAccessToken::getTencentUserId, tencentUser.getId()));
-
-                String url = "https://api.e.qq.com/v1.3/user_actions/add?access_token=" + accessToken.getAccessToken() +
-                        "&timestamp=" + System.currentTimeMillis() / 1000 +
-                        "&nonce=" + Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData("toufang123" + System.currentTimeMillis()).toHexString();
-
-
-                List<Map<String, Object>> actions = new ArrayList<>();
-                Map<String, Object> action = new HashMap<>(8);
-                action.put("url", callback);
-                action.put("action_time", System.currentTimeMillis() / 1000);
-                action.put("action_type", evenType);
-                Map<Object, Object> trace = new HashMap<>(2);
-                trace.put("click_id", clickId);
-                action.put("trace", trace);
-                BigDecimal money = orderDon.getMoney();
-                Map<Object, Object> actionParam = new HashMap<>(2);
-                actionParam.put("value",money);
-                action.put("action_param", actionParam);
-                actions.add(action);
-
-                Map<String, Object> params = new HashMap<>(2);
-                params.put("user_action_set_id", actionSet.getUserActionSetId());
-                params.put("account_id", tencentUser.getAccountId());
-                params.put("actions", actions);
-
-                log.info("腾讯广告api回传 参数params:{}", Jsons.toJson(params));
-                HttpResponse<byte[]> res =
-                        J11HttpC.custom()
-                                .ofPost()
-                                .url(url)
-                                .headers(J11HttpC.ReqType.raw_json)
-                                .body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(params), IoKit.Charsets.UTF_8.getCharset()))
-                                .send(HttpResponse.BodyHandlers.ofByteArray());
-
-
-                Map<String, Object> resMap = Jsons.parseObject(res.body(), Map.class);
-                log.info("腾讯广告api回传:{}", resMap);
-
-                String result = StringUtil.getString(resMap.get("code"));
-                if ("0".equals(result)) {
-                    //修改记录状态
-                    orderPostMapper.updateStatus(orderId);
-                    log.info("回传记录修改状态");
-
-                    // 判断回传状态
-                    if ("未接入".equals(actionSet.getStatus())) {
-                        actionSet.setStatus("已接入");
-                        tenCentActionSetService.updateById(actionSet);
-                    }
-                } else {
-                    //错误
-                    log.error("腾讯广告回传错误 msg:{}, orderId:{}", StringUtil.getString(resMap.get("message")), orderId);
-                }
-            }
-        }
-
-    }
-
-
-    //public void postWeChat(Long orderId, String callback, String evenType) throws Exception {
-    //
-    //    log.info("微信回传入参id:{}", orderId);
-    //    long time = System.currentTimeMillis();
-    //
-    //    AdvertisementOrderPost orderPost = orderPostMapper.getByOrderId(orderId);
-    //
-    //    AdvertisementOrderDon orderDon = orderDonMapper.selectById(orderId);
-    //    Long   popularizeId = orderDon.getPopularizeId();
-    //    String   openId = orderDon.getOpenId();
-    //
-    //    AdvertisementPopularize popularize = popularizeMapper.selectById(popularizeId);
-    //    String appId;
-    //    String dataId;
-    //
-    //    String accessToken = weChatService.getAccessToken(appId);
-    //    String url = "https://api.weixin.qq.com/marketing/user_actions/add?version=v1.0&access_token=" + accessToken;
-    //
-    //    callback = URLDecoder.decode(callback, IoKit.Charsets.UTF_8.getCharset());
-    //// 兼容性代码
-    //    Map<String, String> paramMap = HttpUtil.decodeParamMap(callback, StandardCharsets.UTF_8);
-    //
-    //    String clickId = paramMap.get("click_id") != null ? paramMap.get("click_id") : paramMap.get("gdt_vid");
-    //
-    //    List<Map<String,Object>> actions = new ArrayList<>();
-    //    Map<String,Object> action = new HashMap<>(8);
-    //    action.put("url",callback);
-    //    action.put("action_time", time /1000);
-    //    action.put("action_type",evenType);
-    //
-    //    Map<Object, Object> trace = new HashMap<>(2);
-    //    trace.put("click_id", clickId);
-    //    action.put("trace", trace);
-    //
-    //    //测试roi
-    //    if(popularizeId == 416936782416842752L || popularizeId == 421650470746984448L || popularizeId == 436556082228236288L || popularizeId == 451050013800271872L || popularizeId == 454269741779914752L || popularizeId == 435050773403930624L){
-    //        BigDecimal money;
-    //        if(FoundationOrderPost.OrderType.time.getType().equals(orderPost.getOrderType())){
-    //            //次捐
-    //            money = orderDonMapper.selectById(orderId).getMoney();
-    //        }else {
-    //            money = monthlyDonationMapper.selectById(orderId).getMoney();
-    //        }
-    //        Map<Object, Object> actionParam = new HashMap<>(2);
-    //        actionParam.put("value",money);
-    //        action.put("action_param", actionParam);
-    //    }
-    //
-    //    actions.add(action);
-    //
-    //    //
-    //    Map<String, Object> params = new HashMap<>(2);
-    //    params.put("user_action_set_id",dataId);
-    //    params.put("actions",actions);
-    //
-    //    HttpResponse<byte[]> res =
-    //            J11HttpC.custom()
-    //                    .ofPost()
-    //                    .url(url)
-    //                    .headers(J11HttpC.ReqType.raw_json)
-    //                    .body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(params), IoKit.Charsets.UTF_8.getCharset()))
-    //                    .send(HttpResponse.BodyHandlers.ofByteArray());
-    //
-    //    Map<String, Object> resMap = Jsons.parseObject(res.body(), Map.class);
-    //    log.info("微信api回传:{}", resMap);
-    //
-    //    String result = StringUtil.getString(resMap.get("errcode"));
-    //    if ("0".equals(result)) {
-    //        //修改记录状态
-    //        orderPostMapper.updateStatus(orderId);
-    //        log.info("回传记录修改状态");
-    //    }else {
-    //        //错误
-    //        log.error("微信回传错误 msg:{}, orderId:{}",StringUtil.getString(resMap.get("errmsg")),orderId);
-    //    }
-    //}
-
-    @PostConstruct
-    public void init() {
-        PostDataFactory.add(this, this.getClass().getSimpleName());
-    }
-
-}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderDonPostService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.order;
+
+/**
+ * @author chan
+ * @date 2023/5/16 11:05 AM
+ */
+public interface OrderDonPostService {
+    void postData(Long orderId) throws Exception;
+
+    void savePostData(Long orderId, String callback, String callbackType);
+}

+ 59 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonPostServiceImpl.java

@@ -0,0 +1,59 @@
+package com.cyksj.service.order.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.advertisement.AdvertisementOrderPostMapper;
+import com.cyksj.mapper.order.OrderDonPostMapper;
+import com.cyksj.model.entity.AdvertisementOrderPost;
+import com.cyksj.model.entity.OrderDonPost;
+import com.cyksj.service.advertisement.AdvertisementOrderPostService;
+import com.cyksj.service.order.OrderDonPostService;
+import com.cyksj.service.order.post.AbstractPostDataService;
+import com.cyksj.service.order.post.PostDataFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+/**
+ * @author chan
+ * @date 2023/5/16 11:05 AM
+ */
+@Service
+@Slf4j
+public class OrderDonPostServiceImpl extends ServiceImpl<OrderDonPostMapper, OrderDonPost> implements OrderDonPostService {
+
+    @Override
+    public void postData(Long orderId) throws Exception {
+        OrderDonPost orderPost = this.getOne(Wrappers.lambdaQuery(OrderDonPost.class).eq(OrderDonPost::getOrderId, orderId).eq(OrderDonPost::getStatus, Boolean.FALSE));
+        if (orderPost == null) {
+            log.info("post 数据 不了存在 id:{}", orderId);
+            return;
+        }
+        post(orderId, orderPost);
+    }
+
+    @Override
+    public void savePostData(Long orderId, String callback, String callbackType) {
+        if (AdvertisementOrderPost.Type.verify(callbackType) && StringUtils.isNotBlank(callback)) {
+            log.info("订单数据回传添加记录:{},type:{},orderType:{}", orderId, callbackType);
+            OrderDonPost.Type byType = OrderDonPost.Type.getByType(callbackType);
+
+            this.save(new OrderDonPost().setCallback(callback).setEvenType(byType.getEvenType()).setOrderId(orderId).setType(byType));
+        }
+
+    }
+
+
+    /**
+     * 数据回传
+     */
+    private void post(Long orderId, OrderDonPost orderPost) throws Exception {
+        AbstractPostDataService postStrategy = PostDataFactory.getPostStrategy(orderPost.getType().getType());
+
+        Assert.notNull(postStrategy, "回传渠道类型不存在。");
+
+        postStrategy.postData(orderId, orderPost.getCallback(), orderPost.getEvenType());
+    }
+
+}

+ 25 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -67,6 +67,7 @@ import com.cyksj.service.groups.GroupsFuncService;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderCommonService;
+import com.cyksj.service.order.OrderDonPostService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.pay.AliPayCommonService;
 import com.cyksj.service.relation.GroupRelationClearService;
@@ -202,6 +203,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final AliPayCommonService aliPayCommonService;
 
+	private final OrderDonPostService orderDonPostService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -308,6 +311,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				closeOrder(orderDon.getId());
 			});
 		}
+
+		//数据回传
+		if (StringUtils.isNotBlank(payRequest.getCallback())) {
+			orderDonPostService.savePostData(orderDon.getId(), payRequest.getCallback(), payRequest.getCallbackType());
+		}
+
 		return orderDon;
 	}
 
@@ -492,6 +501,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				log.error("wx增加抽奖机会错误,orderId:{},error:{}", order.getId(), e);
 			}
 		});
+
+		TASK_POOL.execute(()->{
+			try {
+				orderDonPostService.postData((order.getId()));
+			} catch (Exception e) {
+				log.error("回传错误 {}",StringUtil.getErrorText(e));
+			}
+		});
 	}
 
 	@Override
@@ -817,6 +834,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				log.error("zfb增加抽奖机会错误,orderId:{},error:{}", orderDon.getId(), e);
 			}
 		});
+
+		TASK_POOL.execute(()->{
+			try {
+				orderDonPostService.postData((orderDon.getId()));
+			} catch (Exception e) {
+				log.error("回传错误 {}",StringUtil.getErrorText(e));
+			}
+		});
 	}
 
 	public void setRelation(Long relationId, Long groupsId, Long userId, Long goodsId, Boolean isLoginPopularize) {

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/advertisement/postdata/AbstractPostDataService.java → netflix-service/src/main/java/com/cyksj/service/order/post/AbstractPostDataService.java

@@ -1,4 +1,4 @@
-package com.cyksj.service.advertisement.postdata;
+package com.cyksj.service.order.post;
 
 /**
  * @author chan

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/advertisement/postdata/PostDataFactory.java → netflix-service/src/main/java/com/cyksj/service/order/post/PostDataFactory.java

@@ -1,4 +1,4 @@
-package com.cyksj.service.advertisement.postdata;
+package com.cyksj.service.order.post;
 
 import com.cyksj.common.util.SpringCtxUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -36,7 +36,7 @@ public class PostDataFactory {
         }
     }
 
-    public static void add(AbstractPostDataService postDataService,String key) {
+    public static void add(AbstractPostDataService postDataService, String key) {
         strategyBean.put(key,postDataService);
     }
 

+ 136 - 0
netflix-service/src/main/java/com/cyksj/service/order/post/impl/DianJingDataService.java

@@ -0,0 +1,136 @@
+package com.cyksj.service.order.post.impl;
+
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.*;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.order.OrderDonPostMapper;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.service.order.post.AbstractPostDataService;
+import com.cyksj.service.order.post.PostDataFactory;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.net.URLDecoder;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 360点睛回传
+ *
+ * @author chan
+ * @date 2023-07-10 14:20
+ */
+@Slf4j
+@Service("DianJingDataService")
+@RequiredArgsConstructor
+public class DianJingDataService extends AbstractPostDataService{
+
+    //key: 6px6m643y9zoadccx4n1
+    //Secret: omgdr7q9bxw0rsyb634wnhk1fjow7o4j
+    private static final String APP_KEY = "6px6m643y9zoadccx4n1";
+
+    private static final String APP_SECRET = "omgdr7q9bxw0rsyb634wnhk1fjow7o4j";
+
+    private final OrderDonPostMapper orderPostMapper;
+
+    private final OrderDonMapper orderDonMapper;
+
+
+    @Override
+    public void postData(Long orderId, String callback, String evenType) throws Exception {
+        callback = callback.replaceAll("#", "");
+        log.info("360广告回传入参id:{}", orderId);
+
+        callback = URLDecoder.decode(callback, IoKit.Charsets.UTF_8.getCharset());
+
+        Map<String, String> paramMap = HttpUtil.decodeParamMap(callback, StandardCharsets.UTF_8);
+        OrderDon orderDon = orderDonMapper.selectById(orderId);
+        //临时处理 只回传奈飞,其他不回传。
+        if(orderDon.getGoodsId() != 1){
+            log.info("360 只回传奈飞. 该订单商品id:{}",orderDon.getGoodsId());
+            return;
+        }
+        String qhclickid = Optional.ofNullable(paramMap.get("qhclickid")).orElse("");
+        if (StringUtil.isBlank(qhclickid)) {
+            throw new BusinessRuntimeException("360回传错误. qhclickid为空 orderId:" + orderId);
+        }
+        JSONObject params = new JSONObject();
+        DianJingPostData dianJingPostData = new DianJingPostData();
+
+        if(orderDon.getIsWebPay()){
+            //ocpc_ms_convert[移动搜索]
+            //ocpc_ps_convet[PC搜索推广]
+            dianJingPostData.setData_industry("ocpc_ps_convert");
+        }else {
+            dianJingPostData.setData_industry("ocpc_ms_convert");
+        }
+        DianJingPostDataDetail dianJingPostDataDetail = new DianJingPostDataDetail();
+        dianJingPostDataDetail.setQhclickid(qhclickid);
+        dianJingPostDataDetail.setEvent(evenType);
+        dianJingPostDataDetail.setTrans_id(orderId.toString());
+        dianJingPostData.setData_detail(dianJingPostDataDetail);
+        params.putOpt("data",dianJingPostData);
+
+
+        String url = "https://convert.dop.360.cn/uploadWebConvert";
+        String postData = Jsons.toJson(params);
+        log.info("360广告api回传 参数params:{}", postData);
+        String sign = Codec.DoDigest.custom()
+                .setAlgorithm(Codec.DoDigest.Algorithm.MD5)
+                .setStringData(APP_SECRET + postData).toHexString();
+        HttpResponse<byte[]> res =
+                J11HttpC.custom()
+                        .ofPost()
+                        .url(url)
+                        .headers(J11HttpC.ReqType.raw_json, J11HttpC.ofHeader("App-Key",APP_KEY), J11HttpC.ofHeader("App-Sign",sign))
+                        .body(HttpRequest.BodyPublishers.ofString(postData, IoKit.Charsets.UTF_8.getCharset()))
+                        .send(HttpResponse.BodyHandlers.ofByteArray());
+
+
+        Map<String, Object> resMap = Jsons.parseObject(res.body(), Map.class);
+        log.info("360广告api回传:{}", resMap);
+
+        String result = StringUtil.getString(resMap.get("errno"));
+        if ("0".equals(result)) {
+            //修改记录状态
+            orderPostMapper.updateStatus(orderId);
+            log.info("回传记录修改状态");
+
+        } else {
+            //错误
+            log.error("360广告回传错误 msg:{}, orderId:{}", StringUtil.getString(resMap.get("error")), orderId);
+        }
+
+    }
+
+    @PostConstruct
+    public void init() {
+       PostDataFactory.add(this, this.getClass().getSimpleName());
+    }
+
+    @Data
+    static class DianJingPostData{
+
+        private String data_industry;
+
+        private DianJingPostDataDetail data_detail;
+    }
+
+    @Data
+    static class DianJingPostDataDetail{
+        private String qhclickid;
+
+        private String event;
+
+        private String trans_id;
+    }
+}