This commit is contained in:
tanghc
2019-04-15 20:11:18 +08:00
parent e28fd3b2ec
commit 2f2b52a5dd
28 changed files with 1197 additions and 110 deletions

14
sop-website/readme.md Normal file
View File

@@ -0,0 +1,14 @@
# 开放平台网站
包括文档功能,用户注册等,具体业务需要自己实现。
前后端分离
- website-front: 前端页面
- website-server: 后台接口
## 使用方式
- 确保注册中心、网关、微服务正常启动
- 启动website-server(运行WebsiteServerApplication.java)
- 找到sop-website/website-front/pages/doc/doc.htmlIDEA下右键--Debug

View File

@@ -0,0 +1,647 @@
<html data-find="_6">
<head>
<script src="https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101"></script>
<meta charset="utf-8">
<title>返回状态码</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="../../assets/lib/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../assets/css/global.css" media="all">
<link id="layuicss-skincodecss" rel="stylesheet" href="../../assets/lib/layui/css/modules/code.css" media="all">
<link id="layuicss-layer" rel="stylesheet" href="../../assets/lib/layui/css/modules/layer/default/layer.css?v=3.1.1"
media="all">
<style type="text/css">
.site-content table {
border-collapse: collapse;
border-spacing: 0;
empty-cells: show;
vertical-align: top;
width: 100%;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
margin: 12px 0 24px;
}
.site-content table + p {
margin-top: 24px;
}
.site-content table th,
.site-content table td {
padding: 8px 12px;
font-size: 14px;
text-align: left;
word-break: break-word;
word-wrap: break-word;
min-width: 100px;
color: gray;
}
.site-content table thead tr{
background-color: #f2f2f2;
}
.site-content table thead td,
.site-content table tbody td{
border-bottom: 1px solid #e6e6e6;
border-left: 1px solid #e6e6e6;
border-right: 1px solid #e6e6e6;
border-top: 1px solid #e6e6e6;
}
</style>
</head>
<body data-find="_5">
<div class="layui-header header header-doc" spring="">
<div class="layui-main">
<a class="logo" href="#" style="color: #ffffff">
开放平台
</a>
<ul class="layui-nav">
<li class="layui-nav-item layui-this">
<a href="doc.html">文档中心<!-- --></a>
</li>
<span class="layui-nav-bar" style="left: 162px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div>
<!-- 让IE8/9支持媒体查询从而兼容栅格 -->
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<div class="layui-main site-inline">
<div class="site-tree">
<ul id="docItemTree" class="layui-tree">
<li><h2 class="docModule">文档专区</h2></li>
<li class="site-tree-noicon layui-this">
<a href="#">
<cite>公共错误码</cite>
</a>
</li>
</ul>
</div>
<div class="site-content">
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">公共错误码</a></legend>
</fieldset>
</div>
<div class="site-text">
<p>网关会对开发者的接口非业务调用错误做统一处理,返回码如下:</p>
<table>
<thead>
<tr>
<td rowspan="1" colspan="1">
<div><strong>code返回码</strong></div>
</td>
<td rowspan="1" colspan="1">
<div><strong>msg返回码描述</strong></div>
</td>
<td rowspan="1" colspan="1">
<div><strong>sub_code明细返回码</strong></div>
</td>
<td rowspan="1" colspan="1">
<div><strong>sub_msg明细返回码描述</strong></div>
</td>
<td rowspan="1" colspan="1">
<div><strong>解决方案</strong></div>
</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="1" colspan="1">
<div>10000</div>
</td>
<td rowspan="1" colspan="1">
<div>Success接口调用成功</div>
</td>
<td rowspan="1" colspan="1">
<div>&nbsp;</div>
</td>
<td rowspan="1" colspan="1">
<div>&nbsp;</div>
</td>
<td rowspan="1" colspan="1">
<div>&nbsp;</div>
</td>
</tr>
<tr>
<td rowspan="3" colspan="1">
<div>20000</div>
</td>
<td rowspan="3" colspan="1">
<div>服务不可用</div>
</td>
<td rowspan="1" colspan="1">
<div>isp.unknow-error</div>
</td>
<td rowspan="1" colspan="1">
<div>服务暂不可用(业务系统不可用)</div>
</td>
<td rowspan="1" colspan="1">
<div>稍后重试</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>aop.unknow-error</div>
</td>
<td rowspan="1" colspan="1">
<div>服务暂不可用(网关自身的未知错误)</div>
</td>
<td rowspan="1" colspan="1">
<div>稍后重试</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isp.service-not-available</div>
</td>
<td rowspan="1" colspan="1">
<div>服务暂不可用</div>
</td>
<td rowspan="1" colspan="1">
<div>稍后重试</div>
</td>
</tr>
<tr>
<td rowspan="6" colspan="1">
<div>20001</div>
</td>
<td rowspan="6" colspan="1">
<div>授权权限不足</div>
</td>
<td rowspan="1" colspan="1">
<div>aop.invalid-auth-token</div>
</td>
<td rowspan="1" colspan="1">
<div>无效的访问令牌</div>
</td>
<td rowspan="1" colspan="1">
<div>请刷新授权令牌或重新授权获取新的令牌</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>aop.auth-token-time-out</div>
</td>
<td rowspan="1" colspan="1">
<div>访问令牌已过期</div>
</td>
<td rowspan="1" colspan="1">
<div>请刷新授权令牌或重新授权获取新的令牌</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>aop.invalid-app-auth-token</div>
</td>
<td rowspan="1" colspan="1">
<div>无效的应用授权令牌</div>
</td>
<td rowspan="1" colspan="1">
<div>请刷新应用授权令牌或重新授权获取新的令牌</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>aop.invalid-app-auth-token-no-api</div>
</td>
<td rowspan="1" colspan="1">
<div>商户未授权当前接口</div>
</td>
<td rowspan="1" colspan="1">
<div>请重新授权获取新的应用授权令牌</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>aop.app-auth-token-time-out</div>
</td>
<td rowspan="1" colspan="1">
<div>应用授权令牌已过期</div>
</td>
<td rowspan="1" colspan="1">
<div>请刷新应用授权令牌或重新授权获取新的令牌</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>aop.no-product-reg-by-partner</div>
</td>
<td rowspan="1" colspan="1">
<div>商户未签约任何产品</div>
</td>
<td rowspan="1" colspan="1">
<div>ISV代理调用的场景请上线商户的服务窗</div>
</td>
</tr>
<tr>
<td rowspan="8" colspan="1">
<div>40001</div>
</td>
<td rowspan="8" colspan="1">
<div>缺少必选参数</div>
</td>
<td rowspan="1" colspan="1">
<div>isv.missing-method</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少方法名参数</div>
</td>
<td rowspan="1" colspan="1">
<div>请求参数里面必须要有method参数</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-signature</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少签名参数</div>
</td>
<td rowspan="1" colspan="1">
<div>检查请求参数缺少sign参数</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-signature-type</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少签名类型参数</div>
</td>
<td rowspan="1" colspan="1">
<div>检查请求参数缺少sign_type参数</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-signature-key</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少签名配置</div>
</td>
<td rowspan="1" colspan="1">
<div>未上传公钥配置</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-app-id</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少appId参数</div>
</td>
<td rowspan="1" colspan="1">
<div>检查请求参数缺少app_id参数</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-timestamp</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少时间戳参数</div>
</td>
<td rowspan="1" colspan="1">
<div>检查请求参数缺少timestamp参数</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-version</div>
</td>
<td rowspan="1" colspan="1">
<div>缺少版本参数</div>
</td>
<td rowspan="1" colspan="1">
<div>检查请求参数缺少version参数</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.decryption-error-missing-encrypt-type</div>
</td>
<td rowspan="1" colspan="1">
<div>解密出错, 未指定加密算法</div>
</td>
<td rowspan="1" colspan="1">
<div>检查参数缺少encrypt_type参数</div>
</td>
</tr>
<tr>
<td rowspan="20" colspan="1">
<div>40002</div>
</td>
<td rowspan="20" colspan="1">
<div>非法的参数</div>
</td>
<td rowspan="1" colspan="1">
<div>isv.invalid-parameter</div>
</td>
<td rowspan="1" colspan="1">
<div>参数无效</div>
</td>
<td rowspan="1" colspan="1">
<div>检查参数,格式不对、非法值、越界等</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.upload-fail</div>
</td>
<td rowspan="1" colspan="1">
<div>文件上传失败</div>
</td>
<td rowspan="1" colspan="1">
<div>文件写入失败,重试</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-file-extension</div>
</td>
<td rowspan="1" colspan="1">
<div>文件扩展名无效</div>
</td>
<td rowspan="1" colspan="1">
<div>检查传入的文件扩展名称目前支持格式csv,txt,zip,rar,gz,doc,docx,xls,xlsx,pdf,bmp,gif,jpg,jpeg,png</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-file-size</div>
</td>
<td rowspan="1" colspan="1">
<div>文件大小无效</div>
</td>
<td rowspan="1" colspan="1">
<div>检查文件大小目前支持最大为50MB&nbsp;</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-method</div>
</td>
<td rowspan="1" colspan="1">
<div>不存在的方法名</div>
</td>
<td rowspan="1" colspan="1">
<div>检查入参method是否正确</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-format</div>
</td>
<td rowspan="1" colspan="1">
<div>无效的数据格式</div>
</td>
<td rowspan="1" colspan="1">
<div>检查入参format目前只支持json和xml 2种格式</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-signature-type</div>
</td>
<td rowspan="1" colspan="1">
<div>无效的签名类型</div>
</td>
<td rowspan="1" colspan="1">
<div>检查入参sign_type,目前只支持RSA,RSA2,HMAC_SHA1</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-signature</div>
</td>
<td rowspan="1" colspan="1">
<div>无效签名</div>
</td>
<td rowspan="1" colspan="1">
<div>1.公私钥是否是一对 2.检查公钥上传是否与私钥匹配 3.存在中文需要做urlencode 4.签名算法是否无误
</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-encrypt-type</div>
</td>
<td rowspan="1" colspan="1">
<div>无效的加密类型</div>
</td>
<td rowspan="1" colspan="1">
<div>检查入参encrypt_type目前只支持AES</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-encrypt</div>
</td>
<td rowspan="1" colspan="1">
<div>解密异常</div>
</td>
<td rowspan="1" colspan="1">
<div>重试</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-app-id</div>
</td>
<td rowspan="1" colspan="1">
<div>无效的appId参数</div>
</td>
<td rowspan="1" colspan="1">
<div>检查入参app_idapp_id不存在或者未上线</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-timestamp</div>
</td>
<td rowspan="1" colspan="1">
<div>非法的时间戳参数</div>
</td>
<td rowspan="1" colspan="1">
<div>时间戳参数timestamp非法请检查格式需要为"yyyy-MM-dd HH:mm:ss"</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-charset</div>
</td>
<td rowspan="1" colspan="1">
<div>字符集错误</div>
</td>
<td rowspan="1" colspan="1">
<div>请求参数charset错误目前支持格式GBK,UTF-8</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.invalid-digest</div>
</td>
<td rowspan="1" colspan="1">
<div>摘要错误</div>
</td>
<td rowspan="1" colspan="1">
<div>检查请求参数,文件摘要参数必填</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.decryption-error-not-valid-encrypt-type</div>
</td>
<td rowspan="1" colspan="1">
<div>解密出错,不支持的加密算法</div>
</td>
<td rowspan="1" colspan="1">
<div>检查入参encrypt_type目前只支持AES</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.decryption-error-not-valid-encrypt-key</div>
</td>
<td rowspan="1" colspan="1">
<div>解密出错, 未配置加密密钥或加密密钥格式错误</div>
</td>
<td rowspan="1" colspan="1">
<div>没有配置加密密钥</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.decryption-error-unknown</div>
</td>
<td rowspan="1" colspan="1">
<div>解密出错,未知异常</div>
</td>
<td rowspan="1" colspan="1">
<div>重试</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.missing-signature-config</div>
</td>
<td rowspan="1" colspan="1">
<div>验签出错, 未配置对应签名算法的公钥或者证书</div>
</td>
<td rowspan="1" colspan="1">
<div>没有配置应用公钥</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.not-support-app-auth</div>
</td>
<td rowspan="1" colspan="1">
<div>本接口不支持第三方代理调用</div>
</td>
<td rowspan="1" colspan="1">
<div>本接口不支持第三方代理调用</div>
</td>
</tr>
<tr height="34px">
<td rowspan="1" colspan="1">
<div>isv.suspected-attack</div>
</td>
<td rowspan="1" colspan="1">
<div>可疑的攻击请求</div>
</td>
<td rowspan="1" colspan="1">
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>40004</div>
</td>
<td rowspan="1" colspan="1">
<div>业务处理失败</div>
</td>
<td rowspan="1" colspan="3">
<div>对应业务错误码明细错误码和解决方案请参见具体的API接口文档</div>
</td>
</tr>
<tr>
<td rowspan="4" colspan="1">
<div>40006</div>
</td>
<td rowspan="4" colspan="1">
<div>权限不足</div>
</td>
<td rowspan="1" colspan="1">
<div>isv.insufficient-isv-permissions</div>
</td>
<td rowspan="1" colspan="1">
<div>ISV权限不足</div>
</td>
<td rowspan="1" colspan="1">
<div>请检查配置的账户是否有当前接口权限</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.insufficient-user-permissions</div>
</td>
<td rowspan="1" colspan="1">
<div>用户权限不足</div>
</td>
<td rowspan="1" colspan="1">
<div>代理的商户没有当前接口权限</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.route-no-permissions</div>
</td>
<td rowspan="1" colspan="1">
<div>用户权限不足</div>
</td>
<td rowspan="1" colspan="1">
<div>没有当前接口权限</div>
</td>
</tr>
<tr>
<td rowspan="1" colspan="1">
<div>isv.access-forbidden</div>
</td>
<td rowspan="1" colspan="1">
<div>用户权限不足</div>
</td>
<td rowspan="1" colspan="1">
<div>无权访问(接口被禁用)</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div><!-- layui-main end~ -->
<div class="layui-footer footer footer-doc">
<div class="layui-main">
<p>© 2019 <a href="https://gitee.com/durcframework/SOP" target="_blank">SOP</a> MIT license</p>
</div>
</div>
<script src="../../assets/lib/layui/layui.js" charset="utf-8"></script>
<script src="../../config/config.js" charset="utf-8"></script>
<script src="../../assets/lib/jquery/3.2.1/jquery.min.js" charset="utf-8"></script>
<script>
layui.use('code', function(){ //加载code模块
layui.code(); //引用code方法
});
</script>
</body>
</html>

View File

@@ -2,7 +2,7 @@
<head>
<script src="https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101"></script>
<meta charset="utf-8">
<title>滑块文档 - layui</title>
<title>文档中心</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@@ -12,15 +12,9 @@
<link rel="stylesheet" href="../../assets/lib/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../assets/css/global.css" media="all">
<!--<script src="https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6111334333458862.js"></script>-->
<!--<script src="https://pagead2.googlesyndication.com/pagead/js/r20190408/r20190131/show_ads_impl.js" id="google_shimpl"></script>-->
<!--<script src="https://hm.baidu.com/hm.js?d214947968792b839fd669a4decaaffc"></script>-->
<!--<link rel="preload" href="https://adservice.google.com/adsid/integrator.js?domain=www.layui.com" as="script">-->
<!--<script type="text/javascript" src="https://adservice.google.com/adsid/integrator.js?domain=www.layui.com"></script>-->
<link id="layuicss-skincodecss" rel="stylesheet" href="../../assets/lib/layui/css/modules/code.css" media="all">
<link id="layuicss-layer" rel="stylesheet" href="../../assets/lib/layui/css/modules/layer/default/layer.css?v=3.1.1"
media="all">
<!--<link rel="preload" href="https://pagead2.googlesyndication.com/pagead/js/r20190408/r20190131/show_ads_impl.js" as="script">-->
<style type="text/css">
.layui-table {
word-wrap: break-word;
@@ -30,9 +24,11 @@
.layui-table th {
white-space: nowrap !important;
}
.prop-name {
width: 105px;
}
.prop-type {
width: 50px;
}
@@ -47,7 +43,7 @@
</a>
<ul class="layui-nav">
<li class="layui-nav-item layui-this">
<a href="/">文档中心<!-- --></a>
<a href="doc.html">文档中心<!-- --></a>
</li>
<span class="layui-nav-bar" style="left: 162px; top: 55px; width: 0px; opacity: 0;"></span>
@@ -80,16 +76,19 @@
</div>
<div class="site-content">
<h1 class="site-h1"><i class="layui-icon layui-icon-slider"></i> <span class="sop-name"></span>(<span class="sop-summary"></span>)
<h1 class="site-h1"><i class="layui-icon layui-icon-slider"></i> <span class="sop-name"></span>(<span
class="sop-summary"></span>)
</h1>
<blockquote class="layui-elem-quote layui-text sop-description">
</blockquote>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">公共参数</a></legend>
</fieldset>
<div class="site-text" data-find="_2">
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">公共参数</a></legend>
</fieldset>
</div>
<div class="site-text">
<h3>请求地址</h3>
<table class="layui-table">
<thead>
@@ -171,7 +170,7 @@
<td>String</td>
<td></td>
<td>344</td>
<td>商户请求参数的签名串,详见<a href="#" target="_blank">签名</a></td>
<td>商户请求参数的签名串,详见<a href="sign.html" target="_blank">签名</a></td>
<td>详见示例</td>
</tr>
@@ -189,7 +188,7 @@
<td>String</td>
<td></td>
<td>3</td>
<td> 调用的接口版本固定为1.0</td>
<td>调用的接口版本固定为1.0</td>
<td>1.0</td>
</tr>
@@ -223,9 +222,11 @@
</table>
</div>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">请求参数</a></legend>
</fieldset>
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">请求参数</a></legend>
</fieldset>
</div>
<div class="site-text">
<table class="layui-table">
<thead>
@@ -243,9 +244,11 @@
</table>
</div>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">公共响应参数</a></legend>
</fieldset>
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">公共响应参数</a></legend>
</fieldset>
</div>
<div class="site-text">
<table class="layui-table">
<thead>
@@ -264,7 +267,7 @@
<td>String</td>
<td></td>
<td>-</td>
<td>网关返回码,<a href="#" target="_blank">详见文档</a></td>
<td>网关返回码,<a href="code.html" target="_blank">详见文档</a></td>
<td>40004</td>
</tr>
<tr>
@@ -272,7 +275,7 @@
<td>String</td>
<td></td>
<td>-</td>
<td>网关返回码描述,<a href="#" target="_blank">详见文档</a></td>
<td>网关返回码描述,<a href="code.html" target="_blank">详见文档</a></td>
<td>Business Failed</td>
</tr>
<tr>
@@ -296,7 +299,7 @@
<td>String</td>
<td></td>
<td>-</td>
<td>签名,<a href="#" target="_blank">详见文档</a></td>
<td>签名,<a href="sign.html" target="_blank">详见文档</a></td>
<td>xxx</td>
</tr>
</tbody>
@@ -304,9 +307,11 @@
</div>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">响应参数</a></legend>
</fieldset>
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">响应参数</a></legend>
</fieldset>
</div>
<div class="site-text">
<table class="layui-table">
<thead>
@@ -324,24 +329,27 @@
</table>
</div>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">响应示例</a></legend>
</fieldset>
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">响应示例</a></legend>
</fieldset>
</div>
<div class="site-text">
<pre id="responseExampleJson">
</pre>
</div>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">异常示例</a></legend>
</fieldset>
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">异常示例</a></legend>
</fieldset>
</div>
<div class="site-text">
<pre id="responseErrorJson">
</pre>
</div>
</div>
</div><!-- layui-main end~ -->
<div class="layui-footer footer footer-doc">

View File

@@ -1,5 +1,8 @@
layui.use(['element', 'form'], function(){ //加载code模块
var form = layui.form;
// key:module
var docItemStore = {};
function initDocModules() {
$.getJSON(SopConfig.url + '/doc/getDocBaseInfo', function (baseInfo) {
@@ -26,6 +29,7 @@ layui.use(['element', 'form'], function(){ //加载code模块
var html = ['<li><h2>' + docModule + '</h2></li>'];
for (var i = 0; i < docItems.length; i++) {
var docItem = docItems[i];
docItemStore[docItem.nameVersion] = docItem;
/*
<li class="site-tree-noicon layui-this">
<a href="/">
@@ -35,12 +39,12 @@ layui.use(['element', 'form'], function(){ //加载code模块
*/
var selectedClass = i === 0 ? 'layui-this' : '';
html.push('<li class="site-tree-noicon ' + selectedClass + '">');
html.push('<a href="#" sopname="'+docItem.name+'" sopversion="'+docItem.version+'"><cite>'+docItem.summary+'</cite></a>')
html.push('<a href="#" nameversion="'+docItem.nameVersion+'"><cite>'+docItem.summary+'</cite></a>')
}
$('#docItemTree').html(html.join(''));
if (docItems && docItems.length > 0) {
var firstItem = docItems[0];
selectDocItem(firstItem.name, firstItem.version)
selectDocItem(firstItem.nameVersion);
}
})
}
@@ -51,22 +55,21 @@ layui.use(['element', 'form'], function(){ //加载code模块
})
$('#docItemTree').on('click', 'a', function () {
var $tagA = $(this);
selectDocItem($tagA.attr('sopname'), $tagA.attr('sopversion'));
selectDocItem($tagA.attr('nameversion'));
$tagA.parent().addClass('layui-this').siblings().removeClass('layui-this');
})
}
function selectDocItem(name, version) {
$.getJSON(SopConfig.url + '/doc/item/' + name + '/' + version + '/', function (docItem) {
$('.sop-name').text(docItem.name);
$('.sop-version').text(docItem.version);
$('.sop-summary').text(docItem.summary);
$('.sop-description').text(docItem.description || docItem.summary);
function selectDocItem(nameVersion) {
var docItem = docItemStore[nameVersion];
$('.sop-name').text(docItem.name);
$('.sop-version').text(docItem.version);
$('.sop-summary').text(docItem.summary);
$('.sop-description').text(docItem.description || docItem.summary);
createRequestParameter(docItem);
createResponseParameter(docItem);
createResponseCode(docItem);
})
createRequestParameter(docItem);
createResponseParameter(docItem);
createResponseCode(docItem);
}
function createRequestParameter(docItem) {
@@ -99,7 +102,7 @@ layui.use(['element', 'form'], function(){ //加载code模块
' <th>'+(parameter.required ? '<span style="color:red;">是</span>' : '否')+'</th>\n' +
' <th>-</th>\n' +
' <th class="prop-desc">'+parameter.description+'</th>\n' +
' <th class="prop-example">' + parameter.example +'</th>\n' +
' <th class="prop-example">' + (parameter.example || parameter['x-example']) +'</th>\n' +
'</tr>')
}
return html.join('');

View File

@@ -0,0 +1,116 @@
<html data-find="_6">
<head>
<script src="https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101"></script>
<meta charset="utf-8">
<title>签名</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" href="../../assets/lib/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../assets/css/global.css" media="all">
<link id="layuicss-skincodecss" rel="stylesheet" href="../../assets/lib/layui/css/modules/code.css" media="all">
<link id="layuicss-layer" rel="stylesheet" href="../../assets/lib/layui/css/modules/layer/default/layer.css?v=3.1.1"
media="all">
<style type="text/css">
</style>
</head>
<body data-find="_5">
<div class="layui-header header header-doc" spring="">
<div class="layui-main">
<a class="logo" href="#" style="color: #ffffff">
开放平台
</a>
<ul class="layui-nav">
<li class="layui-nav-item layui-this">
<a href="doc.html">文档中心<!-- --></a>
</li>
<span class="layui-nav-bar" style="left: 162px; top: 55px; width: 0px; opacity: 0;"></span>
</ul>
</div>
</div>
<!-- 让IE8/9支持媒体查询从而兼容栅格 -->
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<div class="layui-main site-inline">
<div class="site-tree">
<ul id="docItemTree" class="layui-tree">
<li><h2 class="docModule">签名专区</h2></li>
<li class="site-tree-noicon layui-this">
<a href="#">
<cite>自行实现签名</cite>
</a>
</li>
</ul>
</div>
<div class="site-content">
<div class="site-title">
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">自行实现签名</a></legend>
</fieldset>
</div>
<div class="site-text">
<p>如果未使用开放平台SDK需要自行实现签名过程。</p>
<fieldset class="layui-elem-field layui-field-title site-title">
<legend><a name="use">如何签名</a></legend>
</fieldset>
<p>1.筛选并排序</p>
<p>
获取所有请求参数不包括字节类型参数如文件、字节流剔除sign字段剔除值为空的参数并按照第一个字符的键值ASCII码递增排序字母升序排序如果遇到相同字符则按照第二个字符的键值ASCII码递增排序以此类推。</p>
<p>2.拼接</p>
<p>将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&amp;字符连接起来,此时生成的字符串为待签名字符串。</p>
<p>例如下面的请求示例,参数值都是示例,开发者参考格式即可:</p>
<pre class="layui-code">REQUEST URL: http://open-test.yourdomain.com/api
REQUEST METHOD: POST
CONTENT:
app_id=2014072300007148
method=alipay.mobile.public.menu.add
charset=GBK
sign_type=RSA2
timestamp=2014-07-24 03:07:50
biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}
sign=e9zEAe4TTQ4LPLQvETPoLGXTiURcxiAKfMVQ6Hrrsx2hmyIEGvSfAQzbLxHrhyZ48wOJXTsD4FPnt+YGdK57+fP1BCbf9rIVycfjhYCqlFhbTu9pFnZgT55W+xbAFb9y7vL0MyAxwXUXvZtQVqEwW7pURtKilbcBTEW7TAxzgro=
version=1.0
</pre>
<p>则待签名字符串为:</p>
<pre class="layui-code">app_id=2014072300007148&amp;biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}&amp;charset=GBK&amp;method=alipay.mobile.public.menu.add&amp;sign_type=RSA2&amp;timestamp=2014-07-24 03:07:50&amp;version=1.0</pre>
<p>3.调用签名函数</p>
<p>
使用各自语言对应的SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)签名函数利用商户私钥对待签名字符串进行签名并进行Base64编码。</p>
<p>4.把生成的签名赋值给sign参数拼接到请求参数中。</p>
<pre class="layui-code">/**
@param content 加签内容
@param privateKey 加签私钥
@param charset 加签字符集
@param charset 签名方法
**/
String AlipaySignature.rsaSign(String content, String privateKey, String charset,String signType)
</pre>
</div>
</div>
</div><!-- layui-main end~ -->
<div class="layui-footer footer footer-doc">
<div class="layui-main">
<p>© 2019 <a href="https://gitee.com/durcframework/SOP" target="_blank">SOP</a> MIT license</p>
</div>
</div>
<script src="../../assets/lib/layui/layui.js" charset="utf-8"></script>
<script src="../../config/config.js" charset="utf-8"></script>
<script src="../../assets/lib/jquery/3.2.1/jquery.min.js" charset="utf-8"></script>
<script>
layui.use('code', function(){ //加载code模块
layui.code(); //引用code方法
});
</script>
</body>
</html>

View File

@@ -1,5 +1,6 @@
package com.gitee.sop.websiteserver.bean;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
/**
@@ -14,4 +15,7 @@ public class DocParameter {
private String description;
private String example = "";
@JSONField(name = "x-example")
private String x_example = "";
}

View File

@@ -5,6 +5,7 @@ import com.gitee.sop.websiteserver.bean.DocModule;
import com.gitee.sop.websiteserver.manager.DocManager;
import com.gitee.sop.websiteserver.vo.DocBaseInfoVO;
import com.gitee.sop.websiteserver.vo.DocModuleVO;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -32,6 +33,9 @@ public class DocController {
@Value("${api.url-prod}")
String urlProd;
@Value("${api.pwd}")
String pwd;
@GetMapping("/getDocBaseInfo")
public DocBaseInfoVO getDocBaseInfo() {
List<DocModuleVO> docModuleVOList = docManager.listAll()
@@ -60,4 +64,11 @@ public class DocController {
return docManager.get(method, version);
}
@GetMapping("/doc/reload")
public void reload(String pwd) {
if (StringUtils.equals(this.pwd, pwd)) {
docManager.load();
}
}
}

View File

@@ -3,8 +3,8 @@ package com.gitee.sop.websiteserver.manager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gitee.sop.websiteserver.bean.DocModule;
import com.gitee.sop.websiteserver.bean.DocItem;
import com.gitee.sop.websiteserver.bean.DocModule;
import com.gitee.sop.websiteserver.bean.DocParameter;
import com.gitee.sop.websiteserver.bean.EurekaApplication;
import com.gitee.sop.websiteserver.bean.EurekaApps;
@@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
@@ -61,6 +62,7 @@ public class DocManagerImpl implements DocManager {
public void load() {
try {
Map<String, List<ServiceInfoVO>> listMap = this.getAllServiceList();
log.info("服务列表:{}", JSON.toJSONString(listMap.keySet()));
// {"STORY-SERVICE":[{"ipAddr":"10.1.30.54","name":"STORY-SERVICE","serverPort":"2222"}],"API-GATEWAY":[{"ipAddr":"10.1.30.54","name":"API-GATEWAY","serverPort":"8081"}]}
for (Map.Entry<String, List<ServiceInfoVO>> entry : listMap.entrySet()) {
ServiceInfoVO serviceInfoVo = entry.getValue().get(0);
@@ -79,10 +81,16 @@ public class DocManagerImpl implements DocManager {
private void loadDocInfo(ServiceInfoVO serviceInfoVo) {
String url = "http://" + serviceInfoVo.getIpAddr() + ":" + serviceInfoVo.getServerPort() + "/v2/api-docs";
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
String docInfoJson = entity.getBody();
DocModule docDefinition = this.parseDocJson(docInfoJson);
docDefinitionMap.put(docDefinition.getModule(), docDefinition);
try {
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
String docInfoJson = entity.getBody();
DocModule docDefinition = this.parseDocJson(docInfoJson);
docDefinitionMap.put(docDefinition.getModule(), docDefinition);
} catch (RestClientException e) {
// 这里报错可能是因为有些微服务没有配置swagger文档导致404访问不到
// 这里catch跳过即可
log.warn("读取文档失败, url:{}", url, e);
}
}
private DocModule parseDocJson(String docInfoJson) {

View File

@@ -20,4 +20,5 @@ api:
# 测试地址
url-test: http://api-test.yourdomain.com/api
# 正式地址
url-prod: http://api.yourdomain.com/api
url-prod: http://open.yourdomain.com/api
pwd: doc#123