string datetime = DateTime. Now. AddDays ( - 1 ) . ToString ( "yyyy-MM-dd" ) ; string body = "" ; string URL = "/v3/bill/fundflowbill" + "?bill_date=" + datetime; var auth = BuildAuthAsync ( "GET" , body, URL) ; string Authorization = $"WECHATPAY2-SHA256-RSA2048 { auth } " ; string bill_date = datetime; string url = "https://api.mch.weixin.qq.com/v3/bill/fundflowbill" ; url = url + "?" + "bill_date=" + bill_date. ToString ( ) ; HttpWebRequest request = ( HttpWebRequest) WebRequest. Create ( url) ; request. Timeout = 20000 ; request. Method = "GET" ; request. KeepAlive = true ; request. Headers. Add ( "Authorization" , Authorization) ; request. Accept = "application/json" ; request. UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" ; HttpWebResponse response = ( HttpWebResponse) request. GetResponse ( ) ; string postContent = new StreamReader ( response. GetResponseStream ( ) ) . ReadToEnd ( ) ; JObject json = JObject. Parse ( postContent) ; var download_url = json[ "download_url" ] . ToString ( ) ; var hash_type = json[ "hash_type" ] . ToString ( ) ; var hash_value = json[ "hash_value" ] . ToString ( ) ; if ( download_url != "" ) { int index = download_url. IndexOf ( ".com" ) + 4 ; string downurl = download_url. Substring ( index) ; var Token = BuildAuthAsync ( "GET" , body, downurl) ; Token = $"WECHATPAY2-SHA256-RSA2048 { Token } " ; string FilePath = "D:\\PublicDocumentsFile\\WaChat\\" + datetime + ".csv" ; using ( WebClient client = new WebClient ( ) ) { client. Headers. Add ( "User-Agent" , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" ) ; client. Headers. Add ( "Accept" , "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" ) ; client. Headers. Add ( "Authorization" , Token) ; byte [ ] fileData = client. DownloadData ( download_url) ; File. WriteAllBytes ( FilePath, fileData) ; } DataTable dt = ReadCSV ( FilePath) ; for ( int i = 0 ; i < dt. Rows. Count - 2 ; i++ ) { string BookkeepingTime = dt. Rows[ i] [ "记账时间" ] . ToString ( ) . Substring ( 1 ) ; string BusinessOrderNumber = dt. Rows[ i] [ "微信支付业务单号" ] . ToString ( ) . Substring ( 1 ) ; string SerialNumber = dt. Rows[ i] [ "资金流水单号" ] . ToString ( ) . Substring ( 1 ) ; string BusinessName = dt. Rows[ i] [ "业务名称" ] . ToString ( ) . Substring ( 1 ) ; string BusinessType = dt. Rows[ i] [ "业务类型" ] . ToString ( ) . Substring ( 1 ) ; string RevenueExpenditure = dt. Rows[ i] [ "收支类型" ] . ToString ( ) . Substring ( 1 ) ; decimal Amount = Convert. ToDecimal ( dt. Rows[ i] [ "收支金额(元)" ] . ToString ( ) . Substring ( 1 ) ) ; decimal AccountBalance = Convert. ToDecimal ( dt. Rows[ i] [ "账户结余(元)" ] . ToString ( ) . Substring ( 1 ) ) ; string SubmitApplicant = dt. Rows[ i] [ "资金变更提交申请人" ] . ToString ( ) . Substring ( 1 ) ; string Remarks = dt. Rows[ i] [ "备注" ] . ToString ( ) . Substring ( 1 ) ; string VoucherNumber = dt. Rows[ i] [ "业务凭证号" ] . ToString ( ) . Substring ( 1 ) ; } }
protected string BuildAuthAsync ( string method, string body, string uri) { var timestamp = DateTimeOffset. Now. ToUnixTimeSeconds ( ) ; string nonce = Path. GetRandomFileName ( ) ; string message = $" { method } \n { uri } \n { timestamp } \n { nonce } \n { body } \n" ; string signature = RequestSign ( message) ; times = timestamp. ToString ( ) ; noncerodom = nonce; sign = signature; return $"mchid=\" { mchid } \",nonce_str=\" { nonce } \",timestamp=\" { timestamp } \",serial_no=\" { serial_no } \",signature=\" { signature } \"" ; } protected string RequestSign ( string message) { X509Certificate2 cer = new X509Certificate2 ( "../../apiclient_cert.p12" , mchid, X509KeyStorageFlags. Exportable) ; if ( cer != null ) { RSA rsa = cer. GetRSAPrivateKey ( ) ; byte [ ] data = Encoding. UTF8. GetBytes ( message) ; return Convert. ToBase64String ( rsa. SignData ( data, HashAlgorithmName. SHA256, RSASignaturePadding. Pkcs1) ) ; } else { return "" ; } }
string ZFBAPPID = "" ; string ZFBPublicKey = "" ; string ZFBPrivateKey = "" ; string datetime = DateTime. Now. AddDays ( - 1 ) . ToString ( "yyyy-MM-dd" ) ; AlipayConfig alipayConfig = new AlipayConfig ( ) ; alipayConfig. ServerUrl = "https://openapi.alipay.com/gateway.do" ; alipayConfig. AppId = ZFBAPPID; alipayConfig. PrivateKey = ZFBPrivateKey; alipayConfig. Format = "json" ; alipayConfig. AlipayPublicKey = ZFBPublicKey; alipayConfig. Charset = "UTF-8" ; alipayConfig. SignType = "RSA2" ; IAopClient alipayClient = new DefaultAopClient ( alipayConfig) ; AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest ( ) ; AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel ( ) ; model. BillType = "trade" ; model. BillDate = datetime; request. SetBizModel ( model) ; AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient. Execute ( request) ; if ( response. Code == "10000" ) { string strDate = DateTime. Now. AddDays ( - 1 ) . ToString ( "yyyyMMdd" ) ; string savePath = "D:\\PublicDocumentsFile\\AliPayZIP\\" + datetime + ".zip" ; WebClient client = new WebClient ( ) ; client. DownloadFile ( response. BillDownloadUrl, savePath) ; string FilePath = "D:\\PublicDocumentsFile\\AliPay\\20884416067761510156_" + strDate + "_业务明细.csv" ; string FilePath1 = "D:\\PublicDocumentsFile\\AliPay\\20884416067761510156_" + strDate + "_业务明细(汇总).csv" ; string zipPath = savePath; string csvPath = "" ; string zipFilePath = savePath; if ( File. Exists ( FilePath) ) { File. Delete ( FilePath) ; File. Delete ( FilePath1) ; } System. IO. Compression. ZipFile. ExtractToDirectory ( zipPath, csvPath) ; DataTable dt = new DataTable ( ) ; string [ ] csvLines = File. ReadAllLines ( FilePath, Encoding. GetEncoding ( "GBK" ) ) ; string headerLine = csvLines[ 4 ] ; string [ ] headers = headerLine. Split ( ',' ) ; foreach ( string header in headers) { dt. Columns. Add ( header) ; } for ( int i = 5 ; i < csvLines. Length - 4 ; i++ ) { string [ ] data = csvLines[ i] . Split ( ',' ) ; DataRow row = dt. NewRow ( ) ; for ( int j = 0 ; j < headers. Length; j++ ) { row[ headers[ j] ] = data[ j] ; } dt. Rows. Add ( row) ; } for ( int i = 0 ; i < dt. Rows. Count; i++ ) { string AlipayTransactionNumber = dt. Rows[ i] [ "支付宝交易号" ] . ToString ( ) ; string MerchantOrderNumber = dt. Rows[ i] [ "商户订单号" ] . ToString ( ) ; string BusinessType = dt. Rows[ i] [ "业务类型" ] . ToString ( ) ; string TradeName = dt. Rows[ i] [ "商品名称" ] . ToString ( ) ; string CreationTime = dt. Rows[ i] [ "创建时间" ] . ToString ( ) ; string CompletionTime = dt. Rows[ i] [ "完成时间" ] . ToString ( ) ; string StoreNumber = dt. Rows[ i] [ "门店编号" ] . ToString ( ) ; string StoreName = dt. Rows[ i] [ "门店名称" ] . ToString ( ) ; string Operator = dt. Rows[ i] [ "操作员" ] . ToString ( ) ; string TerminalNumber = dt. Rows[ i] [ "终端号" ] . ToString ( ) ; string OppositeAccount = dt. Rows[ i] [ "对方账户" ] . ToString ( ) ; decimal Amount = Convert. ToDecimal ( dt. Rows[ i] [ "订单金额(元)" ] . ToString ( ) ) ; decimal MerchantActualReceipt = Convert. ToDecimal ( dt. Rows[ i] [ "商家实收(元)" ] . ToString ( ) ) ; decimal AlipayRedEnvelope = Convert. ToDecimal ( dt. Rows[ i] [ "支付宝红包(元)" ] . ToString ( ) ) ; decimal JiFenBao = Convert. ToDecimal ( dt. Rows[ i] [ "集分宝(元)" ] . ToString ( ) ) ; decimal AlipayDiscount = Convert. ToDecimal ( dt. Rows[ i] [ "支付宝优惠(元)" ] . ToString ( ) ) ; decimal MerchantDiscount = Convert. ToDecimal ( dt. Rows[ i] [ "商家优惠(元)" ] . ToString ( ) ) ; decimal VoucherVerificationAmount = Convert. ToDecimal ( dt. Rows[ i] [ "券核销金额(元)" ] . ToString ( ) ) ; string CouponName = dt. Rows[ i] [ "券名称" ] . ToString ( ) ; decimal ConsumptionAmount = Convert. ToDecimal ( dt. Rows[ i] [ "商家红包消费金额(元)" ] . ToString ( ) ) ; decimal CardConsumptionAmount = Convert. ToDecimal ( dt. Rows[ i] [ "卡消费金额(元)" ] . ToString ( ) ) ; string RequestNumber = dt. Rows[ i] [ "退款批次号/请求号" ] . ToString ( ) ; decimal ServiceFee = Convert. ToDecimal ( dt. Rows[ i] [ "服务费(元)" ] . ToString ( ) ) ; decimal Dividend = Convert. ToDecimal ( dt. Rows[ i] [ "分润(元)" ] . ToString ( ) ) ; string Remarks = dt. Rows[ i] [ "备注" ] . ToString ( ) ; } }