This commit is contained in:
六如
2024-12-03 10:13:55 +08:00
parent 942826f4b0
commit 1ce9ebbff9
13 changed files with 166 additions and 465 deletions

View File

@@ -38,7 +38,7 @@ public interface OpenPayment {
"该结果用于跳转到页面,返回到用户浏览器渲染或重定向跳转到页面。" + "该结果用于跳转到页面,返回到用户浏览器渲染或重定向跳转到页面。" +
"具体使用方法请参考 <a href=\"https://torna.cn\" target=\"_blank\">接入指南</a>" "具体使用方法请参考 <a href=\"https://torna.cn\" target=\"_blank\">接入指南</a>"
) )
@Open(value = "pay.trade.wap.pay", version = "1.0") @Open("pay.trade.wap.pay")
PayTradeWapPayResponse tradeWapPay(PayTradeWapPayRequest request); PayTradeWapPayResponse tradeWapPay(PayTradeWapPayRequest request);
} }
@@ -70,42 +70,66 @@ public class OpenPaymentImpl implements OpenPayment {
调用: 调用:
```java ```java
@Test @Test
public void testGet() throws Exception { public void testGet() throws Exception {
// 公共请求参数
Map<String, String> params = new HashMap<String, String>();
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<String, String> params = new HashMap<String, String>(); Map<String, Object> bizContent = new HashMap<>();
params.put("app_id", appId); bizContent.put("outTradeNo", "70501111111S001111119");
params.put("method", "pay.trade.wap.pay"); bizContent.put("totalAmount", "9.00");
params.put("format", "json"); bizContent.put("subject", "衣服");
params.put("charset", "utf-8"); bizContent.put("productCode", "QUICK_WAP_WAY");
params.put("sign_type", "RSA2");
params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
params.put("version", "2.0");
// 业务参数 params.put("biz_content", JSON.toJSONString(bizContent));
Map<String, Object> bizContent = new HashMap<>(); String content = AlipaySignature.getSignContent(params);
bizContent.put("out_trade_no", "70501111111S001111119"); String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
bizContent.put("total_amount", "9.00"); params.put("sign", sign);
bizContent.put("subject", "衣服");
bizContent.put("product_code", "QUICK_WAP_WAY");
params.put("biz_content", JSON.toJSONString(bizContent)); System.out.println("----------- 请求信息 -----------");
String content = AlipaySignature.getSignContent(params); System.out.println("请求参数:" + buildParamQuery(params));
String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8"); System.out.println("商户秘钥:" + privateKey);
params.put("sign", sign); System.out.println("待签名内容:" + content);
System.out.println("签名(sign)" + sign);
System.out.println("URL参数" + buildUrlQuery(params));
System.out.println("----------- 请求信息 -----------"); System.out.println("----------- 返回结果 -----------");
System.out.println("请求参数:" + buildParamQuery(params)); String responseData = postJson(url, params);// 发送请求
System.out.println("商户秘钥:" + privateKey); System.out.println(responseData);
System.out.println("待签名内容:" + content); }
System.out.println("签名(sign)" + sign); ```
System.out.println("URL参数" + buildUrlQuery(params));
System.out.println("----------- 返回结果 -----------"); SDK调用
String responseData = postJson(url, params);// 发送请求
System.out.println(responseData); ```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<PayTradeWapPayResponse> result = client.execute(request);
if (result.isSuccess()) {
PayTradeWapPayResponse response = result.getData();
System.out.println(response);
} else {
System.out.println(result);
} }
}
``` ```
## 整体架构 ## 整体架构

View File

@@ -1,419 +1,5 @@
# changelog # changelog
## 4.4.2 ## 5.0
- 优化参数绑定 全面重构,欢迎体验:[文档](https://www.yuque.com/u1604442/sop)
## 4.4.1
- 修复单值参数绑定问题
## 4.4.0
**【重要】:升级前请阅读 [升级到4.4.0注意事项](./升级到4.4.0注意事项.md)**
- 优化异常处理
- 优化网关多实例数据库重复保存问题
- 修复`IP``IP+路由ID``IP+APP_ID`限流不生效问题
## 4.3.4
- 修复Request参数在第一位导致绑定失败问题
## 4.3.3
- 修复获取eureka地址问题
## 4.3.2
- 修复微服务方法获取不到OpenContext问题
## 4.3.1
- 修复serviceId有大小写出现404问题
- 修复路有监控错误面板分页问题
## 4.3.0
- 升级`spring-boot/spring-cloud/spring-cloud-alibaba`版本
- 修复`DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144`问题
- 修复压测出现`ClosedChannelException``Connection has been closed BEFORE response`问题
## 4.2.7
- 修复两个微服务相同path问题
- 修复Python-SDK下参数传递问题
## 4.2.6
- 优化网关超时处理
## 4.2.5
- 修复restful负载均衡问题
## 4.2.4
- 修复sop-auth模块启动失败问题
## 4.2.3
- 修复nacos的group不生效问题
## 4.2.2
- 优化版本号
## 4.2.1
- 可指定nacos的group`spring.cloud.nacos.discovery.group=xx`
- 修复spring循环依赖问题
## 4.2.0
需要执行`sop-upgrade-4.2.0.sql`
- 新增ISV用户平台
- 新增门户网站portal
- 新增`C++`,`Rust`语言SDK
## 4.1.0
需要执行`sop-upgrade-4.1.0.sql`
- 重构路由监控功能
- 升级SpringBootSpringCloudSpringCloudAlibaba版本
## 4.0.3
- 可定义业务错误码(见`@Open`注解中的`bizCode`属性)
- 文档参数可指定最大长度(使用`@Length(max = xx)`
- 修复返回大文本导致的错误Exceeded limit on max bytes to buffer : 262144
- 增强参数绑定
## 4.0.2
- 支持swagger排序position属性
## 4.0.1
- 修复超大文本无法请求BUG设置`spring.codec.max-in-memory-size`无效)
## 4.0.0(不兼容3.x)
- 新增@Open注解代替ApiMapping和ApiAbility
- service接入减少代码入侵
- 修改admin密码存储规则
- 完善example
### 不兼容部分
- 移除ApiMapping和ApiAbility改为Open注解
- 移除OpenContext
- 移除zuul
- 移除对easyopen支持
## 3.2.1
- 强化RouteInterceptorContext可获取微服务信息
## 3.2.0
- 使用alibaba cloud
- 新增PythonGo版本SDK
- 返回结果新增全局request_id
- 沙箱环境可填写token
Hoxton.SR3Spring Cloud Version 2.2.1.RELEASESpring Cloud Alibaba Version 2.2.5.RELEASESpring Boot Version
- 优化pom文件
- 优化灰度发布
## 3.1.5
修复文件上传大小不一致问题
## 3.1.4
- 优化跨域
## 3.1.3
- 修复监控日志乱码问题
## 3.1.2
- 修复图片上传保存后图片破损问题
## 3.1.1
- 修复继承WebMvcConfigurationSupport导致的jackson序列化时间问题
- 修复微服务接口返回void网关不会返回code和msg问题
## 3.1.0
- 新增路由监控功能
- 新增路由拦截器
- 优化负载均衡策略
## 3.0.1
- 增强国际化消息现SpringCouldGateway支持英文国际化
- 优化限流配置页
## 3.0.0
- 重构spring cloud gateway网关
- 重构`预发布/灰度发布环境选择`
- zuul和gateway网关二合一可随意切换
- 精简配置文件
- 优化文档中心页面
- 优化接口限流
## 2.5.10
- 优化签名认证,优化校验日志打印
## 2.5.9
- 优化获取context-path
- 修复结果返回产生的NPE问题
## 2.5.8
- 优化参数绑定
## 2.5.7
- 优化restful接口调用
## 2.5.6
- 优化文档显示
- 修复路由拉取接口重复BUG
## 2.5.5
- 优化文档显示
## 2.5.4(不建议使用)
- 可排除其它服务(`sop.service.exclude=your-serviceId1,your-serviceId2`
## 2.5.3(不建议使用)
- 修复JSR-303校验问题
## 2.5.2(不建议使用)
- 修复JSR-303校验枚举对象问题
## 2.5.1
- JSR-303支持嵌套校验
## 2.5.0
**(需要执行`sop-2.5.0.sql`升级文件)**
- 网关可校验token [doc](https://durcframework.gitee.io/sop/#/files/10089_%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8Ctoken?t=1572076365259)
## 2.4.1
- 优化restful接口调用如果正在使用此功能必看 [doc](https://durcframework.gitee.io/sop/#/files/10100_%E6%8F%90%E4%BE%9Brestful%E6%8E%A5%E5%8F%A3?t=1571107529449)
## 2.4.0
- 支持自定义限流持续时间每n秒允许m个请求需要执行`sop-2.4.0.sql`升级脚本)
## 2.3.2
- 支持spring cloud gateway下restful接口调用
## 2.3.1
- 修复restful接口调用通配符问题
## 2.3.0
- 支持请求restful接口设置`sop.restful.enable=true`
## 2.2.0(需要执行`sop-2.2.0.sql`升级文件)
- 支持eureka注册中心`eureka`分支
- 签名内容支持urlencode设置`sign.urlencode=true`
- 可扩展其它注册中心
## 2.1.3
- 优化文件上传校验
## 2.1.2
- 优化获取路由配置
## 2.1.1
- 修复springmvc获取路由问题
## 2.1.0
- 支持分布式限流redis实现
- 可调整JSR-303校验顺序
- 修复springmvc工程注册到nacos无法读取路由配置问题
## 2.0.0
- 全面使用nacos舍弃zookeeper1.x版本见1.x分支
- 可自定义文档模块显示顺序
## 1.15.2
- 优化SpringCloudGateway上传文件功能
- 优化SpringCloudGateway动态修改参数功能
## 1.15.1
- 修复未配置正确MessageConverter导致的异常
## 1.15.0
- 优化预发布、灰度
- 网关动态修改请求参数
- 支持swagger-bootstrap插件
- 优化admin服务列表显示
- 优化文档刷新逻辑
- 新增测试all in one
- 修复中文乱码问题
## 1.14.0
- 支持预发布、灰度发布环境
## 1.13.7
- 修复修复context-path识别问题
## 1.13.6
- 修复@RequestBody不能绑定问题
## 1.13.5
- 修复postJson下version获取不到问题
## 1.13.4
- 修复admin服务列表最后更新时间不显示问题
- 优化上传路由配置逻辑
- 微服务可获得access_token, notify_url参数
## 1.13.3
- 优化参数绑定
## 1.13.2
- 修复json方式请求获取不到参数问题
- 微服务端新增获取开放平台请求参数
## 1.13.1
- 支持json方式请求application/json
- 支持传统web服务开发见文档`传统web开发`
## 1.13.0
- 新增IP黑名单
## 1.12.4
- 优化属性文件配置
- 新增sleuth接入文档
- admin的isv列表新增备注字段
## 1.12.3
- 修复删除zk节点导致的BUG
## 1.12.2
- 沙盒支持文件上传
## 1.12.1
- 修复重启网关路由状态重置BUG
- 优化SpringCloudGateway
## 1.12.0
- admin后台新增角色管理
- 支持nacos作为注册中心
## 1.11.0
- 秘钥管理改造
- 服务端返回sign
- 新增SDK返回sign处理
- 新增沙箱环境
## 1.10.0
- 新增监控日志
## 1.9.0
- 改造限流
- 增强参数绑定
## 1.8.0
- 支持文件上传
## 1.7.2
- 修复微服务参数绑定BUG
- Admin新增vue界面
## 1.7.1
- 支持接口名版本号放在url后面
## 1.7.0
- 可自定义数据节点名称
## 1.6.0
- 新增应用授权
## 1.5.0
- admin新增signType字段
- 修复easyopen接入无法访问BUG
## 1.4.0
- 新增文档分组显示
- 支持easyopen文档注解
- BUG修复
## 1.3.0
- 新增接口限流功能 [doc](http://durcframework.gitee.io/sop/#/files/10092_%E6%8E%A5%E5%8F%A3%E9%99%90%E6%B5%81?t=1555378655699)
- 新增文档整合功能 [doc](http://durcframework.gitee.io/sop/#/files/10041_%E7%BC%96%E5%86%99%E6%96%87%E6%A1%A3?t=1555378655698)
- 新增springmvc项目接入demo
## 1.2.0
- SOP Admin新增用户登录
- 新增基础SDK(Java,C#) [doc](http://durcframework.gitee.io/sop/#/files/10095_SDK%E5%BC%80%E5%8F%91?t=1554693919597)
## 1.1.0
- 新增ISV管理 [doc](http://durcframework.gitee.io/sop/#/files/10085_ISV%E7%AE%A1%E7%90%86?t=1554123435621)
- 新增接口授权 [doc](http://durcframework.gitee.io/sop/#/files/10090_%E8%B7%AF%E7%94%B1%E6%8E%88%E6%9D%83?t=1554123435621)
## 1.0.0
- 第一次发布

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -98,7 +98,6 @@ public class OpenStoryImpl implements OpenStory {
@Override @Override
public StoryResponse upload2(StorySaveRequest storySaveDTO, FileData idCardFront, FileData idCardBack) { public StoryResponse upload2(StorySaveRequest storySaveDTO, FileData idCardFront, FileData idCardBack) {
List<String> list = new ArrayList<>();
System.out.println("upload:" + storySaveDTO); System.out.println("upload:" + storySaveDTO);
checkFile(Arrays.asList(idCardFront, idCardBack)); checkFile(Arrays.asList(idCardFront, idCardBack));

View File

@@ -7,5 +7,6 @@ import lombok.Data;
*/ */
@Data @Data
public class DemoFileUploadModel { public class DemoFileUploadModel {
private String remark; private String storyName;
private String addTime;
} }

View File

@@ -1,13 +1,13 @@
package com.gitee.sop.sdk.request; package com.gitee.sop.sdk.request;
import com.gitee.sop.sdk.response.DemoFileUploadResponse; import com.gitee.sop.sdk.response.GetStoryResponse;
/** /**
* @author 六如 * @author 六如
*/ */
public class DemoFileUploadRequest extends BaseRequest<DemoFileUploadResponse> { public class DemoFileUploadRequest extends BaseRequest<GetStoryResponse> {
@Override @Override
protected String method() { protected String method() {
return "file.upload"; return "story.upload.more";
} }
} }

View File

@@ -0,0 +1,23 @@
package com.gitee.sop.sdk.request;
import lombok.Data;
import java.math.BigDecimal;
/**
* pay.trade.wap.pay(手机网站支付接口)
*
* @author 六如
*/
@Data
public class PayTradeWapPayModel {
private String outTradeNo;
private BigDecimal totalAmount;
private String subject;
private String productCode;
}

View File

@@ -0,0 +1,30 @@
package com.gitee.sop.sdk.request;
import com.gitee.sop.sdk.response.PayTradeWapPayResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* pay.trade.wap.pay(手机网站支付接口)
*
* @author 六如
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PayTradeWapPayRequest extends BaseRequest<PayTradeWapPayResponse> {
private String outTradeNo;
private BigDecimal totalAmount;
private String subject;
private String productCode;
@Override
protected String method() {
return "pay.trade.wap.pay";
}
}

View File

@@ -0,0 +1,13 @@
package com.gitee.sop.sdk.response;
import lombok.Data;
/**
* @author 六如
*/
@Data
public class PayTradeWapPayResponse {
private String pageRedirectionData;
}

View File

@@ -8,14 +8,21 @@ import com.gitee.sop.sdk.model.DemoFileUploadModel;
import com.gitee.sop.sdk.model.GetStoryModel; import com.gitee.sop.sdk.model.GetStoryModel;
import com.gitee.sop.sdk.request.DemoFileUploadRequest; import com.gitee.sop.sdk.request.DemoFileUploadRequest;
import com.gitee.sop.sdk.request.GetStoryRequest; import com.gitee.sop.sdk.request.GetStoryRequest;
import com.gitee.sop.sdk.request.PayTradeWapPayModel;
import com.gitee.sop.sdk.request.PayTradeWapPayRequest;
import com.gitee.sop.sdk.response.DemoFileUploadResponse; import com.gitee.sop.sdk.response.DemoFileUploadResponse;
import com.gitee.sop.sdk.response.GetStoryResponse; import com.gitee.sop.sdk.response.GetStoryResponse;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.gitee.sop.sdk.response.PayTradeWapPayResponse;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.junit.Test; import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class SdkTest extends TestCase { public class SdkTest extends TestCase {
String url = "http://localhost:8081/api"; String url = "http://localhost:8081/api";
@@ -33,6 +40,25 @@ public class SdkTest extends TestCase {
// 声明一个就行 // 声明一个就行
OpenClient client = new OpenClient(url, appId, privateKeyIsv, publicKeyPlatform); OpenClient client = new OpenClient(url, appId, privateKeyIsv, publicKeyPlatform);
@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<PayTradeWapPayResponse> result = client.execute(request);
if (result.isSuccess()) {
PayTradeWapPayResponse response = result.getData();
System.out.println(response);
} else {
System.out.println(result);
}
}
@Test @Test
public void testGet() { public void testGet() {
// 创建请求对象 // 创建请求对象
@@ -62,23 +88,22 @@ public class SdkTest extends TestCase {
DemoFileUploadRequest request = new DemoFileUploadRequest(); DemoFileUploadRequest request = new DemoFileUploadRequest();
DemoFileUploadModel model = new DemoFileUploadModel(); DemoFileUploadModel model = new DemoFileUploadModel();
model.setRemark("上传文件参数"); model.setStoryName("上传文件参数");
model.setAddTime( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
request.setBizModel(model); request.setBizModel(model);
String root = System.getProperty("user.dir"); String root = System.getProperty("user.dir");
System.out.println(root); System.out.println(root);
// 这里演示将resources下的两个文件上传到服务器 // 这里演示将resources下的两个文件上传到服务器
request.addFile(new UploadFile("file1", new File(root + "/src/main/resources/file1.txt"))); request.addFile(new UploadFile("idCardFront", new File(root + "/src/main/resources/file1.txt")));
request.addFile(new UploadFile("file2", new File(root + "/src/main/resources/file2.txt"))); request.addFile(new UploadFile("idCardBack", new File(root + "/src/main/resources/file2.txt")));
Result<DemoFileUploadResponse> result = client.execute(request); Result<GetStoryResponse> result = client.execute(request);
System.out.println("--------------------"); System.out.println("--------------------");
if (result.isSuccess()) { if (result.isSuccess()) {
DemoFileUploadResponse response = result.getData(); GetStoryResponse response = result.getData();
List<DemoFileUploadResponse.FileMeta> responseFiles = response.getFiles(); System.out.println("您上传的文件信息:" + response);
System.out.println("您上传的文件信息:");
responseFiles.forEach(System.out::println);
} else { } else {
System.out.println(JSON.toJSONString(result)); System.out.println(JSON.toJSONString(result));
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 16 KiB