java———发送网络传真[通俗易懂]

java———发送网络传真[通俗易懂]目录推荐公众号服务商代码发送代码回执接口推荐公众号有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)服务商在网上兜兜转转没有找到免费的网络传真API,只好付费服务商bnetfax代码有了API后那其他的就是按照文档开发了没什么难度发送代码publicstaticvoidmain(String[]args)throwsIOException,ServiceExceptio…

大家好,又见面了,我是你们的朋友全栈君。

推荐公众号

彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
程序员探索之路

服务商

在网上兜兜转转没有找到免费的网络传真API,只好付费服务商bnetfax

代码

所需jar

链接:https://pan.baidu.com/s/11EYZ7_9nOY2eYt8urXNNsw
提取码:61un

发送代码

public static void main(String[] args) throws IOException, ServiceException { 
   
		收件人号码
        String destnumbers = "********"; 
        发送主题
        String title = "代码测试发送传真"; 
        FaxConfig faxConfig = FaxConfig.builder()
             企业账号
            .bnetaccount("********")
            密码
            .password("********")
            发送者号码
            .sendnumber("********")
            用户账号
            .useraccount("********")
            区号
            .areaid("********")
            .build();
        List<String> paths = Lists.newArrayList("test.pdf");
        FaxResultDTO faxResultDTO = sendFax(faxConfig, title, destnumbers, paths);
        log.info("faxResultDTO=[{}]", faxResultDTO);
    }

    public static FaxResultDTO sendFax(FaxConfig faxConfig, String title, String destnumbers, List<String> filePath) throws IOException, ServiceException { 
   
        Map<String, byte[]> fileBuffer = getFileBuffer(filePath);
        //生成访问Soap传真服务接口的UserTest实例
        SoapFaxClient soapFaxClient = new SoapFaxClient();
        //通过UserTest.upload()把字节大小和文件名传过去以访问Soap传真服务接口
        String xml = soapFaxClient.doSendFax(fileBuffer,
            faxConfig.getSendnumber(), title, faxConfig.getUseraccount(), faxConfig.getBnetaccount(),
            faxConfig.getPassword(), destnumbers, faxConfig.getAreaid());
        //将发送与返回的xml包分开
        String[] xmls = xml.split("@@");
// System.out.println("保存服务端返回的xml到request域中" + xmls[0]);
// System.out.println("保存客户端发送的xml到request域中" + xmls[1]);
        //xml包解析
        FaxResultDTO faxResultDTO = parseFaxResultXml(xmls[0]);
        String resultCode = faxResultDTO.getResultCode();
        String faxid = faxResultDTO.getFaxid();
        String resultdesc = faxResultDTO.getResultdesc();
        if (resultCode != null && (!"".equals(resultCode)) && (resultCode.equals("1000"))) { 
   
            log.info("faxid=[{}], success", faxid);
        } else { 
   
            log.info("resultCode:[{}],resultdesc=[{}]", resultCode, resultdesc);
        }
        faxResultDTO.setRequestXml(xmls[1]);
        faxResultDTO.setResponseXml(xmls[0]);
        return faxResultDTO;
    }

    private static FaxResultDTO parseFaxResultXml(String xml) { 
   
        ServletClass xmlParser = new ServletClass();
        String resultCode = null;
        String faxid = null;
        String hashcode = null;
        String timestamp = null;
        String resultdesc = null;
        FaxResultDTO faxResultDTO = null;
        try { 
   
            xmlParser.loadXml(xml);
            resultCode = xmlParser.getSingleNodeValue("resultcode");
            faxid = xmlParser.getSingleNodeValue("faxid");
            hashcode = xmlParser.getSingleNodeValue("hashcode");
            timestamp = xmlParser.getSingleNodeValue("timestamp");
            resultdesc = xmlParser.getSingleNodeValue("resultdesc");
            faxResultDTO = new FaxResultDTO(resultCode, faxid, hashcode, timestamp, resultdesc);
        } catch (Exception e) { 
   
            log.error("解析fax-result-xml失败", e);
            e.printStackTrace();
        }
        return faxResultDTO;
    }
    
	/** * 返回 key=文件名 value=文件byte数组 * @param path * @return * @throws IOException */
    private static Map<String, byte[]> getFileBuffer(List<String> path) throws IOException { 
   
        Map<String, byte[]> map = Maps.newHashMap();
        path.forEach(p -> { 
   
            File file1 = new File(p);
            FileInputStream fileInputStream = null;
            try { 
   
                fileInputStream = new FileInputStream(file1);
                String filename = file1.getName();
                //获取文件大小
                int filelength = Integer.valueOf(String.valueOf(file1.length()));
                //字节大小
                byte[] buffer = new byte[filelength];
                InputStream streamIn1 = fileInputStream;
                streamIn1.read(buffer);
                streamIn1.close();
                map.put(filename, buffer);
            } catch (FileNotFoundException e) { 
   
                e.printStackTrace();
            } catch (IOException e) { 
   
                e.printStackTrace();
            }
        });
        return map;
    }
    客户端请求发送传真件接口
    public String doSendFax(Map<String, byte[]> fileBuffer,
                         String sendnumber, String title, String useraccount, String bnetaccount, String password,
                         String destnumbers, String areaid) throws ServiceException, RemoteException { 
   

        设置请求访问Soap网络传真接口的url
        String endPoint = "*****************";
        String xml = null;
        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setTargetEndpointAddress(endPoint);
        设置请求访问的url及接口名称
        call.setOperationName(new QName(endPoint, "SendFax"));
        获取附件
        Map<String, Object> fileNamesAndObjects = getFileNamesAndObjects(fileBuffer);
        String[] filename = (String[]) fileNamesAndObjects.get("name");
        Object[] objects = (Object[]) fileNamesAndObjects.get("object");
        MD5 md5 = new MD5();
        MD5加密password
        password = MDES.encrypt(password);
        final String KEY = "*******";
        获取系统时间戳
        long timestamp = System.currentTimeMillis();
        生成哈希码 Md5(useraccount + timestamp + KEY)
        StringBuilder inbuf = new StringBuilder(useraccount)
            .append(bnetaccount)
            .append(timestamp)
            .append(KEY);
        String hashcode = md5.getMD5ofStr(inbuf.toString());
        StringBuffer xmlstring = new StringBuffer(
            "<?xml version=\"1.0\" encoding=\"GB2312\" ?>")
            .append("\n<root>")
            .append("\n<useraccount>" + useraccount + "</useraccount>")
            .append("\n<bnetaccount>" + bnetaccount + "</bnetaccount>")
            .append("\n<areaid>" + areaid + "</areaid>")
            .append("\n<password>" + password + "</password>")
            .append("\n<destnumbers>" + destnumbers + "</destnumbers>")
            .append("\n<sender>" + sendnumber + "</sender>")
            .append("\n<title>" + title + "</title>")
// xmlstring.append("\n<piclevel>" + piclevel + "</piclevel>");
            .append("\n<timestamp>" + timestamp + "</timestamp>")
            .append("\n<hashcode>" + hashcode + "</hashcode>")
            .append("\n<fifle>" + filename[0] + "," + filename[1] + ","
                + filename[2] + "," + filename[3] + "," + filename[4] + "," + filename[5]
                + "," + filename[6] + "," + filename[7] + "," + filename[8] + ","
                + filename[9] + "</fifle>")
            .append("\n<file>" + 1 + "</file>")
            .append("\n</root>");
        log.info("FAX-发送xmL:[{}]", xmlstring.toString());
        客户端调用Soap传真服务发送传真件接口
        objects[0] = xmlstring.toString();
        xml = (String) call.invoke(objects);
        xml += "@@" + xmlstring.toString();
        return xml;
    }

    private static Map<String, Object> getFileNamesAndObjects(Map<String, byte[]> fileBuffer) { 
   
        Map<String, Object> map = new HashMap<>();
        String[] filename = new String[]{ 
   "", "", "", "", "", "", "", "", "", ""};
        Object[] objects = new Object[]{ 
   "", new byte[0], new byte[0], new byte[0], new byte[0], new byte[0], new byte[0], new byte[0], new byte[0], new byte[0], new byte[0]};
        int i = 0;
        for (Map.Entry<String, byte[]> entry : fileBuffer.entrySet()) { 
   
            String key = entry.getKey();
            byte[] value = entry.getValue();
            filename[i] = key;
            objects[i + 1] = value;
            ++i;
        }
        map.put("name", filename);
        map.put("object", objects);
        return map;
    }

返回成功报文

<root>
<faxid>***********</faxid>
<resultcode>1000</resultcode>
<resultdesc>传输正常</resultdesc>
<timestamp>************</timestamp>
<hashcode>**********</hashcode>
</root>

回执接口

客户端请求查询传真回执接口
    public String queryFaxResult(String faxId) { 
   
        设置请求访问Soap网络传真接口的url
        String endPoint = "*************";
        Call call = null;
        String xml = null;
        try { 
   
            Service service = new Service();
            call = (Call) service.createCall();
            call.setTargetEndpointAddress(endPoint);
            设置请求访问的url及接口名称
            call.setOperationName(new QName(endPoint, "queryFaxResult"));

            MD5 md5 = new MD5();
            final String KEY = "**********";
            获取系统时间戳
            long timestamp = System.currentTimeMillis();
            生成哈希码 Md5(faxid + timestamp + KEY)
            String hashcode = md5.getMD5ofStr(faxId + timestamp + KEY);

            StringBuffer xmlstring = new StringBuffer(
                "<?xml version=\"1.0\" encoding=\"GB2312\" ?>");
            xmlstring.append("\n<root>");
            xmlstring.append("\n<faxid>" + faxId + "</faxid>");
            xmlstring.append("\n<timestamp>" + timestamp + "</timestamp>");
            xmlstring.append("\n<hashcode>" + hashcode + "</hashcode>");
            xmlstring.append("\n</root>");
            //System.out.println("\n发送的XML:\n"+xmlstring.toString());

            //客户端调用Soap传真服务查询传真回执接口
            xml = (String) call.invoke(new Object[]{ 
   xmlstring.toString()});

            //为了同时返回发送和返回的xml包,将两个包用“@@”连接
            xml += "@@" + xmlstring.toString();

        } catch (Exception ex) { 
   
            ex.printStackTrace();
            System.out.println("打印错误:\n" + ex.toString());
        }
        return xml;
    }

回执接口返回报文

<root>
<xmlresult>
<flag>N</flag>
<desc></desc>
<times></times>
<caller></caller>
</xmlresult>
<resultcode>1000</resultcode>
<resultdesc>结果:总共需发送号码1个,已发送0个,未发送1</resultdesc>
<hashcode>**************</hashcode>
<timestamp>*************</timestamp>
</root>@@<?xml version="1.0" encoding="GB2312" ?>
<root>
<faxid>********************</faxid>
<timestamp>*********</timestamp>
<hashcode>*************</hashcode>
</root>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153403.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • App测试面试题_软件测试算法面试题汇总

    App测试面试题_软件测试算法面试题汇总1.Web端测试和App端测试有何不同(常见)系统结构方面Web项目,b/s架构,基于浏览器的;Web测试只要更新了服务器端,客户端就会同步会更新;App项目,c/s结构的,必须要有客户端;App修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍;兼容方面Web项目:a.浏览器(火狐、谷歌、IE等)b.操作系统(Windows7、Windows10、Linux等)App项目:a.设备系统:iOS(ipad、iphone)、Android(三星、华为、联想等)、

    2022年8月29日
    7
  • mysql 按位取反_按位与,按位异或,按位取反「建议收藏」

    mysql 按位取反_按位与,按位异或,按位取反「建议收藏」**&按位与,相同的不变,否则都算成0|按位或,^按位异或,不相同的都算成1**PHP按位与或(^、&)运算也是很常用的逻辑判断类型,有许多的PHP新手们或许对此并不太熟悉,今天结合一些代码对PHP与或运算做些介绍,先说明下,在PHP中,按位与主要是对二进制数操作:$a=1;$b=2;$c=$a^b;echo$c//3?>十进制1换算成二进制为:0…

    2022年8月14日
    8
  • 云计算具有什么平台_如何搭建自己的云计算平台?「建议收藏」

    如果你的服务器很多,或者你的钱多了烧,可以考虑搭建自己的云计算平台。下面是一些开源的云计算框架和工具1.Enomalism(https://www.enomaly.com/)云计算平台。Enomalism是一个开放源代码项目,它提供了一个功能类似于EC2的云计算框架。Enomalism基于Linux,同时支持Xen和KernelVirtualMachine(KVM)。En…

    2022年4月17日
    89
  • 新手到黑客的最全入门路径图(附全部学习资料下载)!

    新手到黑客的最全入门路径图(附全部学习资料下载)!点击上方“程序人生”,选择“置顶公众号”第一时间关注程序猿(媛)身边的故事01入门介绍说到黑客,大家可能觉得很神秘,其实狭义上的黑客就是去寻找网站、系统、软件等漏洞,刚入门的黑客大部分从事渗透工作,而渗透大部分属于web安全方向,就是利用漏洞来取得一些数据或达到控制,让对方程序崩溃等效果。02一些常用的名词解释挖洞的话,就相当于在程序中查找漏洞,举一个不大恰当但容易理解的比喻,就像韩非子说所的那个

    2022年6月11日
    38
  • bzoj1717[Usaco2006 Dec]Milk Patterns 产奶的模式*「建议收藏」

    bzoj1717[Usaco2006 Dec]Milk Patterns 产奶的模式*

    2022年2月22日
    47
  • CodeLf–代码变量命名神器

    CodeLf–代码变量命名神器一、CODELF是什么?Codelf通过搜索在线开源平台Github,Bitbucket,GoogleCode,Codeplex,Sourceforge,FedoraProject的项目源码,帮开发者从中找出已有的匹配关键字的变量名,从而帮助开发者命名变量。二、如何使用CODELF?在线地址:https://unbug.github.io/codelf/如图所示:目前,Code

    2022年6月4日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号