diff --git a/doc/docs/_sidebar.md b/doc/docs/_sidebar.md index 8cb54fc6..8d4723a5 100644 --- a/doc/docs/_sidebar.md +++ b/doc/docs/_sidebar.md @@ -1,32 +1,32 @@ -* [首页](/?t=1564057981506) +* [首页](/?t=1564370846275) * 开发文档 - * [快速体验](files/10010_快速体验.md?t=1564057981508) - * [项目接入到SOP](files/10011_项目接入到SOP.md?t=1564057981525) - * [新增接口](files/10020_新增接口.md?t=1564057981525) - * [业务参数校验](files/10030_业务参数校验.md?t=1564057981525) - * [错误处理](files/10040_错误处理.md?t=1564057981525) - * [编写文档](files/10041_编写文档.md?t=1564057981526) - * [接口交互详解](files/10050_接口交互详解.md?t=1564057981526) - * [easyopen支持](files/10070_easyopen支持.md?t=1564057981526) - * [使用签名校验工具](files/10080_使用签名校验工具.md?t=1564057981526) - * [ISV管理](files/10085_ISV管理.md?t=1564057981526) - * [自定义路由](files/10086_自定义路由.md?t=1564057981526) - * [路由授权](files/10090_路由授权.md?t=1564057981526) - * [接口限流](files/10092_接口限流.md?t=1564057981526) - * [监控日志](files/10093_监控日志.md?t=1564057981526) - * [SDK开发](files/10095_SDK开发.md?t=1564057981526) - * [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1564057981526) - * [应用授权](files/10097_应用授权.md?t=1564057981527) - * [更改数据节点名称](files/10099_更改数据节点名称.md?t=1564057981527) - * [传统web开发](files/10100_传统web开发.md?t=1564057981527) - * [自定义过滤器](files/10102_自定义过滤器.md?t=1564057981527) - * [文件上传](files/10104_文件上传.md?t=1564057981527) - * [nacos注册中心](files/10106_nacos注册中心.md?t=1564057981527) - * [扩展其它注册中心](files/10107_扩展其它注册中心.md?t=1564057981527) - * [配置Sleuth链路追踪](files/10109_配置Sleuth链路追踪.md?t=1564057981527) + * [快速体验](files/10010_快速体验.md?t=1564370846281) + * [项目接入到SOP](files/10011_项目接入到SOP.md?t=1564370846298) + * [新增接口](files/10020_新增接口.md?t=1564370846298) + * [业务参数校验](files/10030_业务参数校验.md?t=1564370846299) + * [错误处理](files/10040_错误处理.md?t=1564370846299) + * [编写文档](files/10041_编写文档.md?t=1564370846299) + * [接口交互详解](files/10050_接口交互详解.md?t=1564370846299) + * [easyopen支持](files/10070_easyopen支持.md?t=1564370846299) + * [使用签名校验工具](files/10080_使用签名校验工具.md?t=1564370846299) + * [ISV管理](files/10085_ISV管理.md?t=1564370846299) + * [自定义路由](files/10086_自定义路由.md?t=1564370846299) + * [路由授权](files/10090_路由授权.md?t=1564370846300) + * [接口限流](files/10092_接口限流.md?t=1564370846300) + * [监控日志](files/10093_监控日志.md?t=1564370846300) + * [SDK开发](files/10095_SDK开发.md?t=1564370846300) + * [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1564370846300) + * [应用授权](files/10097_应用授权.md?t=1564370846300) + * [更改数据节点名称](files/10099_更改数据节点名称.md?t=1564370846300) + * [传统web开发](files/10100_传统web开发.md?t=1564370846300) + * [自定义过滤器](files/10102_自定义过滤器.md?t=1564370846300) + * [文件上传](files/10104_文件上传.md?t=1564370846301) + * [nacos注册中心](files/10106_nacos注册中心.md?t=1564370846301) + * [扩展其它注册中心](files/10107_扩展其它注册中心.md?t=1564370846301) + * [配置Sleuth链路追踪](files/10109_配置Sleuth链路追踪.md?t=1564370846301) * 原理分析 - * [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1564057981527) - * [原理分析之路由存储](files/90011_原理分析之路由存储.md?t=1564057981527) - * [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1564057981528) - * [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1564057981528) - * [常见问题](files/90100_常见问题.md?t=1564057981528) + * [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1564370846301) + * [原理分析之路由存储](files/90011_原理分析之路由存储.md?t=1564370846301) + * [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1564370846301) + * [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1564370846301) + * [常见问题](files/90100_常见问题.md?t=1564370846301) diff --git a/doc/docs/files/10020_新增接口.md b/doc/docs/files/10020_新增接口.md index 7f6c35cc..b4fdfba6 100644 --- a/doc/docs/files/10020_新增接口.md +++ b/doc/docs/files/10020_新增接口.md @@ -65,6 +65,33 @@ public Object addGoods(GoodsParam param, HttpServletRequest request) { } ``` +- 方式2 + +```java +@ApiMapping(value = "story.get", version = "2.2") +public Story getStory22(OpenContext openContext) { + // 业务参数 + Story bizObject = openContext.getBizObject(); + // 获取appid,更多方法查看OpenContext类 + String appId = openContext.getAppId(); + System.out.println(appId); + return bizObject; +} +``` + +另一种方式,OpenContext泛型参数填bizObject类,调用openContext.getBizObject()可直接获得对象 + +此方式等价于: + +```java +public Story getStory22(Story bizObject) { + OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); + String appId = openContext.getAppId(); + System.out.println(appId); + return bizObject; +} +``` + ## 接口命名 接口命名没有做强制要求,但我们还是推荐按照下面的方式进行命名: diff --git a/doc/docs/files/90100_常见问题.md b/doc/docs/files/90100_常见问题.md index 2a0b76a9..26ad57ba 100644 --- a/doc/docs/files/90100_常见问题.md +++ b/doc/docs/files/90100_常见问题.md @@ -11,7 +11,12 @@ String appId = openContext.getAppId(); ```java OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); -Object bizObject = openContext.getBizObject(); +Story bizObject = (Story)openContext.getBizObject(); + +或 + +OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); +Story bizObject = openContext.getBizObject(Story.class); ``` ## Socket error occurred: `localhost/0:0:0:0:0:0:0:1:2181`: Connection refused diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenBeanFactory.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenBeanFactory.java new file mode 100644 index 00000000..4e05abd9 --- /dev/null +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenBeanFactory.java @@ -0,0 +1,16 @@ +package com.gitee.sop.servercommon.bean; + +/** + * @author tanghc + */ +public interface OpenBeanFactory { + + /** + * 返回业务参数对象 + * + * @param clazz 业务参数类class + * @param 业务参数对象 + * @return 返回业务参数对象 + */ + T getBizObject(Class clazz); +} diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContext.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContext.java index ffb6ccac..0795c0ad 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContext.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContext.java @@ -12,73 +12,84 @@ import java.util.Date; * 可通过OpenRequest openRequest = ServiceContext.getCurrentContext().getOpenRequest();方式进行获取 * OpenContext * OpenParam - * @author tanghc * + * @author tanghc */ -public interface OpenContext { +public interface OpenContext extends OpenBeanFactory { /** * 返回appid + * * @return 返回appid */ String getAppId(); /** * 返回业务参数json字符串 + * * @return 返回字符串业务参数 */ String getBizContent(); /** * 返回业务对象 + * * @return 业务对象 */ T getBizObject(); /** * 返回字符编码 + * * @return 如UTF-8 */ String getCharset(); /** * 返回接口名 + * * @return 如:alipay.goods.get */ String getMethod(); /** * 返回版本号 + * * @return 如:1.0 */ String getVersion(); /** * 返回参数格式化 + * * @return 如:json */ String getFormat(); /** * 返回签名类型 + * * @return 如:RSA2 */ String getSignType(); /** * 返回时间戳 + * * @return */ Date getTimestamp(); /** * 返回token,即access_token + * * @return 返回token */ String appAuthToken(); /** * 返回回调地址 + * * @return 返回回调地址 */ String getNotifyUrl(); diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContextImpl.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContextImpl.java index 94e8ef6d..dcc20ae6 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContextImpl.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/bean/OpenContextImpl.java @@ -95,4 +95,16 @@ public class OpenContextImpl implements OpenContext { public String getNotifyUrl() { return rootJsonObject.getString(NOTIFY_URL_NAME); } + + @Override + public E getBizObject(Class clazz) { + if (bizObject != null && bizObject.getClass() == clazz) { + return (E) bizObject; + } + JSONObject bizJsonObj = this.rootJsonObject.getJSONObject(BIZ_CONTENT_NAME); + if (bizJsonObj == null) { + return null; + } + return bizJsonObj.toJavaObject(clazz); + } } diff --git a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java index 8459f1f4..c22509cb 100644 --- a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java +++ b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java @@ -41,9 +41,12 @@ public class AlipayController { // 接口名,使用默认版本号 @ApiMapping(value = "story.get") public Story storyget() { + // 获取开放平台参数 + OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); + String appId = openContext.getAppId(); Story story = new Story(); story.setId(1); - story.setName("海底小纵队(默认版本号)"); + story.setName("海底小纵队(默认版本号), app_id:" + appId); return story; } @@ -67,10 +70,39 @@ public class AlipayController { // 忽略验证 @ApiMapping(value = "story.get", version = "2.1", ignoreValidate = true) public Story getStory21(Story story) { - story.setName(story.getName() + ", story.get2.1, ignoreValidate = true"); + OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext(); + // 此处的param和story参数是一样的 + Story param = openContext.getBizObject(Story.class); + boolean isSame = story == param; + story.setName(story.getName() + ", story.get2.1, ignoreValidate = true, story==param:" + isSame); return story; } + /** + * 另一种方式,OpenContext泛型参数填bizObject类
+ * 调用openContext.getBizObject()可直接获得对象
+ * 此方式等价于: + *
+     * public Story getStory22(Story bizObject) {
+     *     OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext();
+     *     // 获取appid,更多方法查看OpenContext类
+     *     String appId = openContext.getAppId();
+     *     System.out.println(appId);
+     *     return bizObject;
+     * }
+     * 
+ * @param openContext + * @return + */ + @ApiMapping(value = "story.get", version = "2.2") + public Story getStory22(OpenContext openContext) { + Story bizObject = openContext.getBizObject(); + // 获取appid,更多方法查看OpenContext类 + String appId = openContext.getAppId(); + System.out.println(appId); + return bizObject; + } + // http://localhost:2222/getStory2 // 遗留接口具备开放平台能力 @ApiAbility diff --git a/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java b/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java index fda92c02..640fb5e7 100644 --- a/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java +++ b/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java @@ -1,6 +1,7 @@ package com.gitee.sop.test; import com.alibaba.fastjson.JSON; +import com.gitee.sop.test.alipay.AlipayApiException; import com.gitee.sop.test.alipay.AlipaySignature; import org.junit.Test; @@ -178,4 +179,56 @@ public class AlipayClientPostTest extends TestBase { System.out.println(responseData); } + // 忽略验证,不校验签名,只需传接口名、版本号、业务参数 + @Test + public void testIgnore() { + // 公共请求参数 + Map params = new HashMap(); + params.put("method", "story.get"); + params.put("version", "2.1"); + // 业务参数 + Map bizContent = new HashMap<>(); + bizContent.put("id", "222"); + bizContent.put("name", "忽略验证name"); + + params.put("biz_content", JSON.toJSONString(bizContent)); + + System.out.println("----------- 返回结果 -----------"); + String responseData = post(url, params);// 发送请求 + System.out.println(responseData); + } + + @Test + public void testStoryget() throws AlipayApiException { + // 公共请求参数 + Map params = new HashMap(); + params.put("app_id", appId); + params.put("method", "story.get"); + params.put("version", "2.2"); + 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())); + // 业务参数 + Map bizContent = new HashMap<>(); + bizContent.put("id", "222"); + bizContent.put("name", "忽略验证22"); + + 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("----------- 返回结果 -----------"); + String responseData = post(url, params);// 发送请求 + System.out.println(responseData); + } + }