利用微信官方文檔下載微信對賬單呢诬、資金賬單

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庶近、參數(shù)等,需要自行去微信后臺上去找和設置

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;

    /**
     * 交易狀態(tài)
     */
    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;

    /**
     * 退款狀態(tài)
     */
    private String refundsStatus;

    /**
     * 商品名稱
     */
    private String commodityName;

    /**
     * 商戶數(shù)據(jù)包
     */
    private String dataPacket;

    /**
     * 手續(xù)費
     */
    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;

    /**
     * 微信支付業(yè)務單號
     */
    private String paymentNumber;

    /**
     * 資金流水單號
     */
    private String flowNumber;

    /**
     * 業(yè)務名稱
     */
    private String businessName;

    /**
     * 業(yè)務類型
     */
    private String businessType;

    /**
     * 收支類型
     */
    private String inoutType;

    /**
     * 收支金額(元)
     */
    private String inoutMoney;

    /**
     * 帳戶結余(元)
     */
    private String accountBalance;

    /**
     * 資金變更提交申請人
     */
    private String applicant;

    /**
     * 備注
     */
    private String remarks;

    /**
     * 業(yè)務憑證號
     */
    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 手續(xù)費賬戶
        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("資金流水總筆數(shù)");
        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.將得到的數(shù)據(jù)定時存入數(shù)據(jù)庫中

/**
     * 生成下載微信對賬單并存入數(shù)據(jù)庫任務
     */
    @Scheduled(cron = "0/10 * * * * ?")
    public void downloadWeChatBill() {
        weChatBillService.saveWeChatBill();
    }

    /**
     * 生成下載微信資金賬單并存入數(shù)據(jù)庫任務
     */
    @Scheduled(cron = "0/10 * * * * ?")
    public void downloadFundFlow() {
        weChatCapitalBillService.saveFundFlow();
    }

6.service

public interface IWeChatBillService {
    int saveWeChatBill();
}
public interface IWeChatCapitalBillService {
    int saveFundFlow();
}

7.實現(xiàn),兩個賬單存入數(shù)據(jù)庫的實現(xiàn)一樣肤京,就放一個

@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;
    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忘分,更是在濱河造成了極大的恐慌棋枕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妒峦,死亡現(xiàn)場離奇詭異重斑,居然都是意外死亡,警方通過查閱死者的電腦和手機肯骇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門窥浪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笛丙,你說我怎么就攤上這事漾脂。” “怎么了胚鸯?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵骨稿,是天一觀的道長。 經(jīng)常有香客問我姜钳,道長坦冠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任傲须,我火速辦了婚禮,結果婚禮上趟脂,老公的妹妹穿的比我還像新娘泰讽。我一直安慰自己,他們只是感情好昔期,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布已卸。 她就那樣靜靜地躺著,像睡著了一般硼一。 火紅的嫁衣襯著肌膚如雪累澡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天般贼,我揣著相機與錄音愧哟,去河邊找鬼。 笑死哼蛆,一個胖子當著我的面吹牛蕊梧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腮介,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肥矢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叠洗?” 一聲冷哼從身側響起甘改,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旅东,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后十艾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抵代,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年疟羹,在試婚紗的時候發(fā)現(xiàn)自己被綠了主守。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡榄融,死狀恐怖参淫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧杯,我是刑警寧澤涎才,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站力九,受9級特大地震影響耍铜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跌前,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一棕兼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抵乓,春花似錦伴挚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜈出,卻和暖如春田弥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铡原。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工偷厦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燕刻。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓沪哺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酌儒。 傳聞我的和親對象是個殘疾皇子辜妓,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355