zhanglin
2023-07-20 cde69bd6e9ce00b22df3690d85ea295459e3b168
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
package com.ruoyi.order.tools.service;
 
 
 
import com.ruoyi.order.tools.constant.AccountType;
import com.ruoyi.order.tools.request.ecommerce.fund.WithdrawExceptionLogRequest;
import com.ruoyi.order.tools.request.ecommerce.fund.WithdrawForPlatformRequest;
import com.ruoyi.order.tools.request.ecommerce.fund.WithdrawForSubMchRequest;
import com.ruoyi.order.tools.request.ecommerce.profitsharing.*;
import com.ruoyi.order.tools.request.ecommerce.refunds.RefundApplyRequest;
import com.ruoyi.order.tools.request.ecommerce.refunds.RefundNotifyRequest;
import com.ruoyi.order.tools.request.ecommerce.refunds.RefundNotifyRequest1;
import com.ruoyi.order.tools.request.ecommerce.subsidies.SubsidiesCancelRequest;
import com.ruoyi.order.tools.request.ecommerce.subsidies.SubsidiesCreateRequest;
import com.ruoyi.order.tools.request.ecommerce.subsidies.SubsidiesRefundRequest;
import com.ruoyi.order.tools.request.pay.bill.BillOfFundFlowRequest;
import com.ruoyi.order.tools.request.pay.bill.BillOfTradeRequest;
import com.ruoyi.order.tools.request.pay.combine.CombineTransactionsAppRequest;
import com.ruoyi.order.tools.request.pay.combine.CombineTransactionsCloseRequest;
import com.ruoyi.order.tools.request.pay.combine.CombineTransactionsJsRequest;
import com.ruoyi.order.tools.request.pay.combine.CombineTransactionsNotifyRequest1;
import com.ruoyi.order.tools.response.ecommerce.amount.AmountDayEndOfPlatformResponse;
import com.ruoyi.order.tools.response.ecommerce.amount.AmountDayEndOfSubMchResponse;
import com.ruoyi.order.tools.response.ecommerce.amount.AmountOnlineOfPlatformResponse;
import com.ruoyi.order.tools.response.ecommerce.amount.AmountOnlineOfSubMchResponse;
import com.ruoyi.order.tools.response.ecommerce.applyments.ApplymentsModifySettlementResponse;
import com.ruoyi.order.tools.response.ecommerce.applyments.ApplymentsResponse;
import com.ruoyi.order.tools.applyments.ApplymentsRequest;
import com.ruoyi.order.tools.response.ecommerce.applyments.ApplymentsSettlementStatusResponse;
import com.ruoyi.order.tools.response.ecommerce.applyments.ApplymentsStatusResponse;
import com.ruoyi.order.tools.applyments.ApplymentsModifySettlementRequest;
import com.ruoyi.order.tools.response.ecommerce.fund.WithdrawForPlatformResponse;
import com.ruoyi.order.tools.response.ecommerce.fund.WithdrawForSubMchResponse;
import com.ruoyi.order.tools.response.ecommerce.fund.WithdrawStatusForPlatformResponse;
import com.ruoyi.order.tools.response.ecommerce.fund.WithdrawStatusForSubMchResponse;
import com.ruoyi.order.tools.response.ecommerce.profitsharing.*;
import com.ruoyi.order.tools.response.ecommerce.refunds.RefundApplyResponse;
import com.ruoyi.order.tools.response.ecommerce.refunds.RefundQueryStatusResponse;
import com.ruoyi.order.tools.response.ecommerce.subsidies.SubsidiesCancelResponse;
import com.ruoyi.order.tools.response.ecommerce.subsidies.SubsidiesCreateResponse;
import com.ruoyi.order.tools.response.ecommerce.subsidies.SubsidiesRefundResponse;
import com.ruoyi.order.tools.response.pay.combine.CombineTransactionsStatusResponse;
import com.ruoyi.order.tools.response.tool.ImageUploadResponse;
 
import java.io.File;
import java.io.InputStream;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
 
public interface ProfitsSharingService {
 
    /**
     * <pre>
     * 二级商户进件API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_1.shtml
     * 电商平台,可使用该接口,帮助其二级商户进件成为微信支付商户。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/applyments/
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ApplymentsResponse> applyments(ApplymentsRequest request);
 
    /**
     * <pre>
     * 查询申请状态API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_2.shtml
     *
     * 电商平台通过查询申请状态API查询二级商户入驻申请结果。
     *
     * 注意:
     * ● 查询申请状态API可按以下两种不同方式查询:
     *     1、通过申请单ID查询申请状态;
     *     2、通过业务申编号查询申请状态
     * ● 两种不同查询方式返回结果相同
     *
     * 1、通过申请单ID查询申请状态
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/applyments/{applyment_id}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param applymentId 提交申请返回的ID
     * @return .
     */
    Optional<ApplymentsStatusResponse> queryApplymentsStatus(String applymentId);
 
    /**
     * <pre>
     * 查询申请状态API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_2.shtml
     *
     * 电商平台通过查询申请状态API查询二级商户入驻申请结果。
     *
     * 注意:
     * ● 查询申请状态API可按以下两种不同方式查询:
     *     1、通过申请单ID查询申请状态;
     *     2、通过业务申编号查询申请状态
     * ● 两种不同查询方式返回结果相同
     *
     * 2、通过业务申请编号查询申请状态
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/applyments/out-request-no/{out_request_no}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param outRequestNo 业务编号
     * @return .
     */
    Optional<ApplymentsStatusResponse> queryApplymentsStatusByOutNo(String outRequestNo);
 
    /**
     * <pre>
     * 下载平台证书API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_3.shtml
     * 由于证书有效期限制和交易安全的原因,微信支付会不定期的更换平台证书。微信支付提供了一系列接口,帮助商户后台系统实现平滑的证书更换。
     *
     * 更换指引:
     * ● 建议开发者使用中控服务器(即统一管理和分发,注意证书的保密和安全性)统一下载和管理微信支付平台证书。其他业务逻辑服务器通过该中控服务器进行报文的验签和解密。
     * ● 在微信支付更换平台证书之前,待更换的证书会提前24小时加入商户的平台证书列表。中控服务器需要定时查询商户的平台证书列表,并及时下载新的平台证书。
     * ● 在微信支付更换平台证书期间,商户收到的应答请求和回调通知中会同时存在不同的证书序列号,商户要能正确处理这种情况。
     * ● 获取平台证书的接口频率限制规则: 单个商户号 1000次/s (查单接口为600次/s)。
     *
     * 最佳实践:
     * 在中控服务器上调用;
     * 定时调用,间隔应小于12小时;
     * 与本地证书序列表对比,如果发现有新增证书序列号,则需要新换的证书。老证书会在1天内失效,应及时清理;
     * 获取到证书后,分发到各业务接口服务器。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/certificates
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @return .
     */
    List<X509Certificate> downloadCertificates();
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_4.shtml
     * 修改结算帐号API
     * 普通服务商(支付机构、银行不可用),可使用本接口修改其进件、已签约的特约商户-结算账户信息。
     *
     * 注意:
     * • 本接口无需传银行开户名称参数。
     * 若账户类型为“经营者个人银行卡”,则系统自动拉取特约商户的经营者姓名为开户名称。
     * 若账户类型为“对公银行账户”,则系统自动拉取特约商户的公司名称为开户名称。
     * 接口说明
     * 适用对象:普通服务商
     * 请求URL:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ApplymentsModifySettlementResponse> modifySettlement(ApplymentsModifySettlementRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_5.shtml
     * 查询结算账户API
     * 最新更新时间:2019.09.09 版本说明
     *
     * 普通服务商(支付机构、银行不可用),可使用本接口查询其进件、已签约的特约商户-结算账户信息(敏感信息掩码)。 该接口可用于核实是否成功修改结算账户信息、及查询系统汇款验证结果。
     *
     * 接口说明
     * 适用对象:普通服务商
     * 请求URL:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/settlement
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param subMchid 二级商户ID
     * @return .
     */
    Optional<ApplymentsSettlementStatusResponse> querySettlement(String subMchid);
 
    /**
     * <pre>
     * 合单下单-APP支付API.
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_1.shtml
     * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。
     * 注意:
     * • 订单如果需要进行抽佣等,需要在合单中指定需要进行分账(profit_sharing为true);指定后,交易资金进入二级商户账户,处于冻结状态,可在后续使用分账接口进行分账,利用分账完结进行资金解冻,实现抽佣和对二级商户的账期。
     * • 合单中同一个二级商户只允许有一笔子订单。
     *
     * 适用对象:电商平台 服务商 直连商户
     * 请求URL:https://api.mch.weixin.qq.com/v3/combine-transactions/app
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return 预支付交易会话标识, 数字和字母。微信生成的预支付会话标识,用于后续接口调用使用。
     */
        Optional<String> combineTransactions(CombineTransactionsAppRequest request);
 
    /**
     * <pre>
     * 合单下单-JS支付API.
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_2.shtml
     * 使用合单支付接口,用户只输入一次密码,即可完成多个订单的支付。目前最多一次可支持50笔订单进行合单支付。
     * 注意:
     * • 订单如果需要进行抽佣等,需要在合单中指定需要进行分账(profit_sharing为true);指定后,交易资金进入二级商户账户,处于冻结状态,可在后续使用分账接口进行分账,利用分账完结进行资金解冻,实现抽佣和对二级商户的账期。
     * • 合单中同一个二级商户只允许有一笔子订单。
     * 适用对象:电商平台 服务商 直连商户
     * 请求URL:https://api.mch.weixin.qq.com/v3/combine-transactions/jsapi
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return 预支付交易会话标识, 数字和字母。微信生成的预支付会话标识,用于后续接口调用使用。
     */
    Optional<String> combineTransactions(CombineTransactionsJsRequest request);
 
    /**
     * <pre>
     * 合单查询订单API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_3.shtml
     * 电商平台通过合单查询订单API查询订单状态,完成下一步的业务逻辑。
     * 注意:
     * • 需要调用查询接口的情况:
     * 1、当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知。
     * 2、调用支付接口后,返回系统错误或未知交易状态情况。
     * 3、调用刷卡支付API,返回USERPAYING的状态。
     * 4、调用关单或撤销接口API之前,需确认支付状态。
     * 适用对象:电商平台 服务商 直连商户
     * 请求URL:https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/{combine_out_trade_no}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param combineOutTradeNo 合单支付总订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一 。
     * @return 订单详情
     */
    Optional<CombineTransactionsStatusResponse> combineTransactionsStatus(String combineOutTradeNo);
 
    /**
     * <pre>
     * 合单关闭订单API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/combine/chapter3_4.shtml
     * 合单支付订单只能使用此合单关单api完成关单。
     *
     * 适用对象:电商平台 服务商 直连商户
     * 请求URL:https://api.mch.weixin.qq.com/v3/combine-transactions/out-trade-no/{combine_out_trade_no}/close
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     * <p>
     * 没有数据,返回状态码204(一般情况)
     * <p>
     * 状态码    错误码    描述    解决方案
     * 202    USERPAYING    用户支付中,需要输入密码    等待5秒,然后调用被扫订单结果查询API,查询当前订单的不同状态,决定下一步的操作
     * 403    TRADE_ERROR    交易错误    因业务原因交易失败,请查看接口返回的详细信息
     * 500    SYSTEMERROR    系统错误    系统异常,请用相同参数重新调用
     * 401    SIGN_ERROR    签名错误    请检查签名参数和方法是否都符合签名算法要求
     * 403    RULELIMIT    业务规则限制    因业务规则限制请求频率,请查看接口返回的详细信息
     * 400    PARAM_ERROR    参数错误    请根据接口返回的详细信息检查请求参数
     * 403    OUT_TRADE_NO_USED    商户订单号重复    请核实商户订单号是否重复提交
     * 404    ORDERNOTEXIST    订单不存在    请检查订单是否发起过交易
     * 400    ORDER_CLOSED    订单已关闭    当前订单已关闭,请重新下单
     * 500    OPENID_MISMATCH    openid和appid不匹配    请确认openid和appid是否匹配
     * 403    NOTENOUGH    余额不足    用户帐号余额不足,请用户充值或更换支付卡后再支付
     * 403    NOAUTH    商户无权限    请商户前往申请此接口相关权限
     * 400    MCH_NOT_EXISTS    商户号不存在    请检查商户号是否正确
     * 500    INVALID_TRANSACTIONID    订单号非法    请检查微信支付订单号是否正确
     * 400    INVALID_REQUEST    无效请求    请根据接口返回的详细信息检查
     * 429    FREQUENCY_LIMITED    频率超限    请降低请求接口频率
     * 500    BANKERROR    银行系统异常    银行系统异常,请用相同参数重新调用
     * 400    APPID_MCHID_NOT_MATCH    appid和mch_id不匹配    请确认appid和mch_id是否匹配
     * 403    ACCOUNTERROR    账号异常    用户账号异常,无需更多操作
     *
     * @param request 请求对象
     */
    void combineTransactionsClose(CombineTransactionsCloseRequest request);
 
    /**
     * @param prePayId 预下单ID
     * @param appId    appID
     * @return 用于app调起支付的参数
     */
    Map<String, String> getAppPayParams(String prePayId, String appId);
 
    /**
     * @param prePayId 预下单ID
     * @param appId    appID
     * @return 用于js调起支付的参数
     */
    Map<String, String> getJsPayParams(String prePayId, String appId);
 
    /**
     * @param prePayId 预下单ID
     * @param appId    appID
     * @return 用于小程序调起支付的参数
     */
    Map<String, String> getSmallPayParams(String prePayId, String appId);
 
    /**
     * @param timeStamp 时间戳
     * @param nonce     随机串
     * @param body      请求实体
     * @param signed    已签名字符串
     * @param serialNo  证书序列号
     * @return 验签结果
     */
    boolean verifyNotifySign(String timeStamp, String nonce, String body, String signed, String serialNo);
 
    /**
     * 对通知的数据体进行解析
     *
     * @param notifyContent 消息通知内容
     * @return 支付信息
     */
    Optional<CombineTransactionsNotifyRequest1> parsePayNotify(String notifyContent);
 
 
    /**
     * <pre>
     * 请求补差API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/subsidies/chapter3_1.shtml
     * 服务商下单的时候带上补差标识,微信订单支付成功并结算完成后,发起分账前,调用该口进行补差。
     * 注意:
     * • 电商平台下单时传入补差金额,详见【合单下单API】文档中补差字段说明。
     * • 在发起分账前,调用该接口进行补差。
     * • 补差金额需要和下单的时候传入的补差金额保持一致(发生用户退款时可以小于下单时的补差金额,须有对应的微信退款单号,任意一笔该订单的微信退款单)。
     * • 该接口支持重入,请求参数相同只会扣款一次,重入有效期180天。
     * • 系统异常(如返回SYSTEM_ERROR),请使用相同参数稍后重新调用,请务必用原参数来重入此接口,如更换金额重试,可能会导致重复扣款,系统会在1天后回退到原账户。
     *
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/subsidies/create
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<SubsidiesCreateResponse> subsidiesCreate(SubsidiesCreateRequest request);
 
    /**
     * <pre>
     * 请求补差回退API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/subsidies/chapter3_2.shtml
     * 订单发送退款的时候,可以对补贴成功的补差单发起回退。
     * 注意:
     * • 补差回退以原补差单位依据,支持多次回退,申请回退总金额不能超过补差金额。
     * • 此接口采用同步处理模式,即在接收到商户请求后,会实时返回处理结果。
     * • 补差回退的前置条件是订单发生退款。
     * • 系统异常(如返回SYSTEM_ERROR),请使用相同参数稍后重新调用,请务必用原商户补差回退单号和原参数来重入此接口。
     *
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/subsidies/return
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<SubsidiesRefundResponse> subsidiesRefund(SubsidiesRefundRequest request);
 
    /**
     * <pre>
     * 取消补差API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/subsidies/chapter3_3.shtml
     * 对带有补差标识的订单,如果不需要补差,可在发起发起分账前,可调用这个接口进行取消补差。
     * 注意:
     * • 取消补差完成后,商户可以对未补差的订单进行分账。
     * • 订单补差取消的前置条件是订单发生退款。
     *
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/subsidies/cancel
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<SubsidiesCancelResponse> subsidiesCancel(SubsidiesCancelRequest request);
 
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_1.shtml
     * 请求分账API
     * 最新更新时间:2020.2.27 版本说明
     *
     * 微信订单支付成功后,由电商平台发起分账请求,将结算后的资金分给分账接收方。
     *
     * 注意:
     * • 微信订单支付成功后,服务商代特约商户发起分账请求,将结算后的钱分到分账接收方。
     * • 对同一笔订单最多能发起20次分账请求,每次请求最多分给5个接收方。
     * • 此接口采用异步处理模式,即在接收到商户请求后,会先受理请求再异步处理,最终的分账结果可以通过查询分账接口获取。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/orders
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingApplyResponse> applyProfitSharing(ProfitSharingApplyRequest request);
 
    /**
     * @return 平台的商户ID
     */
    Optional<String> getPlatformId();
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_2.shtml
     *
     * 返回上一层文档首页 / 电商收付通 / 分账 / 查询分账结果API
     * 查询分账结果API
     * 最新更新时间:2020.04.01 版本说明
     *
     * 发起分账请求后,可调用此接口查询分账结果 ;发起分账完结请求后,可调用此接口查询分账完结的结果
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/orders
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingQueryApplyResponse> queryProfitSharingStatus(ProfitSharingQueryApplyRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
     * 请求分账回退API
     * 最新更新时间:2019.09.11 版本说明
     *
     * 订单已经分账,在退款时,可以先调此接口,将已分账的资金从分账接收方的账户回退给分账方,再发起退款。
     *
     * 注意:
     * • 分账回退以原分账单为依据,支持多次回退,申请回退总金额不能超过原分账单分给该接收方的金额。
     * • 此接口采用同步处理模式,即在接收到商户请求后,会实时返回处理结果。
     * • 此功能需要接收方在商户平台开启同意分账回退后,才能使用。
     * • 对同一笔分账单最多能发起20次分账回退请求。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/returnorders
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingRefundResponse> refundProfitSharing(ProfitSharingRefundRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_4.shtml
     * 查询分账回退结果API
     * 最新更新时间:2019.09.11 版本说明
     *
     * 商户需要核实回退结果,可调用此接口查询回退结果;如果分账回退接口返回状态为处理中,可调用此接口查询回退结果
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/returnorders
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingQueryRefundResponse> queryRefundProfitSharingStatus(ProfitSharingQueryRefundRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_5.shtml
     * 完结分账API
     * 最新更新时间:2019.09.11 版本说明
     *
     * 不需要进行分账的订单,可直接调用本接口将订单的金额全部解冻给特约商户。
     *
     * 注意:
     * • 调用分账接口后,需要解冻剩余资金时,调用本接口将剩余的分账金额全部解冻给特约商户。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/finish-order
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingFinishResponse> finishProfitSharing(ProfitSharingFinishRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_7.shtml
     * 添加分账接收方API
     * 最新更新时间:2020.03.05 版本说明
     *
     * 1. 电商平台可通过此接口添加分账接收方,建立分账接收方列表。后续通过发起分账请求,将电商平台下的二级商户结算后的资金,分给分账接收方列表中具体的分账接收方。
     * 2. 添加的分账接收方统一都在电商平台维度进行管理,其他二级商户,均可向该分账接收方列表中的接收方进行分账,避免在二级商户维度重复维护。
     *
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/receivers/add
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingAddReceiverResponse> addReceiver(ProfitSharingAddReceiverRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_8.shtml
     * 删除分账接收方API
     * 最新更新时间:2020.03.05 版本说明
     *
     * 电商平台发起删除分账接收方请求。删除后,不支持将电商平台下二级商户结算后的资金,分到该分账接收方。
     *
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/profitsharing/receivers/delete
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingRemoveReceiverResponse> removeReceiver(ProfitSharingRemoveReceiverRequest request);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_6.shtml
     *
     * 返回上一层文档首页 / 电商收付通 / 分账 / 分账动账通知API
     * 分账动账通知API
     * 最新更新时间:2020.03.23 版本说明
     *
     * 1、此功能仅针对分账接收方。
     * 2、分账动账金额变动后,微信会把相关变动结果发送给需要实时关注的分账接收方。
     *
     * 注意:
     * 对后台通知交互时,如果微信收到应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功
     *
     * • 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
     * • 如果在所有通知频率(4小时)后没有收到微信侧回调,商户应调用查询订单接口确认订单状态。
     *
     * 特别提醒:商户系统对于开启结果通知的内容一定要做签名验证,并校验通知的信息是否与商户侧的信息一致,防止数据泄漏导致出现“假通知”,造成资金损失。
     * 接口说明
     * 适用对象:直联商户电商服务商 服务商
     * 请求URL:该链接是通过[商户配置]提交service_notify_url设置,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例: “https://pay.weixin.qq.com/wxpay/pay.action”
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * 通知规则
     * 用户支付完成后,微信会把相关支付结果和用户信息发送给清算机构,清算机构需要接收处理后返回应答成功,然后继续给异步通知到下游从业机构。
     * 对后台通知交互时,如果微信收到应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)
     * 通知报文
     * 支付结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。
     *
     * 下面详细描述对通知数据进行解密的流程:
     * 1、用商户平台上设置的APIv3密钥【微信商户平台—&gt;账户设置—&gt;API安全—&gt;设置APIv3密钥】,记为key。
     * 2、针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data。
     * 3、使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象。
     *
     * 注: AEAD_AES_256_GCM算法的接口细节,请参考rfc5116。微信支付使用的密钥key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空。
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<ProfitSharingNotifyRequest1> parseProfitsSharingNotify(ProfitSharingNotifyRequest request);
 
    /**
     * <pre>
     * 退款申请API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_1.shtml
     * 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。
     *
     * 注意:
     * • 交易时间超过一年的订单无法提交退款。
     * • 微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号。
     * • 请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次,错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次。
     * • 每个支付订单的部分退款次数不能超过50次。
     *
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/refunds/apply
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<RefundApplyResponse> refundApply(RefundApplyRequest request);
 
    /**
     * <pre>
     * 查询退款API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_2.shtml
     * 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
     *
     * 注意:
     * ● 退款查询API可按以下两种不同方式查询:
     *     1、通过微信支付退款单号查询退款;
     *     2、通过商户退款单号查询退款。
     * ● 两种不同查询方式返回结果相同
     *
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/refunds/id/{refund_id}
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param subMchid 二级商户
     * @param refundId 退款记录ID
     * @return .
     */
    Optional<RefundQueryStatusResponse> refundQueryById(String subMchid, String refundId);
 
    /**
     * <pre>
     * 查询退款API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_2.shtml
     * 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
     *
     * 注意:
     * ● 退款查询API可按以下两种不同方式查询:
     *     1、通过微信支付退款单号查询退款;
     *     2、通过商户退款单号查询退款。
     * ● 两种不同查询方式返回结果相同
     *
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/refunds/out-refund-no/{out_refund_no}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param subMchid    二级商户
     * @param outRefundNo 退款记录单号
     * @return .
     */
    Optional<RefundQueryStatusResponse> refundQueryByNumber(String subMchid, String outRefundNo);
 
    /**
     * 对通知的数据体进行解析
     *
     * @param request 请求对象
     * @return 退款信息
     */
    Optional<RefundNotifyRequest1> parseRefundNotify(RefundNotifyRequest request);
 
    /**
     * <pre>
     * 查询二级商户账户实时余额API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/amount/chapter3_1.shtml
     *
     * 电商服务商通过此接口可以查询二级商户账户余额信息。
     *
     * 注意:
     * • 电商平台可利用分账实现对二级商户的账期,不建议电商平台利用限制二级商户提现进行账期控制,特殊情况下商户可直接到微信支付进行提现,造成账期控制无效。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/fund/balance/{sub_mchid}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param subMchid 电商平台二级商户号,由微信支付生成并下发。
     * @return .
     */
    Optional<AmountOnlineOfSubMchResponse> queryOnlineAmount(String subMchid);
 
    /**
     * <pre>
     * 查询二级商户账户日终余额API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/amount/chapter3_2.shtml
     *
     * 电商服务商通过该接口可以查询二级商户指定日期当天24点的账户余额。
     *
     * 注意:
     * • 可查询90天内的日终余额。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/fund/enddaybalance/{sub_mchid}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param subMchid 电商平台二级商户号,由微信支付生成并下发。
     * @param date     指定查询商户日终余额的日期 示例值:2019-08-17
     * @return .
     */
    Optional<AmountDayEndOfSubMchResponse> queryDayEndAmount(String subMchid, Date date);
 
    /**
     * <pre>
     * 查询电商平台账户实时余额API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/amount/chapter3_3.shtml
     *
     * 电商平台可通过此接口可以查询本商户号的账号余额情况。
     *
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/merchant/fund/balance/{account_type}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param accountType 账户类型
     * @return .
     */
    Optional<AmountOnlineOfPlatformResponse> queryOnlineAmount(AccountType accountType);
 
    /**
     * <pre>
     * 查询电商平台账户日终余额API
     * 通过此接口可以查询本商户号指定日期当天24点的账户余额。。
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/amount/chapter3_4.shtml
     *
     * 注意:
     * • 可查询90天内的日终余额。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/merchant/fund/dayendbalance/{account_type}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param accountType 账户类型
     * @param date        指定查询商户日终余额的日期 示例值:2019-08-17
     * @return .
     */
    Optional<AmountDayEndOfPlatformResponse> queryDayEndAmount(AccountType accountType, Date date);
 
    /**
     * <pre>
     * 账户余额提现API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_2.shtml
     *
     * 电商平台通过余额提现API帮助二级商户发起账户余额提现申请,完成账户余额提现。
     *
     * 注意:
     * • 相同的“商户提现单号”+“二级商户商户号”可以提供20天内防重。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/fund/withdraw
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<WithdrawForSubMchResponse> withdraw(WithdrawForSubMchRequest request);
 
    /**
     * <pre>
     * 二级商户查询提现状态API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_3.shtml
     *
     * 电商平台通过查询提现状态API查询二级商户提现单的提现结果。
     *
     * 注意:
     * • 支持查询一年内提现结果。
     *
     * 两种查询方式返回结果相同。
     *
     * 1、微信支付提现单号查询
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/fund/withdraw/{withdraw_id}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param subMchId   二级商户号
     * @param withdrawId 提现记录ID
     * @return .
     */
    Optional<WithdrawStatusForSubMchResponse> queryWithdrawStatus(String subMchId, String withdrawId);
 
    /**
     * <pre>
     * 二级商户查询提现状态API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_3.shtml
     *
     * 电商平台通过查询提现状态API查询二级商户提现单的提现结果。
     *
     * 注意:
     * • 支持查询一年内提现结果。
     *
     * 两种查询方式返回结果相同。
     *
     * 2、商户提现单号查询
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/ecommerce/fund/withdraw/out-request-no/{out_request_no}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param subMchId     二级商户ID
     * @param outRequestNo 业务编号
     * @return .
     */
    Optional<WithdrawStatusForSubMchResponse> queryWithdrawStatusByOutNo(String subMchId, String outRequestNo);
 
    /**
     * <pre>
     * 电商平台提现API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_5.shtml
     *
     * 电商平台通过该接口可将其平台的收入进行提现
     *
     * 注意:
     * • 只能在电商平台指定账户的可用余额中进行提现。
     * • 发起提现后如果微信支付正确返回了微信支付提现单号,查询状态需要隔日早上8点后进行。
     * • 查询结果可能存在延迟,提现发起后查询无单据并不代表没有发起提现,应以隔日查询结果为准判断单据是否存在。
     * • 查询结果中状态为INIT时并不代表一定未受理成功,需要等待7日后确定单据最终状态或者原单(所有请求参数保持不变)重入请求。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/merchant/fund/withdraw
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param request 请求对象
     * @return .
     */
    Optional<WithdrawForPlatformResponse> withdraw(WithdrawForPlatformRequest request);
 
    /**
     * <pre>
     * 电商平台查询提现状态API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_6.shtml
     *
     * 电商平台通过该接口查询其提现结果
     *
     * 注意:
     * • 发起提现后如果微信支付正确返回了微信支付提现单号,查询状态需要隔日早上8点后进行。
     * • 查询结果可能存在延迟,提现发起后查询无单据并不代表没有发起提现,应以隔日查询结果为准判断单据是否存在。
     * • 查询结果中状态为INIT时并不代表一定未受理成功,需要等待7日后确定单据最终状态或者原单(所有请求参数保持不变)重入请求。
     * • 可查询90天内的提现数据,时间以微信支付提现单创建时间为准。
     *
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/merchant/fund/withdraw/out-request-no/{out_request_no}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param outRequestNo 业务编号
     * @return .
     */
    Optional<WithdrawStatusForPlatformResponse> queryWithdrawStatus(String outRequestNo);
 
    /**
     * <pre>
     * 按日下载提现异常文件API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_4.shtml
     *
     * 电商服务商按日查询并下载提现状态为异常的提现单,提现异常包括提现失败和银行退票。
     *
     * 注意:
     * • 每日09:00开始可以下载前一日的提现异常文件,支持下载90天内提现状态变为提现异常的提现单文件。
     * • 日期(date)字段为提现状态变为提现异常的日期。建议输入日期为昨日,每天定时(早上9点后)查询昨日是否有状态为异常的提现单。
     * • 电商服务商查询的结果包括电商服务商发起的提现和给电商二级商户发起的提现。
     *
     * • 同一笔提现的相同数据可能出现在不同日期。即提现单A的失败数据,可能同时出现在1日和3日。
     * • 历史数据如果有某一日遗漏,则系统会补入当天的账单中。例如:今日为2019-11-15日,发现2019-11-12日某数据遗漏,则该数据会补入2019-11-15日。
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/merchant/fund/withdraw/bill-type/{bill_type}
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return 下载文件的地址
     */
    Optional<String> downloadWithdrawExceptionFile(WithdrawExceptionLogRequest request);
 
    /**
     * <pre>
     * 申请交易账单API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/bill/chapter3_1.shtml
     *
     * 微信支付按天提供交易账单文件,商户可以通过该接口获取账单文件的下载地址。文件内包含交易相关的金额、时间、营销等信息,供商户核对订单、退款、银行到账等情况。
     *
     * 注意:
     * • 微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;
     * • 对账单中涉及金额的字段单位为“元”;
     * • 对账单接口只能下载三个月以内的账单。
     * • 小微商户不单独提供对账单下载,如有需要,可在调取“下载对账单”API接口时不传sub_mch_id,获取服务商下全量电商二级商户(包括小微商户和非小微商户)的对账单。
     * 接口说明
     * 适用对象:电商平台 服务商 直连商户
     * 请求URL:https://api.mch.weixin.qq.com/v3/bill/tradebill
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return 下载文件的地址
     */
    Optional<String> downloadTradeBill(BillOfTradeRequest request);
 
    /**
     * <pre>
     * 申请资金账单API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/bill/chapter3_2.shtml
     *
     * 微信支付按天提供微信支付账户的资金流水账单文件,商户可以通过该接口获取账单文件的下载地址。文件内包含该账户资金操作相关的业务单号、收支金额、记账时间等信息,供商户进行核对。
     *
     * 注意:
     * • 资金账单中的数据反映的是商户微信支付账户资金变动情况;
     * • 对账单中涉及金额的字段单位为“元”。
     * 接口说明
     * 适用对象:电商平台 服务商 直连商户
     * 请求URL:https://api.mch.weixin.qq.com/v3/bill/fundflowbill
     * 请求方式:GET
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     * </pre>
     *
     * @param request 请求对象
     * @return 下载文件的地址
     */
    Optional<String> downloadTradeBill(BillOfFundFlowRequest request);
 
    /**
     * <pre>
     * 下载账单API
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/bill/chapter3_3.shtml
     * 下载账单API为通用接口,交易/资金账单都可以通过该接口获取到对应的账单。
     *
     * 注意:
     * • 账单文件的下载地址的有效时间为30s。
     * • 强烈建议商户将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完整性。
     * 接口说明
     * 适用对象:电商平台 服务商 直连商户
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * </pre>
     *
     * @param downloadUrl 下载地址
     * @return .
     */
    InputStream downloadBillFile(String downloadUrl);
 
    /**
     * <pre>
     * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/chapter3_1.shtml
     * 图片上传API
     * 最新更新时间:2019.09.09 版本说明
     * 部分微信支付业务指定商户需要使用图片上传 API来上报图片信息,从而获得必传参数的值:图片MediaID 。
     *
     * 接口说明
     * 适用对象:电商平台
     * 请求URL:https://api.mch.weixin.qq.com/v3/merchant/media/upload
     * 请求主体类型:multipart/form-data
     * 请求方式:POST
     * 接口规则:https://wechatpay-api.gitbook.io/wechatpay-api-v3
     *
     * path 指该参数需在请求URL传参
     * query 指该参数需在请求JSON传参
     * </pre>
     *
     * @param file 文件
     * @return .
     */
    Optional<ImageUploadResponse> uploadImage(File file) throws Exception;
}