| package com.doumee.core.wx.pay; | 
| import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.github.binarywang.wxpay.config.WxPayConfig; | 
| import okhttp3.HttpUrl; | 
|   | 
| import java.io.UnsupportedEncodingException; | 
| import java.security.KeyFactory; | 
| import java.security.NoSuchAlgorithmException; | 
| import java.security.PrivateKey; | 
| import java.security.Signature; | 
| import java.security.spec.PKCS8EncodedKeySpec; | 
| import java.util.Base64; | 
| import java.util.HashMap; | 
| import java.util.Map; | 
|   | 
| // Authorization: <schema> <token> | 
| // GET - getToken("GET", httpurl, "") | 
| // POST - getToken("POST", httpurl, json) | 
|   | 
| public class WxBillUtil { | 
|   | 
|     public static void getBill(){ | 
|         // 创建微信支付API对象 | 
|         WxPayConfig config = new WxPayConfig(); | 
| //        WxPay wxpay = new WxMaServiceImpl(); | 
| //        wxpay.setWxMaConfig(config); | 
|   | 
| // 设置对账单参数 | 
|         Map<String, String> data = new HashMap<>(); | 
|         data.put("bill_date", "20231001");  // 设置对账日期 | 
|         data.put("bill_type", "ALL");  // 设置对账单类型,可选值:ALL、SUCCESS、REFUND、RECHARGE_REFUND | 
|   | 
| // 调用下载对账单接口 | 
| //        Map<String, String> result = wxpay.downloadBill(data); | 
|   | 
| // 解析对账单数据 | 
| //        String billData = result.get("data"); | 
|     } | 
|   | 
|     public static void main(String[] args) { | 
|         try { | 
|             System.out.println( getToken("POST", httpurl, JSONObject.toJSONString(new JSONObject()))); | 
|         } catch (Exception e) { | 
|             throw new RuntimeException(e); | 
|         } | 
|     } | 
|     static  String url ="https://api.mch.weixin.qq.com/v3/certificates"; | 
|     static  String schema = "WECHATPAY2-SHA256-RSA2048"; | 
|     static  String yourMerchantId = "1229817002"; | 
|     static  String yourCertificateSerialNo = "3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0"; | 
|     static  String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDav+JQjIMy3o/J" + | 
|             "pwxQpHezUO9McwUD79KgfDcbmKC44anE3MdxIzxpxE6yUkvLZSUpFKyQqnPkJ5rs" + | 
|             "l4hqTOXVZCxy7JFGP+NzpQbwxponzBPzOAHEpcbz1LE5fMoKHvUBKnZNr09AY7Cc" + | 
|             "MMYaaSNKFS52j9q5QW/8oyq1SyQqcAyAE8wOZof1qPDdvxAevEKtXdPnrHkV1YFp" + | 
|             "tofiOLiixax+f+OK29xswUXyC6CNiIM1BhRhAv62re/MKPk1uGxqMxz4FmO4tDBQ" + | 
|             "il32ZvW2c9V5ZPdaRO7syZNMiSY8cYPckU9Qou57sc/pmOFNHem29dPaoIkso8LU" + | 
|             "XW2DP05ZAgMBAAECggEAQV7wggPLvWr3a1rJelv8DZFVQfJpgEiuGBmm2k9dUILX" + | 
|             "miYkT/Iovq7UmcOwNONQHJu6Ci12HqubR7LtKF88m+2ovttleqnjDg82KMQhE12Q" + | 
|             "ZLHLDXpBH2LjZ3ucYTPpIeUPn52RQHvKLpMA0Km0yxHTZckNoykkD0qvm6gN8cQm" + | 
|             "q90O+ZPIjBkgnkZQy/rvyJmgrrMCC+hUKj9hf7rUy0Z3QlpFoAUrGQR43cyNJQJB" + | 
|             "/mo1YMvjLv7i+MZhQMc5isYdynaLW9DJxmJST3PmQnT13ePMjiu4qakBXm3E1GrB" + | 
|             "ZrlR53ib8bT5uNZNGhOfSGXwn3RcLnNxKJbbleFpNQKBgQD8fVY3JUxM8RuR78e/" + | 
|             "cTk4GqM8exAUuqaaHgE7gk++zpyFCXzV5wPo1+uEwqh8hZWN+FZ5I/une+Enhnd5" + | 
|             "V+iUw1CfEd6JTTucgpR3Z4MpXyogcHOArzWI5yO2bCR/J9PEn973BJaji/DUmMmb" + | 
|             "ffiNtQfarEVmZUfz7Br1uzcBjwKBgQDdynWZvRTsB6eEWOO7x5D6cwaY1OkILdI2" + | 
|             "57FuvMo2YuiCii4s8RjjR3V8jr/eaAfHx5QEB8Xks3xUTwjhWX+ox0rzHU8b96HB" + | 
|             "0CENgBPQBbvQk/XIyDSTRQjdKI7Ab7BZiWOihKp2VDG3JtMXHSHqvr2VWdgdV/Uc" + | 
|             "2cAX2uTtlwKBgFGx6DR9n/uBQ+9rSxE5fE8X51tJYkGixwc00CdGGbFePqyZDkhT" + | 
|             "sCMlwfG53jQ0MNi30prttp5Rad+VFZEwjXOc4rglWwDH+ZLBeXJNDtZTEVlfqS+p" + | 
|             "AURjrV14DjMKWu3S4JzCYk9WlzziltD16HdJbNonRWlFOgvFiE+cHMcnAoGBAIGx" + | 
|             "aVFMOxbGZxPCMvFUgpeheaMXJWmN+dX3aE8cAJcLAXGMQfIvzeDhoXcDtnjklmAh" + | 
|             "eZFdxj+1ISffy46TGk5ks5Q0eFUfWiyOezV8xpknMSuHyfrt76iKfuNsWwV2ikXh" + | 
|             "TCz1rQRiuWujPV7Pv0yY2x2hmvmVvJRxVJ3ed23jAoGBAN4BliytMmsVURkoPJT0" + | 
|             "fprT38uqEhfSn/KL1cGYFy0aSiX7A2P7Yk0KDvcObXVJcYwEqBcfX3NDIJtPj9pO" + | 
|             "D3pVlzEUgrBcxCLRxcGqdqoZ9OdEoVgZ6tjX2D5HzD3AoCfB6OCEJzgHLNobCGmh" + | 
|             "kQiTeZj+KI3CtYbie0SS1Dou"; | 
|    static HttpUrl httpurl = HttpUrl.parse(url); | 
|   | 
|     static  String getToken(String method, HttpUrl url, String body) throws Exception { | 
|         String nonceStr = "1234542324"; | 
|         long timestamp = System.currentTimeMillis() / 1000; | 
|         String message = buildMessage(method, url, timestamp, nonceStr, body); | 
|         String signature = sign(message.getBytes("utf-8")); | 
|   | 
|         return "mchid=\"" + yourMerchantId + "\"," | 
|                 + "nonce_str=\"" + nonceStr + "\"," | 
|                 + "timestamp=\"" + timestamp + "\"," | 
|                 + "serial_no=\"" + yourCertificateSerialNo + "\"," | 
|                 + "signature=\"" + signature + "\""; | 
|     } | 
|   | 
|     static String sign(byte[] message) throws  Exception { | 
|         Signature sign = Signature.getInstance("SHA256withRSA"); | 
|         KeyFactory kf = KeyFactory.getInstance("RSA"); | 
|         sign.initSign(kf.generatePrivate( | 
|                 new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)))); | 
|         sign.update(message); | 
|   | 
|         return Base64.getEncoder().encodeToString(sign.sign()); | 
|     } | 
|   | 
|     static String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) { | 
|         String canonicalUrl = url.encodedPath(); | 
|         if (url.encodedQuery() != null) { | 
|             canonicalUrl += "?" + url.encodedQuery(); | 
|         } | 
|   | 
|         return method + "" | 
|                 + canonicalUrl + "" | 
|                 + timestamp + "" | 
|                 + nonceStr + "" | 
|                 + body + ""; | 
|     } | 
| } |