注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

PHP生成跨境电商海关CEB311电子订单XML报文  

2017-05-09 14:58:22|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近在做一个项目,是一个跨境电商平台,需要批量生成CEB311电子订单XML报文,具体的思路是这样,先行从数据库中查询得到结果转换成数组,然后再拼接定单+商品数组,最后再组合推送方信息,将之转为XML即可【这里并没有用到PHP操作XML的类库,而是简单地编写了一个函数来将数组转换成XML】,具体的做法如下【这里省略了从数据库中获取数据,大家可以自行补全】

<?php
//海关生成唯一guid值
function create_guid($type=0) {
if($type==0){
$charid = strtoupper(md5(uniqid(mt_rand(), true)));
}else{
$charid = strtolower(md5(uniqid(mt_rand(), true)));
}
return substr($charid,0,8)."-".substr($charid,8,4)."-".substr($charid,12,4)."-".substr($charid,16,4)
."-".substr($charid,20,12);}
//递归处理数组
function arrForeach($arr) {
if (!is_array ($arr)) {
return false;
}
$xml='';
foreach($arr as $key => $value){
$xml .= is_numeric($key)?"":"<{$key}>";
$xml .= is_array($value)? arrForeach($value):$value;
$xml .= is_numeric($key)?"":"</{$key}>\n";
}
return $xml;
}
//转换数组为海关报文XML
function toXml($post){
foreach ($post as $key => $value) {
$attribute = '';
$str = '';
foreach ($value as $k1 => $v1) {
if(is_array($v1)){ //如果含有数组
$str .= is_numeric($k1)?"":"<{$k1}>";
$str .= arrForeach($v1);
$str .= is_numeric($k1)?"":"</{$k1}>";
}else{
$attribute .= $k1.'="'.$v1.'" ';
}
}
$strHead = '<?xml version="1.0" encoding="UTF-8"?>';
$strHead .= '<'.$key.' '.$attribute.'>'; //key为第一行标签名称 + 第一行的属性
$strFot .= '</'.$key.'>';
}
$string = $strHead.$str.$strFot;
return $string;
}
//大写的GUID
$guid1=create_guid();
//小写的GUID
$guid2=create_guid(1);
//开始生成定单信息
$order = array(
'ceb:OrderHead'=>array(
'ceb:guid' => $guid2,
'ceb:appType' => '1', //企业报送类型。1-新增 2-变更 3-删除。默认为1
'ceb:appTime' => date("YmdHis"), //企业报送时间
'ceb:appStatus' => '2', //业务状态:1-暂存,2-申报,默认为1。
'ceb:orderType' => 'I', //电子订单类型:I进口
'ceb:orderNo' => '2017050913374931701', //订单编号,同一交易平台的订单编号应唯一。
'ceb:ebpCode' => '1105910159', //电商平台的海关注册登记编号
'ceb:ebpName' => '东方物通科技(北京)有限公司', //电商平台名称
'ceb:ebcCode' => '1105910159', //电商企业的海关注册登记编号
'ceb:ebcName' => '东方物通科技(北京)有限公司',//电商企业名称
'ceb:goodsValue' => 14000, //商品实际成交价,含非现金抵扣金额
'ceb:freight' => 5000, //不包含在商品价格中的运杂费,无则填写"0"。
'ceb:discount' => 0, //使用积分、虚拟货币、代金券等非现金支付金额,无则填写"0"
'ceb:taxTotal' => 50, //企业预先代扣的税款金额,无则填写“0”
'ceb:acturalPaid' => 19050,//商品价格+运杂费+代扣税款-非现金抵扣,要跟这个字段对应。
'ceb:currency' => '142', //限定为人民币,填写“142”
'ceb:buyerRegNo' => '20170001', //订购人的交易平台注册号(不校验)
'ceb:buyerName' => '焦洪宇', //订购人的真实姓名
'ceb:buyerIdType' => '1', //订购人证件类型,1-身份证,2-其它。限定为身份证,填写1
'ceb:buyerIdNumber' => '130681136250023332', //订购人身份证号
'ceb:consignee' => '焦洪宇', //收货人姓名,必须与电子运单的收货人姓名一致。
'ceb:consigneeTelephone'=> '13522652231', //收货人联系电话,必须与电子运单的收货人电话一致。
'ceb:consigneeAddress' => '北京市海淀区', //收货地址,必须与电子运单的收货地址一致。
'ceb:note' => 'test', //定单备注
)
);
//生成商品列表信息,注意下,两个商品的价格totalPrice字段合并必须跟订单数组中的goodsValue对应
$goodsList['ceb:OrderList'][0] = array(
"ceb:gnum" => 1, //商品编码
"ceb:itemNo" => 'AF001-001', //电商企业自定义的商品货号(SKU)(可为空)
"ceb:itemName" => '商品1', //交易平台销售商品的中文名称
"ceb:unit" => '007', //计量单位,按海关标准的代码填写,但可根据实际合同而定
"ceb:qty" => 100, //商品实际数量
"ceb:price" => 20, //单个计量单位商品价格
"ceb:totalPrice" => 2000, //商品实际数量*单个计量单位商品价格
"ceb:currency" => "142", //限定为人民币,填写“142”
"ceb:country" => "116", //原产国,请按海关标准的参数代码填写
"ceb:note" => '' //商品备注
);

$goodsList['ceb:OrderList'][1] = array(
"ceb:gnum" => 2, //商品编码
"ceb:itemNo" => 'AF001-002',
"ceb:itemName" => '商品2',
"ceb:unit" => '007',
"ceb:qty" => 200,
"ceb:price" => 60,
"ceb:totalPrice" => 12000,
"ceb:currency" => "142",
"ceb:country" => "116",
"ceb:note" => ''
);
//将商品列表数组跟定单数组合并
$order = array_merge($order,$goodsList);
//生成推送方相应信息,并将订单信息输入
$res['ceb:CEB311Message'] = array(
'guid' => $guid1,
'version' => '1.0',
'xmlns:ceb' => 'http://www.chinaport.gov.cn/ceb',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'ceb:Order' => $order,
'ceb:BaseTransfer' => array(
'ceb:copCode' => '1101180326', //推送方海关注册登记编号,可能是电商,也可以是平台
'ceb:copName' => '电商企业', //推送方企业名称
'ceb:dxpMode' => 'DXP',
'ceb:dxpId' => 'DXP2016522002580001', //推送方DXP编码,一般以DXP开头
'ceb:note' => '' //推送方备注
)
);
//输出XML头
header("Content-type: application/xml");
Header("Content-Disposition: attachment; filename=311_" . date("YmdHis").".xml" );
echo toXml($res);
?>

执行效果如下:
PHP生成跨境电商海关CEB311电子订单XML报文 - sinsunson - 天朝布衣田中码农参上
这里请注意下,生成的XML必须是UTF-8无BOM格式编码,如果从数据库中取回的字符并不是UTF-8,请用iconv函数进行转换。 这样生成的报文就可以直接进行推送了。
  评论这张
 
阅读(15)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017