最近接手了一个棘手的工作:微信下载对账单。

刚接手完全懵逼,怎么和微信对接啊。然后就是百度。。

终于找到了组织:

微信支付|开发文档 :

通过文档我们可以看到,首先是:

1.下载对账单开放接口链接:

https://api.mch.weixin.qq.com/pay/downloadbill

关于应用场景:

商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。

注意:1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;2、微信在次日9点启动生成前一天的对账单,建议商户10点后再获取;3、对账单中涉及金额的字段单位为“元”。4、对账单接口只能下载三个月以内的账单。

2.传入的参数:

接着我们看下传入参数:

其中,微信分配的appId 和 商户号 是自己的。

还有就是需要 去商户平台查自己商户号以及key。这个key主要用在生成签名中。

看一下查詢代码:

SortedMap parameters = new TreeMap();

parameters.put("appid", ConfigUtil.APPID); //APPid

parameters.put("mch_id", ConfigUtil.MCH_ID); //商户id//parameters.put("device_info", "");//微信支付分配的终端设备号,填写此字段,只下载该设备号 的对账单

parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());//下载对账单的日期,格式:20140603,当前日期前一天。String billDate = DateUtil.date2Str(DateUtil.addDay(new Date(), -1), "yyyyMMdd");

parameters.put("bill_date", billDate);//

//bill_type:ALL返回当日所有订单信息,默认值SUCCESS返回当日成功支付的订单。REFUND,返回当日退款订单

parameters.put("bill_type", "ALL");

String sign= PayCommonUtil.createSign("utf-8", parameters);

parameters.put("sign", sign);

String reuqestXml=PayCommonUtil.getRequestXml(parameters);

String result= CommonUtil.httpsRequest(ConfigUtil.DOWNLOAD_BILL_URL, "POST", reuqestXml);

configUtil 工具类里面要配置APPID,MCH_ID,已及Key 。(注:所有的工具类我都放文章末尾链接里,自己下载即可。)我们需要在ConfigUtil工具类中配置一下:

public final static String APPID = "";//服务号的应用号

public final static String APP_SECRECT = "";//服务号的应用密码

public final static String TOKEN = "weixinCourse";//服务号的配置token

public final static String MCH_ID = "";//商户号

public final static String API_KEY = "";//API密钥

public final static String SIGN_TYPE = "MD5";//签名加密方式

public final static String CERT_PATH = "D:/apiclient_cert.p12";//微信支付证书存放路径地址

3.随机数:

我们看一下随机数的生成:

public staticString CreateNoncestr() {

String chars= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

String res= "";for (int i = 0; i < 16; i++) {

Random rd= newRandom();

res+= chars.charAt(rd.nextInt(chars.length() - 1));

}returnres;

}

4.关于签名:

关于签名,有三点需要注意:

①格式是:utf-8;

②签名类型:MD5以及HMAC-SHA256。默认为MD5,本例也是MD5。

③签名的生成:需要前面几个值(APPID等)以及Key:

public static String createSign(String characterEncoding,SortedMapparameters){

StringBuffer sb= newStringBuffer();

Set es=parameters.entrySet();

Iterator it=es.iterator();while(it.hasNext()) {

Map.Entry entry=(Map.Entry)it.next();

String k=(String)entry.getKey();

Object v=entry.getValue();if(null != v && !"".equals(v)&& !"sign".equals(k) && !"key".equals(k)) {

sb.append(k+ "=" + v + "&");

}

}

sb.append("key=" +ConfigUtil.API_KEY);

String sign=MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();returnsign;

}

之后我们把map 变成xml格式数据:

例如这样:

wx2421b1c4370ec43b

20141110

ALL

10000100

21df7dc9cd8616b56919f20d9f679233

332F17B766FC787203EBE9D6E40457A1

代码:

public static String getRequestXml(SortedMapparameters){

StringBuffer sb= newStringBuffer();

sb.append("");

Set es=parameters.entrySet();

Iterator it=es.iterator();while(it.hasNext()) {

Map.Entry entry=(Map.Entry)it.next();

String k=(String)entry.getKey();

String v=(String)entry.getValue();//if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {

if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)) {

sb.append(""+""+k+">");

}else{

sb.append(""+v+""+k+">");

}

}

sb.append("");returnsb.toString();

}

之后把xml传给微信对账单接口而后接口会返回值:

5.返回值解析:

关于返回值,这里我详解下:最重要一点是:成功和失败返回数据流类型不一样:成功返回文本格式,失败返回xml格式数据。

①返回失败的情况 :返回xml ,其中无数据也会返回xml 。并且格式是下图。

下面是错误码:

②成功:数据以文本方式返回。

拿微信给的成功返回数据举例:

交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,代金券或立减优惠金额,微信退款单号,商户退款单号,退款金额,代金券或立减优惠退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率

`2014-11-1016:33:45,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1001690740201411100005734289,`1415640626,`085e9858e3ba5186aafcbaed1,`MICROPAY,`SUCCESS,`CFT,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%`2014-11-1016:46:14,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1002780740201411100005729794,`1415635270,`085e9858e90ca40c0b5aee463,`MICROPAY,`SUCCESS,`CFT,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%总交易单数,总交易额,总退款金额,总代金券或立减优惠退款金额,手续费总金额

`2,`0.02,`0.0,`0.0,`0

我们对成功的数据进行处理:

①把第一行表头去掉

代码为:

String tradeMsg = result.substring(result.indexOf("`"));

数据为:

`2014-11-1016:33:45,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1001690740201411100005734289,`1415640626,`085e9858e3ba5186aafcbaed1,`MICROPAY,`SUCCESS,`CFT,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%`2014-11-1016:46:14,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1002780740201411100005729794,`1415635270,`085e9858e90ca40c0b5aee463,`MICROPAY,`SUCCESS,`CFT,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%总交易单数,总交易额,总退款金额,总代金券或立减优惠退款金额,手续费总金额

`2,`0.02,`0.0,`0.0,`0

②去掉汇总数据,并且去掉"`"这个符号。

代码为:

String tradeInfo = tradeMsg.substring(0, tradeMsg.indexOf("总")).replace("`", "");//去掉汇总数据,并且去掉'`'

数据为:

2014-11-1016:33:45,wx2421b1c4370ec43b,10000100,0,1000,1001690740201411100005734289,1415640626,085e9858e3ba5186aafcbaed1,MICROPAY,SUCCESS,CFT,CNY,0.01,0.0,0,0,0,0,,,被扫支付测试,订单额外描述,0,0.60%

2014-11-1016:46:14,wx2421b1c4370ec43b,10000100,0,1000,1002780740201411100005729794,1415635270,085e9858e90ca40c0b5aee463,MICROPAY,SUCCESS,CFT,CNY,0.01,0.0,0,0,0,0,,,被扫支付测试,订单额外描述,0,0.60%

可以看到和我们想要的数据已经大致一样了。

③用spilt方法拿出每一天数据放进数组里。之后再用spilt方法把数据放进二维数组里。

String[] tradeArray = tradeInfo.split("%"); //根据%来区分

for(String tradeDetailInfo : tradeArray) {

String[] tradeDetailArray= tradeDetailInfo.split(",");

}

④最后保存下来就可以了。

PtWxTradeDetail entity = null;

entity = newPtWxTradeDetail();

entity.setId(null); //自动生成id

entity.setTransDate(DateUtil.str2Date(tradeDetailArray[0], format));//交易时间

entity.setCommonId(tradeDetailArray[1]);//公众账号ID

entity.setBusinessNo(tradeDetailArray[2]);//商户号

entity.setChildBusinessNo(tradeDetailArray[3]);//子商户号

entity.setEquipmentNo(tradeDetailArray[4]);//设备号

entity.setWxOrderNo(tradeDetailArray[5]);//微信订单号

entity.setBusinessOrderNo(tradeDetailArray[6]);//商户订单号

entity.setUserIdentity(tradeDetailArray[7]);//用户标识

entity.setTransType(tradeDetailArray[8]);//交易类型

entity.setTransStatus(tradeDetailArray[9]);//交易状态

entity.setPaymentBank(tradeDetailArray[10]);//付款银行

entity.setCurrency(tradeDetailArray[11]);//货币种类

entity.setTotalAmount(tradeDetailArray[12]);//总金额

entity.setRedEnvelopesAmount(tradeDetailArray[13]);//企业红包金额

entity.setWxRefundNo(tradeDetailArray[14]);//微信退款单号

entity.setBusinessRefundNo(tradeDetailArray[15]);//商户退款单号

entity.setRefundAmount(tradeDetailArray[16]);//退款金额

entity.setRedEnvelopesRefundAmount(tradeDetailArray[17]);//企业红包退款金额

entity.setRefundType(tradeDetailArray[18]);//退款类型

entity.setRefundStatus(tradeDetailArray[19]);//退款状态

entity.setBusinessName(tradeDetailArray[20]);//商品名称

entity.setBusinessData(tradeDetailArray[21]);//商户数据包

entity.setFee(tradeDetailArray[22]);//手续费

entity.setRate(tradeDetailArray[23] + "%");//费率

entity.setCreateDate(newDate());

wxTradeDetailDao.insert(entity);

最后,微信支付工具类下载链接(百度网盘):

后记

写完这篇博文给我最大的感悟就是:一定要仔细,仔细,再仔细的看官方文档。你需要的,文档都有,除了手把手教你以外你需要的肯定都有。

微信对账单 java_微信下载对账单相关推荐

  1. 微信对账单 java_微信支付对账,你是如何处理的?

    支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款结果一致 ...

  2. 微信useragent java_微信内置浏览器和小程序的 User Agent 区别及判断方法

    通过UA来判断不同的设备或者浏览器是开发者最常用的方式方法,而对于微信开发和小程序也是同样的一个情况,我们可以通过微信内置浏览器 User Agent 信息来判断其具体类型或者设备. 所以子凡就通过徒 ...

  3. 微信卡券 java_微信小程序领取卡券(java)

    最近做了个领取微信卡券的小程序,看了很多文档资料以及花了很多时间才算搞定的,不过也算是好事多磨,这边记录分享一下,也算给一点提升. 一.开发前准备 1:申请微信公众号 和 微信小程序,这是两个不同的东 ...

  4. 微信红包 java_微信支付-微信红包Java版本

    https://zb.oschina.net/market/opus/1325c0ab3ac1f4b6 代码链接,可根据需求出方案与代码. 需要有认证的公众号,且开通了微信支付,商户平台且开通了现金红 ...

  5. 微信useragent java_微信内置浏览器UserAgent的判断

    需求分析 现在微信火了,很多线上的APP都希望通过分享的URL或直接的URL进行产品宣传(写这篇博文的时候,听说微信下个版本将要屏蔽微信中的URL链接),这些链接都将通过微信内置的浏览器打开.PM希望 ...

  6. php CI 微信支付扩展 微信扫码支付 jssdk 支付 退款

    微信支付API类库来自:https://github.com/zhangv/wechat-pay 请先看一眼官方场景及支付时序图:https://pay.weixin.qq.com/wiki/doc/ ...

  7. php微信商户下载对账单,浅析微信支付:下载对账单和资金账单

    本文是[浅析微信支付]系列文章的第九篇,主要讲解商户下载对账单接口和资金账单接口的实现和一些注意事项. 浅析微信支付系列已经更新九篇了哟-,没有看过的朋友们可以看一下哦. 在商户平台中,商家也可以下载 ...

  8. java 微信 下载对账单_java下载微信对账单,实现与微信实收对账和日清日结对账...

    最近接手了一个棘手的工作:微信下载对账单. 刚接手完全懵逼,怎么和微信对接啊.然后就是百度.. 终于找到了组织: 微信支付|开发文档 :点击跳转 通过文档我们可以看到,首先是: 1.下载对账单开放接口 ...

  9. 微信刷卡 sdk java_微信支付 Java SDK

    微信支付 Java SDK 对微信支付开发者文档中给出的API进行了封装. com.github.wxpay.sdk.WXPay类下提供了对应的方法: 方法名 说明microPay 刷卡支付 unif ...

  10. node 微信红包 证书出错,请登录微信支付商户平台下载证书

    按照官方文档写的代码,测试给自己发红包时,提示证书出错,请登录微信支付商户平台下载证书. 我是用的superagent库,错误前的核心代码是: const url = 'https://api.mch ...

最新文章

  1. HDU2988(Kruskal算法模版)
  2. 【项目】MD5加盐源码理解
  3. laravel $request 多维数组取值_大白话 Laravel 中间件
  4. 集成ffmpeg/x264:ERROR: libx264 not found的问题
  5. 【枚举】连续自然数和(jzoj 2102)
  6. 程序员面试金典 - 面试题 10.03. 搜索旋转数组(二分查找)
  7. c语言第4章作业,《C语言程序设第4章作业.doc
  8. Cyptoquant CEO:2021年ETH历史最高价与2018年不同,抛压明显更弱
  9. macos mysql8_macOS + MySql8 问题
  10. 一文看懂神经网络中的梯度下降原理 图像说明
  11. python bottle部署_如何使用python-Bottle框架创建REST API应用程序,以及如何在apache服务器上部署restapi应用程序?...
  12. 用网速作为手机信号强度
  13. linux中副规则_linux中命名规则_学习笔记
  14. 有一种VR电影比爱情动作片更“爽”
  15. 软件测试设计用例面试题
  16. 如何在没有安装安卓环境的mac os上装adb环境.
  17. Lesson16基于消息的异步套接字聊天室程序 VS2013 VC++深入详解 孙鑫
  18. 抵制“非你莫属”节目的微博活动,我被臭公知震到了,微博成了不负责任的宣泄之地
  19. 嵌入式行业怎么样,有什么好的就业方向?
  20. linux游戏龙芯能玩吗,历时三个月,我终于成功搭建了龙芯平台,竟可以玩cf和lol你敢信?...

热门文章

  1. win7和win10对于wifi共享的不同
  2. WebCracker4.0和monster字典——路由器登陆密码破解工具
  3. 计算机考研数据库原理知识,数据库原理考研资料题库真题整理
  4. 基于php校园官方网站的背景,校园微信平台的设计
  5. FIFO IP核的使用
  6. paypal标准支付流程图
  7. oracle dbf文件是什么,.ora文件、.dbf文件和.dat文件的区别
  8. 电脑壁纸尺寸比例_怎么设置桌面壁纸尺寸比例
  9. 无法删除文件:无法读源文件或磁盘”
  10. 查看个人小程序的累计独立访客(UV)