淘宝奇门接口PHP例子
介紹
奇門為淘寶的一個 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)
文件:
奇門請求body創建類 文件名Qimenbody.class.php
<?php // 奇門請求body創建類 Class Qimenbody {// 得到發送XMLpublic 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里面,若有你業務邏輯不需要填寫的地方,要去掉那一項。不然提交后的返回值是失敗的。
奇門接口類 文件名Qimen.class.php
<?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;}總結
以上是生活随笔為你收集整理的淘宝奇门接口PHP例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端关于添加一个带有数字圈,类似手机端有
- 下一篇: 【严肃脸】使用caffe实现色情图片的识