当前位置: API文档

trade_push.php(创建原始订单)

¥标准

1.接口说明

   1.1 接口描述:①推送销售订单给ERP ;②更新已推送成功的销售订单。

   1.2 适用版本:客户端 V2.4.5.0及以上版本
   1.3 注意事项仅支持推送自有/其它平台店铺
   1.4 订单更新已推送成功的销售订单的订单状态、退款状态、订单信息变更到ERP情况比较复杂,订单变更处理办法详解, 单击这里【必看】

   1.5 调用建议:建议每间隔(5~10)分钟,将商城积累的订单集中推送,每次请求包含订单条数建议不超过50条(1条订单由“trade_list+order_list”构成),如果累积量超过了50条,分多次请求。

2.调用场景

   2.1 自研商城、分销系统、全渠道等系统对接

3.请求参数说明

   3.1 请求地址

环境HTTP地址
测试环境https://sandbox.wangdian.cn/openapi2/trade_push.php
正式环境https://api.wangdian.cn/openapi2/trade_push.php

   3.2 公共请求参数

名称字段类型长度
必须描述
卖家账号sidString
购买ERP时由旺店通分配给ERP购买方,请从ERP购买方获取。
接口账号appkeyString
本开放平台“自助对接”功能模块内自助申请,获取方式点击这里
时间戳timestampint
北京时间1970-01-01 08:00:00起至现在的总秒数,10位int值,旺店通企业版API服务端允许请求最大时间误差为5min,date.timezone = Asia/Shanghai。
签名signString
API输入参数签名结果,签名算法介绍单击这里

   3.3 业务请求参数

名称字段类型长度
必须描述
店铺编号shop_novarchar20代表店铺所有属性的唯一编码,用于店铺区分,ERP内支持自定义(ERP店铺界面设置,查看路径ERP→设置→基本设置→店铺→店铺列表),用于创建指定店铺单据信息,测试环境店铺编号信息同接口账号。ERP内shop_no对应的“店铺平台”必须为“自有/其它”。正式环境店铺创建成功后ERP会自动授权,如果自动授权失败,在ERP店铺界面(路径ERP→设置→基本设置→店铺→店铺列表)选中授权失败的店铺,点击店铺界面提供的店铺授权按钮重新授权。
   
模式switchtinyint10:非严格模式,1:严格模式,默认1。严格模式详情介绍单击这里
订单列表节点trade_listdata[]
请求参数的1级数据节点,包含销售订单所有属性信息的数据节点,节点下数据字段详见下述“trade_list”

trade_list

名称字段类型长度
必须描述
原始单号tidvarchar40指商城、官网等平台的订单编号,ERP称之为原始单号,同一个sid下通过本接口新增订单的tid保证唯一。
平台状态trade_statustinyint4平台订单状态较多且涉及变更,详情介绍单击这里
支付状态pay_statustinyint4平台订单付款状态:0:未付款,1:部分付款,2:已付款
发货条件delivery_termtinyint41:款到发货,2:货到付款(包含部分货到付款),3:分期付款,4:挂账
下单时间trade_timedatetime
平台订单创建时间,时间格式:yyyy-MM-dd HH:mm:ss
支付时间pay_timedatetime

平台订单付款时间,时间格式:yyyy-MM-dd HH:mm:ss,未付款订单为:0000-00-00 00:00:00
分销类别fenxiao_typetinyint
1:代销  2:经销
采购单IDpurchase_idvarchar40转供销情况下,采购单ID
分销商fenxiao_nickvarchar40分销订单的分销商id,或转供销时供应商id
客户网名buyer_nickvarchar100平台买家昵称,注意:一次推送网名相同的订单不能超过30
买家emailbuyer_emailvarchar60买家email
支付单号pay_idvarchar40支付单号
支付账号pay_accountvarchar128支付账号
支付方式pay_methodtinyint4支付方式:  1在线支付 2现金,3银行转账,4邮局汇款 5预付款 6刷卡 7支付宝 8微信支付  不传默认为1 在线支付
收件人receiver_namevarchar40收件人姓名
省份receiver_provincevarchar40收件人省份,传为中文名称需与旺店通地址库匹配,点击查看
城市receiver_cityvarchar40收件人城市,传为中文名称需与旺店通地址库匹配,点击查看
区县receiver_districtvarchar40收件人区县,传为中文名称需与旺店通地址库匹配,点击查看
地址详情receiver_addressvarchar256收件人地址详情,传为中文名称,需与旺店通地址库匹配,点击查看,如果不传省市区,则会尝试从详细地址解析省市区,必须是空格分隔的才能解析成功,需要注意直辖市的地址格式,举例“北京 北京市 海淀区 花园路xxxx”
手机receiver_mobilevarchar40手机号码
电话receiver_telnovarchar40电话号码
邮编receiver_zipvarchar20收件人邮编
物流方式logistics_typesmallint6

不传本参数,输入值默认-1,表示由ERP系统策略选择。平台指定订单发货物流可选输入值单击这里

发票类别invoice_kindtinyint40:不需要,1:普通发票,2:增值税普通发票电子,3:增值税普通发票纸质,4:增值税专用发票
发票抬头invoice_titlevarchar255发票抬头
发票内容invoice_contentvarchar255

常见内容:纳税人识别号、地址、电话、开户银行、银行账户,按照以下格式推送,系统开发票时可解析。

推送格式:纳税人识别号:xxxxxxxxxxx;地址:xxxxxxxx 13888888888;开户银行:银行名称 银行账户;

英文分号以后是地址,地址后面是空格,空格后面是电话,电话后面是英文分号,分号以后是开户行,然后空格,然后是银行账号

客户备注标旗remark_flagtinyint4
客户备注标旗,取值0至5对应的标旗颜色依次为灰(无标旗)、红、黄、绿、蓝、紫,不传默认0
买家备注buyer_messagevarchar1024买家下单时填写的订单备注
客服备注seller_memovarchar1024商家客服对订单进行的备注内容
标旗seller_flagtinyint4客服标旗,取值0至5对应的标旗颜色依次为灰(无标旗)、红、黄、绿、蓝、紫,不传默认0
邮费post_amountdecimal(19,4)商家收取买家的物流或者快递费用
货到付款金额cod_amountdecimal(19,4)货到付款金额   cod金额=(price * num + adjust_amount -discount – share_discount)+post_amount+ext_cod_fee-paid
货到付款买家费用ext_cod_feedecimal(19,4)货到付款买家费用,扣除货到付款订单金额后,卖家仍需支付的货到付款其他金额。这个钱卖家收不回来,是快递公司直接收走,但在快递单里是要打印出来,否则快递收款就错了
其它收费other_amountdecimal(19,4)其它应从买家收取的服务费,其他费用
已付paiddecimal(19,4)订单已付金额,paid计算公式:paid = Σ(price * num + adjust_amount -discount – share_discount)+ post_amount+other_amount,所有金额相关字段推送处理办法,单击这里
证件类型id_card_typetinyint41:身份证(不传默认为0,为0时将证件号码置空)
证件号码id_cardvarchar40证件号码
自动流转模式is_auto_wmstinyint1是否为自动流转模式(1:是 0:不是 不传默认0),非自动流转模式一定不要传值。自动流转模式处理办法,”自动流转模式处理办法详解”)单击这里
仓库类型wms_typetinyint4非自动流转模式一定不要传值
仓库编号warehouse_novarchar40ERP内自定义的仓库编号,查看路径ERP→设置→基本设置→仓库→仓库列表,测试环境仓库编号查看测试环境分配邮件。平台订单需指定ERP内仓库时,传哪个仓库的编号,ERP将为订单选择哪个仓库。
订单货品明细节点order_listdata[]
货品明细列表(子订单列表)节点

order_list

名称字段类型长度
必须描述
子订单编号oidvarchar40平台订单货品表主键,子订单唯一标识,同一个sid下通过本接口新增订单的oid(子订单编号)要保证唯一;如果oid重复,ERP生成系统单(递交)时会提示“订单货品数量不一致xxxxxx”
数量numdecimal(19,4)货品数量,订单推送成功以后本字段值不能更改
单价pricedecimal(19,4)标价,折扣前的价格,可以推送价格为0的商品。订单推送成功以后本字段值不能更改
状态statustinyint4平台子订单状态,子订单状态可以和主订单不一样,比如其中一个子订单退款完成,其状态是80,但主订单仍然是待发货,可选值同trade_status
退款状态refund_statustinyint40:无退款,1:取消退款,2:已申请退款,3:等待退货,4:等待收货,5:退款成功。本字段在售前退款的时候,根据不同的场景填写不同的值,eg:申请退款值为2,取消退款值为1……
平台货品IDgoods_idvarchar40平台系统货品(SPU)的唯一标识。goods_id不能为空,goods_id和goods_no区别与SPU、SKU概念介绍,单击这里
平台规格IDspec_idvarchar40平台系统单品(SKU)的的唯一标识,尽量不为空,spec_id和spec_no区别与SPU、SKU概念介绍,单击这里
货品编码goods_novarchar40平台货品SPU编码,对应ERP货品编号,尽量不为空
规格编码spec_novarchar40平台货品SKU唯一码,对应ERP商家编码,goods_no和spec_no不能同时为空
货品名称goods_namevarchar255平台货品名称
规格名称spec_namevarchar100平台货品规格名称
调整adjust_amountdecimal(19,4)客服调整总金额(大于0加价,小于0减价,是折扣来源的一部分,没有传0)
优惠discountdecimal(19,4)下单总折扣,客户下单时折扣(比如促销打折,不包含客服调整、分摊折扣,没有传0)
分摊优惠share_discountdecimal(19,4)分摊总折扣,由总订单分摊而来,一般是付款时产生,如使用优惠券,没有传0。分摊优惠传值注意:例如三个商品,优惠10,分摊优惠可以是:3/3/4,或者3.33/3.33/3.34.即最后一个商品的分摊优惠使用减法计算
佣金commissiondecimal(19,4)佣金   不传默认为0
备注remarkvarchar1024货品明细备注推送此字段ERP客户端需升级至V2.3.9.2及以上
类目cidvarchar40平台货品所属类目

4.响应参数

   4.1 公共响应参数

名称字段类型长度
必须描述
错误码codeint40状态码:0表示成功,其他表示失败
错误原因messagevarchar255错误原因
返回的新增订单个数new_countint10有单据新增时不为0(新建的原始单据)
返回的更新订单个数chg_countint10

有单据更新时不为0(在已有的原始单据上进行修改)

   4.2 业务响应参数


5.请求示例

PHP
<?php
    require_once('../WdtClient.php');

    $c = new WdtClient;
    $c->sid ='';
    $c->appkey ='';
    $c->appsecret ="";
    $c->gatewayUrl = 'http://sandbox.wangdian.cn/openapi2/trade_push.php';

    $trade_list[] = array
    (
        'tid'              => 'LxTestTid'.time(),
        'trade_status'     => 30,
        'delivery_term'    => 1,
        'pay_status'       => 2,
        'trade_time'       => '0000-00-00 00:00:00',
        'pay_time'         => '0000-00-00 00:00:00', // 未付款情况下为0000-00-00 00:00:00
        'buyer_nick'       => '',
        'buyer_email'      => '123456234533@mail.com',
        'receiver_mobile'  => '13233456110',
        'receiver_telno'   => '1234563567',
        'receiver_zip'     => '0000000',
        'receiver_province'=>'北京',
        'receiver_name'    =>'亚历山大',
        'receiver_city'    =>'北京市',
        'receiver_district'=>'海淀区',
        'receiver_address' =>'海淀',
        'logistics_type'   => 4, // ems
        'invoice_kind'     => 0,
        'invoice_title'    => '',
        'invoice_content'  => '发票内容+',
        'buyer_message'    => '发最好&&&的+',
        'remark'           => '测试专用',
        'remark_flag'      => 1,
        'post_amount'      => 10, //邮费
        'paid'             => 409, //已支付金额
        'cod_amount'       => '0',
        'ext_cod_fee'      => '0',
        'order_list'       => array(
            array
            (
                'oid'            => 'LxTestOid'.time(),
                'status'         => 30,
                'refund_status'  => 0,
                'goods_id'       => 'E166D18BAAEA420CB132E105B3B6128A',
                'spec_id'        => '',
                'goods_no'       => '',
                'spec_no'        => '9787533951092',
                'goods_name'     => '情商是什么?——关于生活智慧的44个故事',
                'spec_name'      => '',
                'num'            => 1,
                'price'          => 399,
                'adjust_amount'  => '0', //手工调整,特别注意:正的表示加价,负的表示减价
                'discount'       => 0, //子订单折扣
                'share_discount' => '0', //分摊优惠
                'cid'            => '13',
            )
        )
    );
        
    $c->putApiParam('shop_no','api_test');
    $c->putApiParam('switch',0);
    $c->putApiParam('trade_list',json_encode($trade_list, JSON_UNESCAPED_UNICODE));
    $json = $c->wdtOpenApi();
    var_dump($json);
    
?>
JAVA
package com.wangdian.api.trade;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.wangdian.api.WdtClient;

public class TradePush {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        WdtClient client = new WdtClient("传入sid", "传入appkey", "传入appsecret", "传入url");
        //测试环境sid、appkey、密钥请到旺店通开放平台-自助对接-申请测试环境内查看,测试环境url=https://sandbox.wangdian.cn/openapi2/
        //调用正式环境时请将sid、appkey、appsecret切换为实际参数,参数在旺店通开放平台-自助对接-应用管理内应用状态为已上线的应用中查看,调用正式环境注意切换正式环境url=https://api.wangdian.cn/openapi2/
        
        List<Map<String, Object>> trade_list = new ArrayList<Map<String, Object>>();
        List<Map<String, Object>> order_list = new ArrayList<Map<String, Object>>();
        
        Map<String, Object> order_1 = new HashMap<String, Object>();
        order_1.put("oid", "ghsTest121101");
        order_1.put("num", 1);
        order_1.put("price", 12);
        order_1.put("status", 30);
        order_1.put("refund_status", 0);
        order_1.put("goods_id", "18344");
        order_1.put("spec_id", "18656");
        order_1.put("goods_no", "ghs2");
        order_1.put("spec_no", "ghs201812070212123");
        order_1.put("goods_name", "123");
        order_1.put("discount", 0);        //子订单折扣
        order_1.put("adjust_amount", 0);    //手工调整,特别注意:正的表示加价,负的表示减价
        order_1.put("share_discount", 0);
        
        
        order_list.add(order_1);
        
        Map<String, Object> trade_1 = new HashMap<String, Object>();
        trade_1.put("tid", "AT201812110002");
        trade_1.put("trade_status", 20);
        trade_1.put("pay_status", "1");
        trade_1.put("delivery_term", 2);
        trade_1.put("trade_time", "2018-12-11 14:21:00");
        trade_1.put("buyer_nick", "三国杀");
        trade_1.put("receiver_province", "河南省");
        trade_1.put("receiver_city", "周口市");
        trade_1.put("receiver_district", "川汇区");
        trade_1.put("receiver_mobile", "26283920011");
        trade_1.put("receiver_name", "123");
        trade_1.put("receiver_address", "123");
        trade_1.put("logistics_type", 4);
        trade_1.put("post_amount", 12);
        trade_1.put("cod_amount", 2);
        trade_1.put("ext_cod_fee", 0);
        trade_1.put("other_amount", 1);
        trade_1.put("paid", 0);
        trade_1.put("order_list", order_list);
        

        trade_list.add(trade_1);
        
        String trade_list_json = JSON.toJSONString(trade_list);
        //System.out.println(purchase_info_json);
        
        Map<String, String> params = new HashMap<String, String>();
        params.put("shop_no", "ghs2test");
        params.put("trade_list", trade_list_json);
        try {
            String response = client.execute("trade_push.php", params);
            System.out.println(response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WdtSdk;

namespace TradePush
{
    class TradePush
    {
        static void Main(string[] args)
        {
            WdtClient client = new WdtClient();
            client.sid = "";
            client.appkey = "";
            client.appsecret = "";
            client.gatewayUrl = "http://sandbox.wangdian.cn/openapi2/trade_push.php";

            var trade_list = new[]
            {
                new
                {
                    tid = "TestTid45235678987654",
                    trade_status = "30",
                    delivery_term    = "1",
                    trade_time       = "0000-00-00 00:00:00",
                    pay_time         = "0000-00-00 00:00:00",
                    buyer_nick       = "ceshi",
                    buyer_email      = "123456234533@mail.com",
                    receiver_mobile  = "13233456110",
                    receiver_telno   = "1234563567",
                    receiver_zip     = "0000000",
                    receiver_province= "北京",
                    receiver_name    = "亚历山大",
                    receiver_city    = "北京市",
                    receiver_district= "海淀区",
                    receiver_address = "乌鲁木齐市新疆乌鲁木齐市西山路82号009信箱",
                    logistics_type   = "4",
                    invoice_kind     = "0",
                    invoice_title    = "",
                    invoice_content  = "发票内容+",
                    buyer_message    = "发最好&&&的+",
                    remark           = "测试专用",
                    remark_flag      = "1",
                    paid             = "399",
                    post_amount      = "0",
                    cod_amount       = "0",
                    ext_cod_fee      = "0",
                    order_list       = new[]
                    {
                        new{
                            oid            = "TestOid3456789876543",
                            status         = "30",
                            refund_status  = "0",
                            goods_id       = "E166D18BAAEA420CB132E105B3B6128A",
                            spec_id        = "567898765",
                            goods_no       = "",
                            spec_no        = "9787533951092",
                            goods_name     = "情商是什么?——关于生活智慧的44个故事",
                            spec_name      = "",
                            num            = "1",
                            price          = "399",
                            adjust_amount  = "0",
                            discount       = "0",
                            share_discount = "0",
                            cid            = "13",
                            remark           = "ceshiceshiceshi"
                        }
                    }
                }
            };
            String json = trade_list.ToJsonString();
            client.putParams("trade_list", json);
            client.putParams("shop_no", "api_test");
            client.putParams("switch", "0");

            string result = client.wdtOpenapi();
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
}
python
import WdtClient
import json

t = WdtClient.WdtClient('appkey', 'appsecret', 'sid', 'http://sandbox.wangdian.cn/openapi2/')
trade_list = []
order_list = []
order_1 = {}
order_1.update({"oid": 'ghsTest121101'})
order_1.update({"num": 1})
order_1.update({"price": 12})
order_1.update({"status": 30})
order_1.update({"refund_status": 0})
order_1.update({"goods_id": '18344'})
order_1.update({"spec_id": '18656'})
order_1.update({"goods_no": 'ghs2'})
order_1.update({"spec_no": 'ghs201812070212123'})
order_1.update({"goods_name": '123'})
order_1.update({"discount": 0})
order_1.update({"adjust_amount": 0})
order_1.update({"share_discount": 0})
order_list.append(order_1)
trade_1 = {}
trade_1.update({"tid": 'AT201812110002'})
trade_1.update({"trade_status": 20})
trade_1.update({"pay_status": '1'})
trade_1.update({"delivery_term": 2})
trade_1.update({"trade_time": '2018-12-11 14:21:00'})
trade_1.update({"buyer_nick": '三国杀'})
trade_1.update({"receiver_name": '亚历山大'})
trade_1.update({"receiver_province": '河南省'})
trade_1.update({"receiver_city": '周口市'})
trade_1.update({"receiver_district": '川汇区'})
trade_1.update({"receiver_address": '123'})
trade_1.update({"logistics_type": 4})
trade_1.update({"post_amount": 12})
trade_1.update({"cod_amount": 2})
trade_1.update({"ext_cod_fee": 0})
trade_1.update({"other_amount": 1})
trade_1.update({"paid": 0})
trade_1.update({"order_list": order_list})
trade_list.append(trade_1)
# del(trade_list[0])
jsonArr = json.dumps(trade_list, ensure_ascii=False)
params = {}
params.update({"shop_no": 'test111'})
params.update({"trade_list": jsonArr})
response = t.execute("trade_push.php", params)
print(response)

6.响应示例

   6.1 正常响应示例 

JSON
{
    'code': 0,
    'message': "",
    'new_count': 1,
    'chg_count': 0
}

   6.2 异常响应示例

JSON
{
    "code": 99,
    "message": "buyer_nick 名字不能只用一个,不同客户必须用不同的名字"
}



常用工具