精华内容
下载资源
问答
  • 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: ...

    最近发现对账单的 格式变了 重新写了一下

    官网地址: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_6

    有问题留言

    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Author: liangkesai
     * @CreateDate: 2019/05/20 11:25
     */
    public class Bill {
    
        private String date;//交易时间
        private String appId;//公众账号ID
        private String mch_id;//商户号
        private String subMch_id;//子商户号 特约商户号
        private String device_info;//设备号
        private String weiXinOrderNo;//微信订单号
        private String mchOrderNo;//商户订单号
        private String userId;//用户标识
        private String type;//交易类型
        private String status;//交易状态
        private String bank;//付款银行
        private String currency;//货币种类
        private String amount;//总金额
        private String envelopeAmount;//企业红包金额 代金券金额
        private String name;//商品名称
        private String packet;//商户数据包
        private String poundage;//手续费
        private String rate;//费率
        private String orderAmount; //订单金额
    
        public String getOrderAmount() {
            return orderAmount;
        }
    
        public void setOrderAmount(String orderAmount) {
            this.orderAmount = orderAmount;
        }
    
        public String getDate() {
            return date;
        }
    
        public void setDate(String date) {
            this.date = date;
        }
    
        public String getAppId() {
            return appId;
        }
    
        public void setAppId(String appId) {
            this.appId = appId;
        }
    
        public String getMch_id() {
            return mch_id;
        }
    
        public void setMch_id(String mch_id) {
            this.mch_id = mch_id;
        }
    
        public String getSubMch_id() {
            return subMch_id;
        }
    
        public void setSubMch_id(String subMch_id) {
            this.subMch_id = subMch_id;
        }
    
        public String getDevice_info() {
            return device_info;
        }
    
        public void setDevice_info(String device_info) {
            this.device_info = device_info;
        }
    
        public String getWeiXinOrderNo() {
            return weiXinOrderNo;
        }
    
        public void setWeiXinOrderNo(String weiXinOrderNo) {
            this.weiXinOrderNo = weiXinOrderNo;
        }
    
        public String getMchOrderNo() {
            return mchOrderNo;
        }
    
        public void setMchOrderNo(String mchOrderNo) {
            this.mchOrderNo = mchOrderNo;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
        public String getBank() {
            return bank;
        }
    
        public void setBank(String bank) {
            this.bank = bank;
        }
    
        public String getCurrency() {
            return currency;
        }
    
        public void setCurrency(String currency) {
            this.currency = currency;
        }
    
        public String getAmount() {
            return amount;
        }
    
        public void setAmount(String amount) {
            this.amount = amount;
        }
    
        public String getEnvelopeAmount() {
            return envelopeAmount;
        }
    
        public void setEnvelopeAmount(String envelopeAmount) {
            this.envelopeAmount = envelopeAmount;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPacket() {
            return packet;
        }
    
        public void setPacket(String packet) {
            this.packet = packet;
        }
    
        public String getPoundage() {
            return poundage;
        }
    
        public void setPoundage(String poundage) {
            this.poundage = poundage;
        }
    
        public String getRate() {
            return rate;
        }
    
        public void setRate(String rate) {
            this.rate = rate;
        }
        
        
        //date 为账单时间 格式 2018-12-25
        //result  接口返回数据
        public static List<Bill> analyze(String result ,String date){
            List<Bill> bills = new ArrayList<Bill>();
            String tradeMsg = result.substring(result.indexOf("`")); //去标题
            String tradeInfo = tradeMsg.substring(0, tradeMsg.indexOf("总")).replaceFirst(date,"").replaceAll("`","");;// 去掉汇总数据
            String[] tradeArray = tradeInfo.split(date); //通过交易时间分隔   订单数
            for(String trade : tradeArray){
                String[] order = trade.split(",");
                Bill bill = new Bill();
                bill.setDate(date+order[0]);
                bill.setAppId(order[1]);
                bill.setMch_id(order[2]);
                bill.setSubMch_id(order[3]);
                bill.setDevice_info(order[4]);
                bill.setWeiXinOrderNo(order[5]);
                bill.setMchOrderNo(order[6]);
                bill.setUserId(order[7]);
                bill.setType(order[8]);
                bill.setStatus(order[9]);
                bill.setBank(order[10]);
                bill.setCurrency(order[11]);
                bill.setAmount(order[12]);
                bill.setEnvelopeAmount(order[13]);
                bill.setName(order[14]);
                bill.setPacket(order[15]);
                bill.setPoundage(order[16]);
                bill.setRate(order[17]);
                bill.setOrderAmount(order[18]);
                bills.add(bill);
            }
            return bills;
        }
    
        public static void main(String[] args) {
            String result = "交易时间,公众账号ID,商户号,特约商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,应结订单金额,代金券金额,商品名称,商户数据包,手续费,费率,订单金额,费率备注" +
                    "`2018-12-25 11:24:26,`wx5c60835f5f7a3f8a,`1270239901,`0,`,`4200000225201812255017455831,`D20181225101152818265,`oXlfr0LZH7Yuic1RseBqRHYQFryE,`JSAPI,`SUCCESS,`CFT,`CNY,`0.01,`0.00," +
                    "`会员开通,`,`0.00000,`0.60%,`0.01,``2018-12-25 11:08:51,`wx5c60835f5f7a3f8a,`1270239901,`0,`,`4200000233201812252592864627,`D20181225101063139810,`oXlfr0LZH7Yuic1RseBqRHYQFryE,`" +
                    "JSAPI,`SUCCESS,`CFT,`CNY,`0.01,`0.00,`会员开通,`,`0.00000,`0.60%,`0.01,`总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额`2,`0.02,`0.00,`0.00,`0.00000,`0.02,`0.00";
            List<Bill> bills = Bill.analyze(result,"2018-12-25");
    
        }
    }
    

     

    展开全文
  • 查询对账单下载地址接口demo(JAVA)版本 本人实测之后写的demo,只需要配置你自己的参数信息即可测试,欢迎下载学习
  • 最近接手了一个棘手的工作:微信下载对账单。刚接手完全懵逼,怎么和微信对接啊。然后就是百度。。终于找到了组织:微信支付|开发文档 :点击跳转通过文档我们可以看到,首先是:1.下载对账单开放接口链接:...

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

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

    终于找到了组织:

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

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

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

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

    关于应用场景:

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

    注意:

    1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;

    2、微信在次日9点启动生成前一天的对账单,建议商户10点后再获取;

    3、对账单中涉及金额的字段单位为“元”。

    4、对账单接口只能下载三个月以内的账单。

    2.传入的参数:

    接着我们看下传入参数:

    17cc8969c3bd237208611ccf285e0184.png

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

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

    看一下查詢代码:

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    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);

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    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";//微信支付证书存放路径地址

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    3.随机数:

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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    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;

    }

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    4.关于签名:

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

    ①格式是:utf-8;

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

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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    public static String createSign(String characterEncoding,SortedMap 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;

    }

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    例如这样:

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    wx2421b1c4370ec43b

    20141110

    ALL

    10000100

    21df7dc9cd8616b56919f20d9f679233

    332F17B766FC787203EBE9D6E40457A1

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    代码:

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    public static String getRequestXml(SortedMap parameters){

    StringBuffer sb = new StringBuffer();

    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("");

    return sb.toString();

    }

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    5.返回值解析:

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

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

    80654eb2e170a7d3498ec7bbf82c2e45.png

    下面是错误码:

    c0cf10ad1b92fb269cdb83c202fb7e1c.png

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

    176202041ebfd092f96ae7e69a38fbca.png

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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    ①把第一行表头去掉

    代码为:

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

    数据为:

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    `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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    代码为:

    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(",");

    }

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

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

    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);

    ea8f5ef1727fc09fe3a5db0131dfe081.gif

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

    后记

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

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

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

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

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

    终于找到了组织:

    微信支付|开发文档 :

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

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

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

    关于应用场景:

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

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

    2.传入的参数:

    接着我们看下传入参数:

    5fee5f1a572a5d68dc3ac0a89a683a96.png

    其中,微信分配的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 。并且格式是下图。

    79234cf91ad8a5e9bb530c8cfc4082ac.png

    下面是错误码:

    c1eaf557c42223c432d02250a3b94315.png

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

    c99a89eb5865dd06ce850ce5f83c2836.png

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

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

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

    后记

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

    展开全文
  • importjava.math.BigDecimal;importjava.io.Serializable;importjava.util.Date; @TableName("wx_reconciliation")public class WxReconciliationEntity implementsSerializable {private static final long ...

    packagecom.dlc.modules.business.entity;importcom.baomidou.mybatisplus.annotations.TableField;importcom.baomidou.mybatisplus.annotations.TableId;importcom.baomidou.mybatisplus.annotations.TableName;importcom.baomidou.mybatisplus.enums.FieldFill;importcom.fasterxml.jackson.annotation.JsonFormat;importjava.math.BigDecimal;importjava.io.Serializable;importjava.util.Date;

    @TableName("wx_reconciliation")public class WxReconciliationEntity implementsSerializable {private static final long serialVersionUID = 1L;/*** 主键id*/@TableIdprivateLong id;/*** 微信交易时间*/

    privateDate wxTransactionTime;/*** 公众账号id*/

    privateString publicAccountId;/*** 商户号*/

    privateString merchantNumber;/*** 特约商户号*/

    privateString specialMerchantNo;/*** 创建时间*/@TableField(fill=FieldFill.INSERT)privateDate createTime;/*** 更新时间*/@TableField(fill=FieldFill.INSERT_UPDATE)privateDate updateTime;/*** 设备号*/

    privateString deviceNumber;/*** 微信订单号*/

    privateString wechatOrderNo;/*** 商户订单号*/

    privateString merchantOrderNumber;/*** 用户标识*/

    privateString userId;/*** 交易类型*/

    privateString transactionType;/*** 交易状态*/

    privateString tradingStatus;/*** 付款银行*/

    privateString payingBank;/*** 货币种类*/

    privateString currencyType;/*** 应结订单金额*/

    privateBigDecimal orderAmountToBeSettled;/*** 代金券金额*/

    privateBigDecimal voucherAmount;/*** 微信退款单号*/

    privateString wechatRefundNo;/*** 商户退款单号*/

    privateString merchantRefundNo;/*** 退款金额*/

    privateBigDecimal refundAmount;/*** 充值券退款金额*/

    privateBigDecimal refundAmountOfRechargeVoucher;/*** 退款类型*/

    privateString refundType;/*** 退款状态*/

    privateString refundStatus;/*** 商品名称*/

    privateString tradeName;/*** 商户数据包*/

    privateString merchantPacket;/*** 手续费*/

    privateBigDecimal serviceCharge;/*** 费率*/

    privateString rate;/*** 订单金额*/

    privateBigDecimal orderAmount;/*** 申请退款金额*/

    privateBigDecimal applicationForRefundAmount;/*** 费率备注*/

    privateString rateNotes;publicLong getId() {returnid;

    }public voidsetId(Long id) {this.id =id;

    }publicDate getWxTransactionTime() {returnwxTransactionTime;

    }public voidsetWxTransactionTime(Date wxTransactionTime) {this.wxTransactionTime =wxTransactionTime;

    }publicString getPublicAccountId() {returnpublicAccountId;

    }public voidsetPublicAccountId(String publicAccountId) {this.publicAccountId =publicAccountId;

    }publicString getMerchantNumber() {returnmerchantNumber;

    }public voidsetMerchantNumber(String merchantNumber) {this.merchantNumber =merchantNumber;

    }publicString getSpecialMerchantNo() {returnspecialMerchantNo;

    }public voidsetSpecialMerchantNo(String specialMerchantNo) {this.specialMerchantNo =specialMerchantNo;

    }publicDate getCreateTime() {returncreateTime;

    }public voidsetCreateTime(Date createTime) {this.createTime =createTime;

    }publicDate getUpdateTime() {returnupdateTime;

    }public voidsetUpdateTime(Date updateTime) {this.updateTime =updateTime;

    }publicString getDeviceNumber() {returndeviceNumber;

    }public voidsetDeviceNumber(String deviceNumber) {this.deviceNumber =deviceNumber;

    }publicString getWechatOrderNo() {returnwechatOrderNo;

    }public voidsetWechatOrderNo(String wechatOrderNo) {this.wechatOrderNo =wechatOrderNo;

    }publicString getMerchantOrderNumber() {returnmerchantOrderNumber;

    }public voidsetMerchantOrderNumber(String merchantOrderNumber) {this.merchantOrderNumber =merchantOrderNumber;

    }publicString getUserId() {returnuserId;

    }public voidsetUserId(String userId) {this.userId =userId;

    }publicString getTransactionType() {returntransactionType;

    }public voidsetTransactionType(String transactionType) {this.transactionType =transactionType;

    }publicString getTradingStatus() {returntradingStatus;

    }public voidsetTradingStatus(String tradingStatus) {this.tradingStatus =tradingStatus;

    }publicString getPayingBank() {returnpayingBank;

    }public voidsetPayingBank(String payingBank) {this.payingBank =payingBank;

    }publicString getCurrencyType() {returncurrencyType;

    }public voidsetCurrencyType(String currencyType) {this.currencyType =currencyType;

    }publicBigDecimal getOrderAmountToBeSettled() {returnorderAmountToBeSettled;

    }public voidsetOrderAmountToBeSettled(BigDecimal orderAmountToBeSettled) {this.orderAmountToBeSettled =orderAmountToBeSettled;

    }publicBigDecimal getVoucherAmount() {returnvoucherAmount;

    }public voidsetVoucherAmount(BigDecimal voucherAmount) {this.voucherAmount =voucherAmount;

    }publicString getWechatRefundNo() {returnwechatRefundNo;

    }public voidsetWechatRefundNo(String wechatRefundNo) {this.wechatRefundNo =wechatRefundNo;

    }publicString getMerchantRefundNo() {returnmerchantRefundNo;

    }public voidsetMerchantRefundNo(String merchantRefundNo) {this.merchantRefundNo =merchantRefundNo;

    }publicBigDecimal getRefundAmount() {returnrefundAmount;

    }public voidsetRefundAmount(BigDecimal refundAmount) {this.refundAmount =refundAmount;

    }publicBigDecimal getRefundAmountOfRechargeVoucher() {returnrefundAmountOfRechargeVoucher;

    }public voidsetRefundAmountOfRechargeVoucher(BigDecimal refundAmountOfRechargeVoucher) {this.refundAmountOfRechargeVoucher =refundAmountOfRechargeVoucher;

    }publicString getRefundType() {returnrefundType;

    }public voidsetRefundType(String refundType) {this.refundType =refundType;

    }publicString getRefundStatus() {returnrefundStatus;

    }public voidsetRefundStatus(String refundStatus) {this.refundStatus =refundStatus;

    }publicString getTradeName() {returntradeName;

    }public voidsetTradeName(String tradeName) {this.tradeName =tradeName;

    }publicString getMerchantPacket() {returnmerchantPacket;

    }public voidsetMerchantPacket(String merchantPacket) {this.merchantPacket =merchantPacket;

    }publicBigDecimal getServiceCharge() {returnserviceCharge;

    }public voidsetServiceCharge(BigDecimal serviceCharge) {this.serviceCharge =serviceCharge;

    }publicString getRate() {returnrate;

    }public voidsetRate(String rate) {this.rate =rate;

    }publicBigDecimal getOrderAmount() {returnorderAmount;

    }public voidsetOrderAmount(BigDecimal orderAmount) {this.orderAmount =orderAmount;

    }publicBigDecimal getApplicationForRefundAmount() {returnapplicationForRefundAmount;

    }public voidsetApplicationForRefundAmount(BigDecimal applicationForRefundAmount) {this.applicationForRefundAmount =applicationForRefundAmount;

    }publicString getRateNotes() {returnrateNotes;

    }public voidsetRateNotes(String rateNotes) {this.rateNotes =rateNotes;

    }

    @OverridepublicString toString() {return "WxReconciliationEntity [id=" + id + ", wxTransactionTime=" + wxTransactionTime + ", publicAccountId="

    + publicAccountId + ", merchantNumber=" + merchantNumber + ", specialMerchantNo=" +specialMerchantNo+ ", createTime=" + createTime + ", updateTime=" + updateTime + ", deviceNumber=" +deviceNumber+ ", wechatOrderNo=" + wechatOrderNo + ", merchantOrderNumber=" + merchantOrderNumber + ", userId="

    + userId + ", transactionType=" + transactionType + ", tradingStatus=" + tradingStatus + ", payingBank="

    + payingBank + ", currencyType=" + currencyType + ", orderAmountToBeSettled=" +orderAmountToBeSettled+ ", voucherAmount=" + voucherAmount + ", wechatRefundNo=" + wechatRefundNo + ", merchantRefundNo="

    + merchantRefundNo + ", refundAmount=" + refundAmount + ", refundAmountOfRechargeVoucher="

    + refundAmountOfRechargeVoucher + ", refundType=" + refundType + ", refundStatus=" +refundStatus+ ", tradeName=" + tradeName + ", merchantPacket=" + merchantPacket + ", serviceCharge=" +serviceCharge+ ", rate=" + rate + ", orderAmount=" + orderAmount + ", applicationForRefundAmount="

    + applicationForRefundAmount + ", rateNotes=" + rateNotes + "]";

    }

    }

    展开全文
  • Java 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)**需求****流程**1 、调用支付宝接口, 获取zip 下载地址2、工具类代码3、目录4、开发环境5、更新实际收益到本地数据库查询 需求 定时任务:每天统计昨天...
  • 对账单数据 请求下载对账单的api方法 Map resp = wxpay.downloadBill(data); String s = resp.get("data"); 对于数据返回的 比较麻烦,所以用bean对其进行处理,方便装换成我们需要的数据类型 接收的数据bean public ...
  • 银行存款对账要怎么做,在会计行业经常会遇到此类问题,下面由数豆子为大家整理相关内容,一起来看看吧。资金是企业得以生存和发展的“血液”,是企业实现价值最大化的依赖,货币资金也是企业在生产经营过程中以货币...
  • 生成对账文件_实现

    2021-03-16 14:58:34
    packagecom.seaway.open.open_bank_luoyang_...importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;im...
  • 支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,成功时,微信账单接口返回数据以文本表格的方式返回,第一行为表头,后面各行为对应的字段内容,字段内容跟查询订单或退款结果一致...
  • 由于银行对账的滞后性和对账单回收少以及对账员与柜员等参与人员没有彻底分离等弊端的存在,给了不法分子可乘之机。这必然会给银企乃 至国家带来严重的经济损失。所以,银企对账的各个环节我们都要重视起来,严加...
  • 银行存款对账方法

    2021-03-09 23:53:51
    1.某企业200x年7月31日银行存款的帐面余额为535,000元,开户银行送来对帐,其银行存款余额为508,000元。经查对,发现有以下几笔未达帐项:(1)7月30日,委托银行收款50,000元,银...1.某企业200x年7月31日银行...
  • 微信下载对账单并解析

    千次阅读 2019-05-08 17:45:43
    // 下载对账单的日期,格式:20140603,日期不可为当天。 // bill_type:ALL返回当日所有订单信息,默认值SUCCESS返回当日成功支付的订单。REFUND,返回当日退款订单 parameters.put("bill_type", "SUCCESS"); ...
  • oracle导入银行对账单This is another entry in my ‘Previously Unpublicised Code’ series – explanations of code that has been sitting on my Github profile for ages, but has never been discussed ...
  • 中行对账单打印工具

    2018-11-08 17:16:57
    银行通知打印,可以换成其他通知打印。涉及PDF文件生成、条码生成打印、文本文件数据读取等,通知可直接打印,也可以生成PDF文件再合并打印,以便提高打印速度。需要看代码的可以输入工程密码,密码是我的...
  • 本篇文章主要聊聊如何设计千万级别的对账系统。其他一些业务问题可以参看对账清分设计总概览。 目前系统运行的对账总情况:对账日交易量两千万,交易金额50亿,对账时间5分钟以内 本篇文章分两个模块 第一个模块主要...
  • 前言对账系统作为支付系统中的基石系统,处于整个支付环节中的最后一层,主要用来保证我方支付数据与第三方支付渠道或银行的数据一致性。在没有对账系统之前,财务在第二日手工核对前一日的应收与实收。倘若不一致,...
  • 我是做技术的,为什么会要写产品...本系列的第一篇,会说一说对账系统的框架是什么样子的,都有什么。对账是做什么呢?说起来很简单,通俗讲就是,你该收到的和你真收到的是否一致,你该给的和你真给的是否一致。...
  • 标题:微信对账单地址:功能:pom文件实体类方法:查询的当天n-2的 微信对账单地址: 链接:https://pay.weixin.qq.com/wiki/doc/api/app/app_jw.php?chapter=9_6&index=8 功能: << 商户可以通过该接口...
  • 微信支付对账单下载

    千次阅读 2019-04-10 17:39:44
    微信对账单查询 应用场景 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。 注意: 1、微信侧未成功下单的交易不会出现在对账单中。支付...
  • 微信对账单转excel

    千次阅读 2018-09-06 17:09:25
    String fileName = "微信对账_" + DateUtils.getDate("yyyy-MM-dd") + ".xlsx"; response.setContentType("application/octet-stream; charset=utf-8"); // 设置下载文件名 response.addHeader("Content-...
  • 1:银行对账期初录入:出纳管理——银行对账——银行对账期初——选择科目确定——选取该银行账户...2:银行对账单录入:出纳管理——银行对账——银行对账单——选择科目——增加——录入银行对账单。3:银行对账:...
  • 微信支付对账单查询获取

    千次阅读 2020-07-01 19:54:57
    微信支付对账单查询获取 第一步:拼接请求参数(xml格式) 请求字段说明 appid 微信公众号开发者ID 必填 nonce_str 随机字符串 必填长度不长于32位(可用随机字符串生成工具类生成) mch_id 微信商户号id 必填 bill_...
  • } 对多个公众号进行统一管理,一次性获取全部对账单 /* * 获取昨日微信支付账单 * 1.查询微信公众号号配置 * 2.分别获取支付账单请求,并保存请求记录 * 3.解析微信返回账单数据,并保存到数据库 * 4.更新任务进程...
  • 【实例简介】农业银行TrustPayClient-Java接口文档, 2019年,V3.1.6,接口demo【实例截图】【核心代码】TrustPayClient-Java-V3.1.6├── TrustPayClient-Java-V3.1.6│ ├── ABCIcon│ │ ├── abcicon1.jpg...
  • 对账系统设计

    2021-03-13 00:39:19
    更多支付内容请移步个人站:YKBLog.top对账整体设计从整体来看,按照时序维度的先后,系统对账主要分为三阶段的工作。分别是数据准备、数据核对和差错处理。数据准备细分一下,又分为文件获取、文件解析、数据清洗。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,087
精华内容 434
关键字:

java银行对账单

java 订阅