精华内容
下载资源
问答
  • 支付宝 包含对账单下载示例 业务账单 财务账单 阿里支付 付款 交易查询 退款 退款查询 交易关闭 对账单下载 电脑网站沙箱测试(Java)
  • 本文是【浅析微信支付】系列文章的第九篇,主要讲解商户下载对账单接口和资金账单接口的实现和一些注意事项。 浅析微信支付系列已经更新九篇了哟~,没有看过的朋友们可以看一下哦。 浅析微信支付:申请退款、退款...
    本文是【浅析微信支付】系列文章的第九篇,主要讲解商户下载对账单接口和资金账单接口的实现和一些注意事项。

    浅析微信支付系列已经更新九篇了哟~,没有看过的朋友们可以看一下哦。

    浅析微信支付:申请退款、退款回调接口、查询退款

    浅析微信支付:查询订单和关闭订单

    浅析微信支付:支付结果通知

    在商户平台中,商家也可以下载资金对账单,历史的交易清单,具体位置:商户平台 -> 交易中心 -> 账单管理。

    如果要查看实时的流水记录,可以在微信APP中搜索小程序 微信支付商户助手 即可查看。

    1、下载对账单

    以下为微信官方的下载对账单文档:

    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6

    根据接口下载历史的交易账单,数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款结果一致,具体字段说明可查阅相应接口。

    此接口方便商家在自身系统中下载,不依赖于微信商户平台。

    1.1. 应用场景

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

    注意:
    1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;
    2、微信在次日9点启动生成前一天的对账单,建议商户10点后再获取;
    3、对账单中涉及金额的字段单位为“元”。
    4、对账单接口只能下载三个月以内的账单。
    5、对账单是以商户号纬度来生成的,如一个商户号与多个appid有绑定关系,则使用其中任何一个appid都可以请求下载对账单。对账单中的appid取自交易时候提交的appid,与请求下载对账单时使用的appid无关。

    1.2. 接口链接

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

    1.3. 是否需要证书

    不需要

    1.4. 调用接口

    调用参数:

    字段名称变量名必填类型描述
    账单日期bill_dateString(8)下载对账单的日期,格式:20140603
    账单类型bill_typeString(8)ALL,返回当日所有订单信息,默认值SUCCESS,返回当日成功支付的订单REFUND,返回当日退款订单RECHARGE_REFUND,返回当日充值退款订单
    压缩账单tar_typeString(8)非必传参数,固定值:GZIP,返回格式为.gzip的压缩包账单。不传则默认为数据流形式。

    以下为调用示例代码:

    /**
     * 对账单下载
     */
    private void doDownloadBill() {
        HashMap<String, String> data = new HashMap<String, String>();
        data.put("bill_date", "20161102");
        data.put("bill_type", "ALL");
        try {
            Map<String, String> r = wxpay.downloadBill(data);
            System.out.println(r);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    1.5. 返回结果

    成功时,数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款结果一致,具体字段说明可查阅相应接口。

    第一行为表头,根据请求下载的对账单类型不同而不同(由bill_type决定),目前有:

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

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

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

    从第二行起,为数据记录,各参数以逗号分隔,参数前增加`符号,为标准键盘1左边键的字符,字段顺序与表头一致。

    倒数第二行为订单统计标题,最后一行为统计数据

    总交易单数,总交易额,总退款金额,总代金券或立减优惠退款金额,手续费总金额

    举例如下:

    交易时间,公众账号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

    2、下载资金账单接口

    以下为微信官方的下载资金账单文档:

    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_18&index=7

    2.1. 应用场景

    商户可以通过该接口下载自2017年6月1日起 的历史资金流水账单。

    说明:

    1、资金账单中的数据反映的是商户微信账户资金变动情况;
    2、当日账单在次日上午9点开始生成,建议商户在上午10点以后获取;
    3、资金账单中涉及金额的字段单位为“元”。

    2.2. 接口链接

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

    2.3. 是否需要证书

    请求需要双向证书

    2.4. 调用接口

    调用参数:

    字段名称变量名必填类型描述
    签名类型sign_typeString(32)签名类型,目前仅支持HMAC-SHA256
    资金账单日期bill_dateString(8)下载对账单的日期,格式:20140603
    资金账户类型account_typeString(8)账单的资金来源账户:Basic 基本账户、Operation 运营账户、Fees 手续费账户
    压缩账单tar_typeString(8)非必传参数,固定值:GZIP,返回格式为.gzip的压缩包账单。不传则默认为数据流形式。

    此接口不常用,推荐使用微信商户平台下载。具体的实现请参考上面的官方文档。

    结语

    以上为下载对账单、资金账单相关的解释和源码,特别需要注意的是下载资金账单接口需要特定的签名类型HMAC-SHA256,小伙伴们一定要注意哦,具体的源码可以看作者的github,里面对每个方法有详细的注释。

    预告:下一篇文章 如何使用沙箱环境测试,敬请期待!!!

    ​如果想要提前一览源码的小伙伴,可以先看看我的 github,地址如下:

    `
    https://github.com/YClimb/wxp...
    `

    关注作者微信公众号,点击下方讨论群,扫码即可加入微信支付讨论群与小伙伴一起探讨哦~

    到此本文就结束了,关注公众号查看更多推送!!!


    关注我的公众号


    展开全文
  • 针对微信支付的对账单格式,这里进行一下详细的说明。对账单表头和交易订单的关系交易时间对应查询订单接口time_end公众账号IDappid商户号mch_id子商户号sub_mch_id设备号对应下单接口device_info微信订单号对应查询...

    针对微信支付的对账单格式,这里进行一下详细的说明。

    对账单表头和交易订单的关系

    交易时间

    对应查询订单接口time_end

    公众账号ID

    appid

    商户号

    mch_id

    子商户号

    sub_mch_id

    设备号

    对应下单接口device_info

    微信订单号

    对应查询订单接口transaction_id

    商户订单号

    out_trade_no

    用户标识

    openid, 相对于appid的用户唯一标识

    交易类型

    对应下单接口trade_type

    交易类型见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2

    交易状态

    SUCCESS: 对应收入

    REFUND: 对应支出-退款

    REVOKED: 对应支出-撤销

    这里有几点注意:

    账单的交易状态,和订单的交易状态没有关系,发生过退款的订单,在这里依然有一条success

    交易状态不会变更

    只有发生过支付(进账)的订单,在撤销后才会发生支出并出现在对账单里。

    付款银行

    bank_type

    见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2

    货币种类

    fee_type

    总金额

    total_fee

    企业红包金额

    coupon_fee

    微信退款单号

    对应查询退款接口refund_id

    商户退款单号

    对应退款/查询退款的out_refund_no

    退款金额

    对应单笔退款时的refund_fee

    企业红包退款金额

    对应coupon_refund_fee

    退款类型

    refund_channel

    退款状态

    PROCESSING: 已经从账面扣款

    SUCCESS: 已经从账面扣款,并且出对账单时这个退款已经到账

    商品名称

    body

    商户数据包

    attach

    手续费

    精确到小数点后2位,四舍五入。末尾填充3个0。

    费率

    商户号对应的费率,同一个商户号一致。

    文件格式

    编码

    使用接口下载的时候,是utf8编码

    在商户平台下载的时候,根据选择的office版本不同,编码不同

    文件名格式

    接口下载的是字符串,无文件名

    展开全文
  • 微信下载对账单

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

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

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

    终于找到了组织:

    微信支付|开发文档 :点击跳转

     

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

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

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

     关于应用场景:

    商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。
    注意:
    1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;
    2、微信在次日9点启动生成前一天的对账单,建议商户10点后再获取;
    3、对账单中涉及金额的字段单位为“元”。
    4、对账单接口只能下载三个月以内的账单。

    2.传入的参数:

    接着我们看下传入参数:

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

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

    看一下查詢代码:

            SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
            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 static String CreateNoncestr() {
            String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            String res = "";
            for (int i = 0; i < 16; i++) {
                Random rd = new Random();
                res += chars.charAt(rd.nextInt(chars.length() - 1));
            }
            return res;
        }

    4.关于签名:

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

    ①格式是:utf-8;

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

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

    public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){
            StringBuffer sb = new StringBuffer();
            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();
            return sign;
        }

    例如这样:

    <xml>
      <appid>wx2421b1c4370ec43b</appid>
      <bill_date>20141110</bill_date>
      <bill_type>ALL</bill_type>
      <mch_id>10000100</mch_id>
      <nonce_str>21df7dc9cd8616b56919f20d9f679233</nonce_str>
      <sign>332F17B766FC787203EBE9D6E40457A1</sign>
    </xml>

    代码:

    public static String getRequestXml(SortedMap<Object,Object> parameters){
            StringBuffer sb = new StringBuffer();
            sb.append("<xml>");
            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+">"+"<![CDATA["+v+"]]></"+k+">");
                }else {
                    sb.append("<"+k+">"+v+"</"+k+">");
                }
            }
            sb.append("</xml>");
            return sb.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 = new PtWxTradeDetail();
                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(new Date());
                wxTradeDetailDao.insert(entity);

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

    展开全文
  • 5.下载对账单及资金账单 import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.weein.quickpass.base.entity.WeChatBillDO; import ...

    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();
        }
        //appid
        public String getAppID() {
            return "*******";
        }
        //商户号
        public String getMchID() {
            return "******";
        }
        //key
        public 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 {
    
        @Resource
        IWeChatCapitalBillMapper weChatCapitalBillMapper;
    
        @Override
        public 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;
        }
    }
    
    展开全文
  • 微信支付对账单下载

    千次阅读 2019-04-10 17:39:44
    微信对账单查询 应用场景 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。 注意: 1、微信侧未成功下单的交易不会出现在对账单中。支付...
  • 最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款...
  • java微信对账单解析为bean

    千次阅读 2019-05-21 09:08:35
    最近发现对账单的 格式变了 重新写了一下 官网地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_6 有问题留言 import java.util.ArrayList; import java.util.List; /** * @Author: ...
  • 账单管理应用程序后端 支持AI的FinTech B2B账单管理应用程序,用于查找账单付款是否会延迟。
  • 微信对账单处理-PHP

    千次阅读 2018-05-15 17:33:46
    最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款...
  • 在一家企业里面付款业务很多,有主营业务,有物资采购、员工报销等等很多付款业务,并不是每个业务都有或者都需要出具账单的,账单主要是和供应商对账的一个媒介,并不一定是最终付款的金额(比如上面谈到的账单发票...
  • 标题:微信对账单地址:功能:pom文件实体类方法:查询的当天n-2的 微信对账单地址: 链接:https://pay.weixin.qq.com/wiki/doc/api/app/app_jw.php?chapter=9_6&index=8 功能: << 商户可以通过该接口...
  • 微信对账单接口返回值解析

    千次阅读 2018-08-08 02:15:01
    我遇到的问题就是在调用微信的对账单接口时,微信会返回一个字符串给我,而这个字符串就包含了账单名称以及账单数据。喏,就是下面这个样子。 当时看了一脸懵逼,因为看不出任何可以进行解析的特征,因此不得不又...
  • 支付宝对账单CSV解析

    千次阅读 2019-05-17 21:46:38
    支付宝对账单CSV解析 一、读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码 import com.slx.outer.zip.ZipEntry; import com.slx.outer.zip.ZipInputStream; import org.junit.Test; import ...
  • 微信支付对账单的详细说明

    万次阅读 2017-09-27 15:04:09
    针对微信支付的对账单格式,这里进行一下详细的说明。 对账单表头和交易订单的关系 交易时间  对应查询订单接口time_end 公众账号ID appid 商户号 mch_id 子商户号 sub_mch_id 设备号 对应下单接口...
  • 微信下载对账单官方内容:应用场景商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。注意:1、微信侧未成功下单的交易不会出现在对账单中。...
  • 微信支付对账单查询获取 第一步:拼接请求参数(xml格式) 请求字段说明 appid 微信公众号开发者ID 必填 nonce_str 随机字符串 必填长度不长于32位(可用随机字符串生成工具类生成) mch_id 微信商户号id 必填 bill_...
  • 最近接手了一个棘手的工作:微信下载对账单。 刚接手完全懵逼,怎么和微信对接啊。然后就是百度。。 终于找到了组织: 微信支付|开发文档 :点击跳转 通过文档我们可以看到,首先是: 1.下载对账单开放接口...
  • Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: yarn start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何...
  • WISE 14.3版本,客户端系统windows 2016,安装好金蝶客户端后,运行财务会计-应付款管理-采购对账付款平台-采购付款平台的时候,报如下错误: 未设置对象变量或With block变量 错误代码:91(5BH)Source:K3capital ...
  • 微信对账单转excel

    千次阅读 2018-09-06 17:09:25
    交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,代金券或立减优惠金额,微信退款单号,商户退款单号,退款金额,代金券或立减优惠退款金额,...
  • 该数据集包含有关2005年4月至2005年9月台湾地区信用卡客户的默认付款,人口统计学因素,信用数据,付款历史和账单报表的信息。我们使用Logistic回归进行预测,并使用机器学习和Keras进行了3层分析使用深度学习进行...
  • 关键字:微信支付 微信支付v3 ...本文介绍微信支付下的对账单的开发实现流程。 注意 微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版。V3版的微信支付没有paySignKey参数。v2的相...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,550
精华内容 2,620
关键字:

付款对账单