赞
踩
奇门为淘宝的一个 ERP(Enterprise Resource Planning) 和 WMS(Warehouse Management System) 的一个标准中间件接口。
实现 ERP —- 奇门 —– WMS 的对接,也可以间接等价于 SHOP —- 奇门 —– WMS的对接。
由于市面上各大小软件公司开发的ERP或WMS数据库设计,接口各不相同。为行业统一接口标准,于是奇门就诞生了。
淘宝奇门的白皮书请自行网上搜索。
传统做法:我有一间成人用品的工厂,网友小明在我的网上商城里面购买了一个充气娃娃,现在的流程是小梅查到商城有订单后,小梅去仓库拿对应的商品进行包装后,然后再跑去快递公司发货给小明。
新的做法:我有一间成人用品的工厂,我先把一批充气娃娃压到了申通快递公司,然后叫申通的工作人员清点好我压的充气娃娃的数量,并录入WMS(当然,这个快递公司的WMS已经接入到奇门)。网友小明在我的网上商城里面购买了一个充气娃娃,现在的流程是当小明下单并支付后,商城系统利用奇门接口把【订单信息和商品所在仓库的信息】传递给奇门(当然,账号是我的工厂的奇门账号),奇门也给对应编号的WMS系统发送订单信息,申通公司知道有新订单要发出后,拿对应的商品进行包装后,发货给小明,并在WMS填写好该订单发货的信息,然后传递给奇门,奇门再传递给商城系统,商城系统对应的接口程序修改小明的订单状态为已发货并修改快递单号和快递公司。
新方法看似复杂,其实不然:
1. 减少了人工成本(没小梅的事了)
2. 假若我有多个工厂的时候,省去了ERP系统和不同的WMS对接的开发成本
3. 把信息交给奇门后,接下来的流程就不用担心了,快递单号获取迅速,不用担心买家催发货了。
4. 一劳永逸,不用再担心仓库的管理了,交给第三方快递公司(当然可以自己建立一个仓库和造一套wms)
<?php
// 奇门请求body创建类
Class Qimenbody {
// 得到发送XML
public function getBody($name, $param) {
switch ($name) {
// 商品同步接口
case "taobao.qimen.singleitem.synchronize":
return $this->singleitemSynchronize($param);
break;
// 组合商品接口
case "taobao.qimen.combineitem.synchronize":
return $this->combineitemSynchronize($param);
break;
// 入库单创建接口
case "taobao.qimen.entryorder.create":
return $this->entryorderCreate($param);
break;
// 入库单查询接口
case "taobao.qimen.entryorder.query":
return $this->entryorderQuery($param);
break;
// 退货入库单创建接口
case "taobao.qimen.returnorder.create":
return $this->returnorderCreate($param);
break;
// 退货入库单查询接口
case "taobao.qimen.returnorder.query":
return $this->returnorderQuery($param);
break;
// 出库单创建接口
case "taobao.qimen.stockout.create":
return $this->stockoutCreate($param);
break;
// 出库单查询接口
case "taobao.qimen.stockout.query":
return $this->stockoutQuery($param);
break;
// 发货单创建接口
case "taobao.qimen.deliveryorder.create":
return $this->deliveryorderCreate($param);
break;
// 发货单查询接口
case "taobao.qimen.deliveryorder.query":
return $this->deliveryorderQuery($param);
break;
// 订单流水查询接口
case "taobao.qimen.orderprocess.query":
return $this->orderprocessQuery($param);
break;
// 订单状态查询接口 (批量)
case "taobao.qimen.orderstatus.batchquery":
return $this->orderstatusBatchquery($param);
break;
// 发货单缺货查询接口
case "taobao.qimen.itemlack.query":
return $this->itemlackQuery($param);
break;
// 取消某些创建的单据, 如入库单、出库单、退货单等
case "taobao.qimen.order.cancel":
return $this->orderCancel($param);
break;
// 库存查询接口
case "taobao.qimen.inventory.query":
return $this->inventoryQuery($param);
break;
// 库存盘点查询接口
case "taobao.qimen.inventorycheck.query":
return $this->inventorycheckQuery($param);
break;
// 仓内加工单创建接口
case "taobao.qimen.storeprocess.create":
return $this->storeprocessCreate($param);
break;
// 菜鸟自动流转查询接口 (扩展)
case "taobao.qimen.autotransfer.query":
return $this->autotransferQuery($param);
break;
default:
exit('No match body!');
break;
}
}
// 创建发货单BODY, 其他BODY参照白皮书
public function deliveryorderCreate($param) {
if ( empty($param) ) {
exit('参数为空!');
}
$deliveryOrderCode = $param['order_sn']; // 出库单号, string (50) , 必填
$preDeliveryOrderCode = $param['order_sn']; // 原出库单号(ERP分配), string (50) , 条件必填,条件为换货出库
$preDeliveryOrderId = $param['order_sn']; // 原出库单号(WMS分配), string (50) , 条件必填,条件为换货出库
$orderType = "JYCK"; // 出库单类型, string (50) , 必填, JYCK=一般交易出库单, HHCK=换货出库单, BFCK=补发出库单,QTCK=其他出库单
$warehouseCode = "A"; // 仓库编码, string (50),必填 ,统仓统配等无需ERP指定仓储编码的情况填OTHER
$sourcePlatformCode = "OTHER"; // 订单来源平台编码, string (50) , 必填,TB= 淘宝 、TM=天猫 、JD=京东、DD=当当、PP=拍拍、YX=易讯、EBAY=ebay、QQ=QQ网购、AMAZON=亚马逊、SN=苏宁、GM=国美、WPH=唯品会、JM=聚美、LF=乐蜂、MGJ=蘑菇街、JS=聚尚、PX=拍鞋、YT=银泰、YHD=1号店、VANCL=凡客、YL=邮乐、YG=优购、1688=阿里巴巴、POS=POS门店、OTHER=其他, (只传英文编码)
$createTime = date('Y-m-d H:i:s'); // 发货单创建时间, string (19) , YYYY-MM-DD HH:MM:SS, 必填
$placeOrderTime = $param['add_time']; // 前台订单 (店铺订单) 创建时间 (下单时间) , string (19) , YYYY-MM-DD HH:MM:SS, 必填
$operateTime = date('Y-m-d H:i:s'); // 操作 (审核) 时间, string (19) , YYYY-MM-DD HH:MM:SS, 必填
$shopNick = $param['shopNick']; // 店铺名称, string (200) , 必填
$logisticsCode = "STO"; // 物流公司编码, string (50) , SF=顺丰、EMS=标准快递、EYB=经济快件、ZJS=宅急送、YTO=圆通 、ZTO=中通 (ZTO) 、HTKY=百世汇通、UC=优速、STO=申通、TTKDEX=天天快递 、QFKD=全峰、FAST=快捷、POSTB=邮政小包 、GTO=国通、YUNDA=韵达、JD=京东配送、DD=当当宅配、OTHER=其他,必填, (只传英文编码)
$sendName = $param['sendName']; // 姓名, string (50) , 必填
$sendMobile = $param['sendMobile']; // 移动电话, string (50) , 必填
$sendProvince = $param['sendProvince']; // 省份, string (50) , 必填
$sendCity = $param['sendCity']; // 城市, string (50) , 必填
$sendDetailAddress = $param['sendDetailAddress']; // 详细地址, string (200) , 必填
$name = $param['name']; // 姓名, string (50) , 必填
$mobile = $param['mobile']; // 移动电话, string (50) , 必填
$province = $param['province']; // 省份, string (50) , 必填
$city = $param['city']; // 城市, string (50) , 必填
$detailAddress = $param['address']; // 详细地址, string (200) , 必填
$type = "INVOICE"; // 发票类型, string (50) , INVOICE=普通发票,VINVOICE=增值税普通发票, EVINVOICE=电子增票, 条件必填 (条件为invoiceFlag为Y)
$ownerCode = "123"; // 货主编码, string (50) , 必填
$itemCode = $param['goods_id']; // 商品编码, string (50) , 必填
$itemId = "1"; // 仓储系统商品编码, string (50) ,条件必填
$planQty = $param['goods_number']; // 应发商品数量, int, 必填
$actualPrice = $param['total']; // 实际成交价, double (18, 2) , 必填
$createOrder = <<<EOF
<?xml version="1.0" encoding="utf-8"?>
<request>
<deliveryOrder>
<deliveryOrderCode>{$deliveryOrderCode}</deliveryOrderCode>
<preDeliveryOrderCode>{$preDeliveryOrderCode}</preDeliveryOrderCode>
<preDeliveryOrderId>{$preDeliveryOrderId}</preDeliveryOrderId>
<orderType>{$orderType}</orderType>
<warehouseCode>{$warehouseCode}</warehouseCode>
<sourcePlatformCode>{$sourcePlatformCode}</sourcePlatformCode>
<createTime>{$createTime}</createTime>
<placeOrderTime>{$placeOrderTime}</placeOrderTime>
<operateTime>{$operateTime}</operateTime>
<shopNick>{$shopNick}</shopNick>
<logisticsCode>{$logisticsCode}</logisticsCode>
<senderInfo>
<name>{$sendName}</name>
<mobile>{$sendMobile}</mobile>
<province>{$sendProvince}</province>
<city>{$sendCity}</city>
<detailAddress>{$sendDetailAddress}</detailAddress>
</senderInfo>
<receiverInfo>
<name>{$name}</name>
<mobile>{$mobile}</mobile>
<province>{$province}</province>
<city>{$city}</city>
<detailAddress>{$detailAddress}</detailAddress>
</receiverInfo>
</deliveryOrder>
<orderLines>
<orderLine>
<ownerCode>{$ownerCode}</ownerCode>
<itemCode>{$itemCode}</itemCode>
<itemId>{$itemId}</itemId>
<planQty>{$planQty}</planQty>
<actualPrice>{$actualPrice}</actualPrice>
</orderLine>
</orderLines>
</request>
EOF;
return $createOrder;
}
// ........................................
// ........................................
// ........................................
// ........................................
// ........................................
// 其余的得到BODY函数,请参照白皮书编写。
// ........................................
// ........................................
// ........................................
// ........................................
// ........................................
}

值得注意的问题:提交BODY的XML里面,若有你业务逻辑不需要填写的地方,要去掉那一项。不然提交后的返回值是失败的。
<?php
// 奇门类
class Qimen {
private $secret = '1111111111111111'; // 奇门提供的安全码(签名用)
private $param = array( // 按接口提供的逐一填写
"format" => 'xml',
"app_key" => '0000000000',
"v" => '2.0',
"sign_method" => 'md5',
"customerId" => '00000000000000',
);
/**
* 签名
* @param $secret 安全码
* @param $param 提交参数
* @param $body 提交文档内容
*/
public function sign($secret, $param, $body) {
if ( empty($body) ) {
exit('Body can\'t empty!');
}
if ( empty($secret) ) {
exit('Secret error!');
}
ksort($param);
$outputStr = '';
foreach ($param as $k => &$v) {
if ( empty($v) ) {
exit('Param can\'t error!');
}
$outputStr .= $k . $v;
}
$outputStr = $secret . $outputStr . $body . $secret;
return strtoupper(md5($outputStr));
}
// 业务逻辑
public function request() {
// ---------------------------------------------------------------------------------------
//
//
//
//
//
//
// 写业务逻辑..为省代码篇幅,要交给奇门去请求的(也就是拼接到BODY的) 使用数组 $bodyParam 传参数合并BODY
$bodyParam = array(
'order_sn' => '20151112001',
'add_time' => '1447335225',
'shopNick' => '小小网店',
'sendName' => '李梅',
'sendMobile' => '188000000000',
'sendProvince' => '广东省',
'sendCity' => '云浮市',
'sendDetailAddress' => '云安县六都镇XXX号',
'name' => '小明',
'mobile' => '138000000000',
'province' => '广东省',
'city' => '广州市',
'address' => '科韵路XXX号',
'goods_id' => "10086",
'goods_number' => "5",
'total' => "500",
);
//
//
//
//
//
//
//
// ---------------------------------------------------------------------------------------
// 交给奇门
require('./Qimenbody.class.php');
$qimenBody = new \Qimenbody();
$method = "taobao.qimen.deliveryorder.create";
$body = $qimenBody->getBody($method, $bodyParam); // 创建发货单BODY
$this->param['method'] = $method; // 此处填写要应对应BODY,具体参考白皮书的 ‘ERP调用的奇门API名称’
$this->param['timestamp'] = date("Y-m-d H:i:s"); // 时间
$this->param['sign'] = $this->sign($this->secret, $this->param , $body); // 利用body签名
$url = "http://qimenapi.tbsandbox.com/top/router/qimen/service?" . http_build_query($this->param);
$return = $this->httpCurl($url, $body, 'post');
// ---------------------------------------------------------------------------------------
//
//
//
//
//
//
//
// 处理返回值信息,返回信息请查看白皮书中的出参规范
echo $return;
//
//
//
//
//
//
//
// ---------------------------------------------------------------------------------------
}
/**
* 请求数据
* @param $url 请求地址
* @param $data 提交数据
* @param $requestType 请求类型
*/
public function httpCurl($url, $data, $requestType = 'get') {
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
if (strtolower($requestType) == 'post') {
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
}
$return = curl_exec($ch);
curl_close($ch);
return $return;
}
}

$qimen = new \Qimen();
$qimen->request();
若想将奇门当成第三方类库使用的话,请将上面类的request方法替换成下面的代码。
public function request($method,$bodyParam) {
// 交给奇门
require('./Qimenbody.class.php');
$qimenBody = new \Qimenbody();
$body = $qimenBody->getBody($method, $bodyParam); // 创建发货单BODY
$this->param['method'] = $method; // 此处填写要应对应BODY,具体参考白皮书的 ‘ERP调用的奇门API名称’
$this->param['timestamp'] = date("Y-m-d H:i:s"); // 时间
$this->param['sign'] = $this->sign($this->secret, $this->param , $body); // 利用body签名
$url = "http://qimenapi.tbsandbox.com/top/router/qimen/service?" . http_build_query($this->param);
$return = $this->httpCurl($url, $body, 'post');
return $return;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。