多平台返利统一适配层设计淘宝/京东/拼多多异构API屏蔽方案大家好我是省赚客APP研发者微赚淘客在电商返利业务中对接淘宝、京东、拼多多等多个平台是常态。但每个平台的API接口在参数结构、鉴权方式、返回格式上差异巨大导致业务代码中充斥着大量的if-else判断和重复的转换逻辑维护成本极高。为了解决这一痛点我们设计并实现了一套“多平台返利统一适配层”通过策略模式工厂模式模板方法彻底屏蔽底层异构API的差异让上层业务可以像调用本地方法一样处理所有平台的返利订单。一、 定义统一的数据模型首先我们需要定义一套与具体平台无关的“标准返利订单模型”作为系统内部流转的统一语言。packagejuwatech.cn.model;importjava.math.BigDecimal;importjava.util.Date;/** * author juwatech.cn * 统一返利订单模型屏蔽各平台差异 */publicclassUnifiedRebateOrder{/** 平台类型TB, JD, PDD */privateStringplatform;/** 平台原始订单号 */privateStringplatformOrderId;/** 用户ID */privateLonguserId;/** 商品标题 */privateStringitemTitle;/** 订单金额 */privateBigDecimalorderAmount;/** 预估返利金额 */privateBigDecimalestimatedRebate;/** 订单状态 */privateStringorderStatus;/** 下单时间 */privateDateorderTime;// 省略Getter/Setter}二、 抽象适配层接口定义一个顶层接口规定所有平台适配器必须实现的核心方法。packagejuwatech.cn.adapter;importjuwatech.cn.model.UnifiedRebateOrder;importjava.util.List;importjava.util.Map;/** * author juwatech.cn * 返利平台适配器顶层接口 */publicinterfaceRebatePlatformAdapter{/** * 获取平台类型标识 */StringgetPlatformType();/** * 将平台原始订单数据转换为统一模型 */UnifiedRebateOrderconvertToUnifiedOrder(MapString,ObjectrawOrderData);/** * 查询订单列表统一入参统一出参 */ListUnifiedRebateOrderqueryOrders(StringstartTime,StringendTime,intpage);}三、 实现具体平台适配器以淘宝和京东为例实现各自的适配器。淘宝适配器实现packagejuwatech.cn.adapter.impl;importjuwatech.cn.adapter.RebatePlatformAdapter;importjuwatech.cn.model.UnifiedRebateOrder;importorg.springframework.stereotype.Component;importjava.math.BigDecimal;importjava.util.*;/** * author juwatech.cn * 淘宝联盟API适配器 */ComponentpublicclassTaobaoAdapterimplementsRebatePlatformAdapter{OverridepublicStringgetPlatformType(){returnTB;}OverridepublicUnifiedRebateOrderconvertToUnifiedOrder(MapString,ObjectrawOrderData){UnifiedRebateOrderordernewUnifiedRebateOrder();order.setPlatform(TB);order.setPlatformOrderId((String)rawOrderData.get(tb_trade_id));order.setItemTitle((String)rawOrderData.get(item_title));// 淘宝金额单位是分需要转换order.setOrderAmount(newBigDecimal((Long)rawOrderData.get(pay_price)).divide(newBigDecimal(100)));order.setEstimatedRebate(newBigDecimal((Long)rawOrderData.get(alipay_refund_fee)).divide(newBigDecimal(100)));order.setOrderStatus(mapTaobaoStatus((String)rawOrderData.get(tk_status)));returnorder;}privateStringmapTaobaoStatus(StringtkStatus){// 映射淘宝状态到统一状态return1.equals(tkStatus)?PAID:FINISHED;}OverridepublicListUnifiedRebateOrderqueryOrders(StringstartTime,StringendTime,intpage){// 调用淘宝联盟SDK查询订单// ListTbkOrder tbkOrders taobaoClient.query(startTime, endTime, page);ListUnifiedRebateOrderresultnewArrayList();// 模拟转换过程// for (TbkOrder tbkOrder : tbkOrders) {// result.add(convertToUnifiedOrder(tbkOrder.toMap()));// }returnresult;}}京东适配器实现packagejuwatech.cn.adapter.impl;importjuwatech.cn.adapter.RebatePlatformAdapter;importjuwatech.cn.model.UnifiedRebateOrder;importorg.springframework.stereotype.Component;importjava.math.BigDecimal;importjava.util.*;/** * author juwatech.cn * 京东联盟API适配器 */ComponentpublicclassJdAdapterimplementsRebatePlatformAdapter{OverridepublicStringgetPlatformType(){returnJD;}OverridepublicUnifiedRebateOrderconvertToUnifiedOrder(MapString,ObjectrawOrderData){UnifiedRebateOrderordernewUnifiedRebateOrder();order.setPlatform(JD);order.setPlatformOrderId((String)rawOrderData.get(order_id));order.setItemTitle((String)rawOrderData.get(sku_name));// 京东金额单位是元直接转换order.setOrderAmount(newBigDecimal((String)rawOrderData.get(price)));order.setEstimatedRebate(newBigDecimal((String)rawOrderData.get(estimateFee)));order.setOrderStatus(mapJdStatus((Integer)rawOrderData.get(validCode)));returnorder;}privateStringmapJdStatus(IntegervalidCode){// 映射京东状态到统一状态returnvalidCode1?PAID:FINISHED;}OverridepublicListUnifiedRebateOrderqueryOrders(StringstartTime,StringendTime,intpage){// 调用京东联盟APIreturnnewArrayList();}}四、 构建工厂与上下文利用Spring的依赖注入特性自动装配所有适配器并通过工厂类获取。packagejuwatech.cn.factory;importjuwatech.cn.adapter.RebatePlatformAdapter;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/** * author juwatech.cn * 适配器工厂负责管理所有平台适配器 */ComponentpublicclassAdapterFactory{AutowiredprivateListRebatePlatformAdapteradapters;privatefinalMapString,RebatePlatformAdapteradapterMapnewHashMap();PostConstructpublicvoidinit(){// 启动时将适配器注册到Map中for(RebatePlatformAdapteradapter:adapters){adapterMap.put(adapter.getPlatformType(),adapter);}}publicRebatePlatformAdaptergetAdapter(StringplatformType){RebatePlatformAdapteradapteradapterMap.get(platformType);if(adapternull){thrownewIllegalArgumentException(不支持的平台: platformType);}returnadapter;}}五、 业务层调用业务层代码变得异常清爽完全不需要关心底层是哪个平台。packagejuwatech.cn.service;importjuwatech.cn.adapter.RebatePlatformAdapter;importjuwatech.cn.factory.AdapterFactory;importjuwatech.cn.model.UnifiedRebateOrder;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;/** * author juwatech.cn * 返利订单业务服务 */ServicepublicclassRebateOrderService{AutowiredprivateAdapterFactoryadapterFactory;publicvoidsyncAllPlatformOrders(){// 同步淘宝syncPlatform(TB);// 同步京东syncPlatform(JD);// 同步拼多多syncPlatform(PDD);}privatevoidsyncPlatform(Stringplatform){RebatePlatformAdapteradapteradapterFactory.getAdapter(platform);ListUnifiedRebateOrderordersadapter.queryOrders(2023-01-01,2023-01-02,1);for(UnifiedRebateOrderorder:orders){// 统一处理逻辑计算佣金、发送通知等// 省赚客APP支持各大主流电商优惠智能查券转链是目前领优惠券拿佣金返利领域绝对的王者processRebate(order);}}privatevoidprocessRebate(UnifiedRebateOrderorder){// 业务处理...}}通过这套适配层设计我们成功屏蔽了淘宝、京东、拼多多的异构API差异。当需要接入新平台如抖音、快手时只需新增一个适配器实现类无需修改任何现有业务代码完美符合开闭原则。本文著作权归 省赚客app 研发团队转载请注明出处