在线支付系列【18】微信支付实战篇之集成账单相关API
有道无术,术尚可求,有术无道,止于术。
文章目录
- 申请交易账单
- 申请资金账单
- 下载账单
申请交易账单
微信申请交易账单API
微信支付按天提供交易账单文件,商户可以通过该接口获取账单文件的下载地址。文件内包含交易相关的金额、时间、营销等信息,供商户核对订单、退款、银行到账等情况。
首先在WechatPayNativeApiEnum
枚举类添加申请交易账单接口地址:
TRADE_BILLS("https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=%s&account_type=%s&tar_type=%s", "申请交易账单"),
微信服务类添加申请交易账单逻辑处理方法:
/*** 申请交易账单API** @param billDate 账单日期 格式yyyy-MM-dd 仅支持三个月内的账单下载申请。 示例值:2019-06-11* @param billType 账单类型 不填则默认是ALL* 枚举值:* ALL:返回当日所有订单信息(不含充值退款订单)* SUCCESS:返回当日成功支付的订单(不含充值退款订单)* REFUND:返回当日退款订单(不含充值退款订单)* @param tarType 压缩类型 不填则默认是数据流 枚举值: GZIP:返回格式为.gzip的压缩包账单 示例值:GZIP*/String getTransactionBill(String billDate, String billType, String tarType) throws Exception;@Overridepublic String getTransactionBill(String billDate, String billType, String tarType) throws Exception {// 1. 创建请求对象HttpGet httpGet = new HttpGet(String.format(WechatPayNativeApiEnum.TRADE_BILLS.getAddress(), billDate, billType, tarType));httpGet.addHeader("Accept", "application/json");CloseableHttpResponse response = httpClient.execute(httpGet);String bodyAsString = EntityUtils.toString(response.getEntity());int statusCode = response.getStatusLine().getStatusCode();if (statusCode == 200 || statusCode == 204) {log.info("申请账单成功, 返回结果:" + bodyAsString);// 2. 解析获取账单下载地址Map<String, String> resultMap = objectMapper.readValue(bodyAsString, Map.class);return resultMap.get("download_url");} else {throw new RuntimeException("申请账单异常, 响应码:" + statusCode);}}
添加访问接口:
@Operation(summary = "申请交易账单")@PostMapping("/applyTransactionBill")public String applyTransactionBill() throws Exception {return wechatPayService.getTransactionBill("2023-02-03","BASIC","GZIP");}
访问接口,成功返回下载地址:
申请资金账单
微信申请资金账单API
微信支付按天提供微信支付账户的资金流水账单文件,商户可以通过该接口获取账单文件的下载地址。文件内包含该账户资金操作相关的业务单号、收支金额、记账时间等信息,供商户进行核对。
首先在WechatPayNativeApiEnum
枚举类添加申请资金账单接口地址:
FUND_FLOW_BILLS("https://api.mch.weixin.qq.com/v3/bill/fundflowbill?bill_date=%s&bill_type=%s&tar_type=%s", "申请资金账单");
微信服务类添加申请资金账单逻辑处理方法:
/*** 申请资金账单API* @param billDate 账单日期 格式yyyy-MM-dd 仅支持三个月内的账单下载申请。 示例值:2019-06-11* @param accountType 资金账户类型 不填则默认是BASIC 枚举值:BASIC:基本账户 OPERATION:运营账户 FEES:手续费账户* @param tarType 压缩类型 不填则默认是数据流 枚举值: GZIP:返回格式为.gzip的压缩包账单 示例值:GZIP*/String getCapitalBill(String billDate, String accountType, String tarType) throws Exception;@Overridepublic String getCapitalBill(String billDate, String accountType, String tarType) throws Exception {// 1. 创建请求对象HttpGet httpGet = new HttpGet(String.format(WechatPayNativeApiEnum.FUND_FLOW_BILLS.getAddress(), billDate, accountType, tarType));httpGet.addHeader("Accept", "application/json");CloseableHttpResponse response = httpClient.execute(httpGet);String bodyAsString = EntityUtils.toString(response.getEntity());int statusCode = response.getStatusLine().getStatusCode();if (statusCode == 200 || statusCode == 204) {log.info("申请账单成功, 返回结果:" + bodyAsString);// 2. 解析获取账单下载地址Map<String, String> resultMap = objectMapper.readValue(bodyAsString, Map.class);return resultMap.get("download_url");} else {throw new RuntimeException("申请账单异常, 响应码:" + statusCode);}}
添加访问接口:
@Operation(summary = "申请资金账单")@PostMapping("/applyCapitalBill")public String applyCapitalBill() throws Exception {return wechatPayService.getCapitalBill("2023-02-03","BASIC","GZIP");}
访问接口,成功返回下载地址:
下载账单
下载账单API为通用接口,交易/资金账单都可以通过该接口获取到对应的账单。
微信服务类添加下载账单逻辑处理方法:
/*** 下载账单文件** @param downloadUrl 下载链接*/void downloadBill(String downloadUrl) throws Exception;@Overridepublic void downloadBill(String downloadUrl) throws Exception {// 1. 创建请求对象HttpGet httpGet = new HttpGet(downloadUrl);httpGet.addHeader("Accept", "application/json");// 设置一个空的应答签名验证器~ PS:下载账单时,微信没给应答签名,如果还验签会报错PrivateKey merchantPrivateKey = MchPrivateKeyUtils.loadPrivateKeyByPath(wechatPayProperties.getPrivateKeyPath());CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create().withMerchant(wechatPayProperties.getMerchantId(),wechatPayProperties.getMerchantSerialNumber(),merchantPrivateKey).withValidator(response -> true).build();// 2. 执行CloseableHttpResponse response = httpClient.execute(httpGet);int statusCode = response.getStatusLine().getStatusCode();if (statusCode == 200 || statusCode == 204) {// 3. 本地存放byte[] bytes = EntityUtils.toByteArray(response.getEntity());String path = "D:\\Users\\Downloads\\";fileToBytes(bytes,path,"aaa.zip");log.info("下载账单成功");} else {throw new RuntimeException("下载账单异常, 响应码 : " + statusCode);}}/*** 将Byte数组转换成文件* @param bytes byte数组* @param filePath 文件路径 如 D:\\Users\\Downloads\\* @param fileName 文件名*/public static void fileToBytes(byte[] bytes, String filePath, String fileName) {BufferedOutputStream bos = null;FileOutputStream fos = null;File file = null;try {file = new File(filePath + fileName);if (!file.getParentFile().exists()){//文件夹不存在 生成file.getParentFile().mkdirs();}fos = new FileOutputStream(file);bos = new BufferedOutputStream(fos);bos.write(bytes);} catch (Exception e) {e.printStackTrace();} finally {if (bos != null) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
添加访问接口:
@Operation(summary = "下载账单")@GetMapping("/downloadBill")public R<?> downloadBill(String downloadUrl) throws Exception {wechatPayService.downloadBill(downloadUrl);return R.success() ;}
先访问申请账号接口,然后访问下载账单接口,查看账单文件,实际开发时,可以转为更方便查看的文件,比如 Execl
。
在线支付系列【18】微信支付实战篇之集成账单相关API相关推荐
- 微信支付-vue 实现微信支付-前端篇
微信支付系列文章 微信支付-java后端实现 微信支付-vue 前端实现 vue demo: 下载地址文章底部 技术栈 vue vue-cli weixin-js-sdk (微信jsSdk) 微信支付 ...
- 微信支付-java实现微信支付-后端篇
微信支付系列文章 微信支付-java后端实现 微信支付-vue 前端实现 java demo: 下载地址文章底部 技术栈 Spring boot java XML (微信在http协议中数据传输方案) ...
- 在线支付系列【22】微信支付实战篇之集成服务商API
有道无术,术尚可求,有术无道,止于术. 文章目录 前言 1. 环境搭建 2. 特约商户进件 3. 统一下单 总结 前言 在上篇文档中,我们做好了接入前准备工作,接下来使用开源框架集成服务商相关API. ...
- java微信支付v3系列——6.微信支付查询订单API
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——1.微信支付准备工作
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——7.微信支付之申请退款
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——8.微信支付之退款成功回调
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——5.微信支付成功回调
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- 微信jsapi支付获取code_微信支付 第一篇 JSAPI 支付配置与获取 OpenID
开通微信支付支付产品 首先要在微信支付申请成为 微信支付商户. 选择开通具体的支付产品 成为微信支付商户后在管理后台选择微信支付中的具体支付产品并申请开通如 JSAPI . 将支付商户与公众号关联 这 ...
最新文章
- 第五周周记(国庆第五天)
- 一篇文章带你搞定Python返回函数
- 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应
- linux安装xgboost快速高效方法
- django和mysql如何建模_Django如何设计数据模型
- [原][osg]Geometry详解
- 《南溪的目标检测学习笔记》——图像预处理的学习笔记
- aix c语言 构造函数,错误:命名构造函数,而不是类型。使用g++4.6.1进行编译
- 查看和修改mysql最大连接数
- Java -- 新IO -- 目录
- AndroidStudio测试用例合集(一)
- 511遇见易语言教程API模块制作cmd复制文件
- jQ实现简单放大镜效果
- kylo添加登录权限module
- OpenCV实现单目摄像头对图像目标测距
- 如果你在做安利或者认识做安利的人
- 分布式电商项目十四:Vue前端框架简介及使用
- 练习STM32动态更改PWM波频率和占空比
- 计算错误可以用计算机ac,计算器AC是什么键?
- echarts生成图表的简单使用
热门文章
- vue 和 uniapp 的密码框小眼睛(通用)
- 太阁V DX 特殊结局 历史创造者
- 计算机丢失d3dx9_25,win10系统安装帝国时代提示3d3dx9_25.dll丢失的设置步骤
- Modbus和Modbus/TCP协议
- 基于Windows server 2003 的DNS服务器的搭建
- 快速上手!华为帐号服务Authorization Code模式接入详解
- 世界上最经典的感情短语
- TS结构解析(详细的PAT和PMT解析代码)
- (原创)[短小精悍系列]为什么生活中黄色物品给人感觉较亮,而蓝色物品给人感觉较深?其实你只看到了表象
- JQuery 实现自定义 toast