头图

目的

通过白码低代码开发平台实现API快速对接淘宝订单数据。
平台地址:https://www.bnocode.com/

目标

卖家将淘宝上的订单数据对接到自己的系统内,之后再利用这些数据进行会员管理或产品库存管理。

前期准备

商家需要先在淘宝开放平台的控制台上申请创建一个应用,获取到应用的appkey和appsecret作为发起API请求的密钥,注意:不同的应用类型可使用的API接口不一样,一定要根据需求选择合适的应用类型,详情可参考官方API文档。

对接分析

根据官方文档,要实现订单数据同步,大致分为两种方式:

1.使用聚石塔云产品将订单数据直接对接到自己的数据库,但需要购买阿里聚石塔的云服务器,实现起来比较麻烦;

2.通过增量修改订单的接口,每天定时拉取当天有更新的订单,这种方式是可以快速实现的,成本也不算高。

实现步骤:(通过上述的第二种方式实现)

1.创建商品、商品sku、客户(买家)、订单、订单明细数据表

图片
*商品ID是指在淘宝上的商品ID
图片
*skuID是指淘宝上的skuID
图片
*open_id是指买家在淘宝上的唯一标识
图片

图片
*可根据实际需求,添加原价和优惠金额等属性,这些数据在淘宝的订单中都可以获取到的2.添加一个淘宝API,用于获取订单数据,填写配置参数(前期准备时已获取),添加两个输入参数:①查询修改开始时间②查询修改结束时间
图片

编写代码:

async function run($input, $output, $modules = modules) {

  const taobaoSdk = $modules.taobaoSdk;

 

  let { appKey, appSecret } = $modules.helper.config();

const sdk = new taobaoSdk(appKey, appSecret, {

    endpoint: "https://eco.taobao.com/router/rest"  });
let has_next = true;

  let page_no = 1;

  while (has_next) {

    let res = await sdk.execute("taobao.trades.sold.increment.get", {

      session: "6201823bfxxxxxxxxxxxxxxx9ca84c8xxxxxxx8181374",

      fields: "tid,status,payment,orders,pay_time,buyer_nick,buyer_open_id,created",

      start_modified: $input.start_modified,

      end_modified: $input.end_modified,

      page_size: 100,

      page_no,

      use_has_next: true,

    });

    has_next = res.has_next;

    page_no += 1;

    let trade_list = res.trades.trade;

    for (let i = 0; i < trade_list.length; i++) {

      let status_map = {

       "WAIT_BUYER_PAY": "等待买家付款",

        "WAIT_SELLER_SEND_GOODS": "等待卖家发货",

        "SELLER_CONSIGNED_PART": "卖家部分发货",

        "WAIT_BUYER_CONFIRM_GOODS": "等待买家确认发货",

        "TRADE_BUYER_SIGNED": "买家已签收",

        "TRADE_FINISHED": "交易成功",

        "TRADE_CLOSED": "交易关闭",

        "TRADE_CLOSED_BY_TAOBAO": "交易被淘宝关闭",

        "TRADE_NO_CREATE_PAY": "没有创建外部交易(支付宝交易)",

        "WAIT_PRE_AUTH_CONFIRM": "余额宝0元购合约中",

        "PAY_PENDING": "外卡支付付款确认中",

        "ALL_WAIT_PAY": "所有买家未付款的交易",

        "ALL_CLOSED": "所有关闭的交易",

        "PAID_FORBID_CONSIGN": "禁止发货"

      };

//调用功能:新增淘宝订单

      await $modules.program.exec("5fb7b125c3b8f5215662b0ef", {

        "5fb7b12a63c9412159432db5": {

          "field_1605874185141": trade_list[i]["buyer_nick"],//买家昵称

          "field_1605874185391": trade_list[i]["created"].substr(0, 10),//创建日期

          "field_1606099657210": trade_list[i]["created"].substr(11, 5),//创建时间

          "field_1606099671853": trade_list[i]["payment"],//实际付款金额

          "field_1606099671975": trade_list[i]["tid"],//交易编号

          "field_1606099699745": trade_list[i]["orders"]["order"],//订单明细

          "field_1606099716827": status_map[trade_list[i]["status"]]

        }

      });

    }

  }

}

整体思路:将获取到的订单数据,通过调用功能的方式一一录入到系统中,并且可以去重,新订单直接录入,旧订单则更新状态。3.再添加一个淘宝API,用于获取订单的买家openid,详情请参考官方API接口文档,同理,填写两个配置参数和输入、输出参数
图片

编写代码:

async function run($input, $output, $modules = modules) {

  const taobaoSdk = $modules.taobaoSdk;

 

  let { appKey, appSecret } = $modules.helper.config();

 const sdk = new taobaoSdk(appKey, appSecret);

  

  let res = await sdk.execute("taobao.trade.fullinfo.get",{

    session:"6201823bfcxxxxxxxx00598181374",

    fields:"buyer_open_uid",

    tid:$input.tid

  });

  $output.open_uid = res.trade.buyer_open_uid;

}

4.新建一个功能,命名为新增淘宝订单,用于获取订单数据的API调用;①第一步使用交互输入的步骤,可以理解为这个功能的输入参数;
图片

图片
*参数说明:buyer_nick:买家昵称create_date:订单创建日期create_time:订单创建时间payment:实际付款金额tid:交易编号(订单编号)order_list:订单明细(collectiont类型)status:订单状态②第二步使用获取数据的步骤,使用第一步的tid获取到相同编号的订单;
图片

图片
③第三步使用条件判断的步骤,判断第二步是否获取到订单,以判断该订单编号是新订单还是旧订单;
图片

图片

图片
④如果判断为假,即为新订单,第四步就使用自定义API的步骤,获取订单买家的openid,使用前面已经做好的获取openid的API即可;
图片

图片
如果判断为真,即为系统已经录入过的订单,则直接更新订单的数据,第四步就使用关联获取数据的步骤,将第二步获取的订单状态修改为第一步的status参数值;
图片

图片
⑤在判断为假的路线,第五步使用API的输出参数openid,获取客户,同样使用获取数据的步骤;
图片

图片
⑥第六步继续使用条件判断的步骤判断第五步是否获取到客户,原理和第三步一样;
图片
⑦如果第六步判断为假,即客户不存在,则第七步就需要新增客户,使用新增数据的步骤,使用第一步的参数和第四步输出的openid进行新增;
图片

图片
⑧第八步使用新增数据的步骤,新增订单;
图片
其中客户属性需设为上一步新增的客户,其他属性都可以从第一步的参数步骤拿到;
图片
⑨第九步通过编程的方式,使用第一步order_list参数,录入新增订单的明细,这里涉及到商品信息和商品sku的录入,比较复杂,所以我使用了调用功能的方式进行录入,减少出bug的概率;
图片

图片

async function runProcess($model = model, $plugin = plugin, $params) {

    //获取参数步骤

    let params = await $model.getValue("5fb7b12a63c9412159432db5");

    let list = params["field_1606099699745"];//order_list参数

    for (let i = 0; i < list.length; i++) {//遍历order_list参数

        let form = {

            "5fbb2bc7c3b8f5215662b1f7": { _id: $params.item._id },//选择订单步骤

            "5fbb2bdc63c9412159432e68": {//参数步骤

                "field_1606101995488": list[i]["num_iid"],//商品id

                "field_1606101996083": list[i]["sku_id"],//skuID

                "field_1606102022493": list[i]["payment"],//实付金额

                "field_1606102036590": list[i]["sku_properties_name"],//sku名称

                "field_1606102311381": list[i]["title"],//交易标题

                "field_1606102446059": list[i]["num"]//购买数量

            }

        };

        //调用功能:新增订单明细

        await $plugin.program.exec("5fbb2bae63c9412159432e64",form);

    }

}

⑩回到第六步,如果判断为真,即客户已存在,则可以直接新增订单和订单明细,原理和⑧、⑨一样;
图片

图片
上述功能整理流程图:5.再新建一个功能,命名为新增订单明细,供上述功能调用;①第一步使用选择数据的步骤,选择一个订单,作为本功能的输入参数,表示需要新增订单明细的订单;
图片
②第二步使用交互输入的步骤,同理作为本功能的输入参数;
图片

图片
③第三步使用获取数据的步骤,使用第二步的商品ID获取商品;
图片

图片
④第四步使用条件判断的步骤,判断第三步是否有获取到数据,原理类似新增订单功能的④;
图片
如果判断为假,商品不存在,则需要先新增商品(使用第二步的参数进行新增)
图片
⑤第五步继续使用条件判断的步骤,判断第二步的sku参数是否为空,因为有些商品是没有sku参数的,只是一个单品;
图片
如果没有sku参数,则可以直接新增订单明细了;
图片

图片
否则需要先新增sku,再新增订单明细;
图片
⑥回到第四步,如果判断为真,即商品已经存在了,则不需要新增商品,可以继续执行后面的步骤,判断为真的路线和判断为假的路线区别再是否需要再新增商品;
图片
⑦至此功能已做好,上述功能完整流程图:
图片
6.再新建一个功能,用来调用“获取订单数据”的API;
图片

图片

图片
7.在系统设置模块,新建一个定时任务,用于定时运行上述功能,周期为每天的00:00;
图片

图片
测试结果:①客户表
图片
②订单表
图片
③订单明细表
图片
④商品表
图片
⑤商品sku表
图片
整体流程图:
图片


科技事儿哥
10 声望0 粉丝