[Java]獲取微信api中的下載對賬單和下載資金賬單功能

微信官方給的sdk有點(diǎn)問題,通過百度找到了maven依賴,這個比較靠譜
添加依賴

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

重寫config

public class MyConfig implements WXPayConfig {
    private byte[] certData;

    public MyConfig() throws Exception {
        String certPath = "F:\\work\\WxPayAPI_JAVA\\java_sdk_v3.0.9\\src\\main\\resource\\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();
    }
    
    public String getAppID() {
        return "wx888888888";
    }

    public String getMchID() {
        return "1234567897";
    }

    public String getKey() {
        return "00000000000000000000000";
    }

    public InputStream getCertStream() {
        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }

    public int getHttpConnectTimeoutMs() {
        return 8000;
    }

    public int getHttpReadTimeoutMs() {
        return 10000;
    }
}

創(chuàng)建測試文件 WXPayExample.java

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config, HMACSHA256);
        Map<String, String> data = new HashMap<String, String>();
        data.put("bill_date", "20181117");
        data.put("bill_type", "ALL");

對賬單數(shù)據(jù)

請求下載對賬單的api方法

        Map<String, String> resp = wxpay.downloadBill(data);
        String s = resp.get("data");

對于數(shù)據(jù)返回的 比較麻煩,所以用bean對其進(jìn)行處理,方便裝換成我們需要的數(shù)據(jù)類型
接收的數(shù)據(jù)bean

public class PaymentPo 
    //交易時間
    private String trade_time;
    // 公眾賬號ID
    private String appid;
    //商戶號
    private String mch_id;
    //特約商戶號
    private String mch_appid;
    // 設(shè)備號
    private String device_info;
    //微信訂單號
    private String transaction_id;
    // 商戶訂單號
    private String out_trade_no;
    // 用戶標(biāo)識
    private String openid;
    // 交易類型
    private String trade_type;
    //交易狀態(tài)
    private String trade_status;
    //付款銀行
    private String pay_bank;
    //貨幣種類
    private String money_type;
    //應(yīng)結(jié)訂單金額
    private String order_pay;
    //代金券金額
    private String voucher_amount;
    //微信退款單號
    private String refund_number;
    //商戶退款單號
    private String out_refund_no;
    //退款金額
    private String refund_amount;
    //充值券退款金額
    private String refund_amount_voucher;
    //退款類型
    private String refunds_type;
    //退款狀態(tài)
    private String refunds_status;
    //商品名稱
    private String commodity_name;
    //商戶數(shù)據(jù)包
    private String data_packet;
    //手續(xù)費(fèi)
    private String service_charge;
    //費(fèi)率
    private String rate;
    //訂單金額
    private String order_amount;
    //申請退款金額
    private String application_refund_amount;
    //費(fèi)率備注
    private String rate_notes;

對于返回的 String s = resp.get("data");的結(jié)果處理:

        int i = s.indexOf("`");
        int j = s.indexOf("總");

        String substring = s.substring(i, j - 2);
        String[] temp = substring.split(",``");

        //String[] payment = temp[0].replace("`", "").split(",");
        //System.out.println(payment.length);
        ArrayList<PaymentPo> list = new ArrayList<PaymentPo>();
        for (int k = 0; k < temp.length; k++) {
            String[] payment = temp[k].replace("`", "").split(",");
            PaymentPo bean = new PaymentPo();
            for (int p = 0; p < payment.length; p++) {
                bean.setTrade_time(payment[0]);
                bean.setAppid(payment[1]);
                bean.setMch_id(payment[2]);
                bean.setMch_appid(payment[3]);
                bean.setDevice_info(payment[4]);
                bean.setTransaction_id(payment[5]);
                bean.setOut_trade_no(payment[6]);
                bean.setOpenid(payment[7]);
                bean.setTrade_type(payment[8]);
                bean.setTrade_status(payment[9]);
                bean.setPay_bank(payment[10]);
                bean.setMoney_type(payment[11]);
                bean.setOrder_pay(payment[12]);
                bean.setVoucher_amount(payment[13]);
                bean.setRefund_number(payment[14]);
                bean.setOut_refund_no(payment[15]);
                bean.setRefund_amount(payment[16]);
                bean.setRefund_amount_voucher(payment[17]);
                bean.setRefunds_type(payment[18]);
                bean.setRefunds_status(payment[19]);
                bean.setCommodity_name(payment[20]);
                bean.setData_packet(payment[21]);
                bean.setService_charge(payment[22]);
                bean.setRate(payment[23]);
                bean.setOrder_amount(payment[24]);
                bean.setApplication_refund_amount(payment[25]);
            }
            list.add(bean);
        }

        Gson gson2 = new Gson();
        String str = gson2.toJson(list);
        System.out.println(str);

轉(zhuǎn)換成json數(shù)據(jù)輸出

下載資金賬單

這個maven中沒有提供方法,但是微信官方api文檔中寫了有,那就我試試
所以,重寫了maven中的WXPay.java(就是復(fù)制一份到自己想買的目錄中),添加下載資金賬單的方法

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

下載資金賬單是需要證書的,注意用requestWithCert方法,并且 簽名類型 sign_type設(shè)置成HMAC-SHA256
下面就和下載對賬單方法一樣了

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config, HMACSHA256);
        Map<String, String> data = new HashMap<String, String>();
        data.put("bill_date", "20181117");
        data.put("account_type", "Basic");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date date = sdf.parse(data.get("bill_date"));
        int year = date.getYear() + 1900 ;

        Map<String, String> resp = wxpay.downloadfundflow(data);
        String s = resp.get("data");
        int i = s.indexOf("`");
        int j = s.indexOf("資金流水總筆數(shù)");
        String substring = s.substring(i, j);
        //方法比較簡單暴力,通過年份(比如2018 + `) 去切割,最后再把年份拼接上去
        String[] temp = substring.split("`" +year);

        ArrayList<FundFlowBean> list = new ArrayList<FundFlowBean>();
        for (int m = 1; m < temp.length; m++) {
            String[] payment = temp[m].replace("`", "").split(",");
            FundFlowBean bean = new FundFlowBean();
            for (int n = 0; n < payment.length; n++) {
                bean.setTrade_time(year + payment[0]);
                bean.setPayment_number(payment[1]);
                bean.setFlow_number(payment[2]);
                bean.setBusiness_name(payment[3]);
                bean.setBusiness_type(payment[4]);
                bean.setInout_type(payment[5]);
                bean.setInout_money(payment[6]);
                bean.setAccount_balance(payment[7]);
                bean.setApplicant(payment[8]);
                bean.setRemarks(payment[9]);
                if (payment.length==10) {
                    if (payment[9].equals("system")) {
                        bean.setVoucher_number("");
                    }
                }else if (payment.length==11){
                    bean.setVoucher_number(payment[10]);
                }

            }
            list.add(bean);
        }
        Gson gson2 = new Gson();
        String str = gson2.toJson(list);
        System.out.println(str);

用于接收資金賬單數(shù)據(jù)的bean類 FundFlowBean .class 同時生成set get方法

public class FundFlowBean 
    //記賬時間
    private String trade_time;
    //微信支付業(yè)務(wù)單號
    private String payment_number;
    //資金流水單號
    private String flow_number;
    //業(yè)務(wù)名稱
    private String business_name;
    //業(yè)務(wù)類型
    private String business_type;
    //收支類型
    private String inout_type;
    //收支金額(元)
    private String inout_money;
    //賬戶結(jié)余(元)
    private String account_balance;
    //資金變更提交申請人
    private String applicant;
    //備注
    private String remarks;
    //業(yè)務(wù)憑證號
    private String voucher_number;

到此,差不多結(jié)束,關(guān)于config中的各種id,需要去微信后臺上去找和設(shè)置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末志于,一起剝皮案震驚了整個濱河市匾二,隨后出現(xiàn)的幾起案子媒吗,更是在濱河造成了極大的恐慌,老刑警劉巖扛禽,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帝雇,居然都是意外死亡绪爸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門厕宗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画舌,“玉大人,你說我怎么就攤上這事已慢∏簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵佑惠,是天一觀的道長朋腋。 經(jīng)常有香客問我,道長膜楷,這世上最難降的妖魔是什么旭咽? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮赌厅,結(jié)果婚禮上穷绵,老公的妹妹穿的比我還像新娘。我一直安慰自己特愿,他們只是感情好仲墨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揍障,像睡著了一般目养。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毒嫡,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天混稽,我揣著相機(jī)與錄音,去河邊找鬼审胚。 笑死,一個胖子當(dāng)著我的面吹牛礼旅,可吹牛的內(nèi)容都是我干的膳叨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼痘系,長吁一口氣:“原來是場噩夢啊……” “哼菲嘴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤龄坪,失蹤者是張志新(化名)和其女友劉穎昭雌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體健田,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烛卧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妓局。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片总放。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖好爬,靈堂內(nèi)的尸體忽然破棺而出局雄,到底是詐尸還是另有隱情,我是刑警寧澤存炮,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布炬搭,位于F島的核電站,受9級特大地震影響穆桂,放射性物質(zhì)發(fā)生泄漏宫盔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一充尉、第九天 我趴在偏房一處隱蔽的房頂上張望飘言。 院中可真熱鬧,春花似錦驼侠、人聲如沸姿鸿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛预。三九已至,卻和暖如春笋熬,著一層夾襖步出監(jiān)牢的瞬間热某,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工胳螟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昔馋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓糖耸,卻偏偏與公主長得像秘遏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘉竟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理邦危,服務(wù)發(fā)現(xiàn)洋侨,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • 1.1 Spring IoC容器和bean簡介 本章介紹了Spring Framework實現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,578評論 0 8
  • 關(guān)于微信支付 生活中的微信支付 目前我們?nèi)粘I钪薪佑|得比較多的線上電子支付方式主要有兩種倦蚪,一種是支付寶希坚,另一種就...
    積_漸閱讀 3,914評論 3 26
  • 2018 5.8 星期二 天氣晴 早上起來收拾完做飯吃,叫兒子快點(diǎn)穿陵且,洗刷完快吃飯愉镰,今天咱們早去學(xué)...
    往事隨風(fēng)_452e閱讀 106評論 0 0