利用微信官方文档下载微信对账单、资金账单
1.在pom文件里面添加依赖
<dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version></dependency><!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.2</version></dependency>
2.重写config—关于config中的各种id、参数等,需要自行去微信后台上去找和设置
import com.github.wxpay.sdk.WXPayConfig;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class MyConfig implements WXPayConfig {private byte[] certData;public MyConfig() throws Exception {//证书String certPath = "D:\\svn\\quickpassroot\\quick-pass-service\\quick-pass-core\\src\\main\\resources\\file\\apiclient_cert.p12";File file = new File(certPath);InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();}//appidpublic String getAppID() {return "*******";}//商户号public String getMchID() {return "******";}//keypublic String getKey() {return "*******";}public InputStream getCertStream() {ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);return certBis;}public int getHttpConnectTimeoutMs() {return 8000;}public int getHttpReadTimeoutMs() {return 10000;}
}
3.DO
(1)对账单
public class WeChatBillDO implements Serializable {private Integer id;/*** 交易时间*/private String tradeTime;/*** 公众账号ID*/private String appId;/*** 商户号*/private String mchId;/*** 子商户号*/private String mchAppId;/*** 设备号*/private String deviceInfo;/*** 微信订单号*/private String transactionId;/*** 商户订单号*/private String outTradeNo;/*** 用户标识*/private String openId;/*** 交易类型*/private String tradeType;/*** 交易状态*/private String tradeStatus;/*** 付款银行*/private String payBank;/*** 货币种类*/private String moneyType;/*** 应结订单金额*/private String orderPay;/*** 代金劵金额*/private String voucherAmount;/*** 微信退款单号*/private String refundNumber;/*** 商户退款单号*/private String outRefundNo;/*** 退款金额*/private String refundAmount;/*** 充值劵退款金额*/private String refundAmountVoucher;/*** 退款类型*/private String refundsType;/*** 退款状态*/private String refundsStatus;/*** 商品名称*/private String commodityName;/*** 商户数据包*/private String dataPacket;/*** 手续费*/private String serviceCharge;/*** 费率*/private String rate;/*** 订单金额*/private String orderAmount;/*** 申请退款金额*/private String applicationRefundAmount;/*** 费率备注*/private String rateNotes;
(2)资金账单
public class WeChatCapitalBillDO implements Serializable {private Integer id;/*** 记账时间*/private String tradeTime;/*** 微信支付业务单号*/private String paymentNumber;/*** 资金流水单号*/private String flowNumber;/*** 业务名称*/private String businessName;/*** 业务类型*/private String businessType;/*** 收支类型*/private String inoutType;/*** 收支金额(元)*/private String inoutMoney;/*** 帐户结余(元)*/private String accountBalance;/*** 资金变更提交申请人*/private String applicant;/*** 备注*/private String remarks;/*** 业务凭证号*/private String voucherNumber;
4.下载资金账单,这个maven中没有提供方法,但是微信官方api文档中写了有,所以,重写了maven中的WXPay.java(就是复制一份到自己想买的目录中),添加下载资金账单的方法
public Map<String, String> downloadfundflow(Map<String, String> reqData) throws Exception {return this.downloadfundflow(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());}public Map<String, String> downloadfundflow(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {String url;if (this.useSandbox) {url = "https://api.mch.weixin.qq.com/sandboxnew/pay/downloadfundflow";} else {url = "https://api.mch.weixin.qq.com/pay/downloadfundflow";}String respStr = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs).trim();Object ret;if (respStr.indexOf("<") == 0) {ret = WXPayUtil.xmlToMap(respStr);} else {ret = new HashMap();((Map)ret).put("return_code", "SUCCESS");((Map)ret).put("return_msg", "ok");((Map)ret).put("data", respStr);}return (Map)ret;}
5.下载对账单及资金账单
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.weein.quickpass.base.entity.WeChatBillDO;
import com.weein.quickpass.base.entity.WeChatCapitalBillDO;
import com.weein.quickpass.core.config.MyConfig;
import com.weein.wcommon.utils.DateUtils;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import static com.github.wxpay.sdk.WXPayConstants.SignType.HMACSHA256;/*** @author hzt* @describe 下载微信账单*/
public class DownloadWeChatBill {//main方法,用来测试public static void main(String[] args) throws Exception {//List<WeChatBillDO> list = downloadBill();List<WeChatCapitalBillDO> list = downloadCapitalBill();System.out.println(list);}/*** 下载微信对账单** @return* @throws Exception*/public static List<WeChatBillDO> downloadBill() throws Exception {List<WeChatBillDO> list = Lists.newArrayList();MyConfig config = new MyConfig();WXPay wxpay = new WXPay(config, HMACSHA256);Map<String, String> data = new HashMap<String, String>();//下载对账单的日期,格式:20140603,当前日期前一天。String billDate = DateUtils.format(DateUtils.addDay(new Date(), -1), DateUtils.FORMAT_DATE_02);data.put("bill_date", billDate);//data.put("bill_date", "20190329");data.put("bill_type", "ALL");Map<String, String> resp = wxpay.downloadBill(data);String result = resp.get("data");//查询当日没有账单时if (Strings.isNullOrEmpty(result)) {return list;}int i = result.indexOf("`");int j = result.indexOf("总");String substring = result.substring(i, j - 2);String[] temp = substring.split(",``");for (int k = 0; k < temp.length; k++) {String[] payment = temp[k].replace("`", "").split(",");WeChatBillDO weChatBillDO = new WeChatBillDO();weChatBillDO.setTradeTime(payment[0]);weChatBillDO.setAppId(payment[1]);weChatBillDO.setMchId(payment[2]);weChatBillDO.setMchAppId(payment[3]);weChatBillDO.setDeviceInfo(payment[4]);weChatBillDO.setTransactionId(payment[5]);weChatBillDO.setOutTradeNo(payment[6]);weChatBillDO.setOpenId(payment[7]);weChatBillDO.setTradeType(payment[8]);weChatBillDO.setTradeStatus(payment[9]);weChatBillDO.setPayBank(payment[10]);weChatBillDO.setMoneyType(payment[11]);weChatBillDO.setOrderPay(payment[12]);weChatBillDO.setVoucherAmount(payment[13]);weChatBillDO.setRefundNumber(payment[14]);weChatBillDO.setOutRefundNo(payment[15]);weChatBillDO.setRefundAmount(payment[16]);weChatBillDO.setRefundAmountVoucher(payment[17]);weChatBillDO.setRefundsType(payment[18]);weChatBillDO.setRefundsStatus(payment[19]);weChatBillDO.setCommodityName(payment[20]);weChatBillDO.setDataPacket(payment[21]);weChatBillDO.setServiceCharge(payment[22]);weChatBillDO.setRate(payment[23]);weChatBillDO.setOrderAmount(payment[24]);weChatBillDO.setApplicationRefundAmount(payment[25]);list.add(weChatBillDO);}return list;}/*** 下载微信支付资金账单** @return* @throws Exception*/public static List<WeChatCapitalBillDO> downloadCapitalBill() throws Exception {List<WeChatCapitalBillDO> list = Lists.newArrayList();MyConfig config = new MyConfig();WXPay wxpay = new WXPay(config, HMACSHA256);Map<String, String> data = new HashMap<String, String>();//下载账单的日期,格式:20140603,当前日期前一天。//String billDate = DateUtils.format(DateUtils.addDay(new Date(), -1), DateUtils.FORMAT_DATE_02);//data.put("bill_date", billDate);data.put("bill_date", "20190329");SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date date = sdf.parse(data.get("bill_date"));int year = date.getYear() + 1900;//账单的资金来源账户account_type:Basic 基本账户/Operation 运营账户/Fees 手续费账户data.put("account_type", "Basic");Map<String, String> resp = wxpay.downloadfundflow(data);String result = resp.get("data");//查询当日没有账单时if (Strings.isNullOrEmpty(result)) {return list;}int i = result.indexOf("`");int j = result.indexOf("资金流水总笔数");String substring = result.substring(i, j);//方法比较简单暴力,通过年份(比如2018 + `) 去切割,最后再把年份拼接上去String[] temp = substring.split("`" + year);for (int m = 1; m < temp.length; m++) {String[] payment = temp[m].replace("`", "").split(",");WeChatCapitalBillDO weChatCapitalBillDO = new WeChatCapitalBillDO();weChatCapitalBillDO.setTradeTime(year + payment[0]);weChatCapitalBillDO.setPaymentNumber(payment[1]);weChatCapitalBillDO.setFlowNumber(payment[2]);weChatCapitalBillDO.setBusinessName(payment[3]);weChatCapitalBillDO.setBusinessType(payment[4]);weChatCapitalBillDO.setInoutType(payment[5]);weChatCapitalBillDO.setInoutMoney(payment[6]);weChatCapitalBillDO.setAccountBalance(payment[7]);weChatCapitalBillDO.setApplicant(payment[8]);weChatCapitalBillDO.setRemarks(payment[9]);if (payment.length == 10) {if (payment[9].equals("system")) {weChatCapitalBillDO.setVoucherNumber("");}} else if (payment.length == 11) {weChatCapitalBillDO.setVoucherNumber(payment[10]);}list.add(weChatCapitalBillDO);}return list;}
}
5.将得到的数据定时存入数据库中
/*** 生成下载微信对账单并存入数据库任务*/@Scheduled(cron = "0/10 * * * * ?")public void downloadWeChatBill() {weChatBillService.saveWeChatBill();}/*** 生成下载微信资金账单并存入数据库任务*/@Scheduled(cron = "0/10 * * * * ?")public void downloadFundFlow() {weChatCapitalBillService.saveFundFlow();}
6.service
public interface IWeChatBillService {int saveWeChatBill();
}
public interface IWeChatCapitalBillService {int saveFundFlow();
}
7.实现,两个账单存入数据库的实现一样,就放一个
@Service(version = DubboConstant.DUBBO_SERVICE_VERSION)
@Component
public class WeChatCapitalBillServiceImpl implements IWeChatCapitalBillService {@ResourceIWeChatCapitalBillMapper weChatCapitalBillMapper;@Overridepublic int saveFundFlow() {int x = 0;List<WeChatCapitalBillDO> list = null;try {list = DownloadWeChatBill.downloadCapitalBill();} catch (Exception e) {e.printStackTrace();}if (CollectionUtils.isNotEmpty(list)) {for (WeChatCapitalBillDO weChatCapitalBillDO : list) {weChatCapitalBillMapper.insertSelective(weChatCapitalBillDO);x++;}}return x;}
}
利用微信官方文档下载微信对账单、资金账单相关推荐
- Spring官方文档下载
Spring官方文档下载 最近准备弄弄 spring-batch,需要完整的资料,但是大部分都是零散的,于是准备下个官方文档: spring 官方文档下载 官方文档路径:https://docs.sp ...
- 调用微信高级群发接口--视频群发接口出问题(微信官方文档错误纠正)
这几天在弄项目与微信对接,我主要负责将素材(视频,图片.缩略图,音频)材料上传到微信server上.并推送到所关注本平台的用户中.从获取accessToken到素材上传.下载.或者关注者的openId ...
- jdk1.8官方文档下载mac
jdk1.8官方文档中文版,永久有效!! 由于是chm格式的,所以需要下载chmox(mac),也是免费的,都在下面链接中. 链接:https://pan.baidu.com/s/1gTw4tundB ...
- 微信官方文档学习——API
一.基础 1. wx.canIUse('console.log') //true //wx.canIUse (判断小程序的API,回调,参数,组件等是否在当前版本可用)2. const arrayBu ...
- [微信官方文档] 小程序-错误码信息与解决方案表
错误码信息与解决方案表 错误码是通过binderror回调获取到的错误信息. 代码 异常情况 理由 解决方案 1000 后端错误调用失败 该项错误不是开发者的异常情况 一般情况下忽略一段时间即可恢复. ...
- Adaptive AUTOSAR 官方文档下载
地址 Adaptive Platform - AUTOSAR 点击目前的最新链接 下载 点击 "Show All" 点击 "Select all documents of ...
- ARM 官方文档下载地址
https://developer.arm.com/documentation/#sort=relevancy
- Python3.6官方文档下载
网址:https://docs.python.org/3.6/download.html
- python3官方文档下载_Python3.2.3官方文档
核心类差异 Python3对Unicode字符的原生支持 Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的st ...
- 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)
转载自:https://www.jianshu.com/p/d533c69be034 由于微信官方文档对此的描述虽然还可以,但是还是有一些让人疑惑的地方,所以笔者做了一些注解,希望对大家有所帮助 为什 ...
最新文章
- linux 环境下,yum 安装redis
- 移动端HTML5长按图片会选中页面中某个位置的文字
- 10.8.5如何升级(app store 出错 请稍后重试 100)
- Liunx 安装mysql 5.6.16
- 爱计算机辅助筛查肺结节,计算机辅助检测系统提高CT肺结节检出方式的研究
- Matlab符号求导
- SDOI 2009 BIll的挑战
- 嵌入式Linux的QT版本,嵌入式Linux版本Qt5.4快速部署
- c语言编辑学生信息录入的程序,c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!!...
- Struts2校验器(二)之注解
- 小程序毕设作品之微信二手交易小程序毕业设计成品(6)开题答辩PPT
- 你不知道网络安全有多严峻
- Keil_v5 下生成bin文件+Jflash 下载bin文件
- dsp 28377 +RX-8025T 实现RTC功能
- Matlab在线运行网址
- 互联网中的裂变是什么?
- telegram自动发信息_zabbix调用telegram机器人发送报警消息
- 艾美捷FLIVO探针:用于细胞活体凋亡检测,助力科研!
- 企业网盘的优势到底在哪里?
- 最优理论与技术--多目标规划问题
热门文章
- [精简]托福核心词汇60
- 大伽「趣」说AI:在多个场景中的AI落地实践
- 数商云跨境电商平台解决方案
- html颜色奶白色,象牙白rgb值是多少 和乳白哪个更白
- 设置div中的背景颜色及div中的字体颜色
- 量子计算机物理学,使用量子计算机来测试物理学的基本原理
- Netflix-Eureka服务注册与发现说明文档
- PS 金属质感文字制作
- 卸载ps显示无法连接adobe服务器,Solved: photoshop无法卸载 - Adobe Support Community - 7692384...
- 项目经理面试必备20题