# SOP
**Repository Path**: durcframework/SOP
## Basic Information
- **Project Name**: SOP
- **Description**: 一个开放平台解决方案项目,基于dubbo实现,目标让用户快速搭建自己的开放平台
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://www.yuque.com/u1604442/sop
- **GVP Project**: No
## Statistics
- **Stars**: 2184
- **Forks**: 1088
- **Created**: 2019-02-18
- **Last Updated**: 2025-06-17
## Categories & Tags
**Categories**: microservice
**Tags**: None
## README
# SOP(Simple Open Platform)
**当前版本为5.0**
👉🏻 [开发文档](https://www.yuque.com/u1604442/sop)
---
一个开放平台解决方案项目,基于dubbo实现,目标让用户快速搭建自己的开放平台。
通过简单的配置后,你的项目就具备了和支付宝开放平台的一样的接口提供能力。
SOP封装了开放平台大部分功能包括:签名验证、统一异常处理、统一返回内容 、业务参数验证(JSR-303)、秘钥管理等,未来还会实现更多功能。
## 项目特点
+ 接入方式简单,与老项目不冲突,老项目注册到注册中心,然后在方法上加上注解即可。
+ 架构松耦合,业务代码实现在各自微服务上,SOP不参与业务实现,这也是dubbo微服务体系带来的好处。
+ 扩展简单,开放平台对应的功能各自独立,可以自定义实现自己的需求,如:更改参数,更改签名规则等。
## 谁可以使用这个项目
+ 有现成的项目,想改造成开放平台供他人调用
+ 有现成的项目,想暴露其中几个接口并通过开放平台供他人调用
+ 想搭一个开放平台新项目,并结合微服务的方式去维护
+ 对开放平台感兴趣的朋友
以上情况都可以考虑使用SOP
## 例子
开放接口定义
```java
/**
* 支付接口
*
* @author 六如
*/
@Api("支付接口")
public interface OpenPayment {
/**
* 手机网站支付接口
*
* @apiNote 该接口是页面跳转接口,用于生成用户访问跳转链接。
* 请在服务端执行SDK中pageExecute方法,读取响应中的body()结果。
* 该结果用于跳转到页面,返回到用户浏览器渲染或重定向跳转到页面。
* 具体使用方法请参考 接入指南
*/
@Open("pay.trade.wap.pay")
PayTradeWapPayResponse tradeWapPay(PayTradeWapPayRequest request);
}
```
接口实现
```java
/**
* 开放接口实现
*
* @author 六如
*/
@DubboService(validation = "true")
public class OpenPaymentImpl implements OpenPayment {
@Override
public PayTradeWapPayResponse tradeWapPay(PayTradeWapPayRequest request) {
PayTradeWapPayResponse payTradeWapPayResponse = new PayTradeWapPayResponse();
payTradeWapPayResponse.setPageRedirectionData(UUID.randomUUID().toString());
return payTradeWapPayResponse;
}
}
```
调用:
```java
@Test
public void testGet() throws Exception {
// 公共请求参数
Map params = new HashMap();
params.put("app_id", appId);
params.put("method", "pay.trade.wap.pay");
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 bizContent = new HashMap<>();
bizContent.put("outTradeNo", "70501111111S001111119");
bizContent.put("totalAmount", "9.00");
bizContent.put("subject", "衣服");
bizContent.put("productCode", "QUICK_WAP_WAY");
params.put("biz_content", JSON.toJSONString(bizContent));
String content = AlipaySignature.getSignContent(params);
String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
params.put("sign", sign);
System.out.println("----------- 请求信息 -----------");
System.out.println("请求参数:" + buildParamQuery(params));
System.out.println("商户秘钥:" + privateKey);
System.out.println("待签名内容:" + content);
System.out.println("签名(sign):" + sign);
System.out.println("URL参数:" + buildUrlQuery(params));
System.out.println("----------- 返回结果 -----------");
String responseData = postJson(url, params);// 发送请求
System.out.println(responseData);
}
```
SDK调用
```java
@Test
public void test() {
PayTradeWapPayRequest request = new PayTradeWapPayRequest();
PayTradeWapPayModel model = new PayTradeWapPayModel();
model.setOutTradeNo("70501111111S001111119");
model.setTotalAmount(new BigDecimal("1000"));
model.setSubject("衣服");
model.setProductCode("QUICK_WAP_WAY");
request.setBizModel(model);
Result result = client.execute(request);
if (result.isSuccess()) {
PayTradeWapPayResponse response = result.getData();
System.out.println(response);
} else {
System.out.println(result);
}
}
```
## 整体架构

## 页面预览
- 文档页面
- 后台管理-文档管理
- 后台管理-秘钥管理
- 后台管理-用户管理
## 沟通交流
