京东物流开放平台对接云打印功能

news2024/12/23 17:45:58

这是京东开发文档的流程图,根据自己的需求分析,我选择的是接入方式一

这是接入方式一的流程图:

所有第一步我们先下载他的打印组件并安装:京东物流开放平台 

第二步呢就是看你有没有自定义快递面单的需求,由于目前我没有特别的需求,所以我这里选择直接去复制他的官方模板的链接就好了

京东物流快递面单

我直接选择了第一个,把它保存下来

在准备好这些之后我们就可以去获取我们已经下好的快递单的加密后的密文数据了。

获取打印数据的文档

首先要注意的是,接入云打印是还需要额外导入京东提供的jar包的:

然后按需下载自己语言的包就好了,再通过maven或者其他管理工具把它安装到自己的依赖仓库当中,然后把它导入到项目内,我的是这样:

 完成这一步之后我们就可以开始写代码了,其实很简单,就是根据要啥参数传啥参数就好了:

 public static PullDataServicePullDataLopResponse getPullData(String JDTrackNumber){
        System.out.println("获取打印数据,传入单号:"+JDTrackNumber);
        PullDataServicePullDataLopRequest request = new PullDataServicePullDataLopRequest();

        PullDataReqDTO dto = new PullDataReqDTO();
        dto.setCpCode("JD");
        ArrayList<WayBillInfo> wayBillInfos = new ArrayList<>();
        WayBillInfo wayBillInfo = new WayBillInfo();
        wayBillInfo.setJdWayBillCode(JDTrackNumber);
        

        wayBillInfos.add(wayBillInfo);
        dto.setWayBillInfos(wayBillInfos);

        //cpCode为JD\JDKY\JDDJ\ZY时,key的值是ewCustomerCode;cpCode是非京东物流的其他物流服务时,key的值是eCustomerCode。长度13-14
        //cpCode为JD\JDKY\JDDJ\ZY时,value传商家编码(京东快递传商家编码,京东快运、京东大件传事业部编码);cpCode是非京东物流的其他物流服务时,value传下运单时无界电子面单店铺的vendorid或vendorcode。长度1-30
        HashMap<String, String> map = new HashMap<>();
        map.put("ewCustomerCode",customerCode);
        dto.setParameters(map);
        dto.setObjectId(UUID.randomUUID().toString());

        request.setPullDataReqDTO(dto);
        LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(appKey, AppSecret,accessToken);
        request.addLopPlugin(lopPlugin);
        PullDataRespDTO result = null;


        System.out.println("查询组装报文数据的请求参数");
        //{"cpCode":"JD","objectId":"f129ee85-e66f-4661-8bce-704ac80274c9","parameters":{"eCustomerCode":"028K2335278"},"wayBillInfos":[{"jdWayBillCode":"JDVD06181125116"}]}
        System.out.println(JSON.toJSONString(dto));

        PullDataServicePullDataLopResponse response=null;
        try {
            response = client.execute(request);
            System.out.println("获取打印数据,返回code:"+response.getCode());
            System.out.println(JSON.toJSONString(response));
        } catch (Exception e) {
            throw new XBException(3000,e.getMessage());
        }
        return response;

    }

根据他的文档需要的参数类型进行创建即可,然后发送请求。

完成这一步之后就剩最后一步了,组装报文发送给我们刚刚安装的京东打印组件就好了,

这里我是这样做的,在后端组装好报文数据,然后发送给前端,在前端通过websocket与打印组件建立通信,然后发送json数据给他即可:

以下是后端组装报文数据的代码:

 @GetMapping("printPullData")
    public Result printPullData(String trackingNumber,HttpServletRequest request){
        //获取给云打印的打印数据
        PullDataServicePullDataLopResponse pullDataDto = JDUtil.getPullData(trackingNumber);
        //组装发送给打印组件的数据
        //京东快递打印模版uri:https://template-content.jd.com/template-oss?tempCode=jdkd76x105
        JDPullDataDto jdPullDataDto = new JDPullDataDto();
        jdPullDataDto.setOrderType("PRINT");
        jdPullDataDto.setKey(UUID.randomUUID().toString());

        HashMap<String, Object> hashMap = new HashMap<>();
        System.out.println("获取的打印数据");
        hashMap.put("tempUrl","https://template-content.jd.com/template-oss?tempCode=jdkd76x105");

        System.out.println("A");
        System.out.println(JSON.toJSONString(pullDataDto.getResult().getPrePrintDatas()));

        String perPrintData = pullDataDto.getResult().getPrePrintDatas().get(0).getPerPrintData();
        ArrayList<String> strings = new ArrayList<>(1);
        strings.add(perPrintData);
        hashMap.put("printData",strings);
        jdPullDataDto.setParameters(hashMap);
       
        return Result.success(jdPullDataDto);
    }

前端与组件通信:

       layer.confirm(s+",是否打印快递单?", {icon: 3, offset:'50px',},
                                function(){
                                    $.getJSON("${pageContext.request.contextPath}/facilityDetailInfo/printPullData", {
                                        trackingNumber: res.data,
                                    }, (res) => {
                                        if (res.code == 200) {
                                            var pullData = res.data;
                                            console.log("pullData", pullData);

                                            // 替换为服务器的实际 IP 地址
                                            const socket = new WebSocket('ws://127.0.0.1:9113');

                                            socket.onopen = function(event) {
                                                console.log("WebSocket 连接成功,开始发送消息");
                                                // 发送消息到服务器,确保pullData为字符串类型
                                                socket.send(JSON.stringify(pullData));
                                            };

                                            // 当接收到服务器的消息时执行的回调函数
                                            socket.onmessage = function(event) {
                                                console.log("打印组件回复的消息", event.data);

                                                // 根据业务需求处理接收到的消息后关闭连接
                                                socket.close();
                                            };

                                            socket.onerror = function(event) {
                                                console.error("WebSocket 连接出现错误", event);
                                            };

                                            socket.onclose = function(event) {
                                                console.log("WebSocket 连接已关闭", event);
                                            };

                                        } else {
                                            alert(res.message);
                                        }
                                        setTimeout(()=>{
                                            location.reload();
                                        },10000)
                                    });
                                }, function(){
                                    location.reload();
                                });

因为我的电脑没有打印机,所有默认打印行为是pdf,输出如下:

完结。

万水千山总是情,老板给分行不行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

录屏选区指南,优选3款支持区域录制的录屏软件!

在数字内容创作和分享的时代&#xff0c;录屏软件成为了游戏玩家、教育工作者和视频博主的重要工具。无论是想要捕捉精彩的游戏瞬间&#xff0c;还是制作教学视频&#xff0c;选择正确的录屏区域都是确保内容质量和观众体验的关键。然而&#xff0c;面对市面上众多的录屏软件&a…

HDFS回收站-删除策略详解

HDFS拥有回收站的功能,将某一段时间的删除的数据,放到指定路径(/user/{username}/.Trash),至少保留指定的时间,然后一起删除。 现实中发现回收站里有该删除的却没有删除,和回收站原理逻辑对不上。 以下从源码上看看到底是什么原因导致的。 背景 某HDFS集群指定数据保留…

Docusign Maestro:智能自动化,实现无缝协作,让签约更简单!

作为 Docusign IAM 引擎的核心部分&#xff0c;Maestro 能够帮助你自动化、定制并连接你的协议工作流程。你可以完全按照自己的需求&#xff0c;定制每一个流程细节。无论是什么类型的协议&#xff0c;Maestro 都能减少繁琐的手动操作&#xff0c;让最终用户更快、更轻松地完成…

springboot网上商品订单转手系统论文源码调试讲解

第2章 开发环境与技术 开发网上商品订单转手系统需要搭建编程的环境&#xff0c;也需要通过调查&#xff0c;对各个相关技术进行分析&#xff0c;选取适合本系统开发的技术与工具。 2.1 MYSQL数据库 题目确定了是一个应用程序之后&#xff0c;就开始按部就班的进行设计与分析…

7个超有意思的网站,值得收藏起来慢慢用

分享7个超有意思的网站&#xff0c;绝对让你意想不到&#xff01; 1、动漫捏脸 Picrew&#xff5c;つくってあそべる画像メーカー 一个超有趣的二次元动漫捏脸网站&#xff0c;你可以随意制作自己喜欢的各种动漫形象、头像等画作&#xff0c;搭配B站教程食用更佳哦~ 搭配教…

全场景 真利旧 强运维!麒麟信安打造县域自主创新云办公解决方案

近年来&#xff0c;国家正大力推进信息技术自主创新&#xff0c;减少对外依赖&#xff0c;并在关键行业加速推广和应用自研技术产品。现全国乡镇以上各级党政机关积极响应国家战略指引&#xff0c;全面实施自主创新办公系统建设升级。但在升级过程中&#xff0c;却因设备架构和…

4款AI 生成 PPT的工具,帮你赶上演示文稿的新趋势!

AI 生成 PPT 最大的优势就在于它能够帮助我们提高效率。如果我们自己制作的话就需要花费大量的时间去收集资料、构思布局、设计排版。而现在&#xff0c;有了AI工具&#xff0c;一切就迎刃而解&#xff0c;如果大家需要这样的工具&#xff0c;可以看看这4款。 1、笔灵办公 直通…

网络硬盘录像机NVR程序源码海思3520D NVR 安防监控智能升级运用方案

随着安防技术的不断发展&#xff0c;传统的监控系统正逐步向智能化方向转变。海思Hi3520D作为一款高性能的网络视频处理芯片&#xff0c;在NVR&#xff08;网络视频录像机&#xff09;领域有着广泛的应用。本方案旨在探讨如何利用海思Hi3520D芯片的强大功能对现有的NVR系统进行…

软件测试需求分析有多重要?软件测评公司如何进行测试需求分析?

软件测试需求分析是指在软件测试过程中&#xff0c;对用户需求和功能需求进行深入理解和评估的过程。它主要帮助测试团队明确测试目标、制定测试策略&#xff0c;并根据需求制定测试用例。这一过程不仅提高了测试的效率&#xff0c;也降低了后续开发与测试中可能出现的问题。 …

Qt 0819作业

一、思维导图 二、字体对话框的实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_pushButton_clicked(…

ant design pro 技巧之自制复制到剪贴板组件

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的ant design pro 中用户的表单如何控制多个角色ant des…

【PyCharm安装】安装Python和PyCharm的注意事项!!!PyCharm常用的插件介绍。

安装Python的注意事项 确定所需版本&#xff1a;根据您的项目和库的要求&#xff0c;选择合适的Python版本进行安装。不同版本的Python可能支持不同的库和特性。确保网络连接&#xff1a;如果您使用的是在线安装方式&#xff0c;确保您的计算机有可靠的网络连接&#xff0c;以…

《Techporters架构搭建》-Day07 集成API文档工具

API文档化 前言API文档化历史集成Knife4j常用注解基本信息注解分组注解请求方法注解路径注解 使用示例 源码地址&#xff1a;请看day07 前言 在现代软件开发中&#xff0c;良好的API文档是团队协作和项目管理中不可或缺的一部分。OpenAPI规范&#xff08;前身为Swagger&#x…

AI绘画Stable Diffusion插件—LayerDiffusion 分层控图新突破!生成透明图片前后景图片融合,毫无违和感!

大家好&#xff0c;我是画画的小强 用AI绘画Stable Diffusion 生成透明图片怎么搞&#xff1f; 这要搁之前&#xff0c;我们需要生成完图片&#xff0c;然后放到去背景插件中调整参数去除背景&#xff01;效果一般般 如果想要在一张图片上添加主体&#xff0c;该怎么搞&#…

使用gpreftools测试性能

参考文献&#xff1a; C 性能分析工具调研_性能分析工具 gperf perf vergi 比较-CSDN博客性能测试工具CPU profiler(gperftools)的使用心得-CSDN博客gperftools使用方法和常见问题_pprof no nodes to print-CSDN博客c 分析 gperftools 总结 | Weakyon Blog 文章目录 安装使用 …

如何搭建知识库?2024年6款工具优质推荐

一、引言 在当今信息化时代&#xff0c;知识管理已成为企业提升竞争力和实现持续发展的关键。搭建一个高效、易用的知识库&#xff0c;不仅能帮助企业更好地整合和分享内部资源&#xff0c;还能提升员工的工作效率和创新能力。本文将详细介绍如何搭建知识库&#xff0c;并推荐…

制作语音数据集: 爬取B站音视频+基于whisper语音识别标注

本文以制作小学课堂音频数据集为例子 1. 搜索关键字获取音视频链接 if __name__ "__main__":with sync_playwright() as playwright:searcher BLVideoSearch(playwright, headlessTrue)url searcher.make_url(keyword["小学公开课"])searcher.run(url, …

英文科目一外国人要考中国驾照理论考试题目是什么样的

随着中国的国际化发展&#xff0c;越来越多的外国朋友选择在中国生活和工作&#xff0c;其中一些人可能会考虑在这里考取驾驶执照。然而&#xff0c;语言障碍成为了他们面临的一大挑战。一个常见的问题是科目一考试是否提供英文版本或者是否有翻译服务。本文将介绍中国车管所提…

什么是IP?

目录 简介 IP IP协议 IP地址 发展历程 IP地址类型 公有地址 私有地址 IP地址编址方式 A类IP地址 B类IP地址 C类IP地址 D类IP地址 特殊的网址 子网 超网 无类间路由 IP地址的分配 IP地址管理 手工管理模式 DHCP分配IP地址的管理模式 通过交换机管理IP 地址…

分布式ID-一窥雪花算法的原生实现问题与解决方案(CosId)

分布式ID-雪花算法的问题与方案&#xff08;CosId&#xff09; 基本原理 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url%E5%88%86%E5%B8%83%E5%BC%8FID-%E9%9B%AA%E8%8A%B1%E7%AE%9…