探究对接支付API时,相遇获取文件的绝对路径

问题概述?

最近呢在公司做项目对接了某宝的支付转账功能,不过现在对接确实比之前方便了好多,可以直接引用SDK的Maven依赖的方式,然后再根据官方文档的Demo拿过来直接就可以使用,但是呢,需求是可能后面陆续会有多个APPID账号来发起支付操作,所以代码就不能写的太死板,思量了一番之后决定可以使用策略+模板方法 + BeanFactory工厂等组合设计模式。

为啥使用(策略+模板方法 + BeanFactory)?

首先通过分析接口文档,对于开发者来说就是一个,就是只是存在付款主体不同而已,其他请求接口照旧执行,但是总不能每次新增一个付款主体,都改下原来的接口或者就是通过If条件句来判断,这种实行起来虽然可以,就是太low了,想要代码高大上而且效率高,就需要提升代码编码能力,且还需满足高内聚、低耦合以及开闭原则(开:扩展性开放;闭:修改关闭)。

步入主题

  • 代码如下:
tring privateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->";CertAlipayRequest alipayConfig = new CertAlipayRequest();alipayConfig.setPrivateKey(privateKey);alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");alipayConfig.setCharset("UTF8");alipayConfig.setSignType("RSA2");alipayConfig.setEncryptor("");alipayConfig.setFormat("json");alipayConfig.setCertContent("<-- 请填写您的应用公钥证书内容字符串 -->");alipayConfig.setAlipayPublicCertContent("<-- 请填写您的支付宝公钥证书内容字符串 -->");alipayConfig.setRootCertContent("<-- 请填写您的支付宝根证书内容字符串 -->");AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);

看上边代码有什么想说的(没啥说的其实,准备好请求参数直接调用API就完事了),然而该接口要求必须采用公钥证书模式进行加签,所以就引出了我写这篇文档的由来(获取文件的绝对路径)。

项目中获取文件的绝对路径可采用如下方式:

  • 以类加载方式
 // 获取绝对路径String absolutePath = this.getClass().getResource("/").getPath();String certAbsolutePath = absolutePath + "/alipayRootCert.crt";alipayConfig.setRootCertContent(certAbsolutePath);//咦,本地运行通过咯,binggou完事 ,唉 这么简单?继续往下看哦
  • 以ClassPathResource方式
// 获取绝对路径String certAbsolutePath = new ClassPathResource("/wsy/alipayRootCert.crt").getFile().getAbsolutePath();//咦,本地运行通过咯,但是 linux服务器上不行 会报java.io.FileNotFoundException // 哈哈嗨 一直都是本地可以 linux服务器上就跑不起来么,看来还得找解决方案
  • 错误日志贴上
[支付宝CA根证书文件路径加载失败!] 失败原因:class path resource [wsy/alipayRootCert.crt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/data/project/and url/tc-gateway-alipay.jar!/alipayRootCert.crt
  • 原因:

在项目构建的时候Maven插件会把resource下的文件copy过去之后,然后再打成jar包(通过JUI反编译之后文件是存在的),但绝对路径无法获取。

  • 解决方案

因此可以考虑在当前项目下创建一个文件夹,然后加载Jar中的resource资源,以InputStream流写入创建好的文件路径(Apache 下的FileUtils.copyToFile(final InputStream source, final File destination)),然后再获取file的绝对路径,此时该文件在服务器是如实存在的,代码如下:

// 支付宝CA根证书文件路径try {// TODO获取当前项目环境路径String sysAbsPath  = System.getProperty("user.dir");// 获取资源流ClassPathResource resource = new ClassPathResource("/alipayRootCert.crt");// 根据绝对路径 创建FileFile aliPayRkFile = new File(sysAbsPath + "/alipayRootCert.crt");// 将InputSteam写入File中FileUtils.copyToFile(resource.getInputStream(), aliPayRkFile);// 最后再获取文件的绝对路径this.aliPayRootCrtAbsolutePath = aliPayRkFile.getAbsolutePath();log.info("支付宝CA根证书文件加载完毕 路径:{}", aliPayRootCrtAbsolutePath);} catch (Exception e) {log.error("[支付宝CA根证书文件路径加载失败!] 失败原因:{}", e.getMessage());}
  • 针对探究问题进行总结

对于Jar中文件资源,想要获取Jar中文件的绝对路径,需先在(Windows|Linux)创建一份,相当于Copy,然后就能得到文件的绝对路径。

聊下用到的设计模式

  • 策略+模板方法 + BeanFactory

    • 结合Spring 自定义策略Bean
    • 模板方法 进行抽象剥离 以及实现
    • BeanFactory工程,AlipayClient由Spring进行管理

ENDING

你能看到此处,说明咱们遇到了相同的问题,上边就是问题提的解决方案,希望对你有所帮助,同时也帮忙进行点赞和转发哦!3Q
Come 的喂, ABC! 哈哈哈

探究对接支付API时,相遇获取文件的绝对路径相关推荐

  1. 如何获取文件的完整路径?

    有没有一种简单的方法可以打印file.txt的完整路径? file.txt = /nfs/an/disks/jj/home/dir/file.txt <command> dir> & ...

  2. python获取绝对路径_python3中获取文件当前绝对路径的两种方法

    方法1: import sys print(sys.argv) 得到文件当前绝对路径字符串的一个列表 ['D:/pycharm/PracticeProject/ClientServerNetworki ...

  3. 解决IE8上传文件时javascript取文件的本地路径的问题C:\fakepath\..

    IE8上传文件时javascript读取文件的本地路径的问题("C:\fakepath\")的解决方案 前一阵把IE6升级到了IE8,没想到一个网站里面的上传图片时用JavaScr ...

  4. Android 打开文件管理器 获取文件的真实路径

    1. onCreate 部分 public class MainActivity extends AppCompatActivity { Button btn; @Override protected ...

  5. bat获取文件名称和路径的方法

    在文件夹下新建一个txt文件 在txt文件里写入:dir/s/b > 1.txt [若指定文件类型,如pkl文件,则写入:dir *.pkl/s/b > 1.txt 把这个txt文件另存为 ...

  6. Antd的Upload组件上传文件控制文件数量、格式等,以及提交时如何获取文件

    背景:使用React的antd组件的Upload(官网),要求文件上传后,在点击提交时再将文件传过去. 技术点: 完全控制的文件上传. 可控制上传数量. 控制文件格式. 移除时的事件onRemove. ...

  7. 如何获取文件的绝对路径

    我们写代码时常常会碰到需要用到获取文件的路径的时候,但是总不能直接赋值,如果文件换了位置那路径也需 要自己手动去修改,操作不够方便.在C++中并没有类似功能的封装好的函数提供,所以需要我们自己去写一个 ...

  8. 定时发布任务,在global.asax中获取文件的物理路径的方法

    如果要把一个相对路径或者虚拟路径映射道服务器的物理路径,通常会使用Server.MapPath()函数,比如将根目录下的html目录映射为物理路径:Server.MapPath("html& ...

  9. python获取文件的绝对路径

    在测试过程中,通常需要读取文件或写入文件,当要读写的文件和当前文件不在同一目录时,用相对路径经常会报找不到文件的错误.所以为了解决这个问题,我们通常在读写文件时,使用绝对路径. 但是文件路径写为绝对路 ...

最新文章

  1. MySQL—【加餐1】高效查询方法
  2. 【转】String.format详解
  3. drbd(三):drbd的状态说明
  4. Web前端开发工程师必读de设计博客
  5. linux 连个文件都删除不了,什么鬼!
  6. “软下来”的苹果和小米能否拯救智能手机的焦虑? | 畅言
  7. 自定义tableView的section header/footerView时的view复用问题
  8. wps直接打开CVS文件会把长串数字订单号最后4位变为0
  9. centos nginx php_Centos7下NGINX+PHP的安装及配置
  10. Form嵌入到Panel里(C#)
  11. java 电子签章_PDF开发+电子签章,如何实现真正地脱离硬件的无纸化办公体验(实战篇)?...
  12. arcgis怎么压缩tif文件_PDF文件怎么压缩?这个方法千万别错过了!
  13. scratch好书推荐
  14. ubuntu使用cmake编译coffe
  15. 明明有 Windows 11,为什么还要用国产操作系统?
  16. 啥是map啥是reduce
  17. 吉林大学计算机李昕,本报新聘百名特约教工通讯员
  18. 网站URL网址末尾是否应该使用反斜杠
  19. 开通共享毛巾机小程序
  20. java帮助文档在哪

热门文章

  1. java写龟兔赛跑_Java实现龟兔赛跑
  2. 六个核桃,难逃轮回宿命
  3. linux 进程管理相关命令
  4. 灰犀牛之2017年8月21日,四川九寨沟发生7.0级地震
  5. Overleaf 中引用中文参考文献
  6. 浪潮服务器5112面板灯_浪潮英信服务器SA5112M5
  7. ubuntu配置java环境jdk
  8. Django Model各种操作 Meta 常用字段 一对多操作 多对对操作 F Q查询 聚合函数
  9. 电商产品数据集之分析
  10. RFID医疗资产管理解决方案-RFID电子标签-RFID固定资产管理-新导智能