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 "电子面单接口提交内容:
".$jsonParam;
//error_log($jsonParam,3,'error.log');
$jsonResult = $this->submitEOrder($jsonParam);
//echo "
电子面单提交结果:
".$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);
}
}
?>