Java 微信对账单


前言

微信对账单官方地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6

一、需求来源

公司需要做一个邮费支付的核验机制,其原理就是第二天轮询昨天的微信对账单数据,看是否存在已经支付过的数据而我这边的数据没有改变,如果存在,则调用相关方法改变数据状态

二、解题思路

1.封装请求参数,调用微信对账单接口

appid:公众号id
mchId:商户号
pub32tr2:API密钥(key)
以上参数我是通过@Value注解的方式添加进去的。
其中WxPayUtil方法如下,直接调用即可:

public class WxPayUtil {


    public static  String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname)) {
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            } else {
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
            }
        } catch (Exception exception) {
        }
        return resultString;
    }

    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            resultSb.append(byteToHexString(b[i]));
        }

        return resultSb.toString();
    }
    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0) {
            n += 256;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    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 = entry.getKey().toString();
            String v = entry.getValue().toString();
            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
                sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
            } else {
                sb.append("<" + k + ">" + v + "</" + k + ">");
            }
        }
        sb.append("</xml>");
        return sb.toString();
    }

    public static String getRandomString(int length) {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

}

2.解析返回的数据


    // 2.解析微信返回的数据
    ArrayList<String> ywlshList = new ArrayList<>();
    ArrayList<String> orderList = new ArrayList<>();
    ArrayList<String> moneyList = new ArrayList<>();
    String tradeMsg = data.substring(data.indexOf("`"));
    String tradeInfo =
        tradeMsg.substring(0, tradeMsg.indexOf("总")).replace("`", "").replace("\r\n", "");
    String[] tradeArray = tradeInfo.split("%");
    HashMap<String, String> mapList = new HashMap<>();
    for (String tradeDetailInfo : tradeArray) {
      String[] tradeDetailArray = tradeDetailInfo.split(",");
      // 在这个步骤你就可以通过实体类保存相关字段信息了(如支付金额:tradeDetailArray[12])
      mapList.put(tradeDetailArray[6], tradeDetailArray[5] + "_" + tradeDetailArray[12]);
    }
    

3.通过相关数据进行判断……(涉及公司代码暂不提供)

总结

整个流程大概是这样,其实只要将对账单数据解析出来就可以了,而且下一步感觉也还可以通过下载excel表单的形式返回给用户,但是具体需要我们自己去研究。
新手小白,刚上路,有许多知识不清楚,有许多的不足之处,还望大家多多指点一下我,谢谢啦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值