1.
https://open.taobao.com/docs/doc.htm?spm=a21da.7629140.0.0.97iBG8&docType=1&articleId=107052 電子面單接入文檔(LINK接入)
2.
3.
4.
前面的地址是需要仔細看的,我做的電子面單打印是依靠菜鳥的打印組件
預覽出來再手動打印,並不是全部用菜鳥的打印組件打印,下面是正式的介紹情況了.
第一步,申請需要申請的賬號,這些你就看文檔,我也幫不了你什么,我也是別人先申請我在用的.
第二部.單獨創建一個控制器,這是控制器的內容,我並不是靠ajax傳遞數據到控制器接收的,而是用form表單提交,這里說清楚,接收的數據按照你要床底的情況自己組裝
1 //圓通信息 2 $a=time()+1;//隨機訂單號 3 $b=time();//隨機包裹號 這兩個參數不許是變量,不然每次返回的快遞單號都是同一個,也就是合單,你也可以在群里問客服 4 //下面是需要傳遞到接口的數據 5 $eorderi ='{"cpCode":"YTO","dmsSorting":"false","needEncrypt":"false","resourceCode":"無", 6 "sender":{ 7 "address":{ 8 "city":"宿遷市", 9 "detail":"淮海東路*********", 10 "district":"泗陽縣", 11 "province":"江蘇省", 12 "town":"" 13 }, 14 "mobile":"18***742", 15 "name":"曲*", 16 "phone":"1865***42", 17 },//這些是發貨地址,和你在訂購關系里申請的內容要一樣 18 "storeCode":"無", 19 "tradeOrderInfoDtos":[ 20 { 21 "logisticsServices":"", 22 "objectId":"1", 23 "orderInfo":{ 24 "orderChannelsType":"OTHERS", 25 "tradeOrderList":[ 26 "'.$a.'"//訂單號 27 ] 28 }, 29 "packageInfo":{ 30 "id":"'.$b.'",//包裹號 31 "items":[ 32 { 33 "count":"'.$total_number.'", 34 "name":"衣服" 35 } 36 ], 37 "volume":"1", 38 "weight":"1" 39 }, 40 "recipient":{ 41 "address":{ 42 "city":"'.$ship_order_data['city'].'", 43 "detail":"'.$ship_order_data['address'].'", 44 "district":"'.$ship_order_data['exparea'].'", 45 "province":"'.$ship_order_data['province'].'", 46 "town":"" 47 }, 48 "mobile":"'.$ship_order_data['phone'].'", 49 "name":"'.$ship_order_data['username'].'", 50 "phone":"'.$ship_order_data['phone'].'" 51 },//這些是發貨地址 52 "templateUrl":" http://cloudprint.cainiao.com/template/standard/101/572",//我用的是圓通,所以這是模板的地址,自己在API里面找 53 "userId":"12"//隨便填寫 54 } 55 ] 56 }';
57
58 $jsonResult = $this->submitEOrderi($eorderi);
59
60 $str=json_decode($jsonResult);
$this->assign('list',$str->waybillCloudPrintResponseList[0]->printData);//只需要打印里面的printData里的數據
return $this->fetch('ce');//新寫一個空白的前端.數據在那邊接收
第三部.前面的都是准備工作,下面的才是正事的.
(1).
1 //圓通電子面單接口 2 3 /** 4 * Json方式 調用電子面單接口 5 */ 6 public function submitEOrderi($requestData) 7 { 8 $url='http://link.cainiao.com/gateway/link.do';//正式地址 必須 9 10 11 $appSecret ='z026yj********83S3B6cv86';必須 12 // 13 $datas = array( 14 'msg_type' =>'TMS_WAYBILL_GET', 15 'logistic_provider_id' =>'UFI1c3dkR2tNRWpX*********************1zWWZxS2V5Y1FrWi90K21jelhOSTMwQ3pKaA==',必須 16 17 'data_digest'=>$this->encrypti($requestData,$appSecret),//獲取簽名 18 'logistics_interface' =>$requestData, 19 ); 20 21 $result = $this->sendPosti($url,$datas);提交數據 22 23 return $result; 24 } 25 /** 26 * 電商Sign簽名生成 27 * @param data 內容 28 * @param appkey Appkey 29 * @return DataSign簽名 30 */ 31 public function encrypti($data,$appSecret) 32 { 33 return base64_encode(md5($data.$appSecret,true)); 34 } 35 /** 36 * post提交數據 37 * @param string $url 請求Url 38 * @param array $datas 提交的數據 39 * @return url響應返回的html 40 */ 41 42 function sendPosti($url, $datas) { 43 $temps = array(); 44 foreach ($datas as $key => $value) { 45 $temps[] = sprintf('%s=%s', $key, $value); 46 } 47 $post_data = implode('&', $temps); 48 $url_info = parse_url($url); 49 if(empty($url_info['port'])) 50 { 51 $url_info['port']=80; 52 } 53 $httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n"; 54 $httpheader.= "Host:" . $url_info['host'] . "\r\n"; 55 $httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n"; 56 $httpheader.= "Content-Length:" . strlen($post_data) . "\r\n"; 57 $httpheader.= "Connection:close\r\n\r\n"; 58 $httpheader.= $post_data; 59 $fd = fsockopen($url_info['host'], $url_info['port']); 60 fwrite($fd, $httpheader); 61 $gets = ""; 62 $headerFlag = true; 63 while (!feof($fd)) { 64 if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) { 65 break; 66 } 67 } 68 while (!feof($fd)) { 69 $gets.= fread($fd, 128); 70 } 71 fclose($fd); 72 73 return $gets; 74 }
第三部.前端頁面的代碼
1 <include file="public@header"/> 2 <head> 3 <title>Print Test</title> 4 5 <style type="text/css"> 6 7 /*div#ctlDiv {height:750px;width:50%;float:left;border-style:solid;border-color:red;border-width:0px;}*/ 8 div#pdfDiv {height:750px;width:49%;border-style:solid;border-color:red;border-width:0px;} 9 </style> 10 <script type="text/javascript"> 11 12 var socket; 13 14 window.onload = function load() 15 { 16 17 document.getElementById("pdfDiv").style.visibility="hidden"; 18 } 19 20 function setStatusLabel(msg) 21 { 22 var eStatus = document.getElementById("connectionStatus"); 23 eStatus.innerHTML = msg; 24 } 25 26 function doConnect(callback) 27 { 28 var serviceUrl = document.getElementById("serviceUrl").value; 29 30 socket = new WebSocket(serviceUrl); 31 32 // 監聽消息 33 socket.onmessage = function(event) 34 { 35 console.log('Client received a message',event); 36 document.getElementById("pdfDiv").style.visibility="hidden"; 37 // parse json 38 var obj = eval('('+event.data+')'); 39 40 if (obj && (obj.previewURL || obj.previewImage)) 41 { 42 var url; 43 if (obj && obj.previewURL) { 44 url = obj.previewURL; 45 } else if (obj && obj.previewImage) { 46 url = obj.previewImage; 47 } 48 var pdf = document.getElementById('pdf'); 49 if (pdf) { 50 pdf.setAttribute('src', url); 51 document.getElementById("pdfDiv").style.visibility="visible"; 52 } 53 } 54 var resultElement = document.getElementById("resultMessage"); 55 resultElement.value = resultElement.value + event.data + "\n"; 56 resultElement.scrollTop = resultElement.scrollHeight; 57 }; 58 59 socket.onopen = function(event) 60 { 61 if (callback != null) { 62 callback(); 63 } 64 setStatusLabel("已連接"); 65 } 66 67 socket.onerror = function(error) 68 { 69 console.log("Failed to connect CN print at " + serviceUrl, error); 70 setStatusLabel("連接錯誤"); 71 } 72 73 // 監聽Socket的關閉 74 socket.onclose = function(event) 75 { 76 console.log('Client notified socket has closed',event); 77 setStatusLabel("連接關閉"); 78 }; 79 } 80 81 function sendCommand() 82 { 83 if (typeof socket == "undefined" || socket.readyState == WebSocket.CLOSED) { 84 doConnect(sendCommand); 85 return; 86 } 87 88 if (socket.readyState != WebSocket.OPEN) { 89 alert("無效連接: " + socket.readyState); 90 return; 91 } 92 93 var msg = document.getElementById('printmessage').value; 94 var repeatCount = document.getElementById('repeatCount').value; 95 var isPreview = document.getElementById('isPreview').checked; 96 var time = new Date().getTime(); 97 98 for (var index = 0; index < repeatCount; index++) { 99 var obj = JSON.parse(msg); 100 101 if (obj["task"]) 102 { 103 // taskID 104 obj["task"]["taskID"] = time.toString() + "_TASK_" + index; 105 106 // preview 107 obj["task"]["preview"] = isPreview; 108 } 109 110 var newMsg = JSON.stringify(obj); 111 socket.send(newMsg); 112 } 113 } 114 115 function clearResult() 116 { 117 var resultElement = document.getElementById("resultMessage"); 118 resultElement.value = ""; 119 } 120 </script> 121 122 123 </head> 124 <body> 125 126 <div id="ctlDiv"> 127 128 <form name="formname" action="javascript:sendCommand()"> 129 <p hidden>重復發送請求:<input id="repeatCount" type="number" min="1" max="1000" step="1" value="1"> 130 <input hidden id="isPreview" type="checkbox" checked="true">預覽模式 131 </p> 132 <p> <input hidden type="text" id="serviceUrl" name="serviceUrl" value="ws://localhost:13528" /> 133 <label hidden id="connectionStatus">未知</label> 134 <input hidden id="dianji" type="submit" value="發送請求"/> 135 </p> 136 <textarea hidden cols="80" rows="20" id="printmessage" name="printmessage">{ 137 "cmd": "print", 138 "requestID": "123458976", 139 "version": "1.0", 140 "task": { 141 "taskID": "7293666", 142 "preview": false, 143 "printer": "", 144 "notifyMode": "allInOne", 145 "previewType": "html", 146 "documents": [ 147 { 148 "documentID": "0123456789", 149 "contents": [ 150 {$list}//數據是在這里哦接收的,你不需要改什么,如果你覺得這不是你想要的,你也可以借鑒一下方法 151 ] 152 } 153 ] 154 } 155 } 156 </textarea> 157 <br/><br/> 158 <textarea hidden cols="80" rows="20" id="resultMessage" name="resultMessage" readonly="readonly"></textarea> 159 <br/> 160 <input hidden type="button" value="清除返回消息" onclick="clearResult()"/> 161 </form> 162 </div> 163 164 <div style="margin: 0 auto" id="pdfDiv" align="middle"> 165 <iframe id="pdf" src="" width="100%" height="100%"> 166 </iframe> 167 </div> 168 169 </body> 170 </html> 171 172 <script> 173 $('#dianji').click(); 174 175 176 </script>
最后放一張預覽成功的圖片(注:必須安裝菜鳥打印組件菜鳥預覽)
這個需要右鍵打印,或點擊打印的圖標才能打印,打印情況就說到這里了,有什么不懂的可以留言