dev eaa831e9c43e cached
70 files
245.1 KB
72.2k tokens
567 symbols
1 requests
Download .txt
Showing preview only (289K chars total). Download the full file or copy to clipboard to get everything.
Repository: egzosn/pay-spring-boot-starter-parent
Branch: dev
Commit: eaa831e9c43e
Files: 70
Total size: 245.1 KB

Directory structure:
gitextract_dvzawco3/

├── .gitignore
├── LICENSE
├── README.md
├── doc/
│   └── sql/
│       └── merchant_pay.sql
├── pay-spring-boot/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── egzosn/
│                       └── pay/
│                           └── spring/
│                               └── boot/
│                                   └── core/
│                                       ├── MerchantPayServiceManager.java
│                                       ├── PayBuilder.java
│                                       ├── PayConfigurerAdapter.java
│                                       ├── PayServiceConfigurer.java
│                                       ├── PayServiceManager.java
│                                       ├── bean/
│                                       │   ├── MerchantPayOrder.java
│                                       │   └── MerchantQueryOrder.java
│                                       ├── builders/
│                                       │   ├── InMemoryMerchantDetailsServiceBuilder.java
│                                       │   ├── JdbcMerchantDetailsServiceBuilder.java
│                                       │   └── MerchantDetailsServiceBuilder.java
│                                       ├── configurers/
│                                       │   ├── DefalutPayMessageConfigurer.java
│                                       │   ├── MerchantDetailsServiceConfigurer.java
│                                       │   └── PayMessageConfigurer.java
│                                       ├── merchant/
│                                       │   ├── MerchantDetails.java
│                                       │   ├── MerchantDetailsService.java
│                                       │   ├── MerchantNotFoundException.java
│                                       │   ├── PaymentPlatform.java
│                                       │   ├── PaymentPlatformMerchantDetails.java
│                                       │   ├── PaymentPlatformServiceAdapter.java
│                                       │   └── bean/
│                                       │       ├── AliMerchantDetails.java
│                                       │       ├── CommonPaymentPlatformMerchantDetails.java
│                                       │       ├── FuiouMerchantDetails.java
│                                       │       ├── PayPalV2MerchantDetails.java
│                                       │       ├── PayoneerMerchantDetails.java
│                                       │       ├── PaypalMerchantDetails.java
│                                       │       ├── UnionMerchantDetails.java
│                                       │       ├── WxMerchantDetails.java
│                                       │       ├── WxV3MerchantDetails.java
│                                       │       └── WxYouDianMerchantDetails.java
│                                       ├── provider/
│                                       │   ├── CacheMerchantDetailsManager.java
│                                       │   ├── InMemoryMerchantDetailsManager.java
│                                       │   ├── JdbcMerchantDetailsManager.java
│                                       │   ├── MerchantDetailsManager.java
│                                       │   └── merchant/
│                                       │       └── platform/
│                                       │           ├── AliPaymentPlatform.java
│                                       │           ├── FuiouPaymentPlatform.java
│                                       │           ├── PaymentPlatforms.java
│                                       │           ├── PayoneerPaymentPlatform.java
│                                       │           ├── PaypalPaymentPlatform.java
│                                       │           ├── PaypalV2PaymentPlatform.java
│                                       │           ├── UnionPaymentPlatform.java
│                                       │           ├── WxPaymentPlatform.java
│                                       │           ├── WxV3CombinePaymentPlatform.java
│                                       │           ├── WxV3PaymentPlatform.java
│                                       │           ├── WxV3ProfitSharingPlatform.java
│                                       │           └── YoudianPaymentPlatform.java
│                                       └── utils/
│                                           └── SqlTools.java
├── pay-spring-boot-autoconfigue/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── egzosn/
│           │           └── pay/
│           │               └── spring/
│           │                   └── boot/
│           │                       └── autoconfigue/
│           │                           └── PayAutoConfiguration.java
│           └── resources/
│               └── META-INF/
│                   └── spring.factories
├── pay-spring-boot-starter/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── resources/
│               └── META-INF/
│                   └── spring.providers
├── pay-spring-boot-starter-demo/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── egzosn/
│           │           └── pay/
│           │               └── spring/
│           │                   └── boot/
│           │                       └── demo/
│           │                           ├── PayApplication.java
│           │                           ├── config/
│           │                           │   ├── MerchantPayServiceConfigurer.java
│           │                           │   ├── MyAliPaymentPlatform.java
│           │                           │   ├── handlers/
│           │                           │   │   ├── AliPayMessageHandler.java
│           │                           │   │   └── WxPayMessageHandler.java
│           │                           │   └── interceptor/
│           │                           │       └── AliPayMessageInterceptor.java
│           │                           └── controller/
│           │                               └── PayMerchantController.java
│           └── resources/
│               ├── ali/
│               │   ├── alipayCertPublicKey_RSA2.crt
│               │   ├── alipayRootCert.crt
│               │   ├── appCertPublicKey_2016080400165436.crt
│               │   └── www.egzosn.com_私钥.txt
│               └── application.yml
└── pom.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*


================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, "control" means (i) the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising
permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.

"Object" form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.

2. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.

3. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.

4. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of
this License; and
You must cause any modified files to carry prominent notices stating that You
changed the files; and
You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
If the Work includes a "NOTICE" text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.

5. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.

6. Trademarks.

This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.

7. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.

8. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "{}" replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same "printed page" as the copyright notice for easier identification within
third-party archives.

   Copyright 2018 egan

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: README.md
================================================
 # 支付聚合spring boot组件
pay-spring-boot-starter 是一个基于spring-boot实现自动化配置的支付对接, **让你真正做到一行代码实现支付聚合**, 让你可以不用理解支付怎么对接,只需要专注你的业务 


 ### 特性
      1. 项目第三方依赖极少,依托于spring boot与pay-java,项目精简,不用担心项目迁移问题
      2. 一行代码解决配置,一行代码发起支付,一行代码处理回调并且业务与支付完全隔离
      3. 项目扩展性极强极灵活,组件中暴露大量接口,实现对应接口重写加入spring容器即可覆盖全部功能
      4. 引入pay-java具体支付组件即可激活某一支付功能,代码可以不用任何修改即可使用

---
全能第三方支付对接pay-spring-boot-starter开发工具包.优雅的轻量级支付模块集成支付对接支付整合(微信,支付宝,银联,友店,富友,跨境支付paypal,payoneer(P卡派安盈)易极付)app,扫码,网页支付刷卡付条码付刷脸付转账服务商模式、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实现支付,简单快速完成支付模块的开发
 


#### 本项目在以下代码托管网站
* 码云:https://gitee.com/egzosn/pay-spring-boot-starter-parent
* GitHub:https://github.com/egzosn/pay-spring-boot-starter-parent

#### 软件架构
spring-boot  pay-java-parent

#### 本项目基础实现 pay-java-parent 全能第三方支付对接Java开发工具包.优雅的轻量级支付模块集成支付对接支付整合(微信,支付宝,银联,友店,富友,跨境支付paypal,payoneer(P卡派安盈)易极付)app,扫码,网页支付刷卡付条码付刷脸付转账服务商模式、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实现支付,简单快速完成支付模块的开发,可轻松嵌入到任何系统里 目前仅是一个开发工具包(即SDK)
* 码云:https://gitee.com/egzosn/pay-java-parent
* GitHub:https://github.com/egzosn/pay-java-parent


#### 使用教程

1. 引入 pay-spring-boot-starter
```xml
    <dependency>
        <groupId>com.egzosn</groupId>
        <artifactId>pay-spring-boot-starter</artifactId>
        <version>1.0.5</version>
    </dependency>
```
2. 引入 你需要对接的基于`pay-java-parent`支付开发包,具体支付模块 "{module-name}" 为具体的支付渠道的模块名 pay-java-ali,pay-java-wx等

```xml
    <dependency>
        <groupId>com.egzosn</groupId>
        <artifactId>{module-name}</artifactId>
        <version>2.14.9</version>
    </dependency>

```
3. 编写一个基于com.egzosn.pay.spring.boot.core.PayServiceConfigurer的子类 
```
    3.1.  并将其加入spring容器中
    3.2.  对PayServiceConfigurer的子类所实现的方法进行配置数据来源,目前提供两种方式`jdbc`与`inMemory`

```

    
4. 使用: 在你需要用到的类中注入 `com.egzosn.pay.spring.boot.core.MerchantPayServiceManager`  这个类是一个支付相关的操作类,拿到该类的引用即可对任意支付进行操作

#### 使用案例详情查看[pay-spring-boot-starter-demo](pay-spring-boot-starter-demo?dir=1&filepath=pay-spring-boot-starter-demo)


###### 支付教程 

 * [基础模块支付宝微信讲解](https://gitee.com/egzosn/pay-java-parent/wikis/Home)
 * [微信V3,查看demo/WxV3PayController](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-demo/)
 * [微信合并支付,查看demo/WxV3CombinePayController](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-demo/)
 * [微信分账,查看demo/WxV3ProfitSharingController](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-demo/)
 * [银联](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-union?dir=1&filepath=pay-java-union)
 * [payoneer](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-payoneer?dir=1&filepath=pay-java-payoneer)
 * [paypal,查看demo/PayPalV2PayController](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-demo/)
 * [友店微信](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-wx-youdian?dir=1&filepath=pay-java-youdian)
 * [富友](https://gitee.com/egzosn/pay-java-parent/blob/develop/pay-java-fuiou?dir=1&filepath=pay-java-fuiou)
 * [自定义支付宝商户/MyAliPaymentPlatform](pay-spring-boot-starter-demo?dir=1&filepath=pay-spring-boot-starter-demo)
 

作者公众号
![公众号](https://gitee.com/egzosn/pay-java-parent/raw/develop/pay-java-demo/src/main/webapp/gzh.png "gzh.png")

E-Mail:egan@egzosn.com

 **QQ群:** 


1. pay-java(1群): 542193977(已满)
2. pay-java(2群):766275051


微信群: 加我前拜托伸个小手关注公众号

![微信群](https://egzosn.gitee.io/pay-java-parent/wx.jpg "wx.jpg")




#### 参与贡献

1. Fork 本项目
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request


也感谢各大友友同学帮忙进行接口测试

非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于git flow开发流程,因此在发起Pull Request的时候请选择develop分支。



================================================
FILE: doc/sql/merchant_pay.sql
================================================

CREATE DATABASE merchant_pay;

USE `merchant_pay`;


DROP TABLE IF EXISTS `merchant_details`;

CREATE TABLE `merchant_details` (
  `details_id` char(32) NOT NULL COMMENT '列表id',
  `pay_type` varchar(16) NOT NULL COMMENT '支付类型(支付渠道) 详情查看com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform对应子类,aliPay 支付宝, wxPay微信..等等',
  `appid` varchar(32) DEFAULT NULL COMMENT '应用id',
  `mch_id` varchar(32) DEFAULT NULL COMMENT '商户id,商户号,合作伙伴id等等',
  `cert_store_type` varchar(16) DEFAULT NULL COMMENT '当前面私钥公钥为证书类型的时候,这里必填,可选值:PATH,STR,INPUT_STREAM,CLASS_PATH,URL',
  `key_private` mediumtext COMMENT '私钥或私钥证书',
  `key_public` mediumtext COMMENT '公钥或公钥证书',
  `key_cert` varchar(20480) DEFAULT NULL COMMENT 'key证书,附加证书使用,如SSL证书,或者银联根级证书方面',
  `key_cert_pwd` varchar(32) DEFAULT NULL COMMENT '私钥证书或key证书的密码',
  `notify_url` varchar(256) DEFAULT NULL COMMENT '异步回调',
  `return_url` varchar(256) DEFAULT NULL COMMENT '同步回调地址,大部分用于付款成功后页面转跳',
  `sign_type` varchar(16) NOT NULL COMMENT '签名方式,目前已实现多种签名方式详情查看com.egzosn.pay.common.util.sign.encrypt。MD5,RSA等等',
  `seller` varchar(32) DEFAULT NULL COMMENT '收款账号,暂时只有支付宝部分使用,可根据开发者自行使用',
  `sub_app_id` varchar(32) DEFAULT NULL COMMENT '子appid',
  `sub_mch_id` varchar(32) DEFAULT NULL COMMENT '子商户id',
  `input_charset` varchar(16) NOT NULL COMMENT '编码类型,大部分为utf-8',
  `is_test` tinyint(1) NOT NULL COMMENT '是否为测试环境: 0 否,1 测试环境',
  PRIMARY KEY (`details_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;




insert  into `merchant_details`(`details_id`,`pay_type`,`appid`,`mch_id`,`cert_store_type`,`key_private`,`key_public`,`key_cert`,`key_cert_pwd`,`notify_url`,`return_url`,`sign_type`,`seller`,`sub_app_id`,`sub_mch_id`,`input_charset`,`is_test`) values
 ('1','aliPay','2016080400165436','2088102169916436',NULL ,'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw==','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB',NULL,NULL,'http://pay.egzosn.com/payBack1.json','http://pay.egzosn.com/payBack1.json','RSA','2088102169916436',NULL,NULL,'UTF-8',1)
 -- 这里支付证书加载方式,需要配合定制化的代码 详情pay-spring-boot-starter-demo\src\main\java\com\egzosn\pay\spring\boot\demo\config\MyAliPaymentPlatform.java
 ('11','aliPay','2016080400165436','2088102169916436','CLASS_PATH','MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCw7MD2Cwv/jnXssFjXnGx3JlGF57gJa2aYbJRV8MnNiPVpX4Ha+8ZjnQDhvkrWH4hHmzcujOr213HqloMpUSYBzCPiXGVRUUvdimejcHHTod7nI4g6nztzzfey/TXNDHmp7vY3pOIcjB0Zn0pkNAz2tKAFkqb4raHOqTB0QA0zD24Cn+26J2UJyYRcgeH0GtSQuUrm7yaGsuKakh+qtgWF6R71n5PMGOTQ5LH3i0WVHfCBkNGgJC6yC96HR4D7cosoyKD0+lp8UB/NVUWl7Tt/KLOgFUwh0GKSYFfv56O/VBV2+xqCGE4PlZESfVuOqz5vjjxzw3xDAUJrV8hSX/AJAgMBAAECggEBAKE0d3U4B4yo/2XUIH8EdgfykCFUSum6RFbpyBauORHfksyaSzV+ZvtomN8XhhSn0oJ8OMFfgM+86nz2+zdwSxMkMCYWTfLUAi4v59KRqAVO3kz4oS3Y3FDeAK3D7XuRvGFL7GgzAhtEx1cLPrsiehVn6s5pG15GxsIIgq/JlL1J88wn1zENLrVHmD6z/JpXvfb/RS1yR+5lyoohp4g0Ph9jJ3bCyUbRpK0QkPEzgAuWL0K2ITCL7PYHNAplI8d2xHHOLF9Qdjyx+ZrQ/RxtqzfyWzhqjsmp2qlgNCxWlt3woS9UhDB+nRvjEoWTJmIOszAMYuj8wGlX+3Ui3ALOdQECgYEA25EqnFPFinUnzgNvB6NYmh5STmZun6s4bUOLqwefKtEvrOtRwTu7sB7NIf37fizG3/MJUWHxiLy2/3ub4d2JxdDNBtJoEqnp6QB12qglCNa4CajdjtJa1dR81F9QvytsqEkmPYXFPPyviB0FcSIDAGMb3IbwvIfzBPY9WY8dJnECgYEAzkg3yKEFBZ8BU0WQ+3hyfKUoAhBEnxouxRSTBcXxwstJRiqaGTVe5aoJGQI+0xS7Z6q07XDtN2t97s6DnRLWbljsX6B64itzNhXRyzjdD3iZDU/KSw7khjhXf8XOZaj9eXmACDiUnkEn1xsM8bLiRGqB8y5f3aMY/RpuACGXnxkCgYEAx/zwT9Vpr1RIfjfYcJ+Su0X0994K0roUukj0tUJK8qf4gcsQ+y1aJe/YLib1ZBaKyj7G9O5+HmqtUAUZld/AdoJZzOXmz2EeYhD+R7wxh1xz4rCBpW3qOKvDS3jJxmZaIOoHv6/RWFxb0WGFrGcrTrX3EaWDLmWxr4pNlP5qsbECgYATllntrBR8/ycyEAX/SuWcHlaZM5BAh0zvm8+GGdCmDYWMqxjs0duL9URd4o+ynWJaKqR5c2KjA4r2tRdcP+Cqo7j2L5fbiAKtnQ7JvEGJaYsm72+nBuf+MrVkRZUepBhFg5r7rNu31zoAO+pTvQetNWvXeozRz93ckrjlPEtYaQKBgQDFwbV92rlRMLjZzlY+o0knoeJBjPQmPdiBTpGNimdy9L4c2Ure7affjcUiYhkKqrK5k5SScJTATgyQ7JF346FdtUtZ/6Kkj1RwJmmprPrDa9CATLoTle7g9OVd4sHT2ITHZMzPaF3ILvzcwJ70AD1xcxCQb+/7sDPmw7Mc8gOA7Q==','ali/alipayCertPublicKey_RSA2.crt','ali/appCertPublicKey_2016080400165436.crt,ali/alipayRootCert.crt',NULL,'http://pay.egzosn.com/payBack1.json','http://pay.egzosn.com/payBack1.json','RSA2','2088102169916436',NULL,NULL,'UTF-8',1)
,('2','unionPay',NULL,'700000000000001','PATH','D:/certs/acp_test_sign.pfx','D:/certs/acp_test_middle.cer','D:/certs/acp_test_root.cer','000000','http://pay.egzosn.com/payBack3.json','http://pay.egzosn.com/payBack3.json','RSA2',NULL,NULL,NULL,'UTF-8',1)
,( '3','wxPay','公众账号ID','合作者id(商户号)','URL','密钥','转账公钥,转账时必填','http://www.egzosn.com/certs/apiclient_cert.p12','默认为商户号','http://www.pay.egzosn.com/payBack3.json','http://www.pay.egzosn.com/payBack3.json','MD5',NULL,NULL,NULL,'UTF-8','1')
,( '4','wxV3Pay','公众账号ID','合作者id(商户号)','URL','密钥','转账公钥,转账时必填','http://www.egzosn.com/certs/apiclient_cert.p12','默认为商户号','http://www.pay.egzosn.com/payBack3.json','http://www.pay.egzosn.com/payBack3.json','MD5',NULL,NULL,NULL,'UTF-8','1')
,( '5','wxV3ProfitSharing','公众账号ID','合作者id(商户号)','URL','V3密钥','转账公钥,转账时必填','http://www.egzosn.com/certs/apiclient_cert.p12','默认为商户号','http://www.pay.egzosn.com/payBack3.json','http://www.pay.egzosn.com/payBack3.json','MD5',NULL,NULL,NULL,'UTF-8','1')
,( '6','wxV3ProfitSharing','公众账号ID','合作者id(商户号)','URL','V3密钥','转账公钥,转账时必填','http://www.egzosn.com/certs/apiclient_cert.p12','默认为商户号','http://www.pay.egzosn.com/payBack3.json','http://www.pay.egzosn.com/payBack3.json','MD5',NULL,NULL,NULL,'UTF-8','1')
,( '7','wxV3CombinePay','公众账号ID','合作者id(商户号)','URL','V3密钥','转账公钥,转账时必填','http://www.egzosn.com/certs/apiclient_cert.p12','默认为商户号','http://www.pay.egzosn.com/payBack3.json','http://www.pay.egzosn.com/payBack3.json','MD5',NULL,NULL,NULL,'UTF-8','1')
;


================================================
FILE: pay-spring-boot/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.egzosn</groupId>
        <artifactId>pay-spring-boot-starter-parent</artifactId>
      <version>1.0.5</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.egzosn</groupId>
    <artifactId>pay-spring-boot</artifactId>
    <name>pay-spring-boot</name>


</project>

================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/MerchantPayServiceManager.java
================================================
package com.egzosn.pay.spring.boot.core;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import javax.imageio.ImageIO;

import org.springframework.beans.factory.annotation.Autowired;

import com.egzosn.pay.common.api.DefaultPayMessageHandler;
import com.egzosn.pay.common.api.PayMessageHandler;
import com.egzosn.pay.common.api.PayMessageInterceptor;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.api.TransferService;
import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.common.bean.DefaultNoticeRequest;
import com.egzosn.pay.common.bean.MethodType;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.NoticeRequest;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.bean.RefundResult;
import com.egzosn.pay.common.bean.TransferOrder;
import com.egzosn.pay.spring.boot.core.bean.MerchantPayOrder;
import com.egzosn.pay.spring.boot.core.bean.MerchantQueryOrder;
import com.egzosn.pay.spring.boot.core.merchant.MerchantDetailsService;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;

/**
 * 商户支付服务
 *
 * @author egan
 * <pre>
 * email egzosn@gmail.com
 *
 * date 2019/5/8 19:43.
 * </pre>
 */
public class MerchantPayServiceManager implements PayServiceManager {

    @Autowired
    private MerchantDetailsService<PaymentPlatformMerchantDetails> detailsService;

    /**
     * 回调校验
     *
     * @param detailsId 商户列表id
     * @param params    回调回来的参数集
     * @return 签名校验 true通过
     */
    @Override
    public boolean verify(String detailsId, Map<String, Object> params) {

        return this.verify(detailsId, new NoticeParams(params));
    }

    /**
     * 回调校验
     *
     * @param detailsId 商户列表id
     * @param params    回调回来的参数集
     * @return 签名校验 true通过
     */
    @Override
    public boolean verify(String detailsId, NoticeParams params) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        return details.getPayService().verify(params);
    }

    /**
     * 将请求参数或者请求流转化为 Map
     *
     * @param detailsId    商户列表id
     * @param parameterMap 请求参数
     * @param is           请求流
     * @return 获得回调的请求参数
     * @see #getNoticeParams(String, NoticeRequest)
     */
    @Deprecated
    @Override
    public Map<String, Object> getParameter2Map(String detailsId, Map<String, String[]> parameterMap, InputStream is) {
        return getNoticeParams(detailsId, new DefaultNoticeRequest(parameterMap, is)).getBody();
    }

    /**
     * 将请求参数或者请求流转化为 Map
     *
     * @param detailsId 商户列表id
     * @param request   通知请求
     * @return 获得回调的请求参数
     */
    @Override
    public NoticeParams getNoticeParams(String detailsId, NoticeRequest request) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        return details.getPayService().getNoticeParams(request);
    }

    /**
     * 跳到支付页面
     * 针对实时支付,即时付款
     *
     * @param payOrder 商户支付订单信息
     * @return 跳到支付页面
     */
    @Override
    public String toPay(MerchantPayOrder payOrder) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(payOrder.getDetailsId());
        payOrder.setTransactionType(details.getPaymentPlatform().getTransactionType(payOrder.getWayTrade()));
        PayService payService = details.getPayService();
        Map<String, Object> orderInfo = payService.orderInfo(payOrder);
        return payService.buildRequest(orderInfo, MethodType.POST);
    }

    /**
     * 获取支付预订单信息
     *
     * @param payOrder 商户支付订单信息
     * @return 支付预订单信息
     */
    @Override
    public Map<String, Object> app(MerchantPayOrder payOrder) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(payOrder.getDetailsId());
        payOrder.setTransactionType(details.getPaymentPlatform().getTransactionType(payOrder.getWayTrade()));
        PayService payService = details.getPayService();
        return payService.app(payOrder);
    }

    /**
     * 获取支付预订单信息
     *
     * @param payOrder 商户支付订单信息
     * @return 支付预订单信息
     */
    @Override
    public Map<String, Object> getOrderInfo(MerchantPayOrder payOrder) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(payOrder.getDetailsId());
        payOrder.setTransactionType(details.getPaymentPlatform().getTransactionType(payOrder.getWayTrade()));
        PayService payService = details.getPayService();
        return payService.orderInfo(payOrder);
    }

    /**
     * 刷卡付,pos主动扫码付款(条码付)
     * 刷脸付
     *
     * @param payOrder 商户支付订单信息
     * @return 支付结果
     */
    @Override
    public Map<String, Object> microPay(MerchantPayOrder payOrder) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(payOrder.getDetailsId());
        payOrder.setTransactionType(details.getPaymentPlatform().getTransactionType(payOrder.getWayTrade()));
        //支付结果
        return details.getPayService().microPay(payOrder);
    }

    /**
     * 获取二维码图像
     * 二维码支付
     *
     * @param payOrder 商户支付订单信息
     * @return 二维码图像
     * @throws IOException IOException
     */
    @Override
    public byte[] toQrPay(MerchantPayOrder payOrder) throws IOException {
        //获取对应的支付账户操作工具(可根据账户id)
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(payOrder.getDetailsId());
        payOrder.setTransactionType(details.getPaymentPlatform().getTransactionType(payOrder.getWayTrade()));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        ImageIO.write(details.getPayService().genQrPay(payOrder), "JPEG", baos);
        return baos.toByteArray();
    }

    /**
     * 获取二维码信息
     * 二维码支付
     *
     * @param payOrder 商户支付订单信息
     * @return 二维码信息
     */
    @Override
    public String getQrPay(MerchantPayOrder payOrder) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(payOrder.getDetailsId());
        payOrder.setTransactionType(details.getPaymentPlatform().getTransactionType(payOrder.getWayTrade()));
        return details.getPayService().getQrPay(payOrder);
    }

    /**
     * 支付回调地址
     * 方式二
     *
     * @param detailsId    商户列表id
     * @param parameterMap 请求参数
     * @param is           请求流
     * @return 支付是否成功
     * @throws IOException IOException
     *                     拦截器相关增加, 详情查看{@link com.egzosn.pay.common.api.PayService#addPayMessageInterceptor(PayMessageInterceptor)}
     *                     <p>
     *                     业务处理在对应的PayMessageHandler里面处理,在哪里设置PayMessageHandler,详情查看{@link com.egzosn.pay.common.api.PayService#setPayMessageHandler(com.egzosn.pay.common.api.PayMessageHandler)}
     *                     </p>
     *                     如果未设置 {@link com.egzosn.pay.common.api.PayMessageHandler} 那么会使用默认的 {@link com.egzosn.pay.common.api.DefaultPayMessageHandler}
     *                     方法过时,替代方法{@link #payBack(String, NoticeRequest)}
     */
    @Deprecated
    @Override
    public String payBack(String detailsId, Map<String, String[]> parameterMap, InputStream is) throws IOException {
        return this.payBack(detailsId, new DefaultNoticeRequest(parameterMap, is));
    }

    /**
     * 支付回调地址
     * 方式二
     *
     * @param detailsId 商户列表id
     * @param request   请求参数
     * @return 支付是否成功
     * 拦截器相关增加, 详情查看{@link PayService#addPayMessageInterceptor(PayMessageInterceptor)}
     * <p>
     * 业务处理在对应的PayMessageHandler里面处理,在哪里设置PayMessageHandler,详情查看{@link PayService#setPayMessageHandler(PayMessageHandler)}
     * </p>
     * 如果未设置 {@link PayMessageHandler} 那么会使用默认的 {@link DefaultPayMessageHandler}
     */
    @Override
    public String payBack(String detailsId, NoticeRequest request) {
        //业务处理在对应的PayMessageHandler里面处理,在哪里设置PayMessageHandler,详情查看com.egzosn.pay.common.api.PayService.setPayMessageHandler()
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        PayService payService = details.getPayService();
        return payService.payBack(request).toMessage();
    }


    /**
     * 查询
     *
     * @param order 订单的请求体
     * @return 返回查询回来的结果集,支付方原值返回
     */
    @Override
    public Map<String, Object> query(MerchantQueryOrder order) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(order.getDetailsId());
        order.setTransactionType(details.getPaymentPlatform().getTransactionType(order.getWayTrade()));
        return details.getPayService().query(order);
    }

    /**
     * 交易关闭接口
     *
     * @param order 订单的请求体
     * @return 返回支付方交易关闭后的结果
     */
    @Override
    public Map<String, Object> close(MerchantQueryOrder order) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(order.getDetailsId());
        order.setTransactionType(details.getPaymentPlatform().getTransactionType(order.getWayTrade()));
        return details.getPayService().close(order);
    }


    /**
     * 申请退款接口
     *
     * @param detailsId 列表id
     * @param order     订单的请求体
     * @return 返回支付方申请退款后的结果
     */
    @Override
    public RefundResult refund(String detailsId, RefundOrder order) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);

        return details.getPayService().refund(order);
    }

    /**
     * 查询退款
     *
     * @param detailsId 列表id
     * @param order     订单的请求体
     * @return 返回支付方查询退款后的结果
     */
    @Override
    public Map<String, Object> refundQuery(String detailsId, RefundOrder order) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        return details.getPayService().refundquery(order);
    }

    /**
     * 下载对账单
     *
     * @param order 订单的请求体
     * @return 返回支付方下载对账单的结果
     */
    @Override
    public Map<String, Object> downloadBill(MerchantQueryOrder order) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(order.getDetailsId());

        return details.getPayService().downloadBill(order.getBillDate(), order.getBillType());
    }


    /**
     * 转账
     *
     * @param detailsId 列表id
     * @param order     转账订单
     * @return 对应的转账结果
     */
    @Override
    public Map<String, Object> transfer(String detailsId, TransferOrder order) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);

        return details.getPayService().transfer(order);
    }

    /**
     * 转账查询
     *
     * @param detailsId 列表id
     * @param outNo     商户转账订单号
     * @param tradeNo   支付平台转账订单号
     * @return 对应的转账订单
     */
    @Override
    public Map<String, Object> transferQuery(String detailsId, String outNo, String tradeNo) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        return details.getPayService().transferQuery(outNo, tradeNo);
    }

    /**
     * 转账查询
     *
     * @param detailsId   列表id
     * @param assistOrder 辅助交易订单
     * @return 对应的转账订单
     */
    @Override
    public Map<String, Object> transferQuery(String detailsId, AssistOrder assistOrder) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        PayService payService = details.getPayService();
        if (payService instanceof TransferService) {
            return ((TransferService) payService).transferQuery(assistOrder);
        }
        //todo: 暂时兼容旧版本
        return details.getPayService().transferQuery(assistOrder.getOutTradeNo(), assistOrder.getTradeNo());
    }

    /**
     * 创建消息
     *
     * @param detailsId 列表id
     * @param message   支付平台返回的消息
     * @return 支付消息对象
     */
    @Override
    public PayMessage createMessage(String detailsId, Map<String, Object> message) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        return details.getPayService().createMessage(message);
    }

    /**
     * 获取payService具体调用类引用
     *
     * @param detailsId       列表id
     * @param payServiceClass payService类
     * @return 具体调用类引用
     */
    @Override
    public <T extends PayService> T cast(String detailsId, Class<T> payServiceClass) {
        PaymentPlatformMerchantDetails details = detailsService.loadMerchantByMerchantId(detailsId);
        return (T) details.getPayService();
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayBuilder.java
================================================
package com.egzosn.pay.spring.boot.core;

/**
 * 用于构建对象的接口
 *
 * @param <O> 正在构建的对象的类型

 * @author egan
 *         <pre>
 *              email egzosn@gmail.com
 *
 *              date 2019/05/06 19:27.
 *         </pre>
 */
public interface PayBuilder<O> {


    /**
     * 构建对象并返回它或null。
     *
     * @return 如果实现允许,则要构建的对象或null。
     */
    O build();
}

================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayConfigurerAdapter.java
================================================
package com.egzosn.pay.spring.boot.core;

/**
 * 支付配置适配,主要用于外部调用者链式的方式创建对象
 * @author egan
 *         <pre>
 *              email egzosn@gmail.com
 *
 *              date 2019/5/6 19:43.
 *         </pre>
 * @param <B> 返回对应的服务构建器
 */
public interface PayConfigurerAdapter<B> {

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    B and();

    /**
     * 获取构建器
     * @return 构建器
     */
    B getBuilder();
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayServiceConfigurer.java
================================================
package com.egzosn.pay.spring.boot.core;

import com.egzosn.pay.spring.boot.core.configurers.MerchantDetailsServiceConfigurer;
import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;

/**
 * 支付服务配置,用于支付服务相关的配置,暂时主要为商户相关的配置,后期在进行添加别的配置
 * @author egan
 *         <pre>
 *              email egzosn@gmail.com
 *
 *              date 2019/5/8 19:06.
 *         </pre>
 */
public interface PayServiceConfigurer {

    /**
     * 商户配置
     * @param configurer 商户配置
     */
    void configure(MerchantDetailsServiceConfigurer configurer);
    /**
     * 商户配置
     * @param configurer 支付消息配置
     */
    void configure(PayMessageConfigurer configurer) ;




}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayServiceManager.java
================================================
package com.egzosn.pay.spring.boot.core;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import com.egzosn.pay.common.api.PayMessageInterceptor;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.common.bean.NoticeParams;
import com.egzosn.pay.common.bean.NoticeRequest;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.bean.RefundResult;
import com.egzosn.pay.common.bean.TransferOrder;
import com.egzosn.pay.spring.boot.core.bean.MerchantPayOrder;
import com.egzosn.pay.spring.boot.core.bean.MerchantQueryOrder;


/**
 * 商户支付服务
 *
 * @author egan
 * <pre>
 * email egzosn@gmail.com
 *
 * date 020/1/2 15:03
 * </pre>
 */
public interface PayServiceManager {

    /**
     * 回调校验
     *
     * @param detailsId 商户列表id
     * @param params    回调回来的参数集
     * @return 签名校验 true通过
     */

    @Deprecated
    boolean verify(String detailsId, Map<String, Object> params);

    /**
     * 回调校验
     *
     * @param detailsId 商户列表id
     * @param params    回调回来的参数集
     * @return 签名校验 true通过
     */
    boolean verify(String detailsId, NoticeParams params);

    /**
     * 将请求参数或者请求流转化为 Map
     *
     * @param detailsId    商户列表id
     * @param parameterMap 请求参数
     * @param is           请求流
     * @return 获得回调的请求参数
     * @see #getNoticeParams(String, NoticeRequest)
     */
    @Deprecated
    Map<String, Object> getParameter2Map(String detailsId, Map<String, String[]> parameterMap, InputStream is);

    /**
     * 将请求参数或者请求流转化为 Map
     *
     * @param detailsId 商户列表id
     * @param request   通知请求
     * @return 获得回调的请求参数
     */
    NoticeParams getNoticeParams(String detailsId, NoticeRequest request);

    /**
     * 跳到支付页面
     * 针对实时支付,即时付款
     *
     * @param payOrder 商户支付订单信息
     * @return 跳到支付页面
     */
    String toPay(MerchantPayOrder payOrder);

    /**
     * 获取支付预订单信息
     *
     * @param payOrder 商户支付订单信息
     * @return 支付预订单信息
     */
    Map<String, Object> app(MerchantPayOrder payOrder);

    /**
     * 获取支付预订单信息
     *
     * @param payOrder 商户支付订单信息
     * @return 支付预订单信息
     */
    Map<String, Object> getOrderInfo(MerchantPayOrder payOrder);

    /**
     * 刷卡付,pos主动扫码付款(条码付)
     * 刷脸付
     *
     * @param payOrder 商户支付订单信息
     * @return 支付结果
     */
    Map<String, Object> microPay(MerchantPayOrder payOrder);

    /**
     * 获取二维码图像
     * 二维码支付
     *
     * @param payOrder 商户支付订单信息
     * @return 二维码图像
     * @throws IOException IOException
     */
    byte[] toQrPay(MerchantPayOrder payOrder) throws IOException;

    /**
     * 获取二维码信息
     * 二维码支付
     *
     * @param payOrder 商户支付订单信息
     * @return 二维码信息
     */
    String getQrPay(MerchantPayOrder payOrder);

    /**
     * 支付回调地址
     * 方式二
     *
     * @param detailsId    商户列表id
     * @param parameterMap 请求参数
     * @param is           请求流
     * @return 支付是否成功
     * @throws IOException IOException
     *                     拦截器相关增加, 详情查看{@link com.egzosn.pay.common.api.PayService#addPayMessageInterceptor(PayMessageInterceptor)}
     *                     <p>
     *                     业务处理在对应的PayMessageHandler里面处理,在哪里设置PayMessageHandler,详情查看{@link com.egzosn.pay.common.api.PayService#setPayMessageHandler(com.egzosn.pay.common.api.PayMessageHandler)}
     *                     </p>
     *                     如果未设置 {@link com.egzosn.pay.common.api.PayMessageHandler} 那么会使用默认的 {@link com.egzosn.pay.common.api.DefaultPayMessageHandler}
     */
    @Deprecated
    String payBack(String detailsId, Map<String, String[]> parameterMap, InputStream is) throws IOException;

    /**
     * 支付回调地址
     * 方式二
     *
     * @param detailsId 商户列表id
     * @param request   请求参数
     * @return 支付是否成功
     * 拦截器相关增加, 详情查看{@link com.egzosn.pay.common.api.PayService#addPayMessageInterceptor(PayMessageInterceptor)}
     * <p>
     * 业务处理在对应的PayMessageHandler里面处理,在哪里设置PayMessageHandler,详情查看{@link com.egzosn.pay.common.api.PayService#setPayMessageHandler(com.egzosn.pay.common.api.PayMessageHandler)}
     * </p>
     * 如果未设置 {@link com.egzosn.pay.common.api.PayMessageHandler} 那么会使用默认的 {@link com.egzosn.pay.common.api.DefaultPayMessageHandler}
     */
    String payBack(String detailsId, NoticeRequest request);

    /**
     * 查询
     *
     * @param order 订单的请求体
     * @return 返回查询回来的结果集,支付方原值返回
     */
    Map<String, Object> query(MerchantQueryOrder order);

    /**
     * 交易关闭接口
     *
     * @param order 订单的请求体
     * @return 返回支付方交易关闭后的结果
     */
    Map<String, Object> close(MerchantQueryOrder order);

    /**
     * 申请退款接口
     *
     * @param detailsId 列表id
     * @param order     订单的请求体
     * @return 返回支付方申请退款后的结果
     */

    RefundResult refund(String detailsId, RefundOrder order);

    /**
     * 查询退款
     *
     * @param detailsId 列表id
     * @param order     订单的请求体
     * @return 返回支付方查询退款后的结果
     */
    Map<String, Object> refundQuery(String detailsId, RefundOrder order);

    /**
     * 下载对账单
     *
     * @param order 订单的请求体
     * @return 返回支付方下载对账单的结果
     */
    Map<String, Object> downloadBill(MerchantQueryOrder order);


    /**
     * 转账
     *
     * @param detailsId 列表id
     * @param order     转账订单
     * @return 对应的转账结果
     */
    Map<String, Object> transfer(String detailsId, TransferOrder order);

    /**
     * 转账查询
     *
     * @param detailsId 列表id
     * @param outNo     商户转账订单号
     * @param tradeNo   支付平台转账订单号
     * @return 对应的转账订单
     * @deprecated {@link #transferQuery(String, AssistOrder)}
     */
    @Deprecated
    Map<String, Object> transferQuery(String detailsId, String outNo, String tradeNo);


    /**
     * 转账查询
     *
     * @param detailsId   列表id
     * @param assistOrder 辅助交易订单
     * @return 对应的转账订单
     */
    Map<String, Object> transferQuery(String detailsId, AssistOrder assistOrder);

    /**
     * 创建消息
     *
     * @param detailsId 列表id
     * @param message   支付平台返回的消息
     * @return 支付消息对象
     */
    PayMessage createMessage(String detailsId, Map<String, Object> message);


    /**
     * 获取payService具体调用类引用
     *
     * @param detailsId       列表id
     * @param payServiceClass payService类
     * @param <T>             支付服务类引用
     * @return 具体调用类引用
     */
    <T extends PayService> T cast(String detailsId, Class<T> payServiceClass);

}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/bean/MerchantPayOrder.java
================================================
package com.egzosn.pay.spring.boot.core.bean;

import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.TransactionType;

import java.math.BigDecimal;

/**
 * 商户支付订单
 * @author egan
 *         <pre>
 *                 email egzosn@gmail.com
 *
 *                 date 2019/5/9 19:43.
 *                 </pre>
 */
public class MerchantPayOrder extends PayOrder {

    /**
     * 列表id
     */
    private String  detailsId;
    /**
     * 交易类型,交易方式,
     * 本字段与{@link com.egzosn.pay.common.bean.PayOrder#getTransactionType()}相同。
     *
     *  例如,网页支付,扫码付等等
     */
    private String wayTrade;

    public MerchantPayOrder() {
    }

    public MerchantPayOrder(String detailsId, String wayTrade) {
        this.detailsId = detailsId;
        this.wayTrade = wayTrade;
    }



    public MerchantPayOrder(String detailsId, String wayTrade, String subject, String body, BigDecimal price, String outTradeNo) {
        super(subject, body, price, outTradeNo);
        this.detailsId = detailsId;
        this.wayTrade = wayTrade;
    }

    public String getDetailsId() {
        return detailsId;
    }

    public void setDetailsId(String detailsId) {
        this.detailsId = detailsId;
    }

    public String getWayTrade() {
        return wayTrade;
    }

    public void setWayTrade(String wayTrade) {
        this.wayTrade = wayTrade;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/bean/MerchantQueryOrder.java
================================================
package com.egzosn.pay.spring.boot.core.bean;

import com.egzosn.pay.common.bean.AssistOrder;
import com.egzosn.pay.common.bean.BillType;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 订单辅助接口
 *
 * @author egan
 * email egzosn@gmail.com
 * date 2017/3/12 14:50
 */
public class MerchantQueryOrder extends AssistOrder {
    /**
     * 列表id
     */
    private String detailsId;
    /**
     * 退款金额
     */
    private BigDecimal refundAmount;
    /**
     * 总金额
     */
    private BigDecimal totalAmount;
    /**
     * 账单时间:具体请查看对应支付平台
     */
    private Date billDate;
    /**
     * 账单类型:具体请查看对应支付平台
     * 详情实现查看各个平台组件对应实现类
     */
    private BillType billType;
    /**
     * 支付平台订单号或者账单日期
     */
    private Object tradeNoOrBillDate;
    /**
     * 商户单号或者 账单类型
     */
    private String outTradeNoBillType;
    /**
     * 交易类型,交易方式,
     * 本字段与{@link com.egzosn.pay.common.bean.PayOrder#getTransactionType}相同。
     * <p>
     * 例如,网页支付,扫码付等等
     */
    private String wayTrade;

    public String getDetailsId() {
        return detailsId;
    }

    public void setDetailsId(String detailsId) {
        this.detailsId = detailsId;
    }

    public BigDecimal getRefundAmount() {
        return refundAmount;
    }

    public void setRefundAmount(BigDecimal refundAmount) {
        this.refundAmount = refundAmount;
    }

    public BigDecimal getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(BigDecimal totalAmount) {
        this.totalAmount = totalAmount;
    }

    public Date getBillDate() {
        return billDate;
    }

    public void setBillDate(Date billDate) {
        this.billDate = billDate;
    }

    public BillType getBillType() {
        return billType;
    }

    public void setBillType(BillType billType) {
        this.billType = billType;
    }

    public Object getTradeNoOrBillDate() {
        return tradeNoOrBillDate;
    }

    public void setTradeNoOrBillDate(Object tradeNoOrBillDate) {
        this.tradeNoOrBillDate = tradeNoOrBillDate;
    }

    public String getOutTradeNoBillType() {
        return outTradeNoBillType;
    }

    public void setOutTradeNoBillType(String outTradeNoBillType) {
        this.outTradeNoBillType = outTradeNoBillType;
    }

    public String getWayTrade() {
        return wayTrade;
    }

    public void setWayTrade(String wayTrade) {
        this.wayTrade = wayTrade;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/InMemoryMerchantDetailsServiceBuilder.java
================================================
package com.egzosn.pay.spring.boot.core.builders;

import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantDetailsService;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.bean.*;
import com.egzosn.pay.spring.boot.core.provider.InMemoryMerchantDetailsManager;

import java.util.ArrayList;
import java.util.List;

/**
 * 内存型商户列表服务构建器
 * @author egan
 *         <pre>
 *         email egzosn@gmail.com
 *         date  2019/5/6 19:36.
 *         </pre>
 */
public class InMemoryMerchantDetailsServiceBuilder extends MerchantDetailsServiceBuilder {

    private List<PaymentPlatformMerchantDetails> merchantDetails = new ArrayList<PaymentPlatformMerchantDetails>();



    public void addMerchantDetails(PaymentPlatformMerchantDetails merchantDetail) {

        this.merchantDetails.add(merchantDetail);
    }

    public AliMerchantDetails ali(){
        AliMerchantDetails details = new AliMerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }

    public FuiouMerchantDetails fuiou(){
        FuiouMerchantDetails details = new FuiouMerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }
    public PayoneerMerchantDetails payoneer(){
        PayoneerMerchantDetails details = new PayoneerMerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }
    public PaypalMerchantDetails payPal(){
        PaypalMerchantDetails details = new PaypalMerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }
    public UnionMerchantDetails union(){
        UnionMerchantDetails details = new UnionMerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }
    public WxMerchantDetails wx(){
        WxMerchantDetails details = new WxMerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }

    public WxV3MerchantDetails wxV3(){
        WxV3MerchantDetails details = new WxV3MerchantDetails(this);
        addMerchantDetails(details);
        return details;
    }


    /**
     * 开始构建
     *
     * @return 商户列表服务
     */
    @Override
    protected MerchantDetailsService performBuild() {
        InMemoryMerchantDetailsManager merchantDetailsManager = new InMemoryMerchantDetailsManager();
        merchantDetailsManager.setPayMessageConfigurer(configurer);
        merchantDetailsManager.createMerchant(merchantDetails);
        return merchantDetailsManager;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/JdbcMerchantDetailsServiceBuilder.java
================================================
package com.egzosn.pay.spring.boot.core.builders;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import com.egzosn.pay.spring.boot.core.merchant.MerchantDetailsService;
import com.egzosn.pay.spring.boot.core.provider.CacheMerchantDetailsManager;
import com.egzosn.pay.spring.boot.core.provider.JdbcMerchantDetailsManager;
import com.egzosn.pay.spring.boot.core.provider.MerchantDetailsManager;

/**
 * 内存型商户列表服务构建器
 *
 * @author egan
 * <pre>
 *         email egzosn@gmail.com
 *         date  2019/5/6 19:36.
 *         </pre>
 */
public class JdbcMerchantDetailsServiceBuilder extends MerchantDetailsServiceBuilder {

    private JdbcTemplate jdbcTemplate;

    private boolean cache = false;


    public JdbcMerchantDetailsServiceBuilder(DataSource source) {
        setJdbcTemplate(new JdbcTemplate(source));
    }

    public JdbcMerchantDetailsServiceBuilder(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public JdbcMerchantDetailsServiceBuilder(boolean cache) {
        this.cache = cache;
    }

    public JdbcMerchantDetailsServiceBuilder() {
    }


    /**
     * 设置缓存
     *
     * @param cache 缓存
     * @return 当前
     */
    public JdbcMerchantDetailsServiceBuilder cache(boolean cache) {
        setCache(cache);
        return this;
    }

    /**
     * 设置jdbc 模版
     *
     * @param jdbcTemplate jdbcTemplate
     * @return 当前
     */
    public JdbcMerchantDetailsServiceBuilder template(JdbcTemplate jdbcTemplate) {
        setJdbcTemplate(jdbcTemplate);
        return this;
    }


    /**
     * 设置数据源
     *
     * @param source 数据源
     * @return 当前
     */
    public JdbcMerchantDetailsServiceBuilder dataSource(DataSource source) {
        setJdbcTemplate(new JdbcTemplate(source));
        return this;
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    private void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        if (null != this.jdbcTemplate) {
            return;
        }
        this.jdbcTemplate = jdbcTemplate;
    }

    public boolean isCache() {
        return cache;
    }

    public void setCache(boolean cache) {
        this.cache = cache;
    }

    /**
     * 开始构建
     *
     * @return 商户列表服务·
     */
    @Override
    protected MerchantDetailsService performBuild() {

        MerchantDetailsManager manager = new JdbcMerchantDetailsManager(jdbcTemplate);
        if (cache) {
            manager = new CacheMerchantDetailsManager(manager);
        }
        manager.setPayMessageConfigurer(configurer);

        return manager;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/MerchantDetailsServiceBuilder.java
================================================
package com.egzosn.pay.spring.boot.core.builders;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import com.egzosn.pay.spring.boot.core.PayBuilder;
import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantDetailsService;

/**
 * @author egan
 * <pre>
 *         email egzosn@gmail.com
 *         date  2019/5/6 19:36.
 *         </pre>
 */
public class MerchantDetailsServiceBuilder implements PayBuilder<MerchantDetailsService> {
    protected PayMessageConfigurer configurer;

    public static InMemoryMerchantDetailsServiceBuilder inMemory() {
        return new InMemoryMerchantDetailsServiceBuilder();
    }

    public static JdbcMerchantDetailsServiceBuilder jdbc() {
        return new JdbcMerchantDetailsServiceBuilder();
    }

    public static JdbcMerchantDetailsServiceBuilder jdbc(boolean cache) {
        return new JdbcMerchantDetailsServiceBuilder();
    }

    public static JdbcMerchantDetailsServiceBuilder jdbc(DataSource source) {
        return new JdbcMerchantDetailsServiceBuilder(source);
    }

    public static JdbcMerchantDetailsServiceBuilder jdbc(JdbcTemplate jdbcTemplate) {
        return new JdbcMerchantDetailsServiceBuilder(jdbcTemplate);
    }

    /**
     * 构建对象并返回它或null。
     *
     * @return 如果实现允许,则要构建的对象或null。
     */
    @Override
    public MerchantDetailsService build() {
        return performBuild();
    }

    /**
     * 开始构建
     *
     * @return 商户列表服务
     */
    protected MerchantDetailsService performBuild() {
        throw new UnsupportedOperationException("无法构建商家服务(需要使用inMemory()或jdbc())");
    }

    public void setConfigurer(PayMessageConfigurer configurer) {
        this.configurer = configurer;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/DefalutPayMessageConfigurer.java
================================================
package com.egzosn.pay.spring.boot.core.configurers;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.egzosn.pay.common.api.PayMessageHandler;
import com.egzosn.pay.common.api.PayMessageInterceptor;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

/**
 * 支付回调配置中心
 * @author egan
 * <pre>
 *         email egzosn@gmail.com
 *         date 2019/9/7.22:08
 *</pre>
 */
public class DefalutPayMessageConfigurer implements PayMessageConfigurer {

    /**
     * 消息处理器集
     *
     * key 为商户平台
     * value 为对应得处理器
     */
    private Map<PaymentPlatform, PayMessageHandler<PayMessage, PayService>> handlers = new HashMap<PaymentPlatform, PayMessageHandler<PayMessage, PayService>>();

    /**
     * 消息拦截器集
     *
     * key 为商户平台
     * value 为对应得拦截器
     */
    private Map<PaymentPlatform, List<PayMessageInterceptor<PayMessage, PayService>>> interceptors = new HashMap<PaymentPlatform, List<PayMessageInterceptor<PayMessage, PayService>>>();

    /**
     * 添加处理器
     *
     * @param platform 商户平台,渠道
     * @param handler  处理器
     */
    @Override
    public void addHandler(PaymentPlatform platform, PayMessageHandler handler) {
        if (handlers.containsKey(platform)){
            throw new IllegalArgumentException(platform.getPlatform() + "已存在,请勿重复设置");
        }
        this.handlers.put(platform, handler);
    }

    /**
     * 获取处理器
     *
     * @param platform 商户平台,渠道
     * @return 处理器
     */
    @Override
    public PayMessageHandler<PayMessage, PayService> getHandler(PaymentPlatform platform) {
        return handlers.get(platform);
    }
    /**
     * 添加拦截器
     *
     * @param platform    商户平台,渠道
     * @param interceptor 拦截器
     */
    @Override
    public void addInterceptor(PaymentPlatform platform, PayMessageInterceptor interceptor) {
        List<PayMessageInterceptor<PayMessage, PayService>> interceptors = this.interceptors.get(platform);
        if (null == interceptors){
            interceptors = new ArrayList<>();
            this.interceptors.put(platform, interceptors);
        }
        interceptors.add(interceptor);
    }

    /**
     * 获取拦截器
     *
     * @param platform 商户平台,渠道
     * @return 拦截器
     */
    @Override
    public List<PayMessageInterceptor<PayMessage, PayService>> getInterceptor(PaymentPlatform platform) {
        return interceptors.get(platform);
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/MerchantDetailsServiceConfigurer.java
================================================
package com.egzosn.pay.spring.boot.core.configurers;


import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.builders.JdbcMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.builders.MerchantDetailsServiceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * 商户列表服务配置
 *
 * @author egan
 * <pre>
 *      email egzosn@gmail.com
 *
 *      date 2019/5/8 19:54.
 * </pre>
 */
public class MerchantDetailsServiceConfigurer implements PayConfigurerAdapter<MerchantDetailsServiceBuilder> {

    private MerchantDetailsServiceBuilder builder;

    @Autowired
    private PayMessageConfigurer configurer;

    public void setBuilder(MerchantDetailsServiceBuilder builder) {
        this.builder = builder;
    }

    public InMemoryMerchantDetailsServiceBuilder inMemory() {
        InMemoryMerchantDetailsServiceBuilder builder = MerchantDetailsServiceBuilder.inMemory();
        initBuilder(builder);
        return builder;
    }
    public MerchantDetailsServiceBuilder initBuilder(MerchantDetailsServiceBuilder builder) {
        builder.setConfigurer(this.configurer);
        setBuilder(builder);
        return builder;
    }


    public JdbcMerchantDetailsServiceBuilder jdbc() {
        JdbcMerchantDetailsServiceBuilder builder = MerchantDetailsServiceBuilder.jdbc();
        initBuilder(builder);
        return builder;
    }

    public JdbcMerchantDetailsServiceBuilder jdbc(DataSource source) {
        JdbcMerchantDetailsServiceBuilder builder = MerchantDetailsServiceBuilder.jdbc(source);
        initBuilder(builder);
        return builder;
    }

    /**
     *
     * 将在未来可能进行移除,避免项目不用JdbcTemplate最为数据源操作并且不需要引入JdbcTemplate包时导致的不必要报错
     *
     *  替代方式{@link #jdbc()}与{@link #jdbc(DataSource)}进行替代
     *  <code>
     *      jdbc().template(JdbcTemplate);
     *  </code>
     * @param jdbcTemplate jdbc模版
     * @return jdbc商户列表服务构建器
     */
    @Deprecated
    public JdbcMerchantDetailsServiceBuilder jdbc(JdbcTemplate jdbcTemplate) {
        JdbcMerchantDetailsServiceBuilder builder = MerchantDetailsServiceBuilder.jdbc(jdbcTemplate);
        initBuilder(builder);
        return builder;
    }


    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public MerchantDetailsServiceBuilder and() {
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public MerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/PayMessageConfigurer.java
================================================
package com.egzosn.pay.spring.boot.core.configurers;

import com.egzosn.pay.common.api.PayMessageHandler;
import com.egzosn.pay.common.api.PayMessageInterceptor;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

import java.util.List;

/**
 * @author egan
 * <pre>
 *         email egzosn@gmail.com
 *         date 2019/9/7.23:54
 * </pre>
 */
public interface PayMessageConfigurer {

    /**
     * 添加处理器
     *
     * @param platform 商户平台,渠道
     * @param handler  处理器
     */
    void addHandler(PaymentPlatform platform, PayMessageHandler handler);

    /**
     * 获取处理器
     *
     * @param platform 商户平台,渠道
     * @return 处理器
     */
    PayMessageHandler<PayMessage, PayService> getHandler(PaymentPlatform platform);

    /**
     * 添加拦截器
     *
     * @param platform    商户平台,渠道
     * @param interceptor 拦截器
     */
    void addInterceptor(PaymentPlatform platform, PayMessageInterceptor interceptor);

    /**
     * 获取拦截器
     *
     * @param platform 商户平台,渠道
     * @return 拦截器
     */
    List<PayMessageInterceptor<PayMessage, PayService>> getInterceptor(PaymentPlatform platform);

}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant;

import com.egzosn.pay.common.api.PayConfigStorage;

import java.io.Serializable;

/**
 * 商户信息列表
 *
 * @author egan
 *         <pre>
 *                 email egzosn@gmail.com
 *                 date 2018/12/29 11:03.
 *                 </pre>
 */
public interface MerchantDetails extends PayConfigStorage, Serializable {


    /**
     * 获取支付商户详细信息id
     *
     * @return 支付商户详细信息id
     */
    String getDetailsId();
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantDetailsService.java
================================================
package com.egzosn.pay.spring.boot.core.merchant;

/**
 *  提供给客户端获取商户列表信息的服务
 *
 * @author egan
 *         <pre>
 *         email egzosn@gmail.com
 *         date 2018-12-29 10:53:08
 *         </pre>
 */
public interface MerchantDetailsService<T extends MerchantDetails> {

    /**
     *  通过支付商户id加载对应的商户信息列表
     * @param merchantId  支付商户id
     * @return 商户信息列表
     */
    T loadMerchantByMerchantId(String merchantId);

}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantNotFoundException.java
================================================
package com.egzosn.pay.spring.boot.core.merchant;

/**
 * 商户不存在异常
 * @author egan
 *         <pre>
 *         email egzosn@gmail.com
 *         date  2019/4/6 16:43.
 *         </pre>
 */

public class MerchantNotFoundException extends RuntimeException {

    /**
     * 商户列表id
     */
    private String detailsId;
    private static final String MESSAGE = "不存在的商户列表id:";

    /**
     *
     * @param detailsId 商户列表id
     */
    public MerchantNotFoundException(String detailsId) {
        this(MESSAGE + detailsId, null);
    }

    /**
     * @param detailsId 商户列表id
     * @param cause 异常
     */
    public MerchantNotFoundException(String detailsId, Throwable cause) {
        super(MESSAGE + detailsId, cause);
        this.detailsId = detailsId;
    }

    /**
     * 获取商户id
     * @return 商户id
     */
    public String getMerchantId(){
        return detailsId;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.merchant;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.BasePayType;
import com.egzosn.pay.common.http.HttpConfigStorage;

/**
 * 支付平台
 * @author egan
 *         <pre>
 *         email egzosn@gmail.com
 *         date  2019/4/6 17:20.
 *         </pre>
 */
public interface PaymentPlatform<S extends PayService> extends BasePayType {

    /**
     * 获取商户平台
     * @return 商户平台
     */
    String getPlatform();

    /**
     * 获取支付平台对应的支付服务
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    S getPayService(PayConfigStorage payConfigStorage);
    /**
     * 获取支付平台对应的支付服务
     * @param payConfigStorage 支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    S getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage);

}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatformMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant;

import com.egzosn.pay.common.api.PayService;

/**
 * 支付平台商户列表
 * @author egan
 *         <pre>
 *         email egzosn@gmail.com
 *         date 2019/4/6 17:28.
 *         </pre>
 */
public interface PaymentPlatformMerchantDetails<S extends PayService>  extends MerchantDetails{

    /**
     * 获取支付平台对应的支付服务
     * @return 支付服务
     */
    S getPayService();
    /**
     * 获取支付平台
     * @return 支付平台
     */
    PaymentPlatform getPaymentPlatform();
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatformServiceAdapter.java
================================================
package com.egzosn.pay.spring.boot.core.merchant;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;

/**
 * 支付商户服务适配器
 * @author egan
 *         <pre>
 *                 email egzosn@gmail.com
 *
 *                 date 2019/5/9 19:28.
 *                 </pre>
 */
public interface PaymentPlatformServiceAdapter<S extends PayService> {

    /**
     * 初始化服务
     * @return 支付商户服务适配器
     */
    PaymentPlatformServiceAdapter initService();

    /**
     * 获取支付平台对应的支付服务
     * @return 支付服务
     */
    S getPayService();



    /**
     * 获取HTTP请求配置
     * @return HTTP请求配置
     */
    HttpConfigStorage getHttpConfigStorage();
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/AliMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.ali.api.AliPayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.AliPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;

/**
 * 支付宝商户信息列表
 *
 * @author egan
 * <pre>
 *                         email egzosn@gmail.com
 *                         date   2019/4/6 14:30.
 *                         </pre>
 */
public class AliMerchantDetails extends AliPayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {


    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;

    /**
     * 商户平台
     */
    private PaymentPlatform platform;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;


    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public AliMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public AliMerchantDetails() {
        init();
    }

    public void init() {
        if (null != platform){
            return;
        }
        String platformName = AliPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {

        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService) {
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public AliMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }

    public void setDetailsId(String detailsId) {
        this.detailsId = detailsId;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public AliMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public AliMerchantDetails notifyUrl(String notifyUrl) {
        setNotifyUrl(notifyUrl);
        return this;
    }

    public AliMerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }

    public AliMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public AliMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public AliMerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }

    public AliMerchantDetails pid(String pid) {
        setPid(pid);
        return this;
    }

    public AliMerchantDetails appid(String appid) {
        setAppid(appid);
        return this;
    }

    public AliMerchantDetails keyPrivate(String keyPrivate) {
        setKeyPrivate(keyPrivate);
        return this;
    }

    public AliMerchantDetails keyPublic(String keyPublic) {
        setKeyPublic(keyPublic);
        return this;
    }

    public AliMerchantDetails seller(String seller) {
        setSeller(seller);
        return this;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/CommonPaymentPlatformMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.BasePayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.MerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;

import java.io.IOException;
import java.io.InputStream;

/**
 * 公共的支付商户信息列表
 *
 * @author egan
 * <pre>
 * email egzosn@gmail.com
 * date   2019/4/9 19:39.
 * </pre>
 */
public class CommonPaymentPlatformMerchantDetails extends BasePayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<MerchantDetailsServiceBuilder> {

    private String detailsId;
    private String appId;
    private String mchId;
    private String seller;
    private String subAppId;
    private String subMchId;
    /**
     * 证书(PKCS12)
     */
    private Object keystore;


    /**
     * 公钥证书
     */
    private Object keyPublicCert;
    /**
     * 证书,这里针对双证书校验, 银联的根级证书
     */
    private Object keyCert;
    /**
     * 应用私钥证书,rsa_private pkcs8格式 生成签名时使用
     */
    private String keyPrivateCertPwd;

    /**
     * 证书存储类型
     */
    private CertStoreType certStoreType;
    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private volatile PaymentPlatform platform;

    private MerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;


    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public MerchantDetailsServiceBuilder and() {
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public MerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public CommonPaymentPlatformMerchantDetails(MerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public CommonPaymentPlatformMerchantDetails() {

    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        if (null == platform){
            platform = PaymentPlatforms.getPaymentPlatform(getPayType());
        }
        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        getPaymentPlatform();
        if (null == payService){
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }


    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public void setHttpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
    }

    public void setDetailsId(String detailsId) {
        this.detailsId = detailsId;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }


    public void setAppId(String appId) {
        this.appId = appId;
    }

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }

    @Override
    @Deprecated
    public String getAppid() {
        return appId;
    }

    /**
     * 应用id
     * 纠正名称
     *
     * @return 应用id
     */
    @Override
    public String getAppId() {
        return appId;
    }

    @Override
    public String getPid() {
        return mchId;
    }

    @Override
    public String getSeller() {
        return seller;
    }

    public void setSeller(String seller) {
        this.seller = seller;
    }

    public String getSubAppId() {
        return subAppId;
    }

    public void setSubAppId(String subAppId) {
        this.subAppId = subAppId;
    }

    public String getSubMchId() {
        return subMchId;
    }

    public void setSubMchId(String subMchId) {
        this.subMchId = subMchId;
    }


    /**
     * 设置私钥证书
     *
     * @param keystore 私钥证书地址 或者证书内容字符串
     *                 私钥证书密码 {@link #setKeyPrivateCertPwd(String)}
     */
    public void setKeystore(String keystore) {
        super.setKeyPrivate(keystore);
        this.keystore = keystore;
    }

    /**
     * 设置私钥证书
     *
     * @param keystore 私钥证书信息流
     *                 私钥证书密码 {@link #setKeyPrivateCertPwd(String)}
     */
    public void setKeystore(InputStream keystore) {
        this.keystore = keystore;
    }

    public InputStream getKeystoreInputStream() throws IOException {
        return certStoreType.getInputStream(keystore);
    }

    public Object getKeystore() {
        return keystore;
    }

    public String getKeystorePwd() {
        return getKeyPrivateCertPwd();
    }

    public void setKeystorePwd(String keystorePwd) {
       setKeyPrivateCertPwd(keystorePwd);
    }

    /**
     * 获取私钥证书密码
     * @return 私钥证书密码
     */
    public String getKeyPrivateCertPwd() {
        return keyPrivateCertPwd;
    }

    public void setKeyPrivateCertPwd(String keyPrivateCertPwd) {
        this.keyPrivateCertPwd = keyPrivateCertPwd;
    }



    public String getKeyPublicCert() {
        return (String) keyPublicCert;
    }

    /**
     * 设置公钥证书
     *
     * @param keyPublicCert 证书信息或者证书路径
     */
    public void setKeyPublicCert(String keyPublicCert) {
        setKeyPublic(keyPublicCert);
        this.keyPublicCert = keyPublicCert;
    }

    /**
     * 设置公钥证书
     *
     * @param keyPublicCert 证书文件
     */
    public void setKeyPublicCert(InputStream keyPublicCert) {
        this.keyPublicCert = keyPublicCert;
    }

    public Object getKeyCert() {
        return keyCert;
    }


    /**
     * 公钥证书,这里针对双证书校验, 银联的根级证书
     *
     * @param keyCert 证书信息或者证书路径
     */
    public void setKeyCert(String keyCert) {
        this.keyCert = keyCert;
    }

    /**
     * 公钥证书,这里针对双证书校验, 银联的根级证书
     *
     * @param keyCert 证书文件
     */
    public void setKeyCert(InputStream keyCert) {
        this.keyCert = keyCert;
    }

    public InputStream getKeyPublicCertInputStream() throws IOException {
        return certStoreType.getInputStream(keyPublicCert);
    }

    public InputStream getKeyCertInputStream() throws IOException {
        return certStoreType.getInputStream(keyCert);
    }

    /**
     * 证书存储类型
     *
     * @return 证书存储类型
     */
    public CertStoreType getCertStoreType() {
        return certStoreType;
    }

    public void setCertStoreType(CertStoreType certStoreType) {
        this.certStoreType = certStoreType;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/FuiouMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.fuiou.api.FuiouPayConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.FuiouPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;

/**
 * 富友商户信息列表
 *
 * @author egan
 * <pre>
 *                         email egzosn@gmail.com
 *                         date   2019/4/6 14:30.
 *                         </pre>
 */
public class FuiouMerchantDetails extends FuiouPayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {

    private String detailsId;
    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public FuiouMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public FuiouMerchantDetails() {
        init();
    }

    public void init() {
        if (null != platform) {
            return;
        }
        String platformName = FuiouPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }


    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService) {
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public FuiouMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }

    public void setDetailsId(String detailsId) {
        this.detailsId = detailsId;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }


    public FuiouMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public FuiouMerchantDetails notifyUrl(String notifyUrl) {
        setNotifyUrl(notifyUrl);
        return this;
    }

    public FuiouMerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }

    public FuiouMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public FuiouMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public FuiouMerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }

    public FuiouMerchantDetails mchntCd(String mchntCd) {
        setMchntCd(mchntCd);
        return this;
    }

    public FuiouMerchantDetails keyPrivate(String keyPrivate) {
        setKeyPrivate(keyPrivate);
        return this;
    }

    public FuiouMerchantDetails keyPublic(String keyPublic) {
        setKeyPublic(keyPublic);
        return this;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PayPalV2MerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaypalV2PaymentPlatform;

/**
 * 贝宝商户信息列表
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date   2019/4/6 14:30.
 *                 </pre>
 */
public class PayPalV2MerchantDetails extends PayPalConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {

    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public PayPalV2MerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public PayPalV2MerchantDetails() {
        init();
    }

    public void init() {
        if (null != platform) {
            return;
        }
        String platformName = PaypalV2PaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {

        init();

        if (null == payService) {
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public PayPalV2MerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public PayPalV2MerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public PayPalV2MerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public PayPalV2MerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public PayPalV2MerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }

    public PayPalV2MerchantDetails clientID(String clientID) {
        setClientID(clientID);
        return this;
    }

    public PayPalV2MerchantDetails clientSecret(String clientSecret) {
        setClientSecret(clientSecret);
        return this;
    }

    public PayPalV2MerchantDetails cancelUrl(String cancelUrl) {
        setNotifyUrl(cancelUrl);
        return this;
    }

    public PayPalV2MerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PayoneerMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.payoneer.api.PayoneerConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PayoneerPaymentPlatform;

/**
 * P卡(派安盈)商户信息列表
 *
 * @author egan
 *         <pre>
 *                         email egzosn@gmail.com
 *                         date   2019/4/6 14:30.
 *                         </pre>
 */
public class PayoneerMerchantDetails extends PayoneerConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {

    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform ;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;


    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }
    public PayoneerMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public PayoneerMerchantDetails() {
       init();
    }
    public void init() {
        if (null != platform){
            return;
        }
        String platformName = PayoneerPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }
    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }


    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService){
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }
    public PayoneerMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }
    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public PayoneerMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public PayoneerMerchantDetails programId(String programId) {
        setProgramId(programId);
        return this;
    }
    public PayoneerMerchantDetails userName(String userName) {
        setUserName(userName);
        return this;
    }
    public PayoneerMerchantDetails apiPassword(String apiPassword) {
        setApiPassword(apiPassword);
        return this;
    }

    public PayoneerMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public PayoneerMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public PayoneerMerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PaypalMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaypalPaymentPlatform;

/**
 * 贝宝商户信息列表
 *
 * @author egan
 *         <pre>
 *                 email egzosn@gmail.com
 *                 date   2019/4/6 14:30.
 *                 </pre>
 */
public class PaypalMerchantDetails extends PayPalConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {

    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform ;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }
    public PaypalMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public PaypalMerchantDetails() {
      init();
    }
    public void init() {
        String platformName = PaypalPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService){
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }
    public PaypalMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }
    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public PaypalMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }
    public PaypalMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public PaypalMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public PaypalMerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }
    public PaypalMerchantDetails clientID(String clientID) {
        setClientID(clientID);
        return this;
    }
    public PaypalMerchantDetails clientSecret(String clientSecret) {
        setClientSecret(clientSecret);
        return this;
    }

    public PaypalMerchantDetails cancelUrl(String cancelUrl) {
        setNotifyUrl(cancelUrl);
        return this;
    }

    public PaypalMerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/UnionMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import java.io.InputStream;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.UnionPaymentPlatform;
import com.egzosn.pay.union.api.UnionPayConfigStorage;

/**
 * 银联商户信息列表
 *
 * @author egan
 *         <pre>
 *                         email egzosn@gmail.com
 *                         date   2019/4/6 14:30.
 *                         </pre>
 */
public class UnionMerchantDetails extends UnionPayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {

    private String detailsId;
    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public UnionMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public UnionMerchantDetails() {
        init();
    }
    public void init() {
        if (null != platform){
            return;
        }
        String platformName = UnionPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService){
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public UnionMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }


    public UnionMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public UnionMerchantDetails notifyUrl(String notifyUrl) {
        setNotifyUrl(notifyUrl);
        return this;
    }

    public UnionMerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }

    public UnionMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public UnionMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public UnionMerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }

    public UnionMerchantDetails acpMiddleCert(String acpMiddleCert) {
        setAcpMiddleCert(acpMiddleCert);
        return this;
    }

    public UnionMerchantDetails acpMiddleCert(InputStream acpMiddleCert) {
        setAcpMiddleCert(acpMiddleCert);
        return this;
    }

    public UnionMerchantDetails acpRootCert(String acpRootCert) {
        setAcpRootCert(acpRootCert);
        return this;
    }

    public UnionMerchantDetails acpRootCert(InputStream acpRootCert) {
        setAcpRootCert(acpRootCert);
        return this;
    }

    public UnionMerchantDetails keyPrivateCert(String keyPrivateCert) {
        setKeyPrivateCert(keyPrivateCert);
        return this;
    }

    public UnionMerchantDetails keyPrivateCert(InputStream keyPrivateCert) {
        setKeyPrivateCert(keyPrivateCert);
        return this;

    }

    public UnionMerchantDetails keyPrivateCertPwd(String keyPrivateCertPwd) {
        setKeyPrivateCertPwd(keyPrivateCertPwd);
        return this;
    }
    public UnionMerchantDetails certStoreType(CertStoreType certStoreType) {
        setCertStoreType(certStoreType);
        return this;
    }

}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.WxPaymentPlatform;
import com.egzosn.pay.wx.api.WxPayConfigStorage;

/**
 * 支付宝商户信息列表
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date   2019/4/6 20:10.
 *                 </pre>
 */
public class WxMerchantDetails extends WxPayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {


    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public WxMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public WxMerchantDetails() {
        init();
    }

    public void init() {
        if (null != platform) {
            return;
        }
        String platformName = WxPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService) {
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public WxMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public WxMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public WxMerchantDetails notifyUrl(String notifyUrl) {
        setNotifyUrl(notifyUrl);
        return this;
    }

    public WxMerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }

    public WxMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public WxMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public WxMerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }


    public WxMerchantDetails appid(String appid) {
        setAppid(appid);
        return this;
    }

    public WxMerchantDetails secretKey(String secretKey) {
        setSecretKey(secretKey);
        return this;
    }

    public WxMerchantDetails keyPublic(String keyPublic) {
        setKeyPublic(keyPublic);
        return this;
    }

    public WxMerchantDetails mchId(String mchId) {
        setMchId(mchId);
        return this;
    }

    public WxMerchantDetails subAppid(String subAppid) {
        setSubAppid(subAppid);
        return this;
    }

    public WxMerchantDetails subMchId(String subMchId) {
        setSubMchId(subMchId);
        return this;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxV3MerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.WxV3PaymentPlatform;
import com.egzosn.pay.wx.v3.api.WxPayConfigStorage;

/**
 * 支付宝商户信息列表
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date   2019/4/6 20:10.
 *                 </pre>
 */
public class WxV3MerchantDetails extends WxPayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {


    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;

    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }

    public WxV3MerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public WxV3MerchantDetails() {
        init();
    }


    public WxV3MerchantDetails init() {
        if (null != platform) {
            return this;
        }
        String platformName = WxV3PaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
        return this;
    }

    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {

        return platform;
    }

    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService) {
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        initService();
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }

    public WxV3MerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }

    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public void setDetailsId(String detailsId) {
        this.detailsId = detailsId;
    }

    public WxV3MerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }

    public WxV3MerchantDetails notifyUrl(String notifyUrl) {
        setNotifyUrl(notifyUrl);
        return this;
    }

    public WxV3MerchantDetails returnUrl(String returnUrl) {
        setReturnUrl(returnUrl);
        return this;
    }

    public WxV3MerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public WxV3MerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }

    public WxV3MerchantDetails test(boolean test) {
        setTest(test);
        return this;
    }


    public WxV3MerchantDetails appId(String appId) {
        setAppId(appId);
        return this;
    }

    public WxV3MerchantDetails keyPrivate(String keyPrivate) {
        setKeyPrivate(keyPrivate);
        return this;
    }

    public WxV3MerchantDetails v3ApiKey(String v3ApiKey) {
        setV3ApiKey(v3ApiKey);
        return this;
    }

    public WxV3MerchantDetails apiKey(String apiKey) {
        setApiKey(apiKey);
        return this;
    }

    public WxV3MerchantDetails keyPublic(String keyPublic) {
        setKeyPublic(keyPublic);
        return this;
    }

    public WxV3MerchantDetails keyPublicId(String keyPublicId) {
        setKeyPublicId(keyPublicId);
        return this;
    }

    public WxV3MerchantDetails merchantSerialNumber(String merchantSerialNumber) {
        setMerchantSerialNumber(merchantSerialNumber);
        return this;
    }

    public WxV3MerchantDetails mchId(String mchId) {
        setMchId(mchId);
        return this;
    }

    public WxV3MerchantDetails subAppId(String subAppId) {
        setSubAppId(subAppId);
        return this;
    }

    public WxV3MerchantDetails subMchId(String subMchId) {
        setSubMchId(subMchId);
        return this;
    }


    public WxV3MerchantDetails apiClientKeyP12(Object apiClientKeyP12) {
        setApiClientKeyP12(apiClientKeyP12);
        return this;
    }

    public WxV3MerchantDetails certStoreType(CertStoreType certStoreType) {
        setCertStoreType(certStoreType);
        return this;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxYouDianMerchantDetails.java
================================================
package com.egzosn.pay.spring.boot.core.merchant.bean;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;
import com.egzosn.pay.spring.boot.core.builders.InMemoryMerchantDetailsServiceBuilder;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformServiceAdapter;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PayoneerPaymentPlatform;
import com.egzosn.pay.wx.youdian.api.WxYouDianPayConfigStorage;

/**
 * P卡(派安盈)商户信息列表
 *
 * @author egan
 *         <pre>
 *                         email egzosn@gmail.com
 *                         date   2019/4/6 14:30.
 *                         </pre>
 */
public class WxYouDianMerchantDetails extends WxYouDianPayConfigStorage implements PaymentPlatformMerchantDetails, PaymentPlatformServiceAdapter, PayConfigurerAdapter<InMemoryMerchantDetailsServiceBuilder> {

    private String detailsId;

    /**
     * 商户对应的支付服务
     */
    private volatile PayService payService;
    /**
     * 商户平台
     */
    private PaymentPlatform platform ;

    private InMemoryMerchantDetailsServiceBuilder builder;
    /**
     * HTTP请求配置
     */
    private HttpConfigStorage httpConfigStorage;


    /**
     * 外部调用者使用,链式的做法
     *
     * @return 返回对应外部调用者
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder and() {
        initService();
        return getBuilder();
    }

    /**
     * 获取构建器
     *
     * @return 构建器
     */
    @Override
    public InMemoryMerchantDetailsServiceBuilder getBuilder() {
        return builder;
    }
    public WxYouDianMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
        this();
        this.builder = builder;
    }

    public WxYouDianMerchantDetails() {
       init();
    }
    public void init() {
        String platformName = PayoneerPaymentPlatform.platformName;
        setPayType(platformName);
        platform = PaymentPlatforms.getPaymentPlatform(platformName);
    }
    /**
     * 获取支付平台
     *
     * @return 支付平台
     */
    @Override
    public PaymentPlatform getPaymentPlatform() {
        return platform;
    }


    /**
     * 初始化服务
     *
     * @return 支付商户服务适配器
     */
    @Override
    public PaymentPlatformServiceAdapter initService() {
        init();
        if (null == payService){
            payService = platform.getPayService(this, getHttpConfigStorage());
        }
        return this;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @return 支付服务
     */
    @Override
    public PayService getPayService() {
        return payService;
    }

    /**
     * 获取HTTP请求配置
     *
     * @return HTTP请求配置
     */
    @Override
    public HttpConfigStorage getHttpConfigStorage() {
        return httpConfigStorage;
    }
    public WxYouDianMerchantDetails httpConfigStorage(HttpConfigStorage httpConfigStorage) {
        this.httpConfigStorage = httpConfigStorage;
        return this;
    }
    /**
     * 获取支付商户id
     *
     * @return 支付商户id
     */
    @Override
    public String getDetailsId() {
        return detailsId;
    }

    public WxYouDianMerchantDetails detailsId(String detailsId) {
        this.detailsId = detailsId;
        return this;
    }


    public WxYouDianMerchantDetails keyPrivate(String keyPrivate) {
        setKeyPrivate(keyPrivate);
        return this;
    }

    public WxYouDianMerchantDetails keyPublic(String keyPublic) {
        setKeyPublic(keyPublic);
        return this;
    }

    public WxYouDianMerchantDetails seller(String seller) {
        setSeller(seller);
        return this;
    }


    public WxYouDianMerchantDetails signType(String signType) {
        setSignType(signType);
        return this;
    }

    public WxYouDianMerchantDetails inputCharset(String inputCharset) {
        setInputCharset(inputCharset);
        return this;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/CacheMerchantDetailsManager.java
================================================
package com.egzosn.pay.spring.boot.core.provider;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.util.Assert;

import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantNotFoundException;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;

/**
 * 缓存支付账户(商户)存储器
 *
 * @author egan
 *         <pre>
 * email egzosn@gmail.com
 * date 2021/1/7
 * </pre>
 */
public class CacheMerchantDetailsManager implements MerchantDetailsManager<PaymentPlatformMerchantDetails> {

    private Map<String, PaymentPlatformMerchantDetails> merchantDetails = new HashMap<String, PaymentPlatformMerchantDetails>();

    private MerchantDetailsManager<PaymentPlatformMerchantDetails> delegate;

    public CacheMerchantDetailsManager(MerchantDetailsManager<PaymentPlatformMerchantDetails> delegate) {
        this.delegate = delegate;
    }

    /**
     * 创建商户
     *
     * @param merchant 商户信息
     */
    @Override
    public void createMerchant(PaymentPlatformMerchantDetails merchant) {
        Assert.isTrue(!merchantExists(merchant.getDetailsId()), "商户信息已存在");
        merchantDetails.put(merchant.getDetailsId(), merchant);
        delegate.createMerchant(merchant);
    }

    /**
     * 创建商户
     *
     * @param merchants 商户信息
     */
    @Override
    public void createMerchant(Collection<PaymentPlatformMerchantDetails> merchants) {
        for (PaymentPlatformMerchantDetails merchant : merchants) {
            this.createMerchant(merchant);
        }
    }

    /**
     * 更新商户
     *
     * @param merchant 商户信息
     */
    @Override
    public void updateMerchant(PaymentPlatformMerchantDetails merchant) {
        Assert.isTrue(merchantExists(merchant.getDetailsId()), "商户信息不存在");
        merchantDetails.put(merchant.getDetailsId(), merchant);
        delegate.updateMerchant(merchant);


    }

    /**
     * 删除商户
     *
     * @param id 商户id
     */
    @Override
    public void deleteMerchant(String id) {
        merchantDetails.remove(id);
        delegate.deleteMerchant(id);
    }

    /**
     * 检查商户是否存在
     *
     * @param id 商户id
     * @return 检查商户是否存在
     */
    @Override
    public boolean merchantExists(String id) {
        boolean exist = merchantDetails.containsKey(id);
        if (exist) {
            return exist;
        }
        return delegate.merchantExists(id);

    }

    /**
     * 设置支付消息配置中心
     *
     * @param configurer 配置
     */
    @Override
    public void setPayMessageConfigurer(PayMessageConfigurer configurer) {
        delegate.setPayMessageConfigurer(configurer);
    }

    /**
     * 通过支付商户id加载对应的商户信息列表
     *
     * @param merchantId 支付商户id
     * @return 商户信息列表
     */
    @Override
    public PaymentPlatformMerchantDetails loadMerchantByMerchantId(String merchantId) {
        PaymentPlatformMerchantDetails details = merchantDetails.get(merchantId);
        if (null != details) {
            return details;
        }
        details = delegate.loadMerchantByMerchantId(merchantId);
        if (null == details){
            throw new MerchantNotFoundException(merchantId);
        }
        merchantDetails.put(details.getDetailsId(), details);
        return details;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/InMemoryMerchantDetailsManager.java
================================================
package com.egzosn.pay.spring.boot.core.provider;

import com.egzosn.pay.common.api.PayMessageHandler;
import com.egzosn.pay.common.api.PayMessageInterceptor;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.PayMessage;
import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantNotFoundException;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatformMerchantDetails;
import org.springframework.util.Assert;

import java.util.*;


/**
 * 内存型支付账户(商户)存储器
 *
 * @author egan
 *         <pre>
 *                 email egzosn@gmail.com
 *                 date 2018-11-22 17:18:03
 *           </pre>
 */
public class InMemoryMerchantDetailsManager implements MerchantDetailsManager<PaymentPlatformMerchantDetails> {

    private Map<String, PaymentPlatformMerchantDetails> merchantDetails = new HashMap<String, PaymentPlatformMerchantDetails>();
    private PayMessageConfigurer configurer;

    public InMemoryMerchantDetailsManager() {
    }

    public InMemoryMerchantDetailsManager(Collection<PaymentPlatformMerchantDetails> merchantDetails) {
        createMerchant(merchantDetails);
    }

    public InMemoryMerchantDetailsManager(Map<String, PaymentPlatformMerchantDetails> merchantDetails) {
        this.merchantDetails = merchantDetails;
    }

    /**
     * 这个暂时还未定义,后期版本进行
     * @param merchants 属性配置
     */
    public InMemoryMerchantDetailsManager(Properties merchants) {

    }


    /**
     * 创建商户
     *
     * @param merchants 商户信息
     */
    @Override
    public void createMerchant(Collection<PaymentPlatformMerchantDetails> merchants) {
        for (PaymentPlatformMerchantDetails merchant : merchants) {
            this.createMerchant(merchant);
        }
    }
    /**
     * 创建商户
     *
     * @param merchant 商户信息
     */
    @Override
    public void createMerchant(PaymentPlatformMerchantDetails merchant) {

        Assert.isTrue(!merchantExists(merchant.getDetailsId()), "商户信息已存在");
        InMemoryMerchantDetailsManager.setPayMessageConfigurer(merchant.getPayService(), merchant, configurer);
        merchantDetails.put(merchant.getDetailsId(), merchant);

    }
    protected static void setPayMessageConfigurer(PayService payService, PaymentPlatformMerchantDetails details, PayMessageConfigurer configurer){
        PayMessageHandler<PayMessage, PayService> handler = configurer.getHandler(details.getPaymentPlatform());
        if (null != handler){
            payService.setPayMessageHandler(handler);
        }

        List<PayMessageInterceptor<PayMessage, PayService>> interceptors = configurer.getInterceptor(details.getPaymentPlatform());
        if (null == interceptors || interceptors.isEmpty()){
            return;
        }
        for (PayMessageInterceptor<PayMessage, PayService> interceptor : interceptors){
            payService.addPayMessageInterceptor(interceptor);
        }
    }
    /**
     * 更新商户
     *
     * @param merchant 商户信息
     */
    @Override
    public void updateMerchant(PaymentPlatformMerchantDetails merchant) {
        Assert.isTrue(merchantExists(merchant.getDetailsId()), "商户信息不存在");
        merchantDetails.put(merchant.getDetailsId(), merchant);
    }

    /**
     * 删除商户
     *
     * @param id 商户id
     */
    @Override
    public void deleteMerchant(String id) {
        merchantDetails.remove(id);
    }

    /**
     * 检查商户是否存在
     *
     * @param id 商户id
     * @return 检查商户是否存在
     */
    @Override
    public boolean merchantExists(String id) {
        return merchantDetails.containsKey(id);
    }

    /**
     * 设置支付消息配置中心
     *
     * @param configurer 配置
     */
    @Override
    public void setPayMessageConfigurer(PayMessageConfigurer configurer) {
        this.configurer = configurer;
    }

    /**
     * 通过支付商户id加载对应的商户信息列表
     *
     * @param merchantId 支付商户id
     * @return 商户信息列表
     */
    @Override
    public PaymentPlatformMerchantDetails loadMerchantByMerchantId(String merchantId) {

        PaymentPlatformMerchantDetails details = merchantDetails.get(merchantId);
        if (null == details) {
            throw new MerchantNotFoundException(merchantId);
        }
        return details;
    }
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/JdbcMerchantDetailsManager.java
================================================
package com.egzosn.pay.spring.boot.core.provider;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantNotFoundException;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.UnionPaymentPlatform;
import com.egzosn.pay.spring.boot.core.utils.SqlTools;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.Assert;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static com.egzosn.pay.spring.boot.core.utils.SqlTools.SEPARATED;


/**
 * JDBC支付账户(商户)存储器
 *
 * @author egan
 *         <pre>
 *                 email egzosn@gmail.com
 *                 date 2018-11-22 17:18:03
 *                 </pre>
 */
public class JdbcMerchantDetailsManager implements MerchantDetailsManager<CommonPaymentPlatformMerchantDetails> {


    private static final String TABLE = "merchant_details";
    private static final List<String> FIELDS = Arrays.asList("appid", "pay_type", "mch_id", "cert_store_type", "key_private", "key_cert_pwd", "key_public", "key_cert", "notify_url", "return_url", "sign_type", "seller", "sub_app_id", "sub_mch_id", "input_charset", "is_test");
    private static final String SELECT_FIELDS = SqlTools.join(FIELDS, SEPARATED);
    private static final String ID = "details_id";

    private static final String DEFAULT_BASE_QUERY_SQL = SqlTools.getSelectSQL(ID + SEPARATED + SELECT_FIELDS, TABLE);
    private static final String DEFAULT_FIND_BY_ID_SQL = DEFAULT_BASE_QUERY_SQL + " where " + ID + "=?";
    private static final String DEFAULT_INSERT_SQL = "insert into " + TABLE + " (" + ID + SEPARATED + SELECT_FIELDS + ") values (" + SqlTools.forQuestionMarkSQL(FIELDS.size() + 1) + ")";
    private static final String DEFAULT_UPDATE_SQL = SqlTools.generateUpdateByRowIdString(TABLE, FIELDS, ID).toString();
    private static final String DEFAULT_DELETE_SQL = "delete from " + TABLE + " where " + ID + "=?";
    public static final String DEFAULT_EXISTS_SQL = "select " + ID + " from " + TABLE + " where " + ID + " = ?";

    private JdbcTemplate jdbcTemplate;

    private String findByIdSql = DEFAULT_FIND_BY_ID_SQL;
    private String insertSql = DEFAULT_INSERT_SQL;
    private String updateSql = DEFAULT_UPDATE_SQL;
    private String deleteSql = DEFAULT_DELETE_SQL;
    private String existsSql = DEFAULT_EXISTS_SQL;

    private PayMessageConfigurer configurer;

    public JdbcMerchantDetailsManager(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public JdbcMerchantDetailsManager(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }


    /**
     * 创建商户
     *
     * @param merchants 商户信息
     */
    @Override
    public void createMerchant(Collection<CommonPaymentPlatformMerchantDetails> merchants) {
        for (CommonPaymentPlatformMerchantDetails merchant : merchants) {
            this.createMerchant(merchant);
        }
    }
    /**
     * 创建商户
     *
     * @param merchant 商户信息
     */
    @Override
    public void createMerchant(CommonPaymentPlatformMerchantDetails merchant) {

        Assert.isTrue(!merchantExists(merchant.getDetailsId()), "商户信息已存在");
        Object[] args = new Object[]{merchant.getDetailsId(), merchant.getAppId(), merchant.getPayType(), merchant.getMchId(), merchant.getCertStoreType(), merchant.getKeyPrivate(), merchant.getKeyPrivateCertPwd(), merchant.getKeyPublic(), merchant.getKeyCert(), merchant.getNotifyUrl(), merchant.getReturnUrl(), merchant.getSignType(), merchant.getSeller(), merchant.getSubAppId(), merchant.getSubMchId(), merchant.getInputCharset(), merchant.isTest()};
        jdbcTemplate.update(insertSql, args);


    }

    /**
     * 更新商户
     *
     * @param merchant 商户信息
     */
    @Override
    public void updateMerchant(CommonPaymentPlatformMerchantDetails merchant) {
        Assert.isTrue(merchantExists(merchant.getDetailsId()), "商户信息不存在");
        Object[] args = new Object[]{merchant.getAppId(), merchant.getPayType(), merchant.getMchId(), merchant.getCertStoreType(), merchant.getKeyPrivate(), merchant.getKeyPrivateCertPwd(), merchant.getKeyPublic(), merchant.getKeyCert(), merchant.getNotifyUrl(), merchant.getReturnUrl(), merchant.getSignType(), merchant.getSeller(), merchant.getSubAppId(), merchant.getSubMchId(), merchant.getInputCharset(), merchant.isTest(), merchant.getDetailsId()};
        jdbcTemplate.update(updateSql, args);
    }

    /**
     * 删除商户
     *
     * @param id 商户id
     */
    @Override
    public void deleteMerchant(String id) {
        jdbcTemplate.update(deleteSql, id);
    }

    /**
     * 检查商户是否存在
     *
     * @param merchantId 商户id
     * @return 检查商户是否存在
     */
    @Override
    public boolean merchantExists(String merchantId) {
        List<String> ids = jdbcTemplate.queryForList(existsSql, String.class, merchantId);
        if (ids.size() > 1) {
            throw new IncorrectResultSizeDataAccessException("出现重复的支付商户id", 1);
        }

        return !ids.isEmpty();
    }

    /**
     * 通过支付商户id加载对应的商户信息列表
     *
     * @param merchantId 支付商户id
     * @return 商户信息列表
     */
    @Override
    public CommonPaymentPlatformMerchantDetails loadMerchantByMerchantId(String merchantId) {
        List<CommonPaymentPlatformMerchantDetails> detailss = jdbcTemplate.query(findByIdSql, (ResultSet rs, int i)->{
                CommonPaymentPlatformMerchantDetails details = new CommonPaymentPlatformMerchantDetails();
                details.setDetailsId(rs.getString(1));
                details.setAppId(rs.getString(2));
                details.setPayType(rs.getString(3));
                details.setMchId(rs.getString(4));
                String certStoreType = rs.getString(5);
                if (StringUtils.isNotEmpty(certStoreType)) {
                    details.setCertStoreType(CertStoreType.valueOf(certStoreType));
                }
                if (details.getCertStoreType() == CertStoreType.INPUT_STREAM) {
                    setKeyPrivate(details, rs);
                    details.setKeyCert(rs.getAsciiStream(9));
                }
                else {
                    details.setKeystore(rs.getString(6));
                    details.setKeyPublicCert(rs.getString(8));
                    details.setKeyCert(rs.getString(9));
                }
                details.setKeystorePwd(rs.getString(7));
                details.setNotifyUrl(rs.getString(10));
                details.setReturnUrl(rs.getString(11));
                details.setSignType(rs.getString(12));
                details.setSeller(rs.getString(13));
                details.setSubAppId(rs.getString(14));
                details.setSubMchId(rs.getString(15));
                details.setInputCharset(rs.getString(16));
                details.setTest(rs.getBoolean(17));
                PayService payService = details.initService().getPayService();
                InMemoryMerchantDetailsManager.setPayMessageConfigurer(payService, details, configurer);
                return details;
        }, merchantId);
        int size = detailss != null ? detailss.size() : 0;
        if (size == 0) {
            throw new MerchantNotFoundException(merchantId);
        }
        else if (size > 1) {
            throw new IncorrectResultSizeDataAccessException(1, size);
        }
        else {
            return detailss.get(0);
        }
    }


    public void setKeyPrivate(CommonPaymentPlatformMerchantDetails details, ResultSet rs) throws SQLException {
        if (UnionPaymentPlatform.platformName.equals(details.getPayType())) {
            details.setKeystore(rs.getAsciiStream(6));
            details.setKeyPublicCert(rs.getAsciiStream(8));
        }
        else {
            details.setKeyPrivate(rs.getString(6));
            details.setKeyPublic(rs.getString(8));
        }

    }

    public String getFindByIdSql() {
        return findByIdSql;
    }

    public void setFindByIdSql(String findByIdSql) {
        this.findByIdSql = findByIdSql;
    }

    public String getInsertSql() {
        return insertSql;
    }

    public void setInsertSql(String insertSql) {
        this.insertSql = insertSql;
    }

    public String getUpdateSql() {
        return updateSql;
    }

    public void setUpdateSql(String updateSql) {
        this.updateSql = updateSql;
    }

    public String getDeleteSql() {
        return deleteSql;
    }

    public void setDeleteSql(String deleteSql) {
        this.deleteSql = deleteSql;
    }

    public String getExistsSql() {
        return existsSql;
    }

    public void setExistsSql(String existsSql) {
        this.existsSql = existsSql;
    }


    /**
     * 设置支付消息配置中心
     *
     * @param configurer 配置
     */
    @Override
    public void setPayMessageConfigurer(PayMessageConfigurer configurer) {
        this.configurer = configurer;
    }



}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/MerchantDetailsManager.java
================================================
package com.egzosn.pay.spring.boot.core.provider;

import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantDetails;
import com.egzosn.pay.spring.boot.core.merchant.MerchantDetailsService;

import java.util.Collection;
import java.util.List;

/**
 * 商户列表管理器
 * @author egan
 *         <pre>
 *         email egzosn@gmail.com
 *         date  2019/4/2 14:44.
 *         </pre>
 */
public interface MerchantDetailsManager<T extends MerchantDetails> extends MerchantDetailsService<T> {

    /**
     *  创建商户
     * @param merchant 商户信息
     */
    void createMerchant(T merchant);
    /**
     *  创建商户
     * @param merchants 商户信息
     */
    void createMerchant(Collection<T> merchants);

    /**
     *  更新商户
     * @param merchant 商户信息
     */
    void updateMerchant(T merchant);
    /**
     *  删除商户
     * @param id 商户id
     */
    void deleteMerchant(String id);

    /**
     * 检查商户是否存在
     * @param id 商户id
     * @return 检查商户是否存在
     */
    boolean merchantExists(String id);

    /**
     * 设置支付消息配置中心
     * @param configurer 配置
     */
    void setPayMessageConfigurer(PayMessageConfigurer configurer);
}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/AliPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.ali.api.AliPayConfigStorage;
import com.egzosn.pay.ali.api.AliPayService;
import com.egzosn.pay.ali.bean.AliTransactionType;
import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;

/**
 * 支付宝支付平台
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date  2019/4/4 14:35.
 *                 </pre>
 */
@Configuration(AliPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(AliPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.ali.api.AliPayConfigStorage")
public class AliPaymentPlatform implements PaymentPlatform {

    public static final String PLATFORM_NAME = "aliPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof AliPayConfigStorage) {
            return new AliPayService((AliPayConfigStorage) payConfigStorage);
        }
        AliPayConfigStorage configStorage = new AliPayConfigStorage();
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setAppId(payConfigStorage.getAppId());
        configStorage.setPid(payConfigStorage.getPid());
        configStorage.setAttach(payConfigStorage.getAttach());
        configStorage.setSeller(payConfigStorage.getSeller());
        configStorage.setKeyPrivate(payConfigStorage.getKeyPrivate());
        configStorage.setKeyPublic(payConfigStorage.getKeyPublic());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setTest(payConfigStorage.isTest());
        configStorage.setSignType(payConfigStorage.getSignType());
        if (payConfigStorage instanceof CommonPaymentPlatformMerchantDetails) {
            final CommonPaymentPlatformMerchantDetails commonPaymentPlatformMerchantDetails = (CommonPaymentPlatformMerchantDetails) payConfigStorage;
            configStorage.setAppAuthToken(commonPaymentPlatformMerchantDetails.getSubAppId());
            certKeyPublic(configStorage, commonPaymentPlatformMerchantDetails);
        }

        return new AliPayService(configStorage);
    }

    private static void certKeyPublic(AliPayConfigStorage aliPayConfigStorage, CommonPaymentPlatformMerchantDetails payConfigStorage) {
        final String keyPublicCert = payConfigStorage.getKeyPublic();
        //这里通过兼容的方式去处理,匹配尾缀如果为证书文件的话就当证书处理
        if (!keyPublicCert.endsWith(".crt")) {
            return;
        }
        //设置为证书方式
        aliPayConfigStorage.setCertSign(true);
        //设置证书存储方式,这里为路径
        aliPayConfigStorage.setCertStoreType(payConfigStorage.getCertStoreType());
        String[] keyCert = payConfigStorage.getKeyCert().toString().split(",");
        aliPayConfigStorage.setMerchantCert(keyCert[0]);
        aliPayConfigStorage.setAliPayRootCert(keyCert[1]);
        aliPayConfigStorage.setAliPayCert(payConfigStorage.getKeyPublic());
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return AliTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/FuiouPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.fuiou.api.FuiouPayConfigStorage;
import com.egzosn.pay.fuiou.api.FuiouPayService;
import com.egzosn.pay.fuiou.bean.FuiouTransactionType;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

/**
 * 富友支付平台
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date  2019/4/4 14:35.
 *                 </pre>
 */
@Configuration(FuiouPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(FuiouPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.fuiou.api.FuiouPayConfigStorage")
public class FuiouPaymentPlatform implements PaymentPlatform {

    public static final String PLATFORM_NAME = "fuiouPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof FuiouPayConfigStorage) {
            return new FuiouPayService((FuiouPayConfigStorage) payConfigStorage);
        }
        FuiouPayConfigStorage configStorage = new FuiouPayConfigStorage();
        configStorage.setMchntCd(payConfigStorage.getPid());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setSignType(payConfigStorage.getSignType());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setTest(payConfigStorage.isTest());
        return new FuiouPayService(configStorage);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return FuiouTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaymentPlatforms.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

import java.util.HashMap;
import java.util.Map;

/**
 * 支付平台集
 *
 * @author egan
 *         <pre>
 * email egzosn@gmail.com
 * date  2019/4/9 15:57.
 * </pre>
 */
public final class PaymentPlatforms {

    private static final Map<String, PaymentPlatform> PAYMENT_PLATFORMS = new HashMap<String, PaymentPlatform>();


    /**
     * 加载支付平台
     *
     * @param platform 支付平台
     */
    public static void loadPaymentPlatform(PaymentPlatform platform) {
        PAYMENT_PLATFORMS.put(platform.getPlatform(), platform);
    }

    /**
     * 获取所有的支付平台
     *
     * @return 所有的支付平台
     */
    public static Map<String, PaymentPlatform> getPaymentPlatforms() {
        return PAYMENT_PLATFORMS;
    }

    /**
     * 通过支付平台名称与交易类型(支付类型)名称或者交易类型
     *
     * @param platformName        支付平台名称
     * @param transactionTypeName 交易类型名称
     * @return 交易类型
     */
    public static TransactionType getTransactionType(String platformName, String transactionTypeName) {
        PaymentPlatform platform = getPaymentPlatform(platformName);
        return platform.getTransactionType(transactionTypeName);
    }

    /**
     * 通过支付平台名称与交易类型(支付类型)名称或者交易类型
     *
     * @param platformName 支付平台名称
     * @return 交易类型
     */
    public static PaymentPlatform getPaymentPlatform(String platformName) {
        PaymentPlatform platform = PAYMENT_PLATFORMS.get(platformName);
        return platform;
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PayoneerPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.payoneer.api.PayoneerConfigStorage;
import com.egzosn.pay.payoneer.api.PayoneerPayService;
import com.egzosn.pay.payoneer.bean.PayoneerTransactionType;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

/**
 * P卡(派安盈)支付平台
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date  2019/4/4 14:35.
 *                 </pre>
 */
@Configuration(PayoneerPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(PayoneerPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.payoneer.api.PayoneerConfigStorage")
public class PayoneerPaymentPlatform implements PaymentPlatform {


    public static final String PLATFORM_NAME = "payoneerPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;

    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof PayoneerConfigStorage) {
            return new PayoneerPayService((PayoneerConfigStorage) payConfigStorage);
        }
        PayoneerConfigStorage configStorage = new PayoneerConfigStorage();
        configStorage.setProgramId(payConfigStorage.getPid());
        configStorage.setUserName(payConfigStorage.getSeller());
        configStorage.setApiPassword(payConfigStorage.getKeyPrivate());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setSignType(payConfigStorage.getSignType());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setTest(payConfigStorage.isTest());
        return new PayoneerPayService(configStorage);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return PayoneerTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaypalPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.paypal.api.PayPalPayService;
import com.egzosn.pay.paypal.bean.PayPalTransactionType;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

/**
 * 贝宝支付平台
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date  2019/4/4 14:35.
 *                 </pre>
 */

@Configuration(PaypalPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(PaypalPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.paypal.api.PayPalConfigStorage")
public class PaypalPaymentPlatform implements PaymentPlatform {
    public static final String PLATFORM_NAME = "paypalPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof PayPalConfigStorage) {
            return new PayPalPayService((PayPalConfigStorage) payConfigStorage);
        }
        PayPalConfigStorage configStorage = new PayPalConfigStorage();
        configStorage.setClientID(payConfigStorage.getPid());
        configStorage.setClientSecret(payConfigStorage.getKeyPrivate());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        //取消按钮转跳地址,这里用异步通知地址的兼容的做法
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setSignType(payConfigStorage.getSignType());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setTest(payConfigStorage.isTest());
        return new PayPalPayService(configStorage);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return PayPalTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaypalV2PaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.paypal.v2.api.PayPalPayService;
import com.egzosn.pay.paypal.v2.bean.PayPalTransactionType;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;

/**
 * 贝宝支付平台
 *
 * @author egan
 * <pre>
 * email egan@egzosn.com
 * date  2021/10/7.
 * </pre>
 */

@Configuration(PaypalV2PaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(PaypalV2PaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.paypal.api.PayPalConfigStorage")
public class PaypalV2PaymentPlatform implements PaymentPlatform {
    public static final String PLATFORM_NAME = "paypalV2Pay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof PayPalConfigStorage) {
            return new PayPalPayService((PayPalConfigStorage) payConfigStorage);
        }
        PayPalConfigStorage configStorage = new PayPalConfigStorage();
        configStorage.setClientID(payConfigStorage.getPid());
        configStorage.setClientSecret(payConfigStorage.getKeyPrivate());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        //取消按钮转跳地址,这里用异步通知地址的兼容的做法
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setSignType(payConfigStorage.getSignType());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setTest(payConfigStorage.isTest());
        return new PayPalPayService(configStorage);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return PayPalTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/UnionPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;
import com.egzosn.pay.union.api.UnionPayConfigStorage;
import com.egzosn.pay.union.api.UnionPayService;
import com.egzosn.pay.union.bean.UnionTransactionType;

/**
 * 银联支付平台
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date  2019/4/4 14:35.
 *                 </pre>
 */
@Configuration(UnionPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(UnionPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.union.api.UnionPayConfigStorage")
public class UnionPaymentPlatform implements PaymentPlatform {
    protected final Log LOG = LogFactory.getLog(UnionPaymentPlatform.class);
    public static final String PLATFORM_NAME = "unionPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof UnionPayConfigStorage) {
            return new UnionPayService((UnionPayConfigStorage) payConfigStorage);
        }
        UnionPayConfigStorage configStorage = new UnionPayConfigStorage();
        configStorage.setMerId(payConfigStorage.getPid());
        //是否为证书签名
        configStorage.setCertSign(true);
        configStorage.setPid(payConfigStorage.getPid());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setSignType(payConfigStorage.getSignType());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setTest(payConfigStorage.isTest());
        if (payConfigStorage instanceof CommonPaymentPlatformMerchantDetails) {
            CommonPaymentPlatformMerchantDetails merchantDetails = (CommonPaymentPlatformMerchantDetails) payConfigStorage;
            //设置证书对应的存储方式
            configStorage.setCertStoreType(merchantDetails.getCertStoreType());
            try {
                //中级证书路径
                configStorage.setAcpMiddleCert(merchantDetails.getKeyPublicCertInputStream());
                //根证书路径
                configStorage.setAcpRootCert(merchantDetails.getKeyCertInputStream());
                // 私钥证书路径
                configStorage.setKeyPrivateCert(merchantDetails.getKeystoreInputStream());
                //这里转变为流的方式
                configStorage.setCertStoreType(CertStoreType.INPUT_STREAM);
            }
            catch (IOException e) {
                LOG.error(e);
            }
            //私钥证书对应的密码
            configStorage.setKeyPrivateCertPwd(merchantDetails.getKeystorePwd());

        }

        return new UnionPayService(configStorage);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return UnionTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;
import com.egzosn.pay.wx.api.WxPayConfigStorage;
import com.egzosn.pay.wx.api.WxPayService;
import com.egzosn.pay.wx.bean.WxTransactionType;

/**
 * 微信支付平台
 *
 * @author egan
 * <pre>
 *                 email egzosn@gmail.com
 *                 date  2019/4/4 14:35.
 *                 </pre>
 */
@Configuration(WxPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(WxPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.wx.api.WxPayConfigStorage")
public class WxPaymentPlatform extends WxPayConfigStorage implements PaymentPlatform {

    protected final Log LOG = LogFactory.getLog(WxPaymentPlatform.class);

    public static final String PLATFORM_NAME = "wxPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        return getPayService(payConfigStorage, null);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        if (payConfigStorage instanceof WxPayConfigStorage) {
            WxPayService wxPayService = new WxPayService((WxPayConfigStorage) payConfigStorage);
            wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
            return wxPayService;
        }
        WxPayConfigStorage configStorage = new WxPayConfigStorage();
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setAppId(payConfigStorage.getAppId());
        configStorage.setMchId(payConfigStorage.getPid());
        configStorage.setAttach(payConfigStorage.getAttach());
        configStorage.setKeyPrivate(payConfigStorage.getKeyPrivate());
        configStorage.setKeyPublic(payConfigStorage.getKeyPublic());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setTest(payConfigStorage.isTest());
        configStorage.setSignType(payConfigStorage.getSignType());

        if (payConfigStorage instanceof CommonPaymentPlatformMerchantDetails) {
            CommonPaymentPlatformMerchantDetails merchantDetails = (CommonPaymentPlatformMerchantDetails) payConfigStorage;
            configStorage.setSubAppId(merchantDetails.getSubAppId());
            configStorage.setSubMchId(merchantDetails.getSubMchId());
            if (null != merchantDetails.getKeyCert()) {
                if (null == httpConfigStorage) {
                    httpConfigStorage = new HttpConfigStorage();
                }
                httpConfigStorage.setCertStoreType(merchantDetails.getCertStoreType());
                try {
                    httpConfigStorage.setKeystore(merchantDetails.getKeyCertInputStream());
                }
                catch (IOException e) {
                    LOG.error(e);
                }

                httpConfigStorage.setCertStoreType(CertStoreType.INPUT_STREAM);
                httpConfigStorage.setStorePassword(merchantDetails.getKeystorePwd());

            }
        }


        WxPayService wxPayService = new WxPayService(configStorage);
        wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
        return wxPayService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return WxTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3CombinePaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;
import com.egzosn.pay.wx.v3.api.WxCombinePayService;
import com.egzosn.pay.wx.v3.api.WxPayConfigStorage;
import com.egzosn.pay.wx.v3.bean.WxTransactionType;

/**
 * 微信V3合单支付平台
 *
 * @author egan
 * <pre>
 * email egan@egzosn.com
 * date  2021/10/7.
 * </pre>
 */
@Configuration(WxV3CombinePaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(WxV3CombinePaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.wx.v3.api.WxPayConfigStorage")
public class WxV3CombinePaymentPlatform extends WxPayConfigStorage implements PaymentPlatform {

    private final Log LOG = LogFactory.getLog(WxV3CombinePaymentPlatform.class);

    public static final String PLATFORM_NAME = "wxV3CombinePay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        return getPayService(payConfigStorage, null);
    }


    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        if (payConfigStorage instanceof WxPayConfigStorage) {
            WxCombinePayService wxPayService = new WxCombinePayService((WxPayConfigStorage) payConfigStorage);
            wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
            return wxPayService;
        }
        WxPayConfigStorage configStorage = new WxPayConfigStorage();
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setAppId(payConfigStorage.getAppId());
        configStorage.setMchId(payConfigStorage.getPid());
        configStorage.setAttach(payConfigStorage.getAttach());
        configStorage.setV3ApiKey(payConfigStorage.getKeyPrivate());
        configStorage.setKeyPublic(payConfigStorage.getKeyPublic());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setTest(payConfigStorage.isTest());
        configStorage.setSignType(payConfigStorage.getSignType());
        //是否为证书签名
        configStorage.setCertSign(true);
        if (payConfigStorage instanceof CommonPaymentPlatformMerchantDetails) {
            CommonPaymentPlatformMerchantDetails merchantDetails = (CommonPaymentPlatformMerchantDetails) payConfigStorage;
            configStorage.setSubAppId(merchantDetails.getSubAppId());
            configStorage.setSubMchId(merchantDetails.getSubMchId());
            if (null != merchantDetails.getKeyCert()) {
                configStorage.setCertStoreType(merchantDetails.getCertStoreType());
                try {
                    configStorage.setApiClientKeyP12(merchantDetails.getKeyCertInputStream());
                }
                catch (IOException e) {
                    LOG.error(e);
                }
                configStorage.setCertStoreType(CertStoreType.INPUT_STREAM);

            }
        }


        WxCombinePayService wxPayService = new WxCombinePayService(configStorage);
        wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
        return wxPayService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return WxTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3PaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;
import com.egzosn.pay.wx.v3.api.WxPayConfigStorage;
import com.egzosn.pay.wx.v3.api.WxPayService;
import com.egzosn.pay.wx.v3.bean.WxTransactionType;

/**
 * 微信V3支付平台
 *
 * @author egan
 * <pre>
 * email egan@egzosn.com
 * date  2021/10/7.
 * </pre>
 */
@Configuration(WxV3PaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(WxV3PaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.wx.v3.api.WxPayConfigStorage")
public class WxV3PaymentPlatform extends WxPayConfigStorage implements PaymentPlatform {

    private final Log LOG = LogFactory.getLog(WxV3PaymentPlatform.class);

    public static final String PLATFORM_NAME = "wxV3Pay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        return getPayService(payConfigStorage, null);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        if (payConfigStorage instanceof WxPayConfigStorage) {
            WxPayService wxPayService = new WxPayService((WxPayConfigStorage) payConfigStorage);
            wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
            return wxPayService;
        }
        WxPayConfigStorage configStorage = new WxPayConfigStorage();
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setAppId(payConfigStorage.getAppId());
        configStorage.setMchId(payConfigStorage.getPid());
        configStorage.setAttach(payConfigStorage.getAttach());
        configStorage.setV3ApiKey(payConfigStorage.getKeyPrivate());
        configStorage.setKeyPublic(payConfigStorage.getKeyPublic());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setTest(payConfigStorage.isTest());
        configStorage.setSignType(payConfigStorage.getSignType());
        if (payConfigStorage instanceof CommonPaymentPlatformMerchantDetails) {
            CommonPaymentPlatformMerchantDetails merchantDetails = (CommonPaymentPlatformMerchantDetails) payConfigStorage;
            configStorage.setSubAppId(merchantDetails.getSubAppId());
            configStorage.setSubMchId(merchantDetails.getSubMchId());
            if (null != merchantDetails.getKeyCert()) {
                configStorage.setCertStoreType(merchantDetails.getCertStoreType());
                try {
                    configStorage.setApiClientKeyP12(merchantDetails.getKeyCertInputStream());
                }
                catch (IOException e) {
                    LOG.error(e);
                }
                configStorage.setCertStoreType(CertStoreType.INPUT_STREAM);

            }
        }


        WxPayService wxPayService = new WxPayService(configStorage);
        wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
        return wxPayService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return WxTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3ProfitSharingPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CertStoreType;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.merchant.bean.CommonPaymentPlatformMerchantDetails;
import com.egzosn.pay.wx.v3.api.WxPayConfigStorage;
import com.egzosn.pay.wx.v3.api.WxProfitSharingService;
import com.egzosn.pay.wx.v3.bean.WxTransactionType;

/**
 * 微信V3分账平台
 *
 * @author egan
 * <pre>
 * email egan@egzosn.com
 * date  2021/10/7.
 * </pre>
 */
@Configuration(WxV3ProfitSharingPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(WxV3ProfitSharingPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.wx.v3.api.WxPayConfigStorage")
public class WxV3ProfitSharingPlatform extends WxPayConfigStorage implements PaymentPlatform {

    private final Log LOG = LogFactory.getLog(WxV3ProfitSharingPlatform.class);

    public static final String PLATFORM_NAME = "wxV3ProfitSharing";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;

    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        return getPayService(payConfigStorage, null);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        if (payConfigStorage instanceof WxPayConfigStorage) {
            WxProfitSharingService wxPayService = new WxProfitSharingService((WxPayConfigStorage) payConfigStorage);
            wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
            return wxPayService;
        }
        WxPayConfigStorage configStorage = new WxPayConfigStorage();
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setAppId(payConfigStorage.getAppId());
        configStorage.setMchId(payConfigStorage.getPid());
        configStorage.setAttach(payConfigStorage.getAttach());
        configStorage.setV3ApiKey(payConfigStorage.getKeyPrivate());
        configStorage.setKeyPublic(payConfigStorage.getKeyPublic());
        configStorage.setNotifyUrl(payConfigStorage.getNotifyUrl());
        configStorage.setReturnUrl(payConfigStorage.getReturnUrl());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setTest(payConfigStorage.isTest());
        configStorage.setSignType(payConfigStorage.getSignType());
        //是否为证书签名
        if (payConfigStorage instanceof CommonPaymentPlatformMerchantDetails) {
            CommonPaymentPlatformMerchantDetails merchantDetails = (CommonPaymentPlatformMerchantDetails) payConfigStorage;
            configStorage.setSubAppId(merchantDetails.getSubAppId());
            configStorage.setSubMchId(merchantDetails.getSubMchId());
            if (null != merchantDetails.getKeyCert()) {
                configStorage.setCertStoreType(merchantDetails.getCertStoreType());
                try {
                    configStorage.setApiClientKeyP12(merchantDetails.getKeyCertInputStream());
                }
                catch (IOException e) {
                    LOG.error(e);
                }
                configStorage.setCertStoreType(CertStoreType.INPUT_STREAM);

            }
        }


        WxProfitSharingService wxPayService = new WxProfitSharingService(configStorage);
        wxPayService.setRequestTemplateConfigStorage(httpConfigStorage);
        return wxPayService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return WxTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/YoudianPaymentPlatform.java
================================================
package com.egzosn.pay.spring.boot.core.provider.merchant.platform;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Configuration;

import com.egzosn.pay.common.api.PayConfigStorage;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.TransactionType;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.wx.youdian.api.WxYouDianPayConfigStorage;
import com.egzosn.pay.wx.youdian.api.WxYouDianPayService;
import com.egzosn.pay.wx.youdian.bean.YoudianTransactionType;

/**
 * 友店支付平台
 *
 * @author egan
 * <pre>
 *         email egzosn@gmail.com
 *         date  2019/4/4 14:35.
 *         </pre>
 */
@Configuration(YoudianPaymentPlatform.PLATFORM_NAME)
@ConditionalOnMissingBean(YoudianPaymentPlatform.class)
@ConditionalOnClass(name = "com.egzosn.pay.wx.youdian.api.WxYouDianPayConfigStorage")
public class YoudianPaymentPlatform implements PaymentPlatform {

    public static final String PLATFORM_NAME = "youdianPay";
    @Deprecated
    public static final String platformName = PLATFORM_NAME;


    /**
     * 获取商户平台
     *
     * @return 商户平台
     */
    @Override
    public String getPlatform() {
        return PLATFORM_NAME;
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage 支付配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage) {
        if (payConfigStorage instanceof WxYouDianPayConfigStorage) {
            return new WxYouDianPayService((WxYouDianPayConfigStorage) payConfigStorage);
        }
        WxYouDianPayConfigStorage configStorage = new WxYouDianPayConfigStorage();
        configStorage.setKeyPrivate(payConfigStorage.getKeyPrivate());
        configStorage.setKeyPublic(payConfigStorage.getKeyPublic());
        configStorage.setSignType(payConfigStorage.getSignType());
        configStorage.setPayType(payConfigStorage.getPayType());
        configStorage.setSeller(payConfigStorage.getSeller());
        configStorage.setInputCharset(payConfigStorage.getInputCharset());
        configStorage.setTest(payConfigStorage.isTest());
        return new WxYouDianPayService(configStorage);
    }

    /**
     * 获取支付平台对应的支付服务
     *
     * @param payConfigStorage  支付配置
     * @param httpConfigStorage 网络配置
     * @return 支付服务
     */
    @Override
    public PayService getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage httpConfigStorage) {
        PayService payService = getPayService(payConfigStorage);
        payService.setRequestTemplateConfigStorage(httpConfigStorage);
        return payService;
    }

    @Override
    public TransactionType getTransactionType(String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        return YoudianTransactionType.valueOf(name);
    }


}


================================================
FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/utils/SqlTools.java
================================================
package com.egzosn.pay.spring.boot.core.utils;


import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * jdbc sql生成语句生产
 *
 * @author ZaoSheng
 * Wed Nov 162 17:31:32 CST 2015
 */
public class SqlTools {
    public static final String SEPARATED = ", ";
    private static final Pattern PATTERN = Pattern.compile(":([0-9A-Za-z_]+)[" + SEPARATED + "]?");

    /**
     * 获取统计的sql
     *
     * @param sql 原始sql
     * @return 转化后的sql
     */
    public static String getCountSQL(final String sql) {
        return getCountSQL(sql, null);
    }

    /**
     * 获取统计的sql
     *
     * @param sql 原始sql
     * @return 转化后的sql
     */
    public static String getCountOracleSQL(final String sql) {
        return getCountOracleSQL(sql, null);

    }

    /**
     * 获取统计的sql
     *
     * @param sql        原始sql
     * @param countField 需要统计的字段
     * @return 转化后的sql
     */
    public static String getCountSQL(final String sql, String countField) {

        String countSql = String.format("SELECT  COUNT(%s) ", null == countField ? "*" : countField);
        String upperSql = sql.toUpperCase();
        int start = upperSql.indexOf("FROM ");
        int end = upperSql.lastIndexOf("ORDER BY ");
        countSql += sql.substring(start, end == -1 ? sql.length() : end);
        return countSql;
    }

    /**
     * 获取统计的sql
     *
     * @param sql        原始sql
     * @param countField 需要统计的字段
     * @return 转化后的sql
     */
    public static String getCountOracleSQL(final String sql, String countField) {

        String countSql = String.format("SELECT  COUNT(%s) ", null == countField ? "*" : countField);
        String upperSql = sql.toUpperCase().replace("SELECT * FROM ( ", "").replace(" ) WHERE ROWNUM BETWEEN %s AND %s", "");
        int start = upperSql.indexOf("FROM ");
        int end = upperSql.lastIndexOf("ORDER BY ");
        countSql += sql.substring(start, end == -1 ? sql.length() : end);
        return countSql;
    }

    /**
     * 移除sql的group部分
     *
     * @param sql 原始sql
     * @return 转化后的sql
     */
    public static String removeGROUP(final String sql) {

        String upperSql = sql.toUpperCase();
        int end = upperSql.indexOf(" GROUP ");
        return -1 == end ? sql : sql.substring(0, end);
    }

    /**
     * 获取sql
     *
     * @param select 需要查询的字段
     * @param tableName 表名
     * @return sql
     */
    public static String getSelectSQL(String select, String tableName) {
        if (null == select || "".equals(select)) {
            select = "*";
        }
        return String.format("select %s from %s ", select, tableName);

    }


    /**
     * 获取sql
     *
     * @param select    需要查询的字段
     * @param tableName 表名
     * @param alias     别名
     * @param where     条件开始的语句
     * @return 拼装好的sql
     */
    public static String getSQL(String select, String tableName, String alias, String where) {
        return String.format("%s %s %s", getSelectSQL(select, tableName), alias, where);
    }


    /**
     * 拼接分页部分
     *
     * @param pageNumber 页号
     * @param pageSize   每页大小
     * @return 拼装 分页sql
     */
    public static String forPaginate(int pageNumber, int pageSize) {
        int offset = pageSize * (pageNumber - 1);
        return String.format(" limit %s,%s", offset, pageSize);
    }


    /**
     * 拼接分页部分
     *
     * @param sql sql
     * @param pageNumber 页号
     * @param pageSize   每页大小
     * @return 拼装 分页sql
     */
    public static String forPaginate(String sql, int pageNumber, int pageSize) {
        int offset = pageSize * (pageNumber - 1);
        String sqltmp = String.format("SELECT *  FROM (SELECT ROWNUM  RN,a.* FROM (  %s  ) a  WHERE ROWNUM <= %s) WHERE RN >%s", sql, offset + pageSize, offset);
        return sqltmp;
    }


    /**
     * 设置 参数
     *
     * @param ps     代替对象
     * @param params 参数
     * @throws SQLException 设置参数异常
     */
    public static void fillStatement(PreparedStatement ps, List<Object> params) throws SQLException {
        if (null == params || params.isEmpty()) {
            return;
        }

        int i = 0;
        for (Object param : params) {
            if (param instanceof List) {
                fillStatement(ps, (List) param);
                ps.addBatch();
                continue;
            }

            if (param instanceof Object[]) {
                fillStatement(ps, (Object[]) param);
                ps.addBatch();
                continue;
            }

            if (null == param) {
                ps.setNull(++i, Types.OTHER);
                continue;
            }
            ps.setObject(++i, param);

        }

    }

    /**
     * 设置 参数
     *
     * @param ps     代替对象
     * @param params 参数
     * @throws SQLException 设置参数异常
     */
    public static void fillStatement(PreparedStatement ps, Object... params) throws SQLException {


        if (null == params) {
            return;
        }
        if (params instanceof Object[][]) {
            for (Object[] v : (Object[][]) params) {
                fillStatement(ps, v);
                ps.addBatch();
            }
        }
        else {
            int i = 0;
            for (Object param : params) {
                if (null == param) {
                    ps.setNull(++i, Types.OTHER);
                    continue;
                }
                ps.setObject(++i, param);
            }
        }


    }


    /**
     * 生成插入语句
     *
     * @param tableName      表名
     * @param keyColumnNames 数据库列集
     * @return 插入语句
     */
    public static StringBuilder generateInsertString(String tableName, List<String> keyColumnNames) {
        StringBuilder sql = new StringBuilder();
        sql.append("insert into ").append(tableName).append("(");
        StringBuilder temp = new StringBuilder(") values(");
        boolean flag = false;
        for (String colName : keyColumnNames) {
            if (flag) {
                sql.append(", ");
                temp.append(", ");
            }
            sql.append("").append(colName).append("");
            temp.append("?");
            flag = true;
        }
        return sql.append(temp.toString()).append(")");

    }

    /**
     * 生成更新语句
     *
     * @param tableName      表名
     * @param keyColumnNames 数据库列集
     * @param idColumn       主键列
     * @return 更新语句
     */
    public static StringBuilder generateUpdateByRowIdString(String tableName, List<String> keyColumnNames, String idColumn) {
        StringBuilder sql = new StringBuilder();
        sql.append("update ").append(tableName).append(" set ");
        int i = 0;
        for (String colName : keyColumnNames) {
            if (i != 0) {
                sql.append(", ");
            }
            sql.append("").append(colName).append(" = ? ");
            i++;
        }
//		keyColumnNames.add(idColumn);
        sql.append(" where ").append(idColumn).append(" = ?");
        return sql;
    }

    /**
     * 通过 Map 获取保存的sql
     *
     * @param table 表名
     * @param attrs Map属性集
     * @param paras 参数集
     * @return 生成sql
     */
    public static StringBuilder forMapSave(String table, Map<String, Object> attrs, List<Object> paras) {
        StringBuilder sql = new StringBuilder();
        sql.append("insert into ").append(table).append("(");
        StringBuilder temp = new StringBuilder(") values(");
        for (Map.Entry<String, Object> entry : attrs.entrySet()) {
            if (null == entry.getValue()) {
                continue;
            }
            if (paras.size() > 0) {
                sql.append(", ");
                temp.append(", ");
            }
            sql.append(' ').append(entry.getKey()).append(' ');
            temp.append("?");
            paras.add(entry.getValue());
        }
        sql.append(temp).append(")");
        return sql;
    }


    /**
     * 生成更新的sql
     *
     * @param table    表名
     * @param attrs    更新的属性
     * @param where    条件部分
     * @param whereVal 条件对应的值
     * @param paras    参数集
     * @return 更新的sql
     */
    public static StringBuilder forMapUpdate(String table, Map<String, Object> attrs, String where, List<Object> whereVal, List<Object> paras) {

        StringBuilder sql = new StringBuilder();
        sql.append("update ").append(table).append(" set ");
        for (Map.Entry<String, Object> entry : attrs.entrySet()) {
            if (!paras.isEmpty()) {
                sql.append(", ");
            }
            sql.append(' ').append(entry.getKey()).append(" = ? ");
            paras.add(entry.getValue());
        }

        sql.append(where);
        paras.addAll(whereVal);

        return sql;
    }

    /**
     * 生成更新的sql
     *
     * @param table 表名
     * @param attrs 更新的属性
     * @param where 条件部分 and eq 级别
     * @param paras 参数集
     * @return 更新的sql
     */
    public static StringBuilder forMapUpdate(String table, Map<String, Object> attrs, Map<String, Object> where, List<Object> paras) {
        boolean flag = false;
        StringBuilder sql = new StringBuilder();
        sql.append("update ").append(table).append(" set ");
        for (Map.Entry<String, Object> entry : attrs.entrySet()) {
            if (flag) {
                sql.append(", ");
            }
            sql.append(' ').append(entry.getKey()).append(" = ? ");
            paras.add(entry.getValue());
            flag = true;
        }
        sql.append(" where ");
        for (Map.Entry<String, Object> entry : where.entrySet()) {
            if (!flag) {
                sql.append(" and ");
            }
            sql.append(' ').append(entry.getKey()).append(" = ? ");
            paras.add(entry.getValue());
            flag = false;
        }
        return sql;
    }


    /**
     * 冒号形式的sql转化为问号形式
     *
     * @param sql    原始sql
     * @param attrs  属性
     * @param values 转化后的属性集
     * @return 转化后的sql
     */
    public static String forConverSQL(String sql, Map<String, Object> attrs, List<Object> values) {
        Matcher matcher = PATTERN.matcher(sql);
        String rexp = null;
        while (matcher.find()) {
            String group = matcher.group(1);
            Object ov = attrs.get(group);
            if (ov instanceof Collection) {
                StringBuilder sb = new StringBuilder();
                Collection vs = (Collection) ov;
                for (Object v : vs) {
                    sb.append("?,");
                    values.add(v);
                }
                sb.deleteCharAt(sb.length() - 1);
                rexp = sb.toString();
            }
            else {
                values.add(ov);
                rexp = "?";
            }
            sql = sql.replace(String.format(":%s", group), rexp);
        }
        return sql;
    }

    /**
     * 根据数组对象生成对应的in部分
     *
     * @param num 生成"?"的数量
     *
     *            <code> forQuestionMarkSQL(3)  = ?,?,? </code>
     * @return 问号,逗号隔开
     */
    public static String forQuestionMarkSQL(int num) {

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < num; i++) {
            sb.append("?,");
        }
        sb.deleteCharAt(sb.length() - 1);

        return sb.toString();
    }

    /**
     * 将集合以分隔符的形式进行连接成对应字符串
     *
     * @param list      集合
     * @param separated 分隔符
     * @return 连接字符串
     */
    public static String join(List<String> list, String separated) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            if (sb.length() != 0) {
                sb.append(separated);
            }
            sb.append(list.get(i));

        }
        return sb.toString();

    }


}


================================================
FILE: pay-spring-boot-autoconfigue/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>pay-spring-boot-starter-parent</artifactId>
        <groupId>com.egzosn</groupId>
      <version>1.0.5</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>pay-spring-boot-autoconfigue</artifactId>
    <name>pay-spring-boot-autoconfigue</name>
    <dependencies>
    <dependency>
        <groupId>com.egzosn</groupId>
        <artifactId>pay-spring-boot</artifactId>
        <version>${project.version}</version>
    </dependency>
    </dependencies>

</project>

================================================
FILE: pay-spring-boot-autoconfigue/src/main/java/com/egzosn/pay/spring/boot/autoconfigue/PayAutoConfiguration.java
================================================
package com.egzosn.pay.spring.boot.autoconfigue;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import com.egzosn.pay.spring.boot.core.MerchantPayServiceManager;
import com.egzosn.pay.spring.boot.core.PayServiceConfigurer;
import com.egzosn.pay.spring.boot.core.PayServiceManager;
import com.egzosn.pay.spring.boot.core.configurers.DefalutPayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.configurers.MerchantDetailsServiceConfigurer;
import com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigurer;
import com.egzosn.pay.spring.boot.core.merchant.MerchantDetailsService;
import com.egzosn.pay.spring.boot.core.merchant.PaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.AliPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.FuiouPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaymentPlatforms;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PayoneerPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaypalPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.PaypalV2PaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.UnionPaymentPlatform;
import com.egzosn.pay.spring.boot.core.provider.merchant.platform.WxPaymentPlatform;
import com.egzosn.pay.spring
Download .txt
gitextract_dvzawco3/

├── .gitignore
├── LICENSE
├── README.md
├── doc/
│   └── sql/
│       └── merchant_pay.sql
├── pay-spring-boot/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── egzosn/
│                       └── pay/
│                           └── spring/
│                               └── boot/
│                                   └── core/
│                                       ├── MerchantPayServiceManager.java
│                                       ├── PayBuilder.java
│                                       ├── PayConfigurerAdapter.java
│                                       ├── PayServiceConfigurer.java
│                                       ├── PayServiceManager.java
│                                       ├── bean/
│                                       │   ├── MerchantPayOrder.java
│                                       │   └── MerchantQueryOrder.java
│                                       ├── builders/
│                                       │   ├── InMemoryMerchantDetailsServiceBuilder.java
│                                       │   ├── JdbcMerchantDetailsServiceBuilder.java
│                                       │   └── MerchantDetailsServiceBuilder.java
│                                       ├── configurers/
│                                       │   ├── DefalutPayMessageConfigurer.java
│                                       │   ├── MerchantDetailsServiceConfigurer.java
│                                       │   └── PayMessageConfigurer.java
│                                       ├── merchant/
│                                       │   ├── MerchantDetails.java
│                                       │   ├── MerchantDetailsService.java
│                                       │   ├── MerchantNotFoundException.java
│                                       │   ├── PaymentPlatform.java
│                                       │   ├── PaymentPlatformMerchantDetails.java
│                                       │   ├── PaymentPlatformServiceAdapter.java
│                                       │   └── bean/
│                                       │       ├── AliMerchantDetails.java
│                                       │       ├── CommonPaymentPlatformMerchantDetails.java
│                                       │       ├── FuiouMerchantDetails.java
│                                       │       ├── PayPalV2MerchantDetails.java
│                                       │       ├── PayoneerMerchantDetails.java
│                                       │       ├── PaypalMerchantDetails.java
│                                       │       ├── UnionMerchantDetails.java
│                                       │       ├── WxMerchantDetails.java
│                                       │       ├── WxV3MerchantDetails.java
│                                       │       └── WxYouDianMerchantDetails.java
│                                       ├── provider/
│                                       │   ├── CacheMerchantDetailsManager.java
│                                       │   ├── InMemoryMerchantDetailsManager.java
│                                       │   ├── JdbcMerchantDetailsManager.java
│                                       │   ├── MerchantDetailsManager.java
│                                       │   └── merchant/
│                                       │       └── platform/
│                                       │           ├── AliPaymentPlatform.java
│                                       │           ├── FuiouPaymentPlatform.java
│                                       │           ├── PaymentPlatforms.java
│                                       │           ├── PayoneerPaymentPlatform.java
│                                       │           ├── PaypalPaymentPlatform.java
│                                       │           ├── PaypalV2PaymentPlatform.java
│                                       │           ├── UnionPaymentPlatform.java
│                                       │           ├── WxPaymentPlatform.java
│                                       │           ├── WxV3CombinePaymentPlatform.java
│                                       │           ├── WxV3PaymentPlatform.java
│                                       │           ├── WxV3ProfitSharingPlatform.java
│                                       │           └── YoudianPaymentPlatform.java
│                                       └── utils/
│                                           └── SqlTools.java
├── pay-spring-boot-autoconfigue/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── egzosn/
│           │           └── pay/
│           │               └── spring/
│           │                   └── boot/
│           │                       └── autoconfigue/
│           │                           └── PayAutoConfiguration.java
│           └── resources/
│               └── META-INF/
│                   └── spring.factories
├── pay-spring-boot-starter/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── resources/
│               └── META-INF/
│                   └── spring.providers
├── pay-spring-boot-starter-demo/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── egzosn/
│           │           └── pay/
│           │               └── spring/
│           │                   └── boot/
│           │                       └── demo/
│           │                           ├── PayApplication.java
│           │                           ├── config/
│           │                           │   ├── MerchantPayServiceConfigurer.java
│           │                           │   ├── MyAliPaymentPlatform.java
│           │                           │   ├── handlers/
│           │                           │   │   ├── AliPayMessageHandler.java
│           │                           │   │   └── WxPayMessageHandler.java
│           │                           │   └── interceptor/
│           │                           │       └── AliPayMessageInterceptor.java
│           │                           └── controller/
│           │                               └── PayMerchantController.java
│           └── resources/
│               ├── ali/
│               │   ├── alipayCertPublicKey_RSA2.crt
│               │   ├── alipayRootCert.crt
│               │   ├── appCertPublicKey_2016080400165436.crt
│               │   └── www.egzosn.com_私钥.txt
│               └── application.yml
└── pom.xml
Download .txt
SYMBOL INDEX (567 symbols across 55 files)

FILE: doc/sql/merchant_pay.sql
  type `merchant_details` (line 9) | CREATE TABLE `merchant_details` (

FILE: pay-spring-boot-autoconfigue/src/main/java/com/egzosn/pay/spring/boot/autoconfigue/PayAutoConfiguration.java
  class PayAutoConfiguration (line 43) | @Configuration
    method loadPaymentPlatforms (line 48) | @Autowired(required = false)
    method detailsServiceConfigurer (line 57) | @Bean
    method configure (line 64) | @Bean
    method payServiceManager (line 74) | @Bean
    method messageHandlerConfigurer (line 83) | @Bean

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/PayApplication.java
  class PayApplication (line 12) | @SpringBootApplication
    method main (line 14) | public static void main(String[] args) {

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/MerchantPayServiceConfigurer.java
  class MerchantPayServiceConfigurer (line 43) | @Configuration
    method loadPublicKeyFromString (line 52) | public static PublicKey loadPublicKeyFromString(String keyString) {
    method configure (line 68) | @Override
    method configure (line 205) | @Override

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/MyAliPaymentPlatform.java
  class MyAliPaymentPlatform (line 24) | public class MyAliPaymentPlatform extends AliPaymentPlatform {
    method getPayService (line 33) | @Override
    method certKeyPublic (line 67) | private static void certKeyPublic(AliPayConfigStorage aliPayConfigStor...
    method getPayService (line 90) | @Override
    method getTransactionType (line 97) | @Override

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/handlers/AliPayMessageHandler.java
  class AliPayMessageHandler (line 18) | @Component
    method handle (line 31) | @Override

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/handlers/WxPayMessageHandler.java
  class WxPayMessageHandler (line 15) | public class WxPayMessageHandler implements PayMessageHandler<WxPayMessa...
    method handle (line 20) | @Override

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/interceptor/AliPayMessageInterceptor.java
  class AliPayMessageInterceptor (line 19) | @Component
    method intercept (line 32) | @Override

FILE: pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/controller/PayMerchantController.java
  class PayMerchantController (line 36) | @RequestMapping("pay")
    method merchantExists (line 46) | @GetMapping("merchantExists")
    method toPay (line 58) | @ResponseBody
    method jsapi (line 74) | @RequestMapping(value = "jsapi")
    method getOrderInfo (line 89) | @RequestMapping("app")
    method toQrPay (line 104) | @ResponseBody
    method getQrPay (line 118) | @ResponseBody
    method microPay (line 135) | @RequestMapping(value = "microPay")
    method payBack (line 156) | @RequestMapping(value = "payBack/{deatilsId}.json")
    method payBackOld (line 175) | @Deprecated
    method query (line 192) | @RequestMapping("query")
    method close (line 207) | @RequestMapping("close")
    method refund (line 223) | @RequestMapping("refund")
    method refundQuery (line 235) | @RequestMapping("refundquery")
    method downloadBill (line 249) | @RequestMapping("downloadBill")
    method transfer (line 263) | @RequestMapping("transfer/{detailsId}")
    method transferQuery (line 274) | @RequestMapping("transferQuery/{detailsId}")

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/MerchantPayServiceManager.java
  class MerchantPayServiceManager (line 41) | public class MerchantPayServiceManager implements PayServiceManager {
    method verify (line 53) | @Override
    method verify (line 66) | @Override
    method getParameter2Map (line 81) | @Deprecated
    method getNoticeParams (line 94) | @Override
    method toPay (line 107) | @Override
    method app (line 122) | @Override
    method getOrderInfo (line 136) | @Override
    method microPay (line 151) | @Override
    method toQrPay (line 167) | @Override
    method getQrPay (line 185) | @Override
    method payBack (line 208) | @Deprecated
    method payBack (line 227) | @Override
    method query (line 242) | @Override
    method close (line 255) | @Override
    method refund (line 270) | @Override
    method refundQuery (line 284) | @Override
    method downloadBill (line 296) | @Override
    method transfer (line 311) | @Override
    method transferQuery (line 326) | @Override
    method transferQuery (line 339) | @Override
    method createMessage (line 357) | @Override
    method cast (line 370) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayBuilder.java
  type PayBuilder (line 15) | public interface PayBuilder<O> {
    method build (line 23) | O build();

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayConfigurerAdapter.java
  type PayConfigurerAdapter (line 13) | public interface PayConfigurerAdapter<B> {
    method and (line 20) | B and();
    method getBuilder (line 26) | B getBuilder();

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayServiceConfigurer.java
  type PayServiceConfigurer (line 15) | public interface PayServiceConfigurer {
    method configure (line 21) | void configure(MerchantDetailsServiceConfigurer configurer);
    method configure (line 26) | void configure(PayMessageConfigurer configurer) ;

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayServiceManager.java
  type PayServiceManager (line 30) | public interface PayServiceManager {
    method verify (line 40) | @Deprecated
    method verify (line 50) | boolean verify(String detailsId, NoticeParams params);
    method getParameter2Map (line 61) | @Deprecated
    method getNoticeParams (line 71) | NoticeParams getNoticeParams(String detailsId, NoticeRequest request);
    method toPay (line 80) | String toPay(MerchantPayOrder payOrder);
    method app (line 88) | Map<String, Object> app(MerchantPayOrder payOrder);
    method getOrderInfo (line 96) | Map<String, Object> getOrderInfo(MerchantPayOrder payOrder);
    method microPay (line 105) | Map<String, Object> microPay(MerchantPayOrder payOrder);
    method toQrPay (line 115) | byte[] toQrPay(MerchantPayOrder payOrder) throws IOException;
    method getQrPay (line 124) | String getQrPay(MerchantPayOrder payOrder);
    method payBack (line 141) | @Deprecated
    method payBack (line 157) | String payBack(String detailsId, NoticeRequest request);
    method query (line 165) | Map<String, Object> query(MerchantQueryOrder order);
    method close (line 173) | Map<String, Object> close(MerchantQueryOrder order);
    method refund (line 183) | RefundResult refund(String detailsId, RefundOrder order);
    method refundQuery (line 192) | Map<String, Object> refundQuery(String detailsId, RefundOrder order);
    method downloadBill (line 200) | Map<String, Object> downloadBill(MerchantQueryOrder order);
    method transfer (line 210) | Map<String, Object> transfer(String detailsId, TransferOrder order);
    method transferQuery (line 221) | @Deprecated
    method transferQuery (line 232) | Map<String, Object> transferQuery(String detailsId, AssistOrder assist...
    method createMessage (line 241) | PayMessage createMessage(String detailsId, Map<String, Object> message);
    method cast (line 252) | <T extends PayService> T cast(String detailsId, Class<T> payServiceCla...

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/bean/MerchantPayOrder.java
  class MerchantPayOrder (line 17) | public class MerchantPayOrder extends PayOrder {
    method MerchantPayOrder (line 31) | public MerchantPayOrder() {
    method MerchantPayOrder (line 34) | public MerchantPayOrder(String detailsId, String wayTrade) {
    method MerchantPayOrder (line 41) | public MerchantPayOrder(String detailsId, String wayTrade, String subj...
    method getDetailsId (line 47) | public String getDetailsId() {
    method setDetailsId (line 51) | public void setDetailsId(String detailsId) {
    method getWayTrade (line 55) | public String getWayTrade() {
    method setWayTrade (line 59) | public void setWayTrade(String wayTrade) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/bean/MerchantQueryOrder.java
  class MerchantQueryOrder (line 16) | public class MerchantQueryOrder extends AssistOrder {
    method getDetailsId (line 54) | public String getDetailsId() {
    method setDetailsId (line 58) | public void setDetailsId(String detailsId) {
    method getRefundAmount (line 62) | public BigDecimal getRefundAmount() {
    method setRefundAmount (line 66) | public void setRefundAmount(BigDecimal refundAmount) {
    method getTotalAmount (line 70) | public BigDecimal getTotalAmount() {
    method setTotalAmount (line 74) | public void setTotalAmount(BigDecimal totalAmount) {
    method getBillDate (line 78) | public Date getBillDate() {
    method setBillDate (line 82) | public void setBillDate(Date billDate) {
    method getBillType (line 86) | public BillType getBillType() {
    method setBillType (line 90) | public void setBillType(BillType billType) {
    method getTradeNoOrBillDate (line 94) | public Object getTradeNoOrBillDate() {
    method setTradeNoOrBillDate (line 98) | public void setTradeNoOrBillDate(Object tradeNoOrBillDate) {
    method getOutTradeNoBillType (line 102) | public String getOutTradeNoBillType() {
    method setOutTradeNoBillType (line 106) | public void setOutTradeNoBillType(String outTradeNoBillType) {
    method getWayTrade (line 110) | public String getWayTrade() {
    method setWayTrade (line 114) | public void setWayTrade(String wayTrade) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/InMemoryMerchantDetailsServiceBuilder.java
  class InMemoryMerchantDetailsServiceBuilder (line 20) | public class InMemoryMerchantDetailsServiceBuilder extends MerchantDetai...
    method addMerchantDetails (line 26) | public void addMerchantDetails(PaymentPlatformMerchantDetails merchant...
    method ali (line 31) | public AliMerchantDetails ali(){
    method fuiou (line 37) | public FuiouMerchantDetails fuiou(){
    method payoneer (line 42) | public PayoneerMerchantDetails payoneer(){
    method payPal (line 47) | public PaypalMerchantDetails payPal(){
    method union (line 52) | public UnionMerchantDetails union(){
    method wx (line 57) | public WxMerchantDetails wx(){
    method wxV3 (line 63) | public WxV3MerchantDetails wxV3(){
    method performBuild (line 75) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/JdbcMerchantDetailsServiceBuilder.java
  class JdbcMerchantDetailsServiceBuilder (line 21) | public class JdbcMerchantDetailsServiceBuilder extends MerchantDetailsSe...
    method JdbcMerchantDetailsServiceBuilder (line 28) | public JdbcMerchantDetailsServiceBuilder(DataSource source) {
    method JdbcMerchantDetailsServiceBuilder (line 32) | public JdbcMerchantDetailsServiceBuilder(JdbcTemplate jdbcTemplate) {
    method JdbcMerchantDetailsServiceBuilder (line 36) | public JdbcMerchantDetailsServiceBuilder(boolean cache) {
    method JdbcMerchantDetailsServiceBuilder (line 40) | public JdbcMerchantDetailsServiceBuilder() {
    method cache (line 50) | public JdbcMerchantDetailsServiceBuilder cache(boolean cache) {
    method template (line 61) | public JdbcMerchantDetailsServiceBuilder template(JdbcTemplate jdbcTem...
    method dataSource (line 73) | public JdbcMerchantDetailsServiceBuilder dataSource(DataSource source) {
    method getJdbcTemplate (line 78) | public JdbcTemplate getJdbcTemplate() {
    method setJdbcTemplate (line 82) | private void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    method isCache (line 89) | public boolean isCache() {
    method setCache (line 93) | public void setCache(boolean cache) {
    method performBuild (line 102) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/MerchantDetailsServiceBuilder.java
  class MerchantDetailsServiceBuilder (line 18) | public class MerchantDetailsServiceBuilder implements PayBuilder<Merchan...
    method inMemory (line 21) | public static InMemoryMerchantDetailsServiceBuilder inMemory() {
    method jdbc (line 25) | public static JdbcMerchantDetailsServiceBuilder jdbc() {
    method jdbc (line 29) | public static JdbcMerchantDetailsServiceBuilder jdbc(boolean cache) {
    method jdbc (line 33) | public static JdbcMerchantDetailsServiceBuilder jdbc(DataSource source) {
    method jdbc (line 37) | public static JdbcMerchantDetailsServiceBuilder jdbc(JdbcTemplate jdbc...
    method build (line 46) | @Override
    method performBuild (line 56) | protected MerchantDetailsService performBuild() {
    method setConfigurer (line 60) | public void setConfigurer(PayMessageConfigurer configurer) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/DefalutPayMessageConfigurer.java
  class DefalutPayMessageConfigurer (line 22) | public class DefalutPayMessageConfigurer implements PayMessageConfigurer {
    method addHandler (line 46) | @Override
    method getHandler (line 60) | @Override
    method addInterceptor (line 70) | @Override
    method getInterceptor (line 86) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/MerchantDetailsServiceConfigurer.java
  class MerchantDetailsServiceConfigurer (line 23) | public class MerchantDetailsServiceConfigurer implements PayConfigurerAd...
    method setBuilder (line 30) | public void setBuilder(MerchantDetailsServiceBuilder builder) {
    method inMemory (line 34) | public InMemoryMerchantDetailsServiceBuilder inMemory() {
    method initBuilder (line 39) | public MerchantDetailsServiceBuilder initBuilder(MerchantDetailsServic...
    method jdbc (line 46) | public JdbcMerchantDetailsServiceBuilder jdbc() {
    method jdbc (line 52) | public JdbcMerchantDetailsServiceBuilder jdbc(DataSource source) {
    method jdbc (line 69) | @Deprecated
    method and (line 82) | @Override
    method getBuilder (line 92) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/PayMessageConfigurer.java
  type PayMessageConfigurer (line 18) | public interface PayMessageConfigurer {
    method addHandler (line 26) | void addHandler(PaymentPlatform platform, PayMessageHandler handler);
    method getHandler (line 34) | PayMessageHandler<PayMessage, PayService> getHandler(PaymentPlatform p...
    method addInterceptor (line 42) | void addInterceptor(PaymentPlatform platform, PayMessageInterceptor in...
    method getInterceptor (line 50) | List<PayMessageInterceptor<PayMessage, PayService>> getInterceptor(Pay...

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantDetails.java
  type MerchantDetails (line 16) | public interface MerchantDetails extends PayConfigStorage, Serializable {
    method getDetailsId (line 24) | String getDetailsId();

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantDetailsService.java
  type MerchantDetailsService (line 12) | public interface MerchantDetailsService<T extends MerchantDetails> {
    method loadMerchantByMerchantId (line 19) | T loadMerchantByMerchantId(String merchantId);

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantNotFoundException.java
  class MerchantNotFoundException (line 12) | public class MerchantNotFoundException extends RuntimeException {
    method MerchantNotFoundException (line 24) | public MerchantNotFoundException(String detailsId) {
    method MerchantNotFoundException (line 32) | public MerchantNotFoundException(String detailsId, Throwable cause) {
    method getMerchantId (line 41) | public String getMerchantId(){

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatform.java
  type PaymentPlatform (line 16) | public interface PaymentPlatform<S extends PayService> extends BasePayTy...
    method getPlatform (line 22) | String getPlatform();
    method getPayService (line 29) | S getPayService(PayConfigStorage payConfigStorage);
    method getPayService (line 36) | S getPayService(PayConfigStorage payConfigStorage, HttpConfigStorage h...

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatformMerchantDetails.java
  type PaymentPlatformMerchantDetails (line 13) | public interface PaymentPlatformMerchantDetails<S extends PayService>  e...
    method getPayService (line 19) | S getPayService();
    method getPaymentPlatform (line 24) | PaymentPlatform getPaymentPlatform();

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatformServiceAdapter.java
  type PaymentPlatformServiceAdapter (line 15) | public interface PaymentPlatformServiceAdapter<S extends PayService> {
    method initService (line 21) | PaymentPlatformServiceAdapter initService();
    method getPayService (line 27) | S getPayService();
    method getHttpConfigStorage (line 35) | HttpConfigStorage getHttpConfigStorage();

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/AliMerchantDetails.java
  class AliMerchantDetails (line 23) | public class AliMerchantDetails extends AliPayConfigStorage implements P...
    method and (line 50) | @Override
    method getBuilder (line 61) | @Override
    method AliMerchantDetails (line 66) | public AliMerchantDetails(InMemoryMerchantDetailsServiceBuilder builde...
    method AliMerchantDetails (line 71) | public AliMerchantDetails() {
    method init (line 75) | public void init() {
    method getPaymentPlatform (line 89) | @Override
    method initService (line 100) | @Override
    method getPayService (line 114) | @Override
    method getHttpConfigStorage (line 125) | @Override
    method httpConfigStorage (line 130) | public AliMerchantDetails httpConfigStorage(HttpConfigStorage httpConf...
    method setDetailsId (line 135) | public void setDetailsId(String detailsId) {
    method getDetailsId (line 144) | @Override
    method detailsId (line 149) | public AliMerchantDetails detailsId(String detailsId) {
    method notifyUrl (line 154) | public AliMerchantDetails notifyUrl(String notifyUrl) {
    method returnUrl (line 159) | public AliMerchantDetails returnUrl(String returnUrl) {
    method signType (line 164) | public AliMerchantDetails signType(String signType) {
    method inputCharset (line 169) | public AliMerchantDetails inputCharset(String inputCharset) {
    method test (line 174) | public AliMerchantDetails test(boolean test) {
    method pid (line 179) | public AliMerchantDetails pid(String pid) {
    method appid (line 184) | public AliMerchantDetails appid(String appid) {
    method keyPrivate (line 189) | public AliMerchantDetails keyPrivate(String keyPrivate) {
    method keyPublic (line 194) | public AliMerchantDetails keyPublic(String keyPublic) {
    method seller (line 199) | public AliMerchantDetails seller(String seller) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/CommonPaymentPlatformMerchantDetails.java
  class CommonPaymentPlatformMerchantDetails (line 26) | public class CommonPaymentPlatformMerchantDetails extends BasePayConfigS...
    method and (line 78) | @Override
    method getBuilder (line 88) | @Override
    method CommonPaymentPlatformMerchantDetails (line 93) | public CommonPaymentPlatformMerchantDetails(MerchantDetailsServiceBuil...
    method CommonPaymentPlatformMerchantDetails (line 98) | public CommonPaymentPlatformMerchantDetails() {
    method getPaymentPlatform (line 107) | @Override
    method initService (line 120) | @Override
    method getPayService (line 135) | @Override
    method getHttpConfigStorage (line 146) | @Override
    method setHttpConfigStorage (line 151) | public void setHttpConfigStorage(HttpConfigStorage httpConfigStorage) {
    method setDetailsId (line 155) | public void setDetailsId(String detailsId) {
    method getDetailsId (line 164) | @Override
    method setAppId (line 170) | public void setAppId(String appId) {
    method getMchId (line 174) | public String getMchId() {
    method setMchId (line 178) | public void setMchId(String mchId) {
    method getAppid (line 182) | @Override
    method getAppId (line 194) | @Override
    method getPid (line 199) | @Override
    method getSeller (line 204) | @Override
    method setSeller (line 209) | public void setSeller(String seller) {
    method getSubAppId (line 213) | public String getSubAppId() {
    method setSubAppId (line 217) | public void setSubAppId(String subAppId) {
    method getSubMchId (line 221) | public String getSubMchId() {
    method setSubMchId (line 225) | public void setSubMchId(String subMchId) {
    method setKeystore (line 236) | public void setKeystore(String keystore) {
    method setKeystore (line 247) | public void setKeystore(InputStream keystore) {
    method getKeystoreInputStream (line 251) | public InputStream getKeystoreInputStream() throws IOException {
    method getKeystore (line 255) | public Object getKeystore() {
    method getKeystorePwd (line 259) | public String getKeystorePwd() {
    method setKeystorePwd (line 263) | public void setKeystorePwd(String keystorePwd) {
    method getKeyPrivateCertPwd (line 271) | public String getKeyPrivateCertPwd() {
    method setKeyPrivateCertPwd (line 275) | public void setKeyPrivateCertPwd(String keyPrivateCertPwd) {
    method getKeyPublicCert (line 281) | public String getKeyPublicCert() {
    method setKeyPublicCert (line 290) | public void setKeyPublicCert(String keyPublicCert) {
    method setKeyPublicCert (line 300) | public void setKeyPublicCert(InputStream keyPublicCert) {
    method getKeyCert (line 304) | public Object getKeyCert() {
    method setKeyCert (line 314) | public void setKeyCert(String keyCert) {
    method setKeyCert (line 323) | public void setKeyCert(InputStream keyCert) {
    method getKeyPublicCertInputStream (line 327) | public InputStream getKeyPublicCertInputStream() throws IOException {
    method getKeyCertInputStream (line 331) | public InputStream getKeyCertInputStream() throws IOException {
    method getCertStoreType (line 340) | public CertStoreType getCertStoreType() {
    method setCertStoreType (line 344) | public void setCertStoreType(CertStoreType certStoreType) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/FuiouMerchantDetails.java
  class FuiouMerchantDetails (line 23) | public class FuiouMerchantDetails extends FuiouPayConfigStorage implemen...
    method and (line 46) | @Override
    method getBuilder (line 57) | @Override
    method FuiouMerchantDetails (line 62) | public FuiouMerchantDetails(InMemoryMerchantDetailsServiceBuilder buil...
    method FuiouMerchantDetails (line 67) | public FuiouMerchantDetails() {
    method init (line 71) | public void init() {
    method getPaymentPlatform (line 85) | @Override
    method initService (line 96) | @Override
    method getPayService (line 110) | @Override
    method getHttpConfigStorage (line 121) | @Override
    method httpConfigStorage (line 126) | public FuiouMerchantDetails httpConfigStorage(HttpConfigStorage httpCo...
    method setDetailsId (line 131) | public void setDetailsId(String detailsId) {
    method getDetailsId (line 140) | @Override
    method detailsId (line 146) | public FuiouMerchantDetails detailsId(String detailsId) {
    method notifyUrl (line 151) | public FuiouMerchantDetails notifyUrl(String notifyUrl) {
    method returnUrl (line 156) | public FuiouMerchantDetails returnUrl(String returnUrl) {
    method signType (line 161) | public FuiouMerchantDetails signType(String signType) {
    method inputCharset (line 166) | public FuiouMerchantDetails inputCharset(String inputCharset) {
    method test (line 171) | public FuiouMerchantDetails test(boolean test) {
    method mchntCd (line 176) | public FuiouMerchantDetails mchntCd(String mchntCd) {
    method keyPrivate (line 181) | public FuiouMerchantDetails keyPrivate(String keyPrivate) {
    method keyPublic (line 186) | public FuiouMerchantDetails keyPublic(String keyPublic) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PayPalV2MerchantDetails.java
  class PayPalV2MerchantDetails (line 23) | public class PayPalV2MerchantDetails extends PayPalConfigStorage impleme...
    method and (line 47) | @Override
    method getBuilder (line 58) | @Override
    method PayPalV2MerchantDetails (line 63) | public PayPalV2MerchantDetails(InMemoryMerchantDetailsServiceBuilder b...
    method PayPalV2MerchantDetails (line 68) | public PayPalV2MerchantDetails() {
    method init (line 72) | public void init() {
    method getPaymentPlatform (line 86) | @Override
    method initService (line 96) | @Override
    method getPayService (line 112) | @Override
    method getHttpConfigStorage (line 123) | @Override
    method httpConfigStorage (line 128) | public PayPalV2MerchantDetails httpConfigStorage(HttpConfigStorage htt...
    method getDetailsId (line 138) | @Override
    method detailsId (line 143) | public PayPalV2MerchantDetails detailsId(String detailsId) {
    method signType (line 148) | public PayPalV2MerchantDetails signType(String signType) {
    method inputCharset (line 153) | public PayPalV2MerchantDetails inputCharset(String inputCharset) {
    method test (line 158) | public PayPalV2MerchantDetails test(boolean test) {
    method clientID (line 163) | public PayPalV2MerchantDetails clientID(String clientID) {
    method clientSecret (line 168) | public PayPalV2MerchantDetails clientSecret(String clientSecret) {
    method cancelUrl (line 173) | public PayPalV2MerchantDetails cancelUrl(String cancelUrl) {
    method returnUrl (line 178) | public PayPalV2MerchantDetails returnUrl(String returnUrl) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PayoneerMerchantDetails.java
  class PayoneerMerchantDetails (line 23) | public class PayoneerMerchantDetails extends PayoneerConfigStorage imple...
    method and (line 48) | @Override
    method getBuilder (line 59) | @Override
    method PayoneerMerchantDetails (line 63) | public PayoneerMerchantDetails(InMemoryMerchantDetailsServiceBuilder b...
    method PayoneerMerchantDetails (line 68) | public PayoneerMerchantDetails() {
    method init (line 71) | public void init() {
    method getPaymentPlatform (line 84) | @Override
    method initService (line 95) | @Override
    method getPayService (line 109) | @Override
    method getHttpConfigStorage (line 120) | @Override
    method httpConfigStorage (line 124) | public PayoneerMerchantDetails httpConfigStorage(HttpConfigStorage htt...
    method getDetailsId (line 133) | @Override
    method detailsId (line 138) | public PayoneerMerchantDetails detailsId(String detailsId) {
    method programId (line 143) | public PayoneerMerchantDetails programId(String programId) {
    method userName (line 147) | public PayoneerMerchantDetails userName(String userName) {
    method apiPassword (line 151) | public PayoneerMerchantDetails apiPassword(String apiPassword) {
    method signType (line 156) | public PayoneerMerchantDetails signType(String signType) {
    method inputCharset (line 161) | public PayoneerMerchantDetails inputCharset(String inputCharset) {
    method test (line 166) | public PayoneerMerchantDetails test(boolean test) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PaypalMerchantDetails.java
  class PaypalMerchantDetails (line 23) | public class PaypalMerchantDetails extends PayPalConfigStorage implement...
    method and (line 47) | @Override
    method getBuilder (line 58) | @Override
    method PaypalMerchantDetails (line 62) | public PaypalMerchantDetails(InMemoryMerchantDetailsServiceBuilder bui...
    method PaypalMerchantDetails (line 67) | public PaypalMerchantDetails() {
    method init (line 70) | public void init() {
    method getPaymentPlatform (line 81) | @Override
    method initService (line 91) | @Override
    method getPayService (line 105) | @Override
    method getHttpConfigStorage (line 115) | @Override
    method httpConfigStorage (line 119) | public PaypalMerchantDetails httpConfigStorage(HttpConfigStorage httpC...
    method getDetailsId (line 128) | @Override
    method detailsId (line 133) | public PaypalMerchantDetails detailsId(String detailsId) {
    method signType (line 137) | public PaypalMerchantDetails signType(String signType) {
    method inputCharset (line 142) | public PaypalMerchantDetails inputCharset(String inputCharset) {
    method test (line 147) | public PaypalMerchantDetails test(boolean test) {
    method clientID (line 151) | public PaypalMerchantDetails clientID(String clientID) {
    method clientSecret (line 155) | public PaypalMerchantDetails clientSecret(String clientSecret) {
    method cancelUrl (line 160) | public PaypalMerchantDetails cancelUrl(String cancelUrl) {
    method returnUrl (line 165) | public PaypalMerchantDetails returnUrl(String returnUrl) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/UnionMerchantDetails.java
  class UnionMerchantDetails (line 26) | public class UnionMerchantDetails extends UnionPayConfigStorage implemen...
    method and (line 49) | @Override
    method getBuilder (line 60) | @Override
    method UnionMerchantDetails (line 65) | public UnionMerchantDetails(InMemoryMerchantDetailsServiceBuilder buil...
    method UnionMerchantDetails (line 70) | public UnionMerchantDetails() {
    method init (line 73) | public void init() {
    method getPaymentPlatform (line 87) | @Override
    method initService (line 97) | @Override
    method getPayService (line 111) | @Override
    method getHttpConfigStorage (line 122) | @Override
    method httpConfigStorage (line 127) | public UnionMerchantDetails httpConfigStorage(HttpConfigStorage httpCo...
    method getDetailsId (line 137) | @Override
    method detailsId (line 143) | public UnionMerchantDetails detailsId(String detailsId) {
    method notifyUrl (line 148) | public UnionMerchantDetails notifyUrl(String notifyUrl) {
    method returnUrl (line 153) | public UnionMerchantDetails returnUrl(String returnUrl) {
    method signType (line 158) | public UnionMerchantDetails signType(String signType) {
    method inputCharset (line 163) | public UnionMerchantDetails inputCharset(String inputCharset) {
    method test (line 168) | public UnionMerchantDetails test(boolean test) {
    method acpMiddleCert (line 173) | public UnionMerchantDetails acpMiddleCert(String acpMiddleCert) {
    method acpMiddleCert (line 178) | public UnionMerchantDetails acpMiddleCert(InputStream acpMiddleCert) {
    method acpRootCert (line 183) | public UnionMerchantDetails acpRootCert(String acpRootCert) {
    method acpRootCert (line 188) | public UnionMerchantDetails acpRootCert(InputStream acpRootCert) {
    method keyPrivateCert (line 193) | public UnionMerchantDetails keyPrivateCert(String keyPrivateCert) {
    method keyPrivateCert (line 198) | public UnionMerchantDetails keyPrivateCert(InputStream keyPrivateCert) {
    method keyPrivateCertPwd (line 204) | public UnionMerchantDetails keyPrivateCertPwd(String keyPrivateCertPwd) {
    method certStoreType (line 208) | public UnionMerchantDetails certStoreType(CertStoreType certStoreType) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxMerchantDetails.java
  class WxMerchantDetails (line 23) | public class WxMerchantDetails extends WxPayConfigStorage implements Pay...
    method and (line 48) | @Override
    method getBuilder (line 59) | @Override
    method WxMerchantDetails (line 64) | public WxMerchantDetails(InMemoryMerchantDetailsServiceBuilder builder) {
    method WxMerchantDetails (line 69) | public WxMerchantDetails() {
    method init (line 73) | public void init() {
    method getPaymentPlatform (line 87) | @Override
    method initService (line 97) | @Override
    method getPayService (line 111) | @Override
    method getHttpConfigStorage (line 122) | @Override
    method httpConfigStorage (line 127) | public WxMerchantDetails httpConfigStorage(HttpConfigStorage httpConfi...
    method getDetailsId (line 137) | @Override
    method detailsId (line 142) | public WxMerchantDetails detailsId(String detailsId) {
    method notifyUrl (line 147) | public WxMerchantDetails notifyUrl(String notifyUrl) {
    method returnUrl (line 152) | public WxMerchantDetails returnUrl(String returnUrl) {
    method signType (line 157) | public WxMerchantDetails signType(String signType) {
    method inputCharset (line 162) | public WxMerchantDetails inputCharset(String inputCharset) {
    method test (line 167) | public WxMerchantDetails test(boolean test) {
    method appid (line 173) | public WxMerchantDetails appid(String appid) {
    method secretKey (line 178) | public WxMerchantDetails secretKey(String secretKey) {
    method keyPublic (line 183) | public WxMerchantDetails keyPublic(String keyPublic) {
    method mchId (line 188) | public WxMerchantDetails mchId(String mchId) {
    method subAppid (line 193) | public WxMerchantDetails subAppid(String subAppid) {
    method subMchId (line 198) | public WxMerchantDetails subMchId(String subMchId) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxV3MerchantDetails.java
  class WxV3MerchantDetails (line 24) | public class WxV3MerchantDetails extends WxPayConfigStorage implements P...
    method and (line 49) | @Override
    method getBuilder (line 60) | @Override
    method WxV3MerchantDetails (line 65) | public WxV3MerchantDetails(InMemoryMerchantDetailsServiceBuilder build...
    method WxV3MerchantDetails (line 70) | public WxV3MerchantDetails() {
    method init (line 75) | public WxV3MerchantDetails init() {
    method getPaymentPlatform (line 90) | @Override
    method initService (line 101) | @Override
    method getPayService (line 115) | @Override
    method getHttpConfigStorage (line 126) | @Override
    method httpConfigStorage (line 131) | public WxV3MerchantDetails httpConfigStorage(HttpConfigStorage httpCon...
    method getDetailsId (line 141) | @Override
    method setDetailsId (line 146) | public void setDetailsId(String detailsId) {
    method detailsId (line 150) | public WxV3MerchantDetails detailsId(String detailsId) {
    method notifyUrl (line 155) | public WxV3MerchantDetails notifyUrl(String notifyUrl) {
    method returnUrl (line 160) | public WxV3MerchantDetails returnUrl(String returnUrl) {
    method signType (line 165) | public WxV3MerchantDetails signType(String signType) {
    method inputCharset (line 170) | public WxV3MerchantDetails inputCharset(String inputCharset) {
    method test (line 175) | public WxV3MerchantDetails test(boolean test) {
    method appId (line 181) | public WxV3MerchantDetails appId(String appId) {
    method keyPrivate (line 186) | public WxV3MerchantDetails keyPrivate(String keyPrivate) {
    method v3ApiKey (line 191) | public WxV3MerchantDetails v3ApiKey(String v3ApiKey) {
    method apiKey (line 196) | public WxV3MerchantDetails apiKey(String apiKey) {
    method keyPublic (line 201) | public WxV3MerchantDetails keyPublic(String keyPublic) {
    method keyPublicId (line 206) | public WxV3MerchantDetails keyPublicId(String keyPublicId) {
    method merchantSerialNumber (line 211) | public WxV3MerchantDetails merchantSerialNumber(String merchantSerialN...
    method mchId (line 216) | public WxV3MerchantDetails mchId(String mchId) {
    method subAppId (line 221) | public WxV3MerchantDetails subAppId(String subAppId) {
    method subMchId (line 226) | public WxV3MerchantDetails subMchId(String subMchId) {
    method apiClientKeyP12 (line 232) | public WxV3MerchantDetails apiClientKeyP12(Object apiClientKeyP12) {
    method certStoreType (line 237) | public WxV3MerchantDetails certStoreType(CertStoreType certStoreType) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxYouDianMerchantDetails.java
  class WxYouDianMerchantDetails (line 23) | public class WxYouDianMerchantDetails extends WxYouDianPayConfigStorage ...
    method and (line 48) | @Override
    method getBuilder (line 59) | @Override
    method WxYouDianMerchantDetails (line 63) | public WxYouDianMerchantDetails(InMemoryMerchantDetailsServiceBuilder ...
    method WxYouDianMerchantDetails (line 68) | public WxYouDianMerchantDetails() {
    method init (line 71) | public void init() {
    method getPaymentPlatform (line 81) | @Override
    method initService (line 92) | @Override
    method getPayService (line 106) | @Override
    method getHttpConfigStorage (line 116) | @Override
    method httpConfigStorage (line 120) | public WxYouDianMerchantDetails httpConfigStorage(HttpConfigStorage ht...
    method getDetailsId (line 129) | @Override
    method detailsId (line 134) | public WxYouDianMerchantDetails detailsId(String detailsId) {
    method keyPrivate (line 140) | public WxYouDianMerchantDetails keyPrivate(String keyPrivate) {
    method keyPublic (line 145) | public WxYouDianMerchantDetails keyPublic(String keyPublic) {
    method seller (line 150) | public WxYouDianMerchantDetails seller(String seller) {
    method signType (line 156) | public WxYouDianMerchantDetails signType(String signType) {
    method inputCharset (line 161) | public WxYouDianMerchantDetails inputCharset(String inputCharset) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/CacheMerchantDetailsManager.java
  class CacheMerchantDetailsManager (line 22) | public class CacheMerchantDetailsManager implements MerchantDetailsManag...
    method CacheMerchantDetailsManager (line 28) | public CacheMerchantDetailsManager(MerchantDetailsManager<PaymentPlatf...
    method createMerchant (line 37) | @Override
    method createMerchant (line 49) | @Override
    method updateMerchant (line 61) | @Override
    method deleteMerchant (line 75) | @Override
    method merchantExists (line 87) | @Override
    method setPayMessageConfigurer (line 102) | @Override
    method loadMerchantByMerchantId (line 113) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/InMemoryMerchantDetailsManager.java
  class InMemoryMerchantDetailsManager (line 24) | public class InMemoryMerchantDetailsManager implements MerchantDetailsMa...
    method InMemoryMerchantDetailsManager (line 29) | public InMemoryMerchantDetailsManager() {
    method InMemoryMerchantDetailsManager (line 32) | public InMemoryMerchantDetailsManager(Collection<PaymentPlatformMercha...
    method InMemoryMerchantDetailsManager (line 36) | public InMemoryMerchantDetailsManager(Map<String, PaymentPlatformMerch...
    method InMemoryMerchantDetailsManager (line 44) | public InMemoryMerchantDetailsManager(Properties merchants) {
    method createMerchant (line 54) | @Override
    method createMerchant (line 65) | @Override
    method setPayMessageConfigurer (line 73) | protected static void setPayMessageConfigurer(PayService payService, P...
    method updateMerchant (line 92) | @Override
    method deleteMerchant (line 103) | @Override
    method merchantExists (line 114) | @Override
    method setPayMessageConfigurer (line 124) | @Override
    method loadMerchantByMerchantId (line 135) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/JdbcMerchantDetailsManager.java
  class JdbcMerchantDetailsManager (line 33) | public class JdbcMerchantDetailsManager implements MerchantDetailsManage...
    method JdbcMerchantDetailsManager (line 58) | public JdbcMerchantDetailsManager(DataSource dataSource) {
    method JdbcMerchantDetailsManager (line 62) | public JdbcMerchantDetailsManager(JdbcTemplate jdbcTemplate) {
    method createMerchant (line 72) | @Override
    method createMerchant (line 83) | @Override
    method updateMerchant (line 98) | @Override
    method deleteMerchant (line 110) | @Override
    method merchantExists (line 121) | @Override
    method loadMerchantByMerchantId (line 137) | @Override
    method setKeyPrivate (line 184) | public void setKeyPrivate(CommonPaymentPlatformMerchantDetails details...
    method getFindByIdSql (line 196) | public String getFindByIdSql() {
    method setFindByIdSql (line 200) | public void setFindByIdSql(String findByIdSql) {
    method getInsertSql (line 204) | public String getInsertSql() {
    method setInsertSql (line 208) | public void setInsertSql(String insertSql) {
    method getUpdateSql (line 212) | public String getUpdateSql() {
    method setUpdateSql (line 216) | public void setUpdateSql(String updateSql) {
    method getDeleteSql (line 220) | public String getDeleteSql() {
    method setDeleteSql (line 224) | public void setDeleteSql(String deleteSql) {
    method getExistsSql (line 228) | public String getExistsSql() {
    method setExistsSql (line 232) | public void setExistsSql(String existsSql) {
    method setPayMessageConfigurer (line 242) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/MerchantDetailsManager.java
  type MerchantDetailsManager (line 18) | public interface MerchantDetailsManager<T extends MerchantDetails> exten...
    method createMerchant (line 24) | void createMerchant(T merchant);
    method createMerchant (line 29) | void createMerchant(Collection<T> merchants);
    method updateMerchant (line 35) | void updateMerchant(T merchant);
    method deleteMerchant (line 40) | void deleteMerchant(String id);
    method merchantExists (line 47) | boolean merchantExists(String id);
    method setPayMessageConfigurer (line 53) | void setPayMessageConfigurer(PayMessageConfigurer configurer);

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/AliPaymentPlatform.java
  class AliPaymentPlatform (line 27) | @Configuration(AliPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 42) | @Override
    method getPayService (line 53) | @Override
    method certKeyPublic (line 80) | private static void certKeyPublic(AliPayConfigStorage aliPayConfigStor...
    method getPayService (line 103) | @Override
    method getTransactionType (line 110) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/FuiouPaymentPlatform.java
  class FuiouPaymentPlatform (line 26) | @Configuration(FuiouPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 41) | @Override
    method getPayService (line 52) | @Override
    method getPayService (line 75) | @Override
    method getTransactionType (line 82) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaymentPlatforms.java
  class PaymentPlatforms (line 18) | public final class PaymentPlatforms {
    method loadPaymentPlatform (line 28) | public static void loadPaymentPlatform(PaymentPlatform platform) {
    method getPaymentPlatforms (line 37) | public static Map<String, PaymentPlatform> getPaymentPlatforms() {
    method getTransactionType (line 48) | public static TransactionType getTransactionType(String platformName, ...
    method getPaymentPlatform (line 59) | public static PaymentPlatform getPaymentPlatform(String platformName) {

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PayoneerPaymentPlatform.java
  class PayoneerPaymentPlatform (line 26) | @Configuration(PayoneerPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 41) | @Override
    method getPayService (line 52) | @Override
    method getPayService (line 77) | @Override
    method getTransactionType (line 84) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaypalPaymentPlatform.java
  class PaypalPaymentPlatform (line 27) | @Configuration(PaypalPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 41) | @Override
    method getPayService (line 52) | @Override
    method getPayService (line 77) | @Override
    method getTransactionType (line 84) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaypalV2PaymentPlatform.java
  class PaypalV2PaymentPlatform (line 27) | @Configuration(PaypalV2PaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 41) | @Override
    method getPayService (line 52) | @Override
    method getPayService (line 77) | @Override
    method getTransactionType (line 84) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/UnionPaymentPlatform.java
  class UnionPaymentPlatform (line 32) | @Configuration(UnionPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 47) | @Override
    method getPayService (line 58) | @Override
    method getPayService (line 106) | @Override
    method getTransactionType (line 113) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxPaymentPlatform.java
  class WxPaymentPlatform (line 32) | @Configuration(WxPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 49) | @Override
    method getPayService (line 60) | @Override
    method getPayService (line 72) | @Override
    method getTransactionType (line 120) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3CombinePaymentPlatform.java
  class WxV3CombinePaymentPlatform (line 32) | @Configuration(WxV3CombinePaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 49) | @Override
    method getPayService (line 60) | @Override
    method getPayService (line 73) | @Override
    method getTransactionType (line 117) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3PaymentPlatform.java
  class WxV3PaymentPlatform (line 32) | @Configuration(WxV3PaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 49) | @Override
    method getPayService (line 60) | @Override
    method getPayService (line 72) | @Override
    method getTransactionType (line 114) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3ProfitSharingPlatform.java
  class WxV3ProfitSharingPlatform (line 32) | @Configuration(WxV3ProfitSharingPlatform.PLATFORM_NAME)
    method getPlatform (line 48) | @Override
    method getPayService (line 59) | @Override
    method getPayService (line 71) | @Override
    method getTransactionType (line 114) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/YoudianPaymentPlatform.java
  class YoudianPaymentPlatform (line 26) | @Configuration(YoudianPaymentPlatform.PLATFORM_NAME)
    method getPlatform (line 41) | @Override
    method getPayService (line 52) | @Override
    method getPayService (line 75) | @Override
    method getTransactionType (line 82) | @Override

FILE: pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/utils/SqlTools.java
  class SqlTools (line 20) | public class SqlTools {
    method getCountSQL (line 30) | public static String getCountSQL(final String sql) {
    method getCountOracleSQL (line 40) | public static String getCountOracleSQL(final String sql) {
    method getCountSQL (line 52) | public static String getCountSQL(final String sql, String countField) {
    method getCountOracleSQL (line 69) | public static String getCountOracleSQL(final String sql, String countF...
    method removeGROUP (line 85) | public static String removeGROUP(final String sql) {
    method getSelectSQL (line 99) | public static String getSelectSQL(String select, String tableName) {
    method getSQL (line 117) | public static String getSQL(String select, String tableName, String al...
    method forPaginate (line 129) | public static String forPaginate(int pageNumber, int pageSize) {
    method forPaginate (line 143) | public static String forPaginate(String sql, int pageNumber, int pageS...
    method fillStatement (line 157) | public static void fillStatement(PreparedStatement ps, List<Object> pa...
    method fillStatement (line 193) | public static void fillStatement(PreparedStatement ps, Object... param...
    method generateInsertString (line 227) | public static StringBuilder generateInsertString(String tableName, Lis...
    method generateUpdateByRowIdString (line 253) | public static StringBuilder generateUpdateByRowIdString(String tableNa...
    method forMapSave (line 277) | public static StringBuilder forMapSave(String table, Map<String, Objec...
    method forMapUpdate (line 308) | public static StringBuilder forMapUpdate(String table, Map<String, Obj...
    method forMapUpdate (line 335) | public static StringBuilder forMapUpdate(String table, Map<String, Obj...
    method forConverSQL (line 368) | public static String forConverSQL(String sql, Map<String, Object> attr...
    method forQuestionMarkSQL (line 401) | public static String forQuestionMarkSQL(int num) {
    method join (line 419) | public static String join(List<String> list, String separated) {
Condensed preview — 70 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (284K chars).
[
  {
    "path": ".gitignore",
    "chars": 278,
    "preview": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Packa"
  },
  {
    "path": "LICENSE",
    "chars": 10249,
    "preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
  },
  {
    "path": "README.md",
    "chars": 3514,
    "preview": " # 支付聚合spring boot组件\npay-spring-boot-starter 是一个基于spring-boot实现自动化配置的支付对接, **让你真正做到一行代码实现支付聚合**, 让你可以不用理解支付怎么对接,只需要专注你的业"
  },
  {
    "path": "doc/sql/merchant_pay.sql",
    "chars": 6536,
    "preview": "\r\nCREATE DATABASE merchant_pay;\r\n\r\nUSE `merchant_pay`;\r\n\r\n\r\nDROP TABLE IF EXISTS `merchant_details`;\r\n\r\nCREATE TABLE `me"
  },
  {
    "path": "pay-spring-boot/pom.xml",
    "chars": 586,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/MerchantPayServiceManager.java",
    "chars": 12583,
    "preview": "package com.egzosn.pay.spring.boot.core;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java."
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayBuilder.java",
    "chars": 356,
    "preview": "package com.egzosn.pay.spring.boot.core;\n\n/**\n * 用于构建对象的接口\n *\n * @param <O> 正在构建的对象的类型\n\n * @author egan\n *         <pre>"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayConfigurerAdapter.java",
    "chars": 431,
    "preview": "package com.egzosn.pay.spring.boot.core;\n\n/**\n * 支付配置适配,主要用于外部调用者链式的方式创建对象\n * @author egan\n *         <pre>\n *          "
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayServiceConfigurer.java",
    "chars": 670,
    "preview": "package com.egzosn.pay.spring.boot.core;\n\nimport com.egzosn.pay.spring.boot.core.configurers.MerchantDetailsServiceConfi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/PayServiceManager.java",
    "chars": 6336,
    "preview": "package com.egzosn.pay.spring.boot.core;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Map;\n"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/bean/MerchantPayOrder.java",
    "chars": 1371,
    "preview": "package com.egzosn.pay.spring.boot.core.bean;\n\nimport com.egzosn.pay.common.bean.PayOrder;\nimport com.egzosn.pay.common."
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/bean/MerchantQueryOrder.java",
    "chars": 2415,
    "preview": "package com.egzosn.pay.spring.boot.core.bean;\n\nimport com.egzosn.pay.common.bean.AssistOrder;\nimport com.egzosn.pay.comm"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/InMemoryMerchantDetailsServiceBuilder.java",
    "chars": 2615,
    "preview": "package com.egzosn.pay.spring.boot.core.builders;\n\nimport com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigur"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/JdbcMerchantDetailsServiceBuilder.java",
    "chars": 2609,
    "preview": "package com.egzosn.pay.spring.boot.core.builders;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.jdbc.core.Jd"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/builders/MerchantDetailsServiceBuilder.java",
    "chars": 1782,
    "preview": "package com.egzosn.pay.spring.boot.core.builders;\n\nimport javax.sql.DataSource;\n\nimport org.springframework.jdbc.core.Jd"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/DefalutPayMessageConfigurer.java",
    "chars": 2505,
    "preview": "package com.egzosn.pay.spring.boot.core.configurers;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java."
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/MerchantDetailsServiceConfigurer.java",
    "chars": 2701,
    "preview": "package com.egzosn.pay.spring.boot.core.configurers;\n\n\nimport com.egzosn.pay.spring.boot.core.PayConfigurerAdapter;\nimpo"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/configurers/PayMessageConfigurer.java",
    "chars": 1206,
    "preview": "package com.egzosn.pay.spring.boot.core.configurers;\n\nimport com.egzosn.pay.common.api.PayMessageHandler;\nimport com.egz"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantDetails.java",
    "chars": 471,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant;\n\nimport com.egzosn.pay.common.api.PayConfigStorage;\n\nimport java.io.Se"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantDetailsService.java",
    "chars": 428,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant;\n\n/**\n *  提供给客户端获取商户列表信息的服务\n *\n * @author egan\n *         <pre>\n *     "
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/MerchantNotFoundException.java",
    "chars": 884,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant;\n\n/**\n * 商户不存在异常\n * @author egan\n *         <pre>\n *         email egzo"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatform.java",
    "chars": 912,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant;\n\nimport com.egzosn.pay.common.api.PayConfigStorage;\nimport com.egzosn."
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatformMerchantDetails.java",
    "chars": 505,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant;\n\nimport com.egzosn.pay.common.api.PayService;\n\n/**\n * 支付平台商户列表\n * @aut"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/PaymentPlatformServiceAdapter.java",
    "chars": 680,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.pay.co"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/AliMerchantDetails.java",
    "chars": 4743,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.ali.api.AliPayConfigStorage;\nimport com.eg"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/CommonPaymentPlatformMerchantDetails.java",
    "chars": 7288,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.BasePayConfigStorage;\nimport co"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/FuiouMerchantDetails.java",
    "chars": 4578,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PayPalV2MerchantDetails.java",
    "chars": 4389,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PayoneerMerchantDetails.java",
    "chars": 4293,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/PaypalMerchantDetails.java",
    "chars": 4273,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/UnionMerchantDetails.java",
    "chars": 5344,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport java.io.InputStream;\n\nimport com.egzosn.pay.common.api.Pa"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxMerchantDetails.java",
    "chars": 4734,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxV3MerchantDetails.java",
    "chars": 5777,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/merchant/bean/WxYouDianMerchantDetails.java",
    "chars": 4116,
    "preview": "package com.egzosn.pay.spring.boot.core.merchant.bean;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.p"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/CacheMerchantDetailsManager.java",
    "chars": 3297,
    "preview": "package com.egzosn.pay.spring.boot.core.provider;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.ut"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/InMemoryMerchantDetailsManager.java",
    "chars": 4234,
    "preview": "package com.egzosn.pay.spring.boot.core.provider;\n\nimport com.egzosn.pay.common.api.PayMessageHandler;\nimport com.egzosn"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/JdbcMerchantDetailsManager.java",
    "chars": 9329,
    "preview": "package com.egzosn.pay.spring.boot.core.provider;\n\nimport com.egzosn.pay.common.api.PayService;\nimport com.egzosn.pay.co"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/MerchantDetailsManager.java",
    "chars": 1190,
    "preview": "package com.egzosn.pay.spring.boot.core.provider;\n\nimport com.egzosn.pay.spring.boot.core.configurers.PayMessageConfigur"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/AliPaymentPlatform.java",
    "chars": 4603,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport org.springframework.boot.autoconfigure.condi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/FuiouPaymentPlatform.java",
    "chars": 3031,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport org.springframework.boot.autoconfigure.condi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaymentPlatforms.java",
    "chars": 1587,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport com.egzosn.pay.common.bean.TransactionType;\n"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PayoneerPaymentPlatform.java",
    "chars": 3214,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport org.springframework.boot.autoconfigure.condi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaypalPaymentPlatform.java",
    "chars": 3141,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport org.springframework.boot.autoconfigure.condi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/PaypalV2PaymentPlatform.java",
    "chars": 3101,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport org.springframework.boot.autoconfigure.condi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/UnionPaymentPlatform.java",
    "chars": 4467,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport java.io.IOException;\n\nimport org.apache.comm"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxPaymentPlatform.java",
    "chars": 4776,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport java.io.IOException;\n\nimport org.apache.comm"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3CombinePaymentPlatform.java",
    "chars": 4649,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport java.io.IOException;\n\nimport org.apache.comm"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3PaymentPlatform.java",
    "chars": 4517,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport java.io.IOException;\n\nimport org.apache.comm"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/WxV3ProfitSharingPlatform.java",
    "chars": 4618,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport java.io.IOException;\n\nimport org.apache.comm"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/provider/merchant/platform/YoudianPaymentPlatform.java",
    "chars": 3079,
    "preview": "package com.egzosn.pay.spring.boot.core.provider.merchant.platform;\n\nimport org.springframework.boot.autoconfigure.condi"
  },
  {
    "path": "pay-spring-boot/src/main/java/com/egzosn/pay/spring/boot/core/utils/SqlTools.java",
    "chars": 11781,
    "preview": "package com.egzosn.pay.spring.boot.core.utils;\n\n\nimport java.sql.PreparedStatement;\nimport java.sql.SQLException;\nimport"
  },
  {
    "path": "pay-spring-boot-autoconfigue/pom.xml",
    "chars": 784,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "pay-spring-boot-autoconfigue/src/main/java/com/egzosn/pay/spring/boot/autoconfigue/PayAutoConfiguration.java",
    "chars": 4121,
    "preview": "package com.egzosn.pay.spring.boot.autoconfigue;\n\nimport java.util.List;\n\nimport org.springframework.beans.factory.annot"
  },
  {
    "path": "pay-spring-boot-autoconfigue/src/main/resources/META-INF/spring.factories",
    "chars": 125,
    "preview": "org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\\ncom.egzosn.pay.spring.boot.autoconfigue.PayAutoConfigur"
  },
  {
    "path": "pay-spring-boot-starter/pom.xml",
    "chars": 807,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "pay-spring-boot-starter/src/main/resources/META-INF/spring.providers",
    "chars": 38,
    "preview": "provides: pay-spring-boot-autoconfigue"
  },
  {
    "path": "pay-spring-boot-starter-demo/pom.xml",
    "chars": 3952,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/PayApplication.java",
    "chars": 424,
    "preview": "package com.egzosn.pay.spring.boot.demo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework."
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/MerchantPayServiceConfigurer.java",
    "chars": 13921,
    "preview": "package com.egzosn.pay.spring.boot.demo.config;\n\nimport com.egzosn.pay.common.bean.CertStoreType;\nimport com.egzosn.pay."
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/MyAliPaymentPlatform.java",
    "chars": 4051,
    "preview": "package com.egzosn.pay.spring.boot.demo.config;\n\nimport com.egzosn.pay.ali.api.AliPayConfigStorage;\nimport com.egzosn.pa"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/handlers/AliPayMessageHandler.java",
    "chars": 1907,
    "preview": "package com.egzosn.pay.spring.boot.demo.config.handlers;\n\nimport com.egzosn.pay.ali.api.AliPayService;\nimport com.egzosn"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/handlers/WxPayMessageHandler.java",
    "chars": 896,
    "preview": "package com.egzosn.pay.spring.boot.demo.config.handlers;\n\nimport com.egzosn.pay.common.api.PayMessageHandler;\nimport com"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/config/interceptor/AliPayMessageInterceptor.java",
    "chars": 1739,
    "preview": "\npackage com.egzosn.pay.spring.boot.demo.config.interceptor;\n\nimport com.egzosn.pay.ali.api.AliPayService;\nimport com.eg"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/java/com/egzosn/pay/spring/boot/demo/controller/PayMerchantController.java",
    "chars": 9589,
    "preview": "package com.egzosn.pay.spring.boot.demo.controller;\n\nimport java.io.IOException;\nimport java.math.BigDecimal;\nimport jav"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/resources/ali/alipayCertPublicKey_RSA2.crt",
    "chars": 3054,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIQIBkQFQ/dyVOPUjiooDnPNjANBgkqhkiG9w0BAQsFADCBkTELMAkGA1UE\nBhMCQ04xGzAZBgN"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/resources/ali/alipayRootCert.crt",
    "chars": 5043,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG\nEwJDTjEOMAwGA1UECgwFTlJDQUM"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/resources/ali/appCertPublicKey_2016080400165436.crt",
    "chars": 1290,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIDjzCCAnegAwIBAgIQICARMFLSkg9etOjTIGp0hjANBgkqhkiG9w0BAQsFADCBkTELMAkGA1UE\nBhMCQ04xGzAZBgN"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/resources/ali/www.egzosn.com_私钥.txt",
    "chars": 1628,
    "preview": "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCw7MD2Cwv/jnXssFjXnGx3JlGF57gJa2aYbJRV8MnNiPVpX4Ha+8ZjnQDhvkrWH4hHmzcu"
  },
  {
    "path": "pay-spring-boot-starter-demo/src/main/resources/application.yml",
    "chars": 823,
    "preview": "server:\n  port: 8080\n#  context-path: /dock\n\n\n\nlogging:\n  level:\n#    root: debug\n      com:\n        egzosn: debug\n  fil"
  },
  {
    "path": "pom.xml",
    "chars": 10066,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  }
]

About this extraction

This page contains the full source code of the egzosn/pay-spring-boot-starter-parent GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 70 files (245.1 KB), approximately 72.2k tokens, and a symbol index with 567 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!