Parcourir la source

facebook 回传

zwhui il y a 2 ans
Parent
commit
e1b416e144

+ 5 - 0
netflix-common/src/main/java/com/cyksj/enums/GatewayApiCode.java

@@ -59,6 +59,11 @@ public enum GatewayApiCode {
 
     GROUP_INDEX_ALREADY_BE_USER(40002,"该车位已有人"),
 
+    /**
+     * facebook
+     */
+    FACEBOOK_ERROR(20001,"Callback error"),
+
 
     //用户未登录
     CMS_USER_NO_LOGIN(20000,"用户未登录!"),

+ 8 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonPost.java

@@ -68,7 +68,14 @@ public class OrderDonPost extends BaseEntity implements Serializable {
         /**
          * 360点睛
          */
-        DJ("360点睛", "dj","ORDER")
+        DJ("360点睛", "dj","ORDER"),
+
+        /**
+         * facebook
+         */
+        FB("facebook", "Facebook",null)
+
+
 
         ;
 

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

@@ -7,5 +7,5 @@ package com.cyksj.service.order;
 public interface OrderDonPostService {
     void postData(Long orderId) throws Exception;
 
-    void savePostData(Long orderId, String callback, String callbackType);
+    void savePostData(Long orderId, String ip, String userAgent,String callback, String callbackType);
 }

+ 19 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonPostServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.order.impl;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.mapper.order.OrderDonPostMapper;
@@ -7,6 +8,9 @@ import com.cyksj.model.entity.OrderDonPost;
 import com.cyksj.service.order.OrderDonPostService;
 import com.cyksj.service.order.post.AbstractPostDataService;
 import com.cyksj.service.order.post.PostDataFactory;
+import com.facebook.ads.sdk.serverside.ActionSource;
+import com.facebook.ads.sdk.serverside.Event;
+import com.facebook.ads.sdk.serverside.UserData;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
@@ -31,11 +35,23 @@ public class OrderDonPostServiceImpl extends ServiceImpl<OrderDonPostMapper, Ord
     }
 
     @Override
-    public void savePostData(Long orderId, String callback, String callbackType) {
+    public void savePostData(Long orderId,String ip, String userAgent, String callback, String callbackType) {
         if (OrderDonPost.Type.verify(callbackType) && StringUtils.isNotBlank(callback)) {
-            log.info("订单数据回传添加记录:{},type:{},orderType:{}", orderId, callbackType);
+            log.info("订单数据回传添加记录:{},type:{}", orderId, callbackType);
             OrderDonPost.Type byType = OrderDonPost.Type.getByType(callbackType);
-
+            if (OrderDonPost.Type.FB.equals(byType)){
+                log.info("package facebook orderPost data start orderId:{}",orderId);
+                Event event = new Event();
+                UserData userData = new UserData();
+                event.setEventId(orderId.toString());
+                event.setEventName("Donate");
+                event.setEventTime(System.currentTimeMillis()/1000);
+                event.setActionSource(ActionSource.website);
+                userData.setClientUserAgent(userAgent);
+                userData.setClientIpAddress(ip);
+                event.setUserData(userData);
+                callback = JSONUtil.toJsonStr(event);
+            }
             this.save(new OrderDonPost().setCallback(callback).setEvenType(byType.getEvenType()).setOrderId(orderId).setType(byType));
         }
 

+ 9 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -5,6 +5,8 @@ import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
+import cn.hutool.http.Header;
 import cn.hutool.json.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
@@ -87,6 +89,7 @@ import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -209,6 +212,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
+	private final HttpServletRequest request;
+
 	@Transactional(rollbackFor = Throwable.class)
 	@Override
 	public OrderDon submit(OrderPayRequest payRequest) throws Exception {
@@ -373,10 +378,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				closeOrder(orderDon.getId(), null);
 			});
 		}
-
+		String clientIp = ServletUtil.getClientIP(request);
+		String userAgent = request.getHeader(Header.USER_AGENT.toString());
 		//数据回传
 		if (StringUtils.isNotBlank(payRequest.getCallback())) {
-			orderDonPostService.savePostData(orderDon.getId(), payRequest.getCallback(), payRequest.getCallbackType());
+			orderDonPostService.savePostData(orderDon.getId(),clientIp,userAgent, payRequest.getCallback(), payRequest.getCallbackType());
 		}
 		//无回传前端传入 查询缓存中用户的回传信息
 		if (StringUtils.isEmpty(payRequest.getCallback())) {
@@ -386,7 +392,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					Optional.ofNullable(Jsons.parseObject(val, OrderDonPostDataDto.class))
 							.ifPresent(orderDonPostDataDto -> {
 								log.info("用户ID:{}预下单 回传用户缓存 订单回传记录保存,callback:{},callbackType:{}", orderDon.getUserId(), orderDonPostDataDto.getCallback(), orderDonPostDataDto.getCallbackType());
-								orderDonPostService.savePostData(orderDon.getId(), orderDonPostDataDto.getCallback(), orderDonPostDataDto.getCallbackType());
+								orderDonPostService.savePostData(orderDon.getId(), clientIp,userAgent,orderDonPostDataDto.getCallback(), orderDonPostDataDto.getCallbackType());
 							});
 				} catch (Exception e) {
 					log.error("解析用户缓存回传信息错误,msg:{}", StringUtil.getErrorText(e));

+ 35 - 0
netflix-service/src/main/java/com/cyksj/service/order/post/facebook/FacebookUtils.java

@@ -0,0 +1,35 @@
+package com.cyksj.service.order.post.facebook;
+
+import com.facebook.ads.sdk.APIContext;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author chan
+ * @date 2022/9/21 2:22 PM
+ */
+@Component
+@Data
+public class FacebookUtils {
+
+    @Value("${facebook.pixel-id}")
+    private String pixelId;
+
+    @Value("${facebook.conversion-token}")
+    private String conversionToken;
+
+    @Value("${facebook1.pixel-id}")
+    private String subPixelId;
+
+    @Value("${facebook1.conversion-token}")
+    private String subConversionToken;
+
+    public APIContext getFacebookContext() {
+        return new APIContext(conversionToken);
+    }
+
+    public APIContext getFacebookContext(String conversionToken) {
+        return new APIContext(conversionToken);
+    }
+}

+ 75 - 0
netflix-service/src/main/java/com/cyksj/service/order/post/impl/FacebookPostDataService.java

@@ -0,0 +1,75 @@
+package com.cyksj.service.order.post.impl;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.enums.GatewayApiCode;
+import com.cyksj.service.order.post.facebook.FacebookUtils;
+import com.cyksj.mapper.order.OrderDonPostMapper;
+import com.cyksj.service.order.post.AbstractPostDataService;
+import com.cyksj.service.order.post.PostDataFactory;
+import com.facebook.ads.sdk.APIContext;
+import com.facebook.ads.sdk.APIException;
+import com.facebook.ads.sdk.serverside.Event;
+import com.facebook.ads.sdk.serverside.EventRequest;
+import com.facebook.ads.sdk.serverside.EventResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * @author chan
+ * @date 2022/9/21 2:25 PM
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class FacebookPostDataService extends AbstractPostDataService {
+
+    private final FacebookUtils facebookUtils;
+
+    private final OrderDonPostMapper orderPostMapper;
+
+    @Override
+    public void postData(Long orderId, String callback, String evenType) {
+        log.info("facebook send Start of API orderId:{}", orderId);
+        String token = "EAANnOWjDZCDIBO5KAs8RM1RQZCsrmkcPYk5fqZAk631CjzZCylLt2LuuFPIlaUht64NM2CYjGvvytHDkaxQisAdw2DkXUnITF0ODaQV7cJopaDZCW6ghnoKQ8CimfZCjJOaKI7ZAGOnXjaAHwqgUdeHSmsRpukaFif9LrvUboT91SJZAGtDhX86ZB4vt83M7VLbpdRgZDZD";
+        String piexlId = "635359668701347";
+        // 获取会话上下文
+        APIContext apiContext = facebookUtils.getFacebookContext(token);
+
+        JSONObject jsonObject = JSONUtil.parseObj(callback);
+
+        Event event = JSONUtil.toBean(jsonObject, Event.class);
+        if(StringUtils.isNotBlank(evenType)){
+            event.setEventName(evenType);
+        }
+        log.info("facebook send /n orderId:{} /n params:{},", orderId, event);
+        EventRequest eventRequest = new EventRequest(piexlId, apiContext);
+        eventRequest.addDataItem(event);
+        try {
+            // 调用SDK方法发送事件
+            EventResponse response = eventRequest.execute();
+            log.info("facebook response:{}", response);
+            //facebook 回传按钮点击特殊处理。
+            if(StringUtils.isNotBlank(evenType)){
+               return;
+            }
+            orderPostMapper.updateStatus(orderId);
+        } catch (APIException e) {
+            log.error("send to facebook error msg:[{}].", e.getMessage());
+            throw new BusinessRuntimeException(GatewayApiCode.FACEBOOK_ERROR.getCode(), GatewayApiCode.FACEBOOK_ERROR.getMsg());
+        }
+    }
+
+
+    @PostConstruct
+    public void init() {
+        PostDataFactory.add(this, this.getClass().getSimpleName());
+    }
+
+
+}

+ 5 - 0
pom.xml

@@ -120,6 +120,11 @@
             <artifactId>mybatis-plus-boot-starter</artifactId>
             <version>3.4.2</version>
         </dependency>
+        <dependency>
+            <groupId>com.facebook.business.sdk</groupId>
+            <artifactId>facebook-java-business-sdk</artifactId>
+            <version>14.0.0</version>
+        </dependency>
 
         <dependency>
             <groupId>com.alibaba</groupId>