# SOP(Simple Open Platform)

一个开放平台解决方案项目，基于Spring Cloud实现，目标让用户快速搭建自己的开放平台。

SOP提供了两种接口调用方式，分别是：[支付宝开放平台](https://docs.open.alipay.com/api)的调用方式和[淘宝开放平台](http://open.taobao.com/api.htm?docId=285&docType=2)的调用方式。
通过简单的配置后，你的项目就具备了和支付宝开放平台的一样的接口提供能力。

SOP封装了开放平台大部分功能包括：签名验证、统一异常处理、统一返回内容 、业务参数验证（JSR-303）、秘钥管理等，未来还会实现更多功能。

## 项目特点

- 接入方式简单，与老项目不冲突，老项目注册到注册中心，然后在方法上加上注解即可。
- 架构松耦合，业务代码实现在各自微服务上，SOP不参与业务实现，这也是Spring Cloud微服务体系带来的好处。
- 扩展简单，开放平台对应的功能各自独立，可以自定义实现自己的需求，如：更改参数，更改签名规则等。

## 谁可以使用这个项目

- 有现成的项目，想改造成开放平台供他人调用
- 有现成的项目，想暴露其中几个接口并通过开放平台供他人调用
- 想搭一个开放平台新项目，并结合微服务的方式去维护
- 对开放平台感兴趣的朋友

以上情况都可以考虑使用SOP

## 例子

```java
// 加一个注解即可
@Open("story.get")
@RequestMapping("/get")
public StoryResult get() {
    StoryResult result = new StoryResult();
    result.setId(1L);
    result.setName("海底小纵队");
    return result;
}
```

调用：

```java
// 公共请求参数
Map<String, String> params = new HashMap<String, String>();
params.put("app_id", appId);
params.put("method", "story.get");
params.put("format", "json");
params.put("charset", "utf-8");
params.put("sign_type", "RSA2");
params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
params.put("version", "1.0");

// 业务参数
Map<String, String> bizContent = new HashMap<>();
bizContent.put("id", "1");
bizContent.put("name", "葫芦娃");

params.put("biz_content", JSON.toJSONString(bizContent));

System.out.println("----------- 请求信息 -----------");
System.out.println("请求参数：" + buildParamQuery(params));
System.out.println("商户秘钥：" + privateKey);
String content = AlipaySignature.getSignContent(params);
System.out.println("待签名内容：" + content);
String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
System.out.println("签名(sign)：" + sign);

params.put("sign", sign);
System.out.println("URL参数：" + buildUrlQuery(params));

System.out.println("----------- 返回结果 -----------");
String responseData = get(url, params);// 发送请求
System.out.println(responseData);
```

## 架构图

![架构图](https://images.gitee.com/uploads/images/2019/1227/145216_c9b45109_332975.png "sop3.png")

> 如上图所示，整个系统运行后，开发者只需关注微服务中的业务代码，接口变更后重新部署微服务应用即可

## 已完成列表

- 签名验证
- 统一异常处理
- 统一返回内容
- session管理
- 秘钥管理
- 微服务端自动验证（JSR-303）
- 支持Spring Cloud Gateway
- Admin管理平台，统一管理微服务配置，管理路由管理，微服务上下线
- 门户网站，提供用户注册账号
- 接入方管理+秘钥管理
- 接口权限分配
- 文件上传/下载
- 提供基础SDK（含：Java,C++,C#,Python,Go,Rust,Nodejs）
- 接口限流
- 文档整合
- 应用授权
- 监控日志
- 支持nacos
- 网关动态修改参数
- 预发布/灰度环境切换
- 支持eureka注册中心

## 界面预览

![服务列表](https://images.gitee.com/uploads/images/2020/1016/134354_c1915902_332975.png "service.png")

![路由管理](https://images.gitee.com/uploads/images/2020/1016/134039_bed1608d_332975.png "route.png")

![限流管理](https://images.gitee.com/uploads/images/2020/1016/134102_f2dcfb25_332975.png "limit.png")

![秘钥信息](https://images.gitee.com/uploads/images/2019/0711/174921_bd817533_332975.png "秘钥信息")

- 门户网站

![首页](https://images.gitee.com/uploads/images/2020/1107/104607_b86161f0_332975.png "portal0.png")

![文档页](https://images.gitee.com/uploads/images/2020/1107/104342_d44849a9_332975.png "portal1.png")

## 工程说明

> 运行环境：JDK8，Maven3，[Nacos](https://nacos.io/zh-cn/docs/what-is-nacos.html)，Mysql

- doc：开发文档
- sop-common：公共模块，封装常用功能，包含签名校验、错误处理、限流等功能
- sop-gateway：网关，统一访问入口，含`Spring Cloud Zuul`和`Spring Cloud Gateway`实现
- sop-example：微服务示例，含springboot,springmvc示例
- sop-website：开放平台对应网站，提供文档API、沙箱测试等内容
- sop-auth：应用授权服务
- sop-admin：后台管理
- sop-sdk：基础sdk，含Java、C#版本
- sop-test：接口调用测试用例

## 分支说明

- master：发版分支（当前为4.0版本）
- develop：日常开发分支
- eureka：使用eureka注册中心

## 相关文档

[开发文档](http://durcframework.gitee.io/sop)

## 沟通交流

Q群：167643071

![SOP2群](https://images.gitee.com/uploads/images/2020/0203/103119_bdf84eb6_332975.png "SOP2群.png")
