微信对账单:
1 导入所需JAR包
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.3.7.B</version>
<exclusions>
<exclusion>
<groupId>com.github.binarywang</groupId>
<artifactId>qrcode-utils</artifactId>
</exclusion>
</exclusions>
</dependency>
2 读取配置文件中配置的微信支付信息
@Data
@ConfigurationProperties(prefix = "wx.pay")
@Component
public class WxPayProperties {
/**
* 设置微信公众号或者小程序等的appid
*/
private String appId;
/**
* 微信支付商户号
*/
private String mchId;
/**
* 微信支付商户密钥
*/
private String mchKey;
/**
* 微信支付交易类型
*/
private String tradeType;
/**
* 证书位置
*/
private String keyPath;
}
3 注入配置
@Component
public class WeChatPayConfig {
@Autowired
private WxPayProperties properties;
@Bean
@ConditionalOnMissingBean
public WxPayConfig payConfig() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(this.properties.getAppId());
payConfig.setMchId(this.properties.getMchId());
payConfig.setMchKey(this.properties.getMchKey());
payConfig.setKeyPath(this.properties.getKeyPath());
payConfig.setTradeType(this.properties.getTradeType());
return payConfig;
}
@Bean
public WxPayService wxPayService(WxPayConfig payConfig) {
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
执行获取微信账单并且保存
public R downloadWxBill(WxPayDownloadBillRequest wxPayDownloadBillRequest){
try {
Map<String,Object> map = new HashMap<>();
map.put("date",wxPayDownloadBillRequest.getBillDate());
R r = customPayWxOrderBillService.queryTotal(map);
if(!r.get("code").toString().equals("0")){
log.error("获取微信对账单错误:{}","该日期数据核对异常");
return R.error("该日期数据核对异常");
}
if(Long.parseLong(r.get("total").toString()) >= 1){
log.error("获取微信对账单错误:{}","该日期的账单数据已经存在");
return R.error("该日期的账单数据已经存在");
}
wxService.setConfig(weChatPayConfig.payConfig());
wxPayDownloadBillRequest.setBillDate(wxPayDownloadBillRequest.getBillDate().replace("-",""));
WxPayBillResult wxPayBillResult = wxService.downloadBill(wxPayDownloadBillRequest);
List<WxPayBillInfo> wxPayBillInfos = wxPayBillResult.getBillInfoList();
List<PubPayWxOrderBillEntity> list = new ArrayList<>();
for(int i =0 ; i < wxPayBillInfos.size() ; i++){
WxPayBillInfo wxPayBillInfo = wxPayBillInfos.get(i);
PubPayWxOrderBillEntity customPayWxOrderBillEntity = new PubPayWxOrderBillEntity();
BeanUtils.copyProperties(wxPayBillInfo , customPayWxOrderBillEntity);
list.add(customPayWxOrderBillEntity);
}
customPayWxOrderBillService.insertBatch(list);
} catch (Exception e) {
e.printStackTrace();
log.error("获取微信对账单错误:{}",e.getMessage());
}
return R.ok();
}
支付宝对账单(比较麻烦一点,需要先获取支付宝对账单下载地址,再从地址下载ZIP压缩包,解压压缩包之后读取并保存对账信息):
1 导入所需JAR包
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.10.0.ALL</version>
</dependency>
2 读取配置文件中配置的支付宝支付信息
@Data
@ConfigurationProperties(prefix = "alipay.pay")
@Component
public class AlipayPayProperties {
/**
* 支付宝支付商户appId
*/
private String appId;
/**
* 支付宝支付商户私钥
*/
private String appPrivateKey;
/**
* 支付宝支付商户公钥
*/
private String publicKey;
/**
* 支付宝商户生成签名字符串所使用的签名算法类
*/
private String signType;
}
3 注入配置
@Component
public class AlipayPayConfig {
@Autowired
private AlipayPayProperties properties;
@Bean
public AlipayClient alipayClient() throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",properties.getAppId(),properties.getAppPrivateKey(),"json",AlipayConstants.CHARSET_UTF8,properties.getPublicKey(),properties.getSignType());
return alipayClient;
}
}
执行获取微信账单并且保存
public R downloadAlipayBill( JSONObject json) throws Exception {
try {
// 将订单提交至支付宝
Map<String,Object> map = new HashMap<>();
map.put("date",json.get("bill_date"));
R r = pubPayAlipayOrderBillService.queryTotal(map);
if(!r.get("code").toString().equals("0")){
log.error("获取支付宝对账单错误:{}","该日期数据核对异常");
return R.error("该日期数据核对异常");
}
if(Long.parseLong(r.get("total").toString()) >= 1){
log.error("获取支付宝对账单错误:{}","该日期的账单数据已经存在");
return R.error("该日期的账单数据已经存在");
}
AlipayClient alipayClient = alipayPayConfig.alipayClient();
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();
request.setBizContent(json.toString());
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient
.execute(request);
if(response.isSuccess()){
// 设置下载后生成Zip目录
URL url = new URL(response.getBillDownloadUrl());
URLConnection urlconn = url.openConnection();
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(urlconn.getInputStream()), Charset.forName("GBK"));
ZipEntry ze = null;
//循环遍历
while ((ze = zipInputStream.getNextEntry()) != null) {
if(ze.getName().indexOf("汇总") <= -1){
System.out.println("文件名:" + ze.getName() + " 文件大小:" + ze.getSize() + " bytes");
System.out.println("文件内容:");
BufferedReader br = new BufferedReader(new InputStreamReader(zipInputStream, Charset.forName("GBK")));
String line;
Long row = 0L;
//内容不为空,输出
List<PubPayAlipayOrderBillEntity> list = new ArrayList<>();
while ((line = br.readLine()) != null) {
System.out.println(line);
String [] arr = line.split(",");
if(arr.length > 20 && row >4){
PubPayAlipayOrderBillEntity pubPayAlipayOrderBillEntity = new PubPayAlipayOrderBillEntity();
pubPayAlipayOrderBillEntity.setTradeTime(arr[5].trim());
pubPayAlipayOrderBillEntity.setTransactionId(arr[0].trim() );
pubPayAlipayOrderBillEntity.setOutTradeNo(arr[1].trim() );
pubPayAlipayOrderBillEntity.setTradeType(arr[2].trim() );
pubPayAlipayOrderBillEntity.setBody(arr[3].trim() );
pubPayAlipayOrderBillEntity.setStartOrderTime(arr[4].trim() );
pubPayAlipayOrderBillEntity.setEndOrderTime(arr[5].trim() );
pubPayAlipayOrderBillEntity.setOpenId(arr[10].trim() );
pubPayAlipayOrderBillEntity.setTotalFee(arr[11].trim() );
pubPayAlipayOrderBillEntity.setPayFee(arr[12].trim() );
pubPayAlipayOrderBillEntity.setRefundId(arr[21].trim() );
pubPayAlipayOrderBillEntity.setRefundPoundage(arr[22].trim() );
pubPayAlipayOrderBillEntity.setRemark(arr.length > 24 ? arr[24].trim() : "");
list.add(pubPayAlipayOrderBillEntity);
}
row++;
}
System.out.println(list.size());
pubPayAlipayOrderBillService.insertBatch(list);
}
}
}else{
log.error("获取支付宝对账单失败:{}",JSON.toJSON(response));
}
} catch (Exception e) {
e.printStackTrace();
log.error("获取支付宝对账单错误:{}",e.getMessage());
}
return R.ok();
}