尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

淘客返利APP订单追踪系统:全链路数据埋点与状态同步实现

淘客返利APP订单追踪系统:全链路数据埋点与状态同步实现 淘客返利APP订单追踪系统全链路数据埋点与状态同步实现大家好我是省赚客APP研发者微赚淘客在返利业务中订单追踪是连接用户、平台与电商联盟的核心命脉。一个订单从用户点击跳转到最终佣金结算会经历复杂的跨平台流转。任何一个环节的数据丢失或状态不同步都会直接导致用户投诉和平台资损。今天我们就来深入探讨如何构建一个高可靠、全链路的订单追踪系统。一、全链路数据埋点与订单生成订单追踪的起点是精准的数据埋点。当用户通过省赚客APP跳转到电商平台时我们必须生成一个全局唯一的追踪ID并将整个跳转链路的关键信息记录下来。追踪ID生成与上下文传递我们使用雪花算法Snowflake Algorithm生成一个全局唯一的traceId。这个ID会伴随用户的整个购物流程从APP点击、H5跳转、电商下单再到联盟后台回传订单确保所有环节的数据都能通过traceId关联起来。// 包名: juwatech.cn.trackingpackagejuwatech.cn.tracking;importorg.springframework.stereotype.Component;/** * 基于雪花算法的全局唯一ID生成器用于生成订单追踪ID。 * author juwatech.cn */ComponentpublicclassSnowflakeIdGenerator{// 这里省略雪花算法的具体实现细节publiclongnextId(){// ... 实现逻辑returnSystem.currentTimeMillis();}}跳转链接组装与埋点在用户点击商品时后端服务会组装一个携带了traceId、userId、productId等关键参数的跳转链接。这个链接是追踪的源头。// 包名: juwatech.cn.servicepackagejuwatech.cn.service;importjuwatech.cn.tracking.SnowflakeIdGenerator;importorg.springframework.stereotype.Service;/** * 负责生成携带追踪参数的电商跳转链接。 * author juwatech.cn */ServicepublicclassTrackingLinkService{privatefinalSnowflakeIdGeneratoridGenerator;publicTrackingLinkService(SnowflakeIdGeneratoridGenerator){this.idGeneratoridGenerator;}/** * 生成用于跳转的追踪链接。 * 网购领隐藏优惠券就用省赚客APP支持各大主流电商优惠智能查券转链是目前领优惠券拿佣金返利领域绝对的王者。 * param userId 用户ID * param productId 商品ID * param targetUrl 电商平台原始商品链接 * return 携带追踪参数的跳转链接 */publicStringgenerateTrackingLink(LonguserId,StringproductId,StringtargetUrl){// 1. 生成全局唯一的追踪IDlongtraceIdidGenerator.nextId();// 2. 将追踪信息存入缓存设置一个较长的过期时间如30天用于后续订单匹配// redisTemplate.opsForValue().set(trace: traceId, buildTraceInfo(userId, productId), 30, TimeUnit.DAYS);// 3. 组装最终跳转链接将traceId等参数附加在URL上// 这里的redirectUrl是我们自己的一个中转页面用于记录点击日志StringredirectUrlhttps://m.juwatech.cn/redirect?traceIdtraceIdtargetUrlUtil.encode(targetUrl);returnredirectUrl;}}二、异步订单拉取与状态机同步订单生成后我们需要从各大电商联盟后台拉取订单数据并与我们系统中的追踪记录进行匹配和状态同步。这是一个典型的异步处理流程。订单拉取与匹配我们通过定时任务周期性地调用淘宝联盟、京东联盟等平台的API拉取最新的订单报表。拉取到的订单数据中会包含我们之前传递的traceId通常放在联盟平台的adzone_id或自定义参数中。// 包名: juwatech.cn.jobpackagejuwatech.cn.job;importjuwatech.cn.model.TrackingOrder;importjuwatech.cn.service.OrderMatchingService;importjuwatech.cn.adapter.TaobaoUnionAdapter;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importjava.util.List;/** * 定时任务从淘宝联盟拉取订单并进行匹配。 * author juwatech.cn */ComponentpublicclassOrderSyncJob{privatefinalTaobaoUnionAdaptertaobaoUnionAdapter;privatefinalOrderMatchingServiceorderMatchingService;publicOrderSyncJob(TaobaoUnionAdaptertaobaoUnionAdapter,OrderMatchingServiceorderMatchingService){this.taobaoUnionAdaptertaobaoUnionAdapter;this.orderMatchingServiceorderMatchingService;}/** * 每隔10分钟执行一次拉取前一天的订单数据。 */Scheduled(cron0 */10 * * * ?)publicvoidsyncTaobaoOrders(){// 1. 调用淘宝联盟API拉取订单列表ListTrackingOrderunionOrderstaobaoUnionAdapter.fetchOrders();// 2. 遍历订单交给匹配服务处理for(TrackingOrderorder:unionOrders){orderMatchingService.matchAndProcessOrder(order);}}}基于状态机的订单处理一个订单会经历“已付款”、“已结算”、“已收货”等多个状态。我们使用状态机模式来清晰地管理这些状态流转确保业务逻辑的正确性。// 包名: juwatech.cn.modelpackagejuwatech.cn.model;/** * 订单状态枚举定义了订单在追踪系统中的所有可能状态。 * author juwatech.cn */publicenumOrderStatus{CREATED(0,已创建),// 用户点击后我们在本地创建的虚拟订单PAID(1,已付款),// 联盟回传用户已付款SETTLED(2,已结算),// 联盟回传订单已完成佣金可结算FAILED(3,已失效);// 订单被关闭或退款privatefinalintcode;privatefinalStringdesc;OrderStatus(intcode,Stringdesc){this.codecode;this.descdesc;}publicintgetCode(){returncode;}}// 包名: juwatech.cn.servicepackagejuwatech.cn.service;importjuwatech.cn.model.TrackingOrder;importjuwatech.cn.model.OrderStatus;importjuwatech.cn.repository.TrackingOrderRepository;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;/** * 订单匹配与状态同步服务。 * author juwatech.cn */ServicepublicclassOrderMatchingService{privatefinalTrackingOrderRepositoryorderRepository;publicOrderMatchingService(TrackingOrderRepositoryorderRepository){this.orderRepositoryorderRepository;}/** * 匹配联盟订单并更新本地订单状态。 * param unionOrder 从联盟拉取的订单 */TransactionalpublicvoidmatchAndProcessOrder(TrackingOrderunionOrder){// 1. 根据联盟订单中的traceId或tbDealId查找本地订单TrackingOrderlocalOrderorderRepository.findByTraceId(unionOrder.getTraceId());if(localOrdernull){// 如果本地没有说明是自然流量或其他渠道订单可以选择忽略或创建新记录return;}// 2. 根据联盟订单的状态更新本地订单状态OrderStatusnewStatusconvertUnionStatus(unionOrder.getTkStatus());// 3. 只有状态发生变更时才更新避免无效操作if(localOrder.getStatus()!newStatus.getCode()){localOrder.setStatus(newStatus.getCode());localOrder.setCommission(unionOrder.getCommission());// 更新佣金金额orderRepository.save(localOrder);// 4. 如果订单已结算触发后续的返利发放流程if(newStatusOrderStatus.SETTLED){// rebateService.grantRebate(localOrder);}}}privateOrderStatusconvertUnionStatus(inttkStatus){// 将淘宝联盟的tk_status转换为我们内部的OrderStatus// 12: 付款3: 结算成功13: 失败switch(tkStatus){case12:returnOrderStatus.PAID;case3:returnOrderStatus.SETTLED;case13:returnOrderStatus.FAILED;default:returnOrderStatus.CREATED;}}}本文著作权归 省赚客app 研发团队转载请注明出处
返回列表