打印电子面单

中通/圆通API接口 PHP 简单封装示例 圆通 API 接口 - 简单封装 PHP yto.api.php 文件 class YTO { private $_domain = 'http://opentestapi.yto.net.cn/service/' ,$_id ,$_key ,$_secret ,$url ,$values ,$result ,$_mouth = []; c... 阅读详情

原文地址:https://www.1024cc.cn

打印电子面单,常用两种方案:

  • 通过快递100获取快递单号,结合c-lodop热敏纸打印
  • 通过菜鸟ISV/自研ERP使用菜鸟电子面单

1.快递100 - 结合热敏纸打印(C-Lodop)

介绍:根据客户提交的快递公司编码获取电子面单页面,调用方获取到电子面单页面后可以通过打印机打印出来使用

地址文档

1.快递100: http://www.kuaidi100.com/openapi/cloudprintele.shtml
2.电子面单:https://poll.kuaidi100.com/manager/page/document/eleapi
3.C-lodop: http://www.lodop.net/

操作代码

<?php

namespace App\Services;

/**
 * 快递100 - 获取物流单号
 */
class SendExpressService
{
    public function __construct()
    {
        // 快递100参数
        $this->kuaidicom    = ""; // 物流编号 - zhongtong
        $this->key          = ""; // 快递100key
        $this->secret       = ""; // 快递100secret
        $this->partnerId    = ""; // 快递100partnerId
        $this->partnerKey   = ""; // 快递100partnerKey
    }


    /**
     * 生成快递单号
     * @Author   echo
     * @DateTime 2019-03-08
     * @param    [type]     $orderItem [description]
     * @return   [type]                [description]
     */
    public function createExpressCode($orderItem, $supplierAddressInfo)
    {
        // $supplierAddressInfo - 供应商信息
        // $orderItem - 订单信息
        $postData = [
            'recMan' => [
                "name"=>$orderItem->receiveName,
                "mobile"=>$orderItem->mobile,
                "tel"=>"",
                "zipCode"=>"",
                "province"=>$orderItem->province,
                "city"=>$orderItem->city,
                "district"=>$orderItem->area,
                "addr"=>$orderItem->address,
                "company"=>""
            ],
            'sendMan' => [
                "name"=>$supplierAddressInfo->contact_person,
                "mobile"=>$supplierAddressInfo->mobile,
                "tel"=>"",
                "zipCode"=>"",
                "province"=> $supplierAddressInfo->province,
                "city"=> $supplierAddressInfo->city,
                "district"=> $supplierAddressInfo->area,
                "addr"=> $supplierAddressInfo->address,
                "company"=>""
            ],
            "kuaidicom"=> $this->kuaidicom,
            "partnerId"=> $this->partnerId,
            "partnerKey"=>$this->partnerKey,
            "net"=>"",
            "kuaidinum"=>"",
            "orderId"=>$orderCode,
            "payType"=>"",
            "expType"=>"标准快递",
            "weight"=>"1",
            "volumn"=>"0",
            "count"=>1,
            "remark"=>$note,
            "valinsPay"=>"0",
            "collection"=>"0",
            "needChild"=>"0",
            "needBack"=>"0",
            "cargo"=>"",
            "needTemplate"=>"1"
        ];

        $time = time();
        $sign = strtoupper(md5(json_encode($postData).$time.$this->key.$this->secret));
        $apiUrl = "http://api.kuaidi100.com/eorderapi.do?method=getElecOrder&param=".json_encode($postData)."&sign=".$sign."&t=".$time."&key=".$this->key;

        return CurlHandler::curl_post_http($apiUrl,[]);
        
    }

}

<script src="/Lodop/js/LodopFuncs.js"></script>
<script type="text/javascript">
    var LODOP; //声明为全局变量

    // 电子面单 - 预览 
    function sendPreviewCommand(expressInfo)
    {
        LODOP=getLodop();
        if (!LODOP.CVERSION) {
            alert('请安装C-Lodop插件')
            return
        }

        setConent(expressInfo);
        LODOP.PREVIEW();
        return             
    }
    
    // 打印电子面单
    function sendCommand(expressInfo)
    {
        LODOP=getLodop();

        if (!LODOP.CVERSION) {
            alert('请安装C-Lodop插件')
            return
        }
     
   
        LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);
        setConent(expressInfo);
        LODOP.PRINT();
        orderId = $(this).val()
        LODOP.On_Return=function(TaskID,Value){
            alert('成功')
        };              
    }
</script>

2.菜鸟物流

介绍:ISV/自研ERP使用菜鸟电子面单:需要注册一个ISV账号申请API并发布,然后重新注册一个商家账号对该ISV发布的应用进行授权,方可完成对接。

文档地址:

1.电子面单接入文档(LINK接入)https://open.taobao.com/doc.htm?docId=107052&docType=1

2.物流云平台 https://cloud.cainiao.com/

3.电子面单管理中心 https://dayin.cainiao.com/miandan/subscribe/subscribe.htm

4.错误码 https://global.link.cainiao.com/#/homepage/doc/3?_k=pnfgj0

日常测试环境

地址:https://linkdaily.tbsandbox.com/gateway/link.do 
或者 https://linkdaily.tbsandbox.com/gateway/pac_message_receiver.do (测试环境不稳定,时有调整,两个地址都试一下,哪个可以用哪个)

AppKey:766654
SecretKey:F53eqq903jQySV100Z8w06f9g914A13Z
Token:TmpFU1ZOUGoyRnoybDZmT3lyaW9hWGR4VFNad0xNYTBUek9QZk9kamt2Z1hJMytsVkVHK0FjVW55T25wcUR1Qw==

日常测试环境使用以上提供的AppKey、SecretKey、Token,不能使用自己申请的。测试环境不支持配置请求、返回报文格式,默认格式xml格式;不可新增订购关系,只能使用提供的快递公司获取面单号,支持的快递公司通过订购关系查询接口获取。请参照LINK接入白皮书1.10中的代码示例进行联调测试,测试环境只供调通接口,具体数据没有参考意义,数据准确性请到正式环境验证。

注:
1、电子面单测试使用日常测试环境(沙箱环境),不使用彩虹桥环境;
2、不要使用自己申请的**AppKey、SecretKey、Token;**
3、报文格式只能使用XML格式;
4、按以下顺序调试电子面单接口:订购关系查询接口、取号接口、更新接口、取消接口;
5、日常环境不支持测试云打印接口,请到正式环境调试。

操作代码

<?php

namespace App\Services;

/**
 * 菜鸟物流获取快递单号
 */
class SendExpressService
{
    public function __construct()
    {
        // 菜鸟参数
        $this->cainiaoDomain        = ""; // 菜鸟请求域名 - http://link.cainiao.com/gateway/link.do
        $this->cainiaoAppSecret     = ""; // 菜鸟AppSecret
        $this->logisticProviderId   = ""; // token(申请成功后菜鸟给的token)
        $this->cpCode               = ""; // 物流编号 - YTO
        $this->senderMobile         = ""; // 发货人号码
        $this->senderName           = ""; // 发货人姓名
        $this->template             = ""; // 物流默认模板
    }


    /**
     * 获取发货地
     * @Author   echo
     * @DateTime 2019-04-10
     * @return   [type]     [description]
     */
    public function getDeliveryAddress()
    {
        // 请求类型
        $type = "TMS_WAYBILL_SUBSCRIPTION_QUERY";
        // 请求内容
        $requestData= json_encode(['cpCode' => $this->cpCode]);
        // 请求链接
        $url = $this->cainiaoDomain."?logistic_provider_id=".$this->logisticProviderId."&msg_type=".$type."&logistics_interface=".urlencode($requestData)."&data_digest=".$this->encrypti($requestData,$this->cainiaoAppSecret);
        // 返回请求
        return get_url($url);
    }

    /**
     * 获取快递单号
     * @Author   echo
     * @DateTime 2019-04-10
     * @param    array      $sender    [发货人信息]
     * @param    array      $recipient [收货人信息]
     * @param    [type]     $orderCode [订单号]
     * @return   [type]                [description]
     */
    public function getExpressCode($sender = [],$recipient = [],$orderCode = null)
    {

        /**
         *  tip
         *  - orderCode不能重复
         *  - recipient数据必须与为“TMS_WAYBILL_SUBSCRIPTION_QUERY”获取数据
         *  - 发货人/收货人,地址/联系人/联系方式不能为空
         */
        // 请求方式
        $type = "TMS_WAYBILL_GET";
        // 请求内容
        $requestData ='{
                "cpCode":"'.$this->cpCode.'",
                "dmsSorting":"false",
                "needEncrypt":"false",
                "resourceCode":"无",
                "sender":{
                    "address":{
                        "city":"'.$sender['city'].'",
                        "detail":"'.$sender['detail'].'",
                        "district":"'.$sender['district'].'",
                        "province":"'.$sender['province'].'",
                        "town":"'.$sender['town'].'"
                    },
                    "mobile":"'.$sender['mobile'].'",
                    "name":"'.$sender['name'].'",
                    "phone":"'.$sender['phone'].'",
                },
                "storeCode":"无",
                "tradeOrderInfoDtos":[
                    {
                        "logisticsServices":"",
                        "objectId":"1",
                        "orderInfo":{
                            "orderChannelsType":"OTHERS",
                            "tradeOrderList":[
                                "'.$orderCode.'"
                            ]
                        },
                        "packageInfo":{
                            "id":"'.$orderCode.'",
                            "items":[
                                {
                                    "count":1,
                                    "name":"商品"
                                }
                            ],
                            "volume":"1",
                            "weight":"1"
                        },
                        "recipient":{
                            "address":{
                                "city":"'.$recipient['city'].'",
                                "detail":"'.$recipient['detail'].'",
                                "district":"'.$recipient['district'].'",
                                "province":"'.$recipient['province'].'",
                                "town":"'.$recipient['town'].'"
                            },
                            "mobile":"'.$recipient['mobile'].'",
                            "name":"'.$recipient['name'].'",
                            "phone":"'.$recipient['phone'].'",
                        },
                        "templateUrl":"'.$this->template.'",
                        "userId":"1"
                    }
                ]
            }';

        $url = $domain."?logistic_provider_id=".$this->logisticProviderId."&msg_type=".$type."&logistics_interface=".urlencode($requestData)."&data_digest=".$this->encrypti($requestData,$this->cainiaoAppSecret);
        return get_url($url);
    }

    /**
     * 电商Sign签名生成
     * @param data 内容
     * @param appkey Appkey
     * @return DataSign签名
     */
    public function encrypti($data,$this->cainiaoAppSecret)
    {
        return urlencode(base64_encode(md5($data.$this->cainiaoAppSecret,true)));
    }

    // get方式请求
    function get_url($httpUrl)
    {
        $ch = curl_init();
        $timeout = 5;
        curl_setopt ($ch, CURLOPT_URL, $httpUrl);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt ($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $file_contents = curl_exec($ch);
        curl_close($ch);
        
        return $file_contents;
    }

}

<script type="text/javascript">

        var serviceUrl = "ws://localhost:13528"
        var socket;

        function doConnect(callback)
        {
            socket = new WebSocket(serviceUrl);

            // 监听消息
            socket.onmessage = function(event)
            {
                console.log('Client received a message',event);
                var obj = eval('('+event.data+')');
                if (obj && (obj.previewURL || obj.previewImage))
                {
                    var url;
                    if (obj && obj.previewURL) {
                        url = obj.previewURL;
                    } else if (obj && obj.previewImage) {
                        url = obj.previewImage;
                    }
                    window.open(url);    
                }
            };

            socket.onopen = function(event)
            {
                if (callback != null) {
                    callback();
                }
            }

            socket.onerror = function(error)
            {
                console.log("Failed to connect CN print at " + serviceUrl, error);
                alert("打印接连接错误,请启动CAINIAO打印组件")
            }

            // 监听Socket的关闭
            socket.onclose = function(event)
            {
                console.log('Client notified socket has closed',event);
                alert("打印连接关闭,请启动CAINIAO打印组件")
            };
        }

        /**
         * 打印命令
         * @Author   echo
         * @DateTime 2019-04-29
         * @param    {[type]}   expressInfo [获取快递单号,返回打印信息]
         * @return   {[type]}               [description]
         */
        function sendCommand(expressInfo)
        {
            if (typeof socket == "undefined" || socket.readyState == WebSocket.CLOSED) {
                doConnect(sendCommand);
                return;
            }

            if (socket.readyState != WebSocket.OPEN) {
                alert("无效连接: " + socket.readyState);
                return;
            }

            var time = new Date().getTime();
            var contents = [];

            // 物流基础数据
            contents.push(expressInfo) 
            // 物流自定义数据 (需要自行配置)
            diyContent = {"templateURL" : "http://cloudprint.cainiao.com/template/customArea/7737479/2","data" : {"product_detail": "自定义内容"}}
            contents.push(diyContent) 
  
            msg = {
                    "cmd": "print",
                    "requestID": "123458976",
                    "version": "1.0",
                    "task": {
                        "taskID": "7293666",
                        "preview": false, // 是否预览
                        "printer": "",
                        "notifyMode": "allInOne",
                        "previewType": "html",
                        "documents": [
                            {
                                "documentID": "0123456789",
                                "contents": contents
                            }
                        ]
                    }
                }

            var obj = msg
            if (obj["task"])
            {
                obj["task"]["taskID"] = time.toString() + "_TASK"
                obj["task"]["preview"] = true;
            }

            var newMsg = JSON.stringify(obj);
            socket.send(newMsg);
        }
    </script>

打印电子面单,常用两种方案:

  • 通过快递100获取快递单号,结合c-lodop热敏纸打印
  • 通过菜鸟ISV/自研ERP使用菜鸟电子面单

1.快递100 - 结合热敏纸打印(C-Lodop)

介绍:根据客户提交的快递公司编码获取电子面单页面,调用方获取到电子面单页面后可以通过打印机打印出来使用

地址文档

1.快递100: http://www.kuaidi100.com/openapi/cloudprintele.shtml
2.电子面单:https://poll.kuaidi100.com/manager/page/document/eleapi
3.C-lodop: http://www.lodop.net/

操作代码

<?php

namespace App\Services;

/**
 * 快递100 - 获取物流单号
 */
class SendExpressService
{
    public function __construct()
    {
        // 快递100参数
        $this->kuaidicom    = ""; // 物流编号 - zhongtong
        $this->key          = ""; // 快递100key
        $this->secret       = ""; // 快递100secret
        $this->partnerId    = ""; // 快递100partnerId
        $this->partnerKey   = ""; // 快递100partnerKey
    }


    /**
     * 生成快递单号
     * @Author   echo
     * @DateTime 2019-03-08
     * @param    [type]     $orderItem [description]
     * @return   [type]                [description]
     */
    public function createExpressCode($orderItem, $supplierAddressInfo)
    {
        // $supplierAddressInfo - 供应商信息
        // $orderItem - 订单信息
        $postData = [
            'recMan' => [
                "name"=>$orderItem->receiveName,
                "mobile"=>$orderItem->mobile,
                "tel"=>"",
                "zipCode"=>"",
                "province"=>$orderItem->province,
                "city"=>$orderItem->city,
                "district"=>$orderItem->area,
                "addr"=>$orderItem->address,
                "company"=>""
            ],
            'sendMan' => [
                "name"=>$supplierAddressInfo->contact_person,
                "mobile"=>$supplierAddressInfo->mobile,
                "tel"=>"",
                "zipCode"=>"",
                "province"=> $supplierAddressInfo->province,
                "city"=> $supplierAddressInfo->city,
                "district"=> $supplierAddressInfo->area,
                "addr"=> $supplierAddressInfo->address,
                "company"=>""
            ],
            "kuaidicom"=> $this->kuaidicom,
            "partnerId"=> $this->partnerId,
            "partnerKey"=>$this->partnerKey,
            "net"=>"",
            "kuaidinum"=>"",
            "orderId"=>$orderCode,
            "payType"=>"",
            "expType"=>"标准快递",
            "weight"=>"1",
            "volumn"=>"0",
            "count"=>1,
            "remark"=>$note,
            "valinsPay"=>"0",
            "collection"=>"0",
            "needChild"=>"0",
            "needBack"=>"0",
            "cargo"=>"",
            "needTemplate"=>"1"
        ];

        $time = time();
        $sign = strtoupper(md5(json_encode($postData).$time.$this->key.$this->secret));
        $apiUrl = "http://api.kuaidi100.com/eorderapi.do?method=getElecOrder&param=".json_encode($postData)."&sign=".$sign."&t=".$time."&key=".$this->key;

        return CurlHandler::curl_post_http($apiUrl,[]);
        
    }

}

<script src="/Lodop/js/LodopFuncs.js"></script>
<script type="text/javascript">
    var LODOP; //声明为全局变量

    // 电子面单 - 预览 
    function sendPreviewCommand(expressInfo)
    {
        LODOP=getLodop();
        if (!LODOP.CVERSION) {
            alert('请安装C-Lodop插件')
            return
        }

        setConent(expressInfo);
        LODOP.PREVIEW();
        return             
    }
    
    // 打印电子面单
    function sendCommand(expressInfo)
    {
        LODOP=getLodop();

        if (!LODOP.CVERSION) {
            alert('请安装C-Lodop插件')
            return
        }
     
   
        LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);
        setConent(expressInfo);
        LODOP.PRINT();
        orderId = $(this).val()
        LODOP.On_Return=function(TaskID,Value){
            alert('成功')
        };              
    }
</script>

2.菜鸟物流

介绍:ISV/自研ERP使用菜鸟电子面单:需要注册一个ISV账号申请API并发布,然后重新注册一个商家账号对该ISV发布的应用进行授权,方可完成对接。

文档地址:

1.电子面单接入文档(LINK接入)https://open.taobao.com/doc.htm?docId=107052&docType=1

2.物流云平台 https://cloud.cainiao.com/

3.电子面单管理中心 https://dayin.cainiao.com/miandan/subscribe/subscribe.htm

4.错误码 https://global.link.cainiao.com/#/homepage/doc/3?_k=pnfgj0

日常测试环境

地址:https://linkdaily.tbsandbox.com/gateway/link.do 
或者 https://linkdaily.tbsandbox.com/gateway/pac_message_receiver.do (测试环境不稳定,时有调整,两个地址都试一下,哪个可以用哪个)

AppKey:766654
SecretKey:F53eqq903jQySV100Z8w06f9g914A13Z
Token:TmpFU1ZOUGoyRnoybDZmT3lyaW9hWGR4VFNad0xNYTBUek9QZk9kamt2Z1hJMytsVkVHK0FjVW55T25wcUR1Qw==

日常测试环境使用以上提供的AppKey、SecretKey、Token,不能使用自己申请的。测试环境不支持配置请求、返回报文格式,默认格式xml格式;不可新增订购关系,只能使用提供的快递公司获取面单号,支持的快递公司通过订购关系查询接口获取。请参照LINK接入白皮书1.10中的代码示例进行联调测试,测试环境只供调通接口,具体数据没有参考意义,数据准确性请到正式环境验证。

注:
1、电子面单测试使用日常测试环境(沙箱环境),不使用彩虹桥环境;
2、不要使用自己申请的**AppKey、SecretKey、Token;**
3、报文格式只能使用XML格式;
4、按以下顺序调试电子面单接口:订购关系查询接口、取号接口、更新接口、取消接口;
5、日常环境不支持测试云打印接口,请到正式环境调试。

操作代码

<?php

namespace App\Services;

/**
 * 菜鸟物流获取快递单号
 */
class SendExpressService
{
    public function __construct()
    {
        // 菜鸟参数
        $this->cainiaoDomain        = ""; // 菜鸟请求域名 - http://link.cainiao.com/gateway/link.do
        $this->cainiaoAppSecret     = ""; // 菜鸟AppSecret
        $this->logisticProviderId   = ""; // token(申请成功后菜鸟给的token)
        $this->cpCode               = ""; // 物流编号 - YTO
        $this->senderMobile         = ""; // 发货人号码
        $this->senderName           = ""; // 发货人姓名
        $this->template             = ""; // 物流默认模板
    }


    /**
     * 获取发货地
     * @Author   echo
     * @DateTime 2019-04-10
     * @return   [type]     [description]
     */
    public function getDeliveryAddress()
    {
        // 请求类型
        $type = "TMS_WAYBILL_SUBSCRIPTION_QUERY";
        // 请求内容
        $requestData= json_encode(['cpCode' => $this->cpCode]);
        // 请求链接
        $url = $this->cainiaoDomain."?logistic_provider_id=".$this->logisticProviderId."&msg_type=".$type."&logistics_interface=".urlencode($requestData)."&data_digest=".$this->encrypti($requestData,$this->cainiaoAppSecret);
        // 返回请求
        return get_url($url);
    }

    /**
     * 获取快递单号
     * @Author   echo
     * @DateTime 2019-04-10
     * @param    array      $sender    [发货人信息]
     * @param    array      $recipient [收货人信息]
     * @param    [type]     $orderCode [订单号]
     * @return   [type]                [description]
     */
    public function getExpressCode($sender = [],$recipient = [],$orderCode = null)
    {

        /**
         *  tip
         *  - orderCode不能重复
         *  - recipient数据必须与为“TMS_WAYBILL_SUBSCRIPTION_QUERY”获取数据
         *  - 发货人/收货人,地址/联系人/联系方式不能为空
         */
        // 请求方式
        $type = "TMS_WAYBILL_GET";
        // 请求内容
        $requestData ='{
                "cpCode":"'.$this->cpCode.'",
                "dmsSorting":"false",
                "needEncrypt":"false",
                "resourceCode":"无",
                "sender":{
                    "address":{
                        "city":"'.$sender['city'].'",
                        "detail":"'.$sender['detail'].'",
                        "district":"'.$sender['district'].'",
                        "province":"'.$sender['province'].'",
                        "town":"'.$sender['town'].'"
                    },
                    "mobile":"'.$sender['mobile'].'",
                    "name":"'.$sender['name'].'",
                    "phone":"'.$sender['phone'].'",
                },
                "storeCode":"无",
                "tradeOrderInfoDtos":[
                    {
                        "logisticsServices":"",
                        "objectId":"1",
                        "orderInfo":{
                            "orderChannelsType":"OTHERS",
                            "tradeOrderList":[
                                "'.$orderCode.'"
                            ]
                        },
                        "packageInfo":{
                            "id":"'.$orderCode.'",
                            "items":[
                                {
                                    "count":1,
                                    "name":"商品"
                                }
                            ],
                            "volume":"1",
                            "weight":"1"
                        },
                        "recipient":{
                            "address":{
                                "city":"'.$recipient['city'].'",
                                "detail":"'.$recipient['detail'].'",
                                "district":"'.$recipient['district'].'",
                                "province":"'.$recipient['province'].'",
                                "town":"'.$recipient['town'].'"
                            },
                            "mobile":"'.$recipient['mobile'].'",
                            "name":"'.$recipient['name'].'",
                            "phone":"'.$recipient['phone'].'",
                        },
                        "templateUrl":"'.$this->template.'",
                        "userId":"1"
                    }
                ]
            }';

        $url = $domain."?logistic_provider_id=".$this->logisticProviderId."&msg_type=".$type."&logistics_interface=".urlencode($requestData)."&data_digest=".$this->encrypti($requestData,$this->cainiaoAppSecret);
        return get_url($url);
    }

    /**
     * 电商Sign签名生成
     * @param data 内容
     * @param appkey Appkey
     * @return DataSign签名
     */
    public function encrypti($data,$this->cainiaoAppSecret)
    {
        return urlencode(base64_encode(md5($data.$this->cainiaoAppSecret,true)));
    }

    // get方式请求
    function get_url($httpUrl)
    {
        $ch = curl_init();
        $timeout = 5;
        curl_setopt ($ch, CURLOPT_URL, $httpUrl);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt ($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $file_contents = curl_exec($ch);
        curl_close($ch);
        
        return $file_contents;
    }

}

<script type="text/javascript">

        var serviceUrl = "ws://localhost:13528"
        var socket;

        function doConnect(callback)
        {
            socket = new WebSocket(serviceUrl);

            // 监听消息
            socket.onmessage = function(event)
            {
                console.log('Client received a message',event);
                var obj = eval('('+event.data+')');
                if (obj && (obj.previewURL || obj.previewImage))
                {
                    var url;
                    if (obj && obj.previewURL) {
                        url = obj.previewURL;
                    } else if (obj && obj.previewImage) {
                        url = obj.previewImage;
                    }
                    window.open(url);    
                }
            };

            socket.onopen = function(event)
            {
                if (callback != null) {
                    callback();
                }
            }

            socket.onerror = function(error)
            {
                console.log("Failed to connect CN print at " + serviceUrl, error);
                alert("打印接连接错误,请启动CAINIAO打印组件")
            }

            // 监听Socket的关闭
            socket.onclose = function(event)
            {
                console.log('Client notified socket has closed',event);
                alert("打印连接关闭,请启动CAINIAO打印组件")
            };
        }

        /**
         * 打印命令
         * @Author   echo
         * @DateTime 2019-04-29
         * @param    {[type]}   expressInfo [获取快递单号,返回打印信息]
         * @return   {[type]}               [description]
         */
        function sendCommand(expressInfo)
        {
            if (typeof socket == "undefined" || socket.readyState == WebSocket.CLOSED) {
                doConnect(sendCommand);
                return;
            }

            if (socket.readyState != WebSocket.OPEN) {
                alert("无效连接: " + socket.readyState);
                return;
            }

            var time = new Date().getTime();
            var contents = [];

            // 物流基础数据
            contents.push(expressInfo) 
            // 物流自定义数据 (需要自行配置)
            diyContent = {"templateURL" : "http://cloudprint.cainiao.com/template/customArea/7737479/2","data" : {"product_detail": "自定义内容"}}
            contents.push(diyContent) 
  
            msg = {
                    "cmd": "print",
                    "requestID": "123458976",
                    "version": "1.0",
                    "task": {
                        "taskID": "7293666",
                        "preview": false, // 是否预览
                        "printer": "",
                        "notifyMode": "allInOne",
                        "previewType": "html",
                        "documents": [
                            {
                                "documentID": "0123456789",
                                "contents": contents
                            }
                        ]
                    }
                }

            var obj = msg
            if (obj["task"])
            {
                obj["task"]["taskID"] = time.toString() + "_TASK"
                obj["task"]["preview"] = true;
            }

            var newMsg = JSON.stringify(obj);
            socket.send(newMsg);
        }
    </script>
电子面单打印通用解决方案(PHP代码示例) 物流快递、电商、ERP、仓储等都涉及发货业务都需要用到电子面单打印,市面上有各种各样的电子面单打印机,电子面单打印软件,电子面单打印工具满足了打印需求,但未能很好的满足移动端打印。这里介绍一个手机端电子面单打印通用解决方案:快宝电子面单云打印,它的优势:不限打印机型号、品牌,可打印各大快递公司电子面单,可打印菜鸟电子面单,支持批量打印,支持远程打印,实现电子面单打印机共享等。一、云打印介绍快宝电子... 阅读详情

相关推荐

快递鸟批量打印电子面单接口及控件安装

目前支持批量打印电子面单的有快递鸟、菜鸟和快递公司。但是快递公司仅能打印本公司的电子面单,对于电商等发货商来说不太适用,菜鸟教适合淘系商家,快递鸟则比较通用,这里介绍快递鸟电子面单接口批量打印的方法

Ttiantian26的博客 5396

常用资源网站

资源网站 一 照片 1 pixabay:https://pixabay.com/zh/ 2 Unsplash:https://unsplash.com/ 3 Pexels:https://www.pexels.com/zh-cn/ 4 Foodiesfeed :https://www.foodiesfeed.com 5 CC零图片网:https://cc0.cn/ 6 Logo神器:https://www.logosc.cn/so/ 二 图标 1 iconfont:https://www.iconfont.

自用云笔记 1万+

如何用C#实现电子面单批量打印功能

本期就来讲解如何用C#实现电子面单批量打印的功能

KuaiDNiao的博客 1121

1024,鸽了1024篇博文的我。。。

1024,鸽了1024篇博文的我。。。 最近,硕士研究生刚开学,鉴于小菜鸡的我刚开始我的“填坑”之路,很忙,对,真的!!! 我在忙什么? 忙于脑网络的学习,还有神经网络架构方面的研究摸索。。。那么本文会很干嘛?不,没有,莫得时间写“硬干”文,所以这篇博客给大家分享一些我收藏的不错的网站。 不想听菜鸡废话的→ 直接截图↓ 超分辨率、原创、二次元、三次元壁纸网站 https://wallhaven.cc/latest?page=2 超分辨率、高速稳定的电影&追剧网站 https:/

Spuer_Tiger 1万+

基于java快递公司电子面单打印接口文档

申请快递公司电子面单打印接口,在正式环境下,在官网申请客户id后。在快递后台即可进行如下的批量打印。​使用快递公司电子面单打印接口功能前,要把接口代码集成到自己内部系统理,在官网下载接口demo安装到本地电脑,可提供多demo版本快递公司电子面单demo下载

KuaiDNiao的博客 1292

Cocos Creator实现的1024游戏

Cocos Creator实现的1024游戏 cc.Class({ extends: cc.Component, properties: { // foo: { // default: null, // The default value will be used only when the component attaching // to a node for the first time // url: cc.Texture2D, // optional, default is typeof default // serializable: true, // optional, default is true // visible: true, // optional, default is true // displayName: 'Foo', // optional // readonly: false, // optional, default is false // }, // ... }, // use this for initialization onLoad: function () { }, // called every frame, uncomment this function to activate update callback // update: function (dt) { // }, });

门面模式(外观模式)

原文链接:https://www.1024cc.cn 定义 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 目的: 1、为一个复杂子系统提供简单的接口 2、减少客户端和子系统的耦合 介绍 ...

cc_echo的博客 7274

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 770

菜鸟电子面单打印

一、首先开通电子面单服务,然后自己编辑一个模板 地址:https://cloudprint.cainiao.com/print 提示:这里不再详细说明,网上随便找了一个模板地址(如果不会,下面我会提供一个,没有关系) 二、需要一台打印机,我的打印机型号是(HPRT 汉印打印机) 有了打印机后,就把打印机与电脑连接,有的电脑可能识别不出来打印机,这个时候就需要装一个驱动(可以询问商家),我的型号可以到http://cn.hprt.com/下载驱动。 电脑上能识别出打印机就OK了 三、需要下载菜鸟打印组件 这个

javaboy_yl 7029

【OpenClaw 故障排查完全指南】

OpenClaw 故障排查指南摘要 本指南针对OpenClaw 2026.2.26版本常见问题提供解决方案,适用于Windows/Linux/macOS平台。 核心问题及修复方案: 飞书插件连接失败:删除冲突插件或重装OpenClaw Ollama认证错误:设置环境变量OLLAMA_API_KEY="ollama-local" 配置警告:可安全忽略的安全扫描提示 端口占用:查找并终止占用18789端口的进程 插件重复加载:清理重复插件目录 快速修复: 提供一键修复PowerShell脚本

weixin_37572294的博客 1万+

Bellhop水声信道模型的仿真

Bellhop是一种基于射线追踪的水声信道模型,广泛用于预测水下环境中的声压场。它通过模拟声波在水中的传播路径,计算声场分布,适用于复杂的水下通信场景。

yt94832的博客 1315

关于菜鸟的圆通电子面单打印

1. https://open.taobao.com/docs/doc.htm?spm=a21da.7629140.0.0.97iBG8&docType=1&articleId=107052 电子面单接入文档(LINK接入) 2. https://dayin.cainiao.com/miandan/subscription/branchRechargeInfo.htm...

weixin_33858485的博客 2791

深入浅出CenterFusion

结合论文和代码理解CenterFusion

Untitled的专栏 5104

php电子面单打印快递100,使用快递100软件打印电子面单设置操作教程

我们在很多的软件的使用中,有小伙伴在使用只能够日常的打印电子账单的时候很多的小伙伴都在使用快递100的这一款软件来使用打印,一些我们的快递这些物流的账单都是可以实现打印的,那快递100在使用过中恶意是需要一定的使用说明来好好的使用的,今天小编就来跟大家分享一下详解使用软件打印电子面单的操作方法。具体的方法和详细的步骤如下:1、进入快递100,点击登录。2、登录成功后,点击“用户中心”。3、进入用户...

weixin_39598135的博客 2754

Mac上Ollama服务IP访问失败的3种修复方法(含永久生效配置)

本文详细介绍了Mac上Ollama服务IP访问失败的3种修复方法,包括临时环境变量覆盖、永久Shell配置修改及进阶排查技巧。重点解析了OLLAMA_HOST环境变量的配置原理,帮助开发者解决Connection refused问题,实现局域网IP访问Ollama服务的需求。

weixin_29209805的博客 210

传输线的特征阻抗

信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输入端或输出端处于阻抗匹配状态,简称为阻抗匹配。否则,便称为阻抗失配。有时也直接叫做匹配或失配。指一个电路输入端的等效阻抗。在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I。可以把输入端想象成一个电阻的两端,这个电阻的阻值,就是输入阻抗。- 对于电压驱动的电路,输入阻抗越大,则对电压源的负载就越轻,因而就越容易驱动,也不会对信号源有影响;

学海无涯的专栏 4466

拼多多怎么批量打印电子面单步骤

拼多多目前是已经 有了自己的电子面单系统了,所以拼多多商家就可以直接用平台上的电子面单了,目前商家打印拼多多电子面单就需要先开通拼多多电子面单系统了哦,同时拼多多的电子面单和其他平台的电子面单是一样的,也可以批量打印电子面单,也能直接用打单工具易掌柜来配置店铺来打印的。 不过还是有不少的商家对拼多多的电子面单不怎么放心,其实拼多多的电子面单系统相当对是给商家福利,可以有效的减少物流异常,还能方便...

weixin_34303897的博客 3318

六、数据资产平台功能架构

该架构图展示了一个功能完善的数据资产平台,它涵盖了数据资产管理的各个方面,从数据采集、模型设计、编目到使用和分析。通过该平台,企业可以更好地管理数据资产,提高数据利用效率,并为业务决策提供有力支持。

moton2017的博客 1627

电子面单云打印方案(PHP示例)

物流快递、电商、ERP、仓储等都涉及发货业务都需要用到电子面单打印,市面上有各种各样的电子面单打印机,电子面单打印软件,电子面单打印工具满足了打印需求,但未能很好的满足移动端打印。这里介绍一个手机端电子面单打印通用解决方案:快宝电子面单云打印,它的优势:不限打印机型号、品牌,可打印各大快递公司...

chenshuan5320的博客 1894

windows在使用ping 127.0.0.1时出现一般故障的解决方案

本文主要介绍了windows在使用ping 127.0.0.1时出现一般故障的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 7万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

微商如何打印电子面单

现在很多做微商的商家,通过微信推广销售商品,但是这类人群要怎么打印现如今流行的电子面单呢?今天小编就为大家介绍一下 https://jingyan.baidu.com/article/eae07827506d8f1fed54856c.html    感觉下面工具不够自动化,还要人工复制,粘贴订单才能够热敏打印。 我希望是能够自动直接打印淘宝,微信等平台的订单,不需要手工做任何事情。 或者...

湾区人工智能 2975

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

电商快递物流的电子面单打印接口API案例代码

一、自定义打印接口 如有打印发货单等其他类打印需求,可使用该接口。通过管理后台模板配置,配置自定义模板,实现自定义打印功能。 1.1 接口格式 提供统一格式的HTTP POST或GET调用接口,并返回统一格式JSON数据。 1.2 请求地址 https://poll.kuaidi100.com/printapi/printtask.do 请求参数(header) 名称 类型 默认值 Content-Type string application/x-www-form-urlencoded

kuaidi100API的博客 24万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

CRMEB产品快递电子面单打印如何设置通用打印设备打印

这样就完成了打印机的添加,重复打印操作即可。点击加号选择usb链接的打印机。设备可打印80mm的纸张。以汉印打印机N31C为例。这样就完成了打印配置。

鑫和皓的博客 1511

电子面单打印模板规格汇总-快递鸟

快递公司名称 编码 模板样式 尺寸规格 TemplateSize字段 CustomArea字段 安能快递 ANE 二联180 宽100mm高180mm切点110/70 默认返回,不能传值 / 安能快运 ANEKY ...

快递鸟API 5332

winform 打印快递电子面单_隐私电子面单demo

[c#]代码库using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;using System.Text;using System.Web;using System.Security.Cryptography.X509Certificates;using Sys...

weixin_39790738的博客 416
下一篇: 门面模式(外观模式)
cc_echo
博客等级 码龄11年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值