123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- <?php
- namespace Lib;
- class KdApiEOrder
- {
- //正式地址
- private $reqUrl = "http://api.kdniao.com/api/Eorderservice";
- private $eBusinessID = "";
- private $appKey = "";
- public function __construct() {
- $ebuss_info = M('lionfish_comshop_config')->where( array('name' => 'kdniao_id') )->find();
- $exappkey = M('lionfish_comshop_config')->where( array('name' => 'kdniao_api_key') )->find();
- $this->eBusinessID = $ebuss_info['value'];
- $this->appKey = $exappkey['value'];
- }
- /**
- * @param $order_id 订单编号
- * @param $express_no 快递编号
- * @param $config_data 配置信息
- * @return array
- */
- public function printOrder($order_id,$express_no,$config_data){
- $kd_result = array();
- $status = 0;
- $order_info = M('lionfish_comshop_order')->where( array('order_id' => $order_id) )->find();
- $express_info = M('lionfish_comshop_express')->where( array('simplecode' => $express_no) )->find();
- $kdn_info = M('lionfish_comshop_kdniao_list')->where( array('express_code' => $express_no) )->find();
- $customer_name = "";
- $customer_pwd = "";
- $month_code = "";
- $send_site = "";
- $send_staff = "";
- $template_size= "";
- $is_send_message = 0;
- $is_send_goods = 0;
- $sender_company = "";
- $sender_name = "";
- $sender_tel = "";
- $sender_mobile = "";
- $sender_postcode = "";
- $sender_address = "";
- $sender_province_name = "";
- $sender_city_name = "";
- $sender_area_name = "";
- if(!empty($kdn_info)){
- $customer_name = $kdn_info['customer_name'];
- $customer_pwd = $kdn_info['customer_pwd'];
- $month_code = $kdn_info['month_code'];
- $send_site = $kdn_info['send_site'];
- $send_staff = $kdn_info['send_staff'];
- $template_size= $kdn_info['template_size'];
- $is_send_message = $kdn_info['is_send_message'];
- $is_send_goods = $kdn_info['is_send_goods'];
- $sender_company = $kdn_info['sender_company'];
- $sender_name = $kdn_info['sender_name'];
- $sender_tel = $kdn_info['sender_tel'];
- $sender_mobile = $kdn_info['sender_mobile'];
- $sender_postcode = $kdn_info['sender_postcode'];
- $sender_address = $kdn_info['sender_address'];
- $sender_province_name = $kdn_info['sender_province_name'];
- $sender_city_name = $kdn_info['sender_city_name'];
- $sender_area_name = $kdn_info['sender_area_name'];
- }else{
- if(!empty($express_info)){
- $customer_name = $express_info['customer_name'];
- $customer_pwd = $express_info['customer_pwd'];
- }
- $sender_company = $config_data['kdn_sender_company'];
- $sender_name = $config_data['kdn_sender_name'];
- $sender_mobile = $config_data['kdn_sender_mobile'];
- $sender_postcode = $config_data['kdn_sender_postcode'];
- $sender_address = $config_data['kdn_sender_address'];
- $sender_province_name = $config_data['kdn_province_id'];
- $sender_city_name = $config_data['kdn_city_id'];
- $sender_area_name = $config_data['kdn_area_id'];
- //圆通快递 TemplateSize字段传值18001,拿到最新的二联单模板发货使用。
- //这是100*180的模板,打印机必须设置为100*180规格,有边距要设置为0
- if($express_no == 'YTO'){
- $template_size = "18001";
- }
- }
- $customername_list = array('SURE','KYSY','PJ','CND','JTSD','DNWL','SNWL','ZTO','YD','HTKY','YTO','YCWL','UC','ANE','DBLKY',
- 'ANEKY','JDKY','LB','HTKYKY','ZTOKY','CNEX','YDKY','SX');
- $customerpwd_list = array('PJ','CND','JTSD','DNWL','SNWL','ZTO','YD','HTKY','UC','ANEKY'
- ,'JDKY','LB','HTKYKY','ZTOKY','YDKY');
- $monthcode_list = array('KYSY','YTO');
- $sendsite_list = array('SURE','YCWL','ANE','ZTOKY','SX');
- $sendstaff_list = array('SURE','JDKY');
- $postcode_list = array('EMS','YZPY','YZBK');
- //判断客户账号
- if(in_array($express_no,$customername_list)){
- if(empty($customer_name)){
- $status = 2;
- }
- }
- //判断客户密码
- if(in_array($express_no,$customerpwd_list)){
- if(empty($customer_pwd)){
- $status = 2;
- }
- }
- //判断月结编码
- if(in_array($express_no,$monthcode_list)){
- if(empty($month_code)){
- $status = 2;
- }
- }
- //判断网点名称
- if(in_array($express_no,$sendsite_list)){
- if(empty($send_site)){
- $status = 2;
- }
- }
- //判断网点编码
- if(in_array($express_no,$sendstaff_list)){
- if(empty($send_staff)){
- $status = 2;
- }
- }
- //判断发件人信息
- if(empty($sender_name) || empty($sender_address) || empty($sender_province_name) || empty($sender_city_name)
- || empty($sender_area_name)){
- $status = 3;
- }
- if(empty($sender_mobile) && empty($sender_tel)){
- $status = 3;
- }
- if(in_array($express_no,$postcode_list)){
- if(empty($sender_postcode)){
- $status = 3;
- }
- }
- if($status == 0){
- if(!empty($order_info)){
- if($order_info['order_status_id'] == 1 && $order_info['delivery'] == 'express' && $order_info['is_kdn_print'] != 1){
- //构造电子面单提交信息
- $eorder = [];
- $eorder["ShipperCode"] = $express_no;
- $eorder["OrderCode"] = $order_info['order_num_alias'];
- //邮费支付方式:1-现付,2-到付,3-月结,4-第三方支付(仅SF支持)
- if(in_array($express_no,$monthcode_list)){
- if(!empty($month_code)){
- $eorder["PayType"] = 3;
- }else{
- $eorder["PayType"] = 1;
- }
- }else{
- $eorder["PayType"] = 1;
- }
- //快递类型:1-标准快件
- $eorder["ExpType"] = 1;
- //部分快递必须使用
- //客户账号
- $eorder["CustomerName"] = $customer_name;
- //客户密码
- $eorder["CustomerPwd"] = $customer_pwd;
- //网点名称
- $eorder["SendSite"] = $send_site;
- //网点编码
- $eorder["SendStaff"] = $send_staff;
- //月结编码
- $eorder["MonthCode"] = $month_code;
- //ERP系统、电商平台等系统或平台类型用户的会员ID或店铺账号等唯一性标识,用于区分其用户
- $eorder["MemberID"] = "";
- //发货仓编码
- $eorder["WareHouseID"] = "";
- //运输方式 1-陆运 2-空运 不填默认为1
- $eorder["TransType"] = 1;
- //快递单号(仅宅急送可用)
- $eorder["LogisticCode"] = "";
- //第三方订单号 (ShipperCode为JD且ExpType为1时必填)
- $eorder["LogisticCode"] = "";
- //是否要求签回单 1-要求 0-不要求
- $eorder["IsReturnSignBill"] = 0;
- //签回单操作要求(如:签名、盖章、身份证复印件等)
- $eorder["OperateRequire"] = "";
- //快递运费
- $eorder["Cost"] = "";
- //其他费用
- $eorder["OtherCost"] = "";
- //是否通知快递员上门揽件 0-通知 1-不通知 不填则默认为1
- $eorder["IsNotice"] = "";
- //返回电子面单模板:0-不需要;1-需要
- $eorder["IsReturnPrintTemplate"] = 1;
- //是否订阅短信:0-不需要;1-需要
- $eorder["IsSendMessage"] = $is_send_message;
- //包装类型(快运字段)默认为0; 0-纸 1-纤 2-木 3-托膜 4-木托 99-其他
- $eorder["PackingType"] = "";
- //送货方式(快运字段)默认为0; 0-自提 1-送货上门(不含上楼) 2-送货上楼
- $eorder["DeliveryMethod"] = "";
- $sender = [];
- $sender["Name"] = $sender_name;
- $sender["Tel"] = $sender_tel;
- $sender["Mobile"] = $sender_mobile;
- $sender["ProvinceName"] = $sender_province_name;
- $sender["CityName"] = $sender_city_name;
- $sender["ExpAreaName"] = $sender_area_name;
- $sender["Address"] = $sender_address;
- $sender["Company"] = $sender_company;
- $sender["PostCode"] = $sender_postcode;
- //收货人地址信息 begin
- $address_id = $order_info['address_id'];
- $address_info = M('lionfish_comshop_address')->where( "address_id=".$order_info['address_id'] )->find();
- $shipping_cityname = D('Seller/Area')->get_area_info($address_info['city_id']);
- $shipping_areaname = D('Seller/Area')->get_area_info($address_info['country_id']);
- $area_info = M('lionfish_comshop_area')->where( array('id' => $address_info['country_id'] ) )->find();
- $receiver = [];
- $receiver["Name"] = $order_info['shipping_name'];
- $receiver["Mobile"] = $order_info['shipping_tel'];
- $receiver["ProvinceName"] = $order_info['shipping_name'];
- $receiver["CityName"] = $shipping_cityname;
- $receiver["ExpAreaName"] = $shipping_areaname;
- $receiver["PostCode"] = $area_info['code'];
- $receiver["Address"] = $order_info['shipping_address'];
- //收货人地址信息 end
- //商品信息 begin
- $commodity = [];
- $goods_list = M('lionfish_comshop_order_goods')->where( array('order_id' => $order_id) )->select();
- $quantity_count = 0;
- $customArea = "";
- foreach($goods_list as $k=>$v){
- $commodityOne = [];
- $commodityOne["GoodsName"] = mb_substr($v['name'],0,16,'utf-8');
- $commodityOne["Goodsquantity"] = $v['quantity'];
- $quantity_count = $quantity_count + $v['quantity'];
- $customArea = $customArea . $v['name']." ".$v['quantity'].",";
- $commodity[] = $commodityOne;
- }
- //商品信息 end
- $eorder["Sender"] = $sender;
- $eorder["Receiver"] = $receiver;
- $eorder["Commodity"] = $commodity;
- $eorder["Quantity"] = $quantity_count;
- if($is_send_goods == 1){
- $eorder['CustomArea'] = $customArea;
- }
- //调用电子面单
- $jsonParam = json_encode($eorder, JSON_UNESCAPED_UNICODE);
- //$jsonParam = JSON($eorder);//兼容php5.2(含)以下
- //echo "电子面单接口提交内容:<br/>".$jsonParam;
- //error_log($jsonParam,3,'error.log');
- $jsonResult = $this->submitEOrder($jsonParam);
- //echo "<br/><br/>电子面单提交结果:<br/>".$jsonResult;
- //解析电子面单返回结果
- $result = json_decode($jsonResult, true);
- $kd_result['jsonResult'] = $jsonResult;
- if($result["ResultCode"] == "100" && $result['Success']) {
- //快递单号
- $shipping_no = $result["Order"]['LogisticCode'];
- //快递公司编码
- $shipperCode = $result["Order"]['ShipperCode'];
- //面单打印模板内容(html格式)
- $PrintTemplate = $result['PrintTemplate'];
- //打印结果
- $Reason = $result['Reason'];
- //用户ID
- $EBusinessID = $result['EBusinessID'];
- //订单编号
- $OrderCode = $result["Order"]['OrderCode'];
- //快递鸟编号
- $KDNOrderCode = $result["Order"]['KDNOrderCode'];
- //唯一标识
- $UniquerRequestNumber = $result["UniquerRequestNumber"];
- //打印结果编码
- $ResultCode = $result["ResultCode"];
- $kd_result['status'] = 0;
- //打印面单数据获取成功,更新订单打印状态,快递公司
- M('lionfish_comshop_order')->where( array('order_id' => $order_id) )->save(array('is_kdn_print'=>1,'shipping_no'=>$shipping_no));
- //保存打印结果信息
- $kdn_result_data = array();
- $kdn_result_data['order_id'] = $order_id;
- $kdn_result_data['order_code'] = $OrderCode;
- $kdn_result_data['e_business_id'] = $EBusinessID;
- $kdn_result_data['result_code'] = $ResultCode;
- $kdn_result_data['status'] = 1;
- $kdn_result_data['print_template'] = $PrintTemplate;
- $kdn_result_data['reason'] = $Reason;
- $kdn_result_data['uniquerRequestNumber'] = $UniquerRequestNumber;
- $kdn_result_data['kdnOrderCode'] = $KDNOrderCode;
- $kdn_info = M('lionfish_comshop_order_kdniao_info')->where( array('order_id' => $order_id,'status'=>0) )->find();
- if(empty($kdn_info)){
- M('lionfish_comshop_order_kdniao_info')->add($kdn_result_data);
- }else{//有失败记录更新
- M('lionfish_comshop_order_kdniao_info')->where( array('id' => $kdn_info['id']) )->save($kdn_result_data);
- }
- //更新订单快递信息
- $express_info = M('lionfish_comshop_express')->where( array('simplecode' => $express_no ) )->find();
- $time = time();
- $data = array(
- 'shipping_method' => $express_info['id'],
- 'shipping_no' => $shipping_no,
- 'dispatchname' => $express_info['name'],
- 'express_time' => $time
- );
- M('lionfish_comshop_order')->where( array('order_id' => $order_id) )->save( $data );
- }else {
- //打印失败 更新订单 打印状态
- M('lionfish_comshop_order')->where( array('order_id' => $order_id) )->save(array('is_kdn_print'=>2));
- $kd_result['status'] = 1;
- //快递公司编码
- $shipperCode = $express_no;
- //打印结果
- $Reason = $result['Reason'];
- //用户ID
- $EBusinessID = $result['EBusinessID'];
- //打印结果编码
- $ResultCode = $result["ResultCode"];
- //订单编号
- $OrderCode = $order_info['order_num_alias'];
- //唯一标识
- $UniquerRequestNumber = $result["UniquerRequestNumber"];
- //保存打印结果信息
- $kdn_result_data = array();
- $kdn_result_data['order_id'] = $order_id;
- $kdn_result_data['order_code'] = $OrderCode;
- $kdn_result_data['e_business_id'] = $EBusinessID;
- $kdn_result_data['result_code'] = $ResultCode;
- $kdn_result_data['status'] = 0;
- $kdn_result_data['print_template'] = "";
- $kdn_result_data['reason'] = $Reason;
- $kdn_result_data['uniquerRequestNumber'] = $UniquerRequestNumber;
- $kdn_info = M('lionfish_comshop_order_kdniao_info')->where( array('order_id' => $order_id,'status'=>0) )->find();
- if(empty($kdn_info)){
- M('lionfish_comshop_order_kdniao_info')->add($kdn_result_data);
- }else{//有失败记录更新
- M('lionfish_comshop_order_kdniao_info')->where( array('id' => $kdn_info['id']) )->save($kdn_result_data);
- }
- }
- $kd_result['code'] = $result["ResultCode"];
- $kd_result['message'] = $result["Reason"];
- }else{
- $kd_result['status'] = 1;
- $kd_result['message'] = "待发货未打印快递订单才能打印面单";
- }
- }else{
- $kd_result['status'] = 1;
- $kd_result['message'] = "订单不存在";
- }
- }else{
- if($status == 2){
- $kd_result['message'] = "快递信息未配置";
- }else if($status == 3){
- $kd_result['message'] = "发件人信息未配置";
- }
- $kd_result['status'] = $status;
- }
- $kd_result['order_id'] = $order_id;
- return $kd_result;
- }
- /**
- * Json方式 调用电子面单接口
- */
- function submitEOrder($requestData){
- $datas = array(
- 'EBusinessID' => $this->eBusinessID,
- 'RequestType' => '1007',
- 'RequestData' => urlencode($requestData) ,
- 'DataType' => '2',
- );
- $datas['DataSign'] = $this->encrypt($requestData, $this->appKey);
- $result = $this->sendPost($this->reqUrl, $datas);
- //根据公司业务处理返回的信息......
- return $result;
- }
- /**
- * post提交数据
- * @param string $url 请求Url
- * @param array $datas 提交的数据
- * @return url响应返回的html
- */
- function sendPost($url, $datas) {
- $temps = array();
- foreach ($datas as $key => $value) {
- $temps[] = sprintf('%s=%s', $key, $value);
- }
- $post_data = implode('&', $temps);
- $url_info = parse_url($url);
- if(empty($url_info['port']))
- {
- $url_info['port']=80;
- }
- $httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";
- $httpheader.= "Host:" . $url_info['host'] . "\r\n";
- $httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n";
- $httpheader.= "Content-Length:" . strlen($post_data) . "\r\n";
- $httpheader.= "Connection:close\r\n\r\n";
- $httpheader.= $post_data;
- $fd = fsockopen($url_info['host'], $url_info['port']);
- fwrite($fd, $httpheader);
- $gets = "";
- $headerFlag = true;
- while (!feof($fd)) {
- if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) {
- break;
- }
- }
- while (!feof($fd)) {
- $gets.= fread($fd, 128);
- }
- fclose($fd);
- return $gets;
- }
- /**
- * 电商Sign签名生成
- * @param data 内容
- * @param appkey Appkey
- * @return DataSign签名
- */
- function encrypt($data, $appkey) {
- return urlencode(base64_encode(md5($data.$appkey)));
- }
- /**************************************************************
- *
- * 使用特定function对数组中所有元素做处理
- * @param string &$array 要处理的字符串
- * @param string $function 要执行的函数
- * @return boolean $apply_to_keys_also 是否也应用到key上
- * @access public
- *
- *************************************************************/
- function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
- {
- static $recursive_counter = 0;
- if (++$recursive_counter > 1000) {
- die('possible deep recursion attack');
- }
- foreach ($array as $key => $value) {
- if (is_array($value)) {
- $this->arrayRecursive($array[$key], $function, $apply_to_keys_also);
- } else {
- $array[$key] = $function($value);
- }
- if ($apply_to_keys_also && is_string($key)) {
- $new_key = $function($key);
- if ($new_key != $key) {
- $array[$new_key] = $array[$key];
- unset($array[$key]);
- }
- }
- }
- $recursive_counter--;
- }
- /**************************************************************
- *
- * 将数组转换为JSON字符串(兼容中文)
- * @param array $array 要转换的数组
- * @return string 转换得到的json字符串
- * @access public
- *
- *************************************************************/
- public function JSON($array) {
- $this->arrayRecursive($array, 'urlencode', true);
- $json = json_encode($array);
- return urldecode($json);
- }
- }
- ?>
|