From 03dda5165d0e12f1e8a37343e5f9dd57ca007bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=9D=B0?= Date: Sun, 30 Sep 2018 16:18:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E7=BE=8E=E9=9B=86=E6=88=90=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=EF=BC=8C=E5=B9=B6=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=B2=99=E7=AE=B1=E6=B5=8B=E8=AF=95=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0sql=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 9 + sql/aurora.sql | 61 ++++- .../app/rest/utils/AliPayController.java | 126 +++++++++++ .../me/aurora/domain/utils/AlipayConfig.java | 80 +++++++ .../me/aurora/domain/utils/EmailConfig.java | 2 + .../java/me/aurora/domain/vo/TradeVo.java | 66 ++++++ .../java/me/aurora/repository/AlipayRepo.java | 11 + .../java/me/aurora/service/AlipayService.java | 48 ++++ .../service/impl/AlipayServiceImpl.java | 123 ++++++++++ .../me/aurora/util/pay/AliPayStatusEnum.java | 41 ++++ .../java/me/aurora/util/pay/AlipayUtils.java | 79 +++++++ src/main/resources/sql/aurora.sql | 61 ++++- .../templates/system/online/index.html | 2 +- .../templates/utils/alipay/index.html | 210 ++++++++++++++++++ .../templates/utils/email/index.html | 2 +- 15 files changed, 901 insertions(+), 20 deletions(-) create mode 100644 src/main/java/me/aurora/app/rest/utils/AliPayController.java create mode 100644 src/main/java/me/aurora/domain/utils/AlipayConfig.java create mode 100644 src/main/java/me/aurora/domain/vo/TradeVo.java create mode 100644 src/main/java/me/aurora/repository/AlipayRepo.java create mode 100644 src/main/java/me/aurora/service/AlipayService.java create mode 100644 src/main/java/me/aurora/service/impl/AlipayServiceImpl.java create mode 100644 src/main/java/me/aurora/util/pay/AliPayStatusEnum.java create mode 100644 src/main/java/me/aurora/util/pay/AlipayUtils.java create mode 100644 src/main/resources/templates/utils/alipay/index.html diff --git a/pom.xml b/pom.xml index f9a9229..4701c7b 100644 --- a/pom.xml +++ b/pom.xml @@ -158,12 +158,21 @@ hutool-all 4.1.8 + javax.mail mail 1.4.7 + + + + com.alipay.sdk + alipay-sdk-java + 3.1.0 + + org.apache.httpcomponents diff --git a/sql/aurora.sql b/sql/aurora.sql index 7545b0e..c2ac24e 100644 --- a/sql/aurora.sql +++ b/sql/aurora.sql @@ -11,12 +11,36 @@ Target Server Version : 50559 File Encoding : 65001 - Date: 29/09/2018 09:22:29 + Date: 30/09/2018 16:17:12 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; +-- ---------------------------- +-- Table structure for zj_alipay_config +-- ---------------------------- +DROP TABLE IF EXISTS `zj_alipay_config`; +CREATE TABLE `zj_alipay_config` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `appID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `charset` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `format` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `gatewayUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `notifyUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `privateKey` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `publicKey` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `returnUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `signType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `sysServiceProviderId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of zj_alipay_config +-- ---------------------------- +INSERT INTO `zj_alipay_config` VALUES (1, '2016091700532697', 'utf-8', 'JSON', 'https://openapi.alipaydev.com/gateway.do', 'http://xiswl.xyz/aliPay/notify', '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', 'http://xiswl.xyz/aliPay/return', 'RSA2', '2088102176044281'); + -- ---------------------------- -- Table structure for zj_email_config -- ---------------------------- @@ -56,7 +80,7 @@ CREATE TABLE `zj_menu` ( `sys` bit(1) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_cbhg0bi3f1emxkhqqtvca9btx`(`soft`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_menu @@ -72,15 +96,16 @@ INSERT INTO `zj_menu` VALUES (8, 'layui-icon-tree', 7, 2, '菜单管理', 6, '/m INSERT INTO `zj_menu` VALUES (9, 'layui-icon-tree', 5, 2, '系统日志', 13, '/sysLog/index', '2018-08-29 11:40:17', '2018-09-27 12:56:27', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (10, 'layui-icon-tree', 7, 2, '权限管理', 4, '/permission/index', '2018-08-29 11:40:17', '2018-09-04 07:40:25', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (11, 'layui-icon-tree', 7, 2, '角色管理', 3, '/role/index', '2018-08-29 11:40:17', '2018-09-04 07:40:25', 0, b'0', b'1'); -INSERT INTO `zj_menu` VALUES (12, 'layui-icon-website', 0, 1, '网络资源', 30, '', '2018-09-20 11:35:56', '2018-09-20 11:40:53', 1, b'0', b'1'); +INSERT INTO `zj_menu` VALUES (12, 'layui-icon-website', 0, 1, '网络资源', 30, '', '2018-09-20 11:35:56', '2018-09-30 15:20:51', 1, b'0', b'1'); INSERT INTO `zj_menu` VALUES (13, 'layui-icon-tree', 12, 2, '图床管理', 31, '/picture/index', '2018-09-20 11:40:53', '2018-09-20 11:40:53', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (14, 'layui-icon-tree', 5, 2, '在线用户', 12, '/online/index', '2018-09-21 16:09:38', '2018-09-22 10:17:09', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (16, 'layui-icon-tree', 5, 2, 'Redis终端', 16, '/redis/terminal', '2018-09-22 11:18:21', '2018-09-27 13:25:09', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (17, 'layui-icon-tree', 7, 2, '接口文档', 7, '/swagger/index', '2018-09-23 09:16:17', '2018-09-23 10:01:06', 0, b'0', b'1'); -INSERT INTO `zj_menu` VALUES (18, 'layui-icon-util', 0, 1, '工具管理', 40, '', '2018-09-24 23:46:02', '2018-09-28 07:32:57', 2, b'0', b'1'); +INSERT INTO `zj_menu` VALUES (18, 'layui-icon-util', 0, 1, '工具管理', 40, '', '2018-09-24 23:46:02', '2018-09-30 15:16:43', 3, b'0', b'1'); INSERT INTO `zj_menu` VALUES (19, 'layui-icon-tree', 18, 2, '富文本编辑', 45, '/ueditor/index', '2018-09-24 23:46:47', '2018-09-24 23:46:47', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (21, 'layui-icon-tree', 5, 2, 'SQL监控', 15, '/druid/index.html', '2018-09-27 13:24:25', '2018-09-27 13:24:25', 0, b'1', b'1'); INSERT INTO `zj_menu` VALUES (22, 'layui-icon-edit', 18, 2, '邮件工具', 41, '/email/index', '2018-09-28 07:32:57', '2018-09-28 07:32:57', 0, b'0', b'1'); +INSERT INTO `zj_menu` VALUES (24, 'layui-icon-tree', 18, 2, '支付宝工具', 42, '/aliPay/index', '2018-09-30 15:16:43', '2018-09-30 15:16:43', 0, b'0', b'0'); -- ---------------------------- -- Table structure for zj_menus_roles @@ -118,6 +143,7 @@ INSERT INTO `zj_menus_roles` VALUES (18, 1); INSERT INTO `zj_menus_roles` VALUES (19, 1); INSERT INTO `zj_menus_roles` VALUES (21, 1); INSERT INTO `zj_menus_roles` VALUES (22, 1); +INSERT INTO `zj_menus_roles` VALUES (24, 1); INSERT INTO `zj_menus_roles` VALUES (5, 3); INSERT INTO `zj_menus_roles` VALUES (7, 3); INSERT INTO `zj_menus_roles` VALUES (9, 3); @@ -138,7 +164,7 @@ CREATE TABLE `zj_permission` ( `pid` int(11) NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_djtxn2vldlgrkfk21d155b48i`(`perms`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_permission @@ -209,7 +235,7 @@ CREATE TABLE `zj_picture` ( PRIMARY KEY (`id`) USING BTREE, INDEX `FK5qtt7wql9517j0e2read2pdus`(`user_id`) USING BTREE, CONSTRAINT `FK5qtt7wql9517j0e2read2pdus` FOREIGN KEY (`user_id`) REFERENCES `zj_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT -) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_picture @@ -227,7 +253,7 @@ CREATE TABLE `zj_role` ( `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `updateDateTime` datetime NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_role @@ -235,6 +261,23 @@ CREATE TABLE `zj_role` ( INSERT INTO `zj_role` VALUES (1, '2018-08-23 09:13:54', '超级管理员', '系统所有权', '2018-08-23 09:14:02'); INSERT INTO `zj_role` VALUES (3, '2018-09-03 15:17:31', '测试', NULL, '2018-09-20 17:28:03'); +-- ---------------------------- +-- Table structure for zj_syslog +-- ---------------------------- +DROP TABLE IF EXISTS `zj_syslog`; +CREATE TABLE `zj_syslog` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `createTime` datetime NULL DEFAULT NULL, + `ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `operation` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `params` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `time` int(11) NULL DEFAULT NULL, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 88 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + -- ---------------------------- -- Table structure for zj_user -- ---------------------------- @@ -250,12 +293,12 @@ CREATE TABLE `zj_user` ( `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_kpubos9gc2cvtkb0thktkbkes`(`email`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_user -- ---------------------------- -INSERT INTO `zj_user` VALUES (1, 'https://www.zhengjie.me/images/avatar.jpg', '2018-08-23 09:11:56', 'zhengjie@tom.com', 1, '2018-09-29 06:56:34', '65a674ce6632479005ea7a9071234cfb', 'aurora'); +INSERT INTO `zj_user` VALUES (1, 'https://www.zhengjie.me/images/avatar.jpg', '2018-08-23 09:11:56', 'zhengjie@tom.com', 1, '2018-09-30 15:30:16', '65a674ce6632479005ea7a9071234cfb', 'aurora'); -- ---------------------------- -- Table structure for zj_user_pictures diff --git a/src/main/java/me/aurora/app/rest/utils/AliPayController.java b/src/main/java/me/aurora/app/rest/utils/AliPayController.java new file mode 100644 index 0000000..9805373 --- /dev/null +++ b/src/main/java/me/aurora/app/rest/utils/AliPayController.java @@ -0,0 +1,126 @@ +package me.aurora.app.rest.utils; + +import io.swagger.annotations.ApiOperation; +import me.aurora.annotation.Log; +import me.aurora.domain.ResponseEntity; +import me.aurora.domain.utils.AlipayConfig; +import me.aurora.domain.vo.TradeVo; +import me.aurora.service.AlipayService; +import me.aurora.util.HttpContextUtils; +import me.aurora.util.pay.AliPayStatusEnum; +import me.aurora.util.pay.AlipayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * @author zhengjie + * @date 2018/07/27 13:41:41 + */ +@RestController +@RequestMapping("/aliPay") +public class AliPayController { + + @Autowired + AlipayUtils alipayUtils; + + @Autowired + private AlipayService alipayService; + + /** + * 跳转到页面 + * @return + */ + @GetMapping(value = "/index") + public ModelAndView emailIndex(){ + AlipayConfig alipay = alipayService.findById(1L); + HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); + request.setAttribute("alipay",alipay); + return new ModelAndView("/utils/alipay/index"); + } + + @Log("配置支付宝参数") + @PostMapping(value = "/config") + public ResponseEntity emailConfig(@Validated(AlipayConfig.New.class) @RequestBody AlipayConfig alipayConfig){ + alipayService.updateConfig(alipayConfig); + return ResponseEntity.ok(); + } + + @ApiOperation(value = "PC网页支付") + @PostMapping(value = "/toPayAsPC") + public ResponseEntity toPayAsPC(@Validated(TradeVo.New.class) @RequestBody TradeVo trade) throws Exception{ + AlipayConfig alipay = alipayService.findById(1L); + trade.setOutTradeNo(alipayUtils.getOrderCode()); + String payUrl = alipayService.toPayAsPC(alipay,trade); + return ResponseEntity.ok(payUrl); + } + + @ApiOperation(value = "手机网页支付") + @PostMapping(value = "/toPayAsWeb") + public ResponseEntity toPayAsWeb(@Validated(TradeVo.New.class) @RequestBody TradeVo trade) throws Exception{ + AlipayConfig alipay = alipayService.findById(1L); + trade.setOutTradeNo(alipayUtils.getOrderCode()); + String payUrl = alipayService.toPayAsWeb(alipay,trade); + return ResponseEntity.ok(payUrl); + } + + @ApiIgnore + @GetMapping("/return") + @ApiOperation(value = "支付之后跳转的链接") + public ResponseEntity returnPage(HttpServletRequest request, HttpServletResponse response) throws Exception { + AlipayConfig alipay = alipayService.findById(1L); + response.setContentType("text/html;charset=" + alipay.getCharset()); + //内容验签,防止黑客篡改参数 + if(alipayUtils.rsaCheck(request,alipay)){ + //商户订单号 + String outTradeNo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8"); + //支付宝交易号 + String tradeNo = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8"); + System.out.println("商户订单号"+outTradeNo+" "+"第三方交易号"+tradeNo); + + /** + * 根据业务需要返回数据,这里统一返回OK + */ + return ResponseEntity.ok(); + }else{ + /** + * 根据业务需要返回数据 + */ + return ResponseEntity.ok(); + } + } + + @ApiIgnore + @RequestMapping("/notify") + @ApiOperation(value = "支付异步通知(要公网访问),接收异步通知,检查通知内容app_id、out_trade_no、total_amount是否与请求中的一致,根据trade_status进行后续业务处理") + public ResponseEntity notify(HttpServletRequest request) throws Exception{ + AlipayConfig alipay = alipayService.findById(1L); + Map parameterMap = request.getParameterMap(); + StringBuilder notifyBuild = new StringBuilder("/****************************** pay notify ******************************/\n"); + parameterMap.forEach((key, value) -> notifyBuild.append(key + "=" + value[0] + "\n") ); + //内容验签,防止黑客篡改参数 + if (alipayUtils.rsaCheck(request,alipay)) { + //交易状态 + String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8"); + // 商户订单号 + String outTradeNo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8"); + //支付宝交易号 + String tradeNo = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8"); + //付款金额 + String totalAmount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8"); + //验证 + if(tradeStatus.equals(AliPayStatusEnum.SUCCESS.getValue())||tradeStatus.equals(AliPayStatusEnum.FINISHED.getValue())){ + /** + * 验证通过后应该根据业务需要处理订单 + */ + } + return ResponseEntity.ok(); + } + return ResponseEntity.error(); + } +} diff --git a/src/main/java/me/aurora/domain/utils/AlipayConfig.java b/src/main/java/me/aurora/domain/utils/AlipayConfig.java new file mode 100644 index 0000000..c444832 --- /dev/null +++ b/src/main/java/me/aurora/domain/utils/AlipayConfig.java @@ -0,0 +1,80 @@ +package me.aurora.domain.utils; + +import lombok.Data; +import javax.persistence.*; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 支付宝配置类 + * @author zhengjie + * @date 2018/09/30 13:54:57 + */ +@Data +@Entity +@Table(name = "zj_alipay_config") +public class AlipayConfig implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 应用ID,APPID,收款账号既是APPID对应支付宝账号 + */ + @NotBlank(groups = {AlipayConfig.New.class}) + private String appID; + + /** + * 商户私钥,您的PKCS8格式RSA2私钥 + */ + @NotBlank(groups = {AlipayConfig.New.class}) + private String privateKey; + + /** + * 支付宝公钥 + */ + @NotBlank(groups = {AlipayConfig.New.class}) + private String publicKey; + + /** + * 签名方式,固定格式 + */ + private String signType="RSA2"; + + /** + * 支付宝开放安全地址,一般不会变 + */ + private String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; + + /** + * 编码,固定格式 + */ + private String charset= "utf-8"; + + /** + * 异步通知地址 + */ + @NotBlank(groups = {AlipayConfig.New.class}) + private String notifyUrl; + + /** + * 订单完成后返回的页面 + */ + @NotBlank(groups = {AlipayConfig.New.class}) + private String returnUrl; + + /** + * 类型,固定格式 + */ + private String format="JSON"; + + /** + * 商户号 + */ + @NotBlank(groups = {AlipayConfig.New.class}) + private String sysServiceProviderId; + + public interface New{}; + +} diff --git a/src/main/java/me/aurora/domain/utils/EmailConfig.java b/src/main/java/me/aurora/domain/utils/EmailConfig.java index 2603d23..8e4afa0 100644 --- a/src/main/java/me/aurora/domain/utils/EmailConfig.java +++ b/src/main/java/me/aurora/domain/utils/EmailConfig.java @@ -7,6 +7,8 @@ import java.io.Serializable; /** * 邮件配置类,数据存覆盖式存入数据存 + * @author 郑杰 + * @date 2018/09/29 */ @Entity @Data diff --git a/src/main/java/me/aurora/domain/vo/TradeVo.java b/src/main/java/me/aurora/domain/vo/TradeVo.java new file mode 100644 index 0000000..a0b9c6b --- /dev/null +++ b/src/main/java/me/aurora/domain/vo/TradeVo.java @@ -0,0 +1,66 @@ +package me.aurora.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import javax.validation.constraints.NotBlank; +import java.sql.Date; +import java.sql.Timestamp; + +/** + * 交易详情,实际应用应该存入数据库,这里就不记录到数据库了,仅供临时测试 + * @author zhengjie + * @date 2018/09/30 13:58:32 + */ +@Data +public class TradeVo { + + /** + * (必填)商品描述 + */ + @NotBlank(groups = {TradeVo.New.class}) + private String body; + + /** + * (必填)商品名称 + */ + @NotBlank(groups = {TradeVo.New.class}) + private String subject; + + /** + * (必填)商户订单号,应该由后台生成 + */ + @ApiModelProperty(hidden = true) + private String outTradeNo; + + /** + * (必填)第三方订单号,微信,支付宝 + */ + @ApiModelProperty(hidden = true) + private String tradeNo; + + /** + * (必填)价格 + */ + @NotBlank(groups = {TradeVo.New.class}) + private String totalAmount; + + /** + * 订单状态,已支付,未支付,作废 + */ + @ApiModelProperty(hidden = true) + private String state; + + /** + * 创建时间,存入数据库时需要 + */ + @ApiModelProperty(hidden = true) + private Timestamp createTime; + + /** + * 作废时间,存入数据库时需要 + */ + @ApiModelProperty(hidden = true) + private Date cancelTime; + + public interface New{}; +} diff --git a/src/main/java/me/aurora/repository/AlipayRepo.java b/src/main/java/me/aurora/repository/AlipayRepo.java new file mode 100644 index 0000000..4682a7c --- /dev/null +++ b/src/main/java/me/aurora/repository/AlipayRepo.java @@ -0,0 +1,11 @@ +package me.aurora.repository; + +import me.aurora.domain.utils.AlipayConfig; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * @author 郑杰 + * @date 2018/09/30 14:17:19 + */ +public interface AlipayRepo extends JpaRepository { +} diff --git a/src/main/java/me/aurora/service/AlipayService.java b/src/main/java/me/aurora/service/AlipayService.java new file mode 100644 index 0000000..d6a2756 --- /dev/null +++ b/src/main/java/me/aurora/service/AlipayService.java @@ -0,0 +1,48 @@ +package me.aurora.service; + +import me.aurora.domain.utils.AlipayConfig; +import me.aurora.domain.vo.TradeVo; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; + +/** + * @author zhengjie + * @date 2018/09/30 14:12:41 + */ +@CacheConfig(cacheNames = "alipay") +public interface AlipayService { + + /** + * 处理来自PC的交易请求 + * @param alipay + * @param trade + * @return + * @throws Exception + */ + String toPayAsPC(AlipayConfig alipay, TradeVo trade) throws Exception; + + /** + * 处理来自手机网页的交易请求 + * @param alipay + * @param trade + * @return + * @throws Exception + */ + String toPayAsWeb(AlipayConfig alipay, TradeVo trade) throws Exception; + + /** + * 查询配置 + * @param id + * @return + */ + @Cacheable(key = "#p0") + AlipayConfig findById(long id); + + /** + * 配置 + * @param alipayConfig + */ + @CachePut(key = "#p0.getId()") + AlipayConfig updateConfig(AlipayConfig alipayConfig); +} diff --git a/src/main/java/me/aurora/service/impl/AlipayServiceImpl.java b/src/main/java/me/aurora/service/impl/AlipayServiceImpl.java new file mode 100644 index 0000000..87af3ca --- /dev/null +++ b/src/main/java/me/aurora/service/impl/AlipayServiceImpl.java @@ -0,0 +1,123 @@ +package me.aurora.service.impl; + +import cn.hutool.http.HttpStatus; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradePagePayRequest; +import com.alipay.api.request.AlipayTradeWapPayRequest; +import me.aurora.config.exception.AuroraException; +import me.aurora.domain.utils.AlipayConfig; +import me.aurora.domain.vo.TradeVo; +import me.aurora.repository.AlipayRepo; +import me.aurora.service.AlipayService; +import me.aurora.util.pay.AlipayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +/** + * @author zhengjie + * @date 2018/09/30 14:12:35 + */ +@Service +public class AlipayServiceImpl implements AlipayService { + + @Autowired + AlipayUtils alipayUtils; + + @Autowired + private AlipayRepo alipayRepo; + + @Override + public String toPayAsPC(AlipayConfig alipay, TradeVo trade) throws Exception { + AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppID(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType()); + + double money = Double.parseDouble(trade.getTotalAmount()); + if(money <= 0 || money>=500){ + throw new AuroraException(HttpStatus.HTTP_BAD_REQUEST,"测试金额过大"); + } + + /** + * 创建API对应的request(电脑网页版) + */ + AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); + + /** + * 订单完成后返回的页面和异步通知地址 + */ + request.setReturnUrl(alipay.getReturnUrl()); + request.setNotifyUrl(alipay.getNotifyUrl()); + /** + * 填充订单参数 + */ + request.setBizContent("{" + + " \"out_trade_no\":\""+trade.getOutTradeNo()+"\"," + + " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + + " \"total_amount\":"+trade.getTotalAmount()+"," + + " \"subject\":\""+trade.getSubject()+"\"," + + " \"body\":\""+trade.getBody()+"\"," + + " \"extend_params\":{" + + " \"sys_service_provider_id\":\""+alipay.getSysServiceProviderId()+"\"" + + " }"+ + " }");//填充业务参数 + /** + * 调用SDK生成表单 + * 通过GET方式,口可以获取url + */ + return alipayClient.pageExecute(request, "GET").getBody(); + + } + + @Override + public String toPayAsWeb(AlipayConfig alipay, TradeVo trade) throws Exception { + AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppID(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType()); + + double money = Double.parseDouble(trade.getTotalAmount()); + if(money <= 0 || money>=500){ + throw new AuroraException(HttpStatus.HTTP_BAD_REQUEST,"测试金额过大"); + } + + /** + * 创建API对应的request(手机网页版) + */ + AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); + + /** + * 订单完成后返回的页面和异步通知地址 + */ + request.setReturnUrl(alipay.getReturnUrl()); + request.setNotifyUrl(alipay.getNotifyUrl()); + /** + * 填充订单参数 + */ + request.setBizContent("{" + + " \"out_trade_no\":\""+trade.getOutTradeNo()+"\"," + + " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + + " \"total_amount\":"+trade.getTotalAmount()+"," + + " \"subject\":\""+trade.getSubject()+"\"," + + " \"body\":\""+trade.getBody()+"\"," + + " \"extend_params\":{" + + " \"sys_service_provider_id\":\""+alipay.getSysServiceProviderId()+"\"" + + " }"+ + " }");//填充业务参数 + /** + * 调用SDK生成表单 + * 通过GET方式,口可以获取url + */ + return alipayClient.pageExecute(request, "GET").getBody(); + } + + @Override + public AlipayConfig findById(long id) { + Optional alipayConfig = alipayRepo.findById(1L); + return alipayConfig.get(); + } + + @Override + public AlipayConfig updateConfig(AlipayConfig alipayConfig) { + alipayConfig.setId(1L); + alipayRepo.saveAndFlush(alipayConfig); + return alipayConfig; + } +} diff --git a/src/main/java/me/aurora/util/pay/AliPayStatusEnum.java b/src/main/java/me/aurora/util/pay/AliPayStatusEnum.java new file mode 100644 index 0000000..af1f383 --- /dev/null +++ b/src/main/java/me/aurora/util/pay/AliPayStatusEnum.java @@ -0,0 +1,41 @@ +package me.aurora.util.pay; + +/** + * 支付状态 + * @author zhengjie + * @date 2018/08/01 16:45:43 + */ +public enum AliPayStatusEnum { + + /** + * 交易成功 + */ + FINISHED("交易成功", "TRADE_FINISHED"), + + /** + * 支付成功 + */ + SUCCESS("支付成功", "TRADE_SUCCESS"), + + /** + * 交易创建 + */ + BUYER_PAY("交易创建", "WAIT_BUYER_PAY"), + + /** + * 交易关闭 + */ + CLOSED("交易关闭", "TRADE_CLOSED"); + + private String name; + private String value; + + AliPayStatusEnum(String name, String value) { + this.name = name; + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/me/aurora/util/pay/AlipayUtils.java b/src/main/java/me/aurora/util/pay/AlipayUtils.java new file mode 100644 index 0000000..d6ba2ee --- /dev/null +++ b/src/main/java/me/aurora/util/pay/AlipayUtils.java @@ -0,0 +1,79 @@ +package me.aurora.util.pay; + +import cn.hutool.core.util.StrUtil; +import com.alipay.api.AlipayApiException; +import com.alipay.api.internal.util.AlipaySignature; +import me.aurora.domain.utils.AlipayConfig; +import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * 支付宝工具类 + * @author zhengjie + * @date 2018/09/30 14:04:35 + */ +@Component +public class AlipayUtils { + + /** + * 生成订单号 + * @return + */ + public String getOrderCode() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + int a = (int)(Math.random() * 9000.0D) + 1000; + System.out.println(a); + Date date = new Date(); + String str = sdf.format(date); + String[] split = str.split("-"); + String s = split[0] + split[1] + split[2]; + String[] split1 = s.split(" "); + String s1 = split1[0] + split1[1]; + String[] split2 = s1.split(":"); + String s2 = split2[0] + split2[1] + split2[2] + a; + return s2; + } + + /** + * 校验签名 + * @param request + * @return + */ + public boolean rsaCheck(HttpServletRequest request, AlipayConfig alipay){ + + /** + * 获取支付宝POST过来反馈信息 + */ + Map params = new HashMap<>(1); + Map requestParams = request.getParameterMap(); + for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { + String name = (String) iter.next(); + String[] values = (String[]) requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + params.put(name, valueStr); + } + + try { + boolean verifyResult = AlipaySignature.rsaCheckV1(params, + alipay.getPublicKey(), + alipay.getCharset(), + alipay.getSignType()); + return verifyResult; + } catch (AlipayApiException e) { + return false; + } + } + + public boolean isEmpty(String str){ + return StrUtil.isEmpty(str); + } +} diff --git a/src/main/resources/sql/aurora.sql b/src/main/resources/sql/aurora.sql index 7545b0e..c2ac24e 100644 --- a/src/main/resources/sql/aurora.sql +++ b/src/main/resources/sql/aurora.sql @@ -11,12 +11,36 @@ Target Server Version : 50559 File Encoding : 65001 - Date: 29/09/2018 09:22:29 + Date: 30/09/2018 16:17:12 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; +-- ---------------------------- +-- Table structure for zj_alipay_config +-- ---------------------------- +DROP TABLE IF EXISTS `zj_alipay_config`; +CREATE TABLE `zj_alipay_config` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `appID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `charset` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `format` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `gatewayUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `notifyUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `privateKey` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `publicKey` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `returnUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `signType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `sysServiceProviderId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of zj_alipay_config +-- ---------------------------- +INSERT INTO `zj_alipay_config` VALUES (1, '2016091700532697', 'utf-8', 'JSON', 'https://openapi.alipaydev.com/gateway.do', 'http://xiswl.xyz/aliPay/notify', 'MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5js8sInU10AJ0cAQ8UMMyXrQ+oHZEkVt5lBwsStmTJ7YikVYgbskx1YYEXTojRsWCb+SH/kDmDU4pK/u91SJ4KFCRMF2411piYuXU/jF96zKrADznYh/zAraqT6hvAIVtQAlMHN53nx16rLzZ/8jDEkaSwT7+HvHiS+7sxSojnu/3oV7BtgISoUNstmSe8WpWHOaWv19xyS+Mce9MY4BfseFhzTICUymUQdd/8hXA28/H6osUfAgsnxAKv7Wil3aJSgaJczWuflYOve0dJ3InZkhw5Cvr0atwpk8YKBQjy5CdkoHqvkOcIB+cYHXJKzOE5tqU7inSwVbHzOLQ3XbnAgMBAAECggEAVJp5eT0Ixg1eYSqFs9568WdetUNCSUchNxDBu6wxAbhUgfRUGZuJnnAll63OCTGGck+EGkFh48JjRcBpGoeoHLL88QXlZZbC/iLrea6gcDIhuvfzzOffe1RcZtDFEj9hlotg8dQj1tS0gy9pN9g4+EBH7zeu+fyv+qb2e/v1l6FkISXUjpkD7RLQr3ykjiiEw9BpeKb7j5s7Kdx1NNIzhkcQKNqlk8JrTGDNInbDM6inZfwwIO2R1DHinwdfKWkvOTODTYa2MoAvVMFT9Bec9FbLpoWp7ogv1JMV9svgrcF9XLzANZ/OQvkbe9TV9GWYvIbxN6qwQioKCWO4GPnCAQKBgQDgW5MgfhX8yjXqoaUy/d1VjI8dHeIyw8d+OBAYwaxRSlCfyQ+tieWcR2HdTzPca0T0GkWcKZm0ei5xRURgxt4DUDLXNh26HG0qObbtLJdu/AuBUuCqgOiLqJ2f1uIbrz6OZUHns+bT/jGW2Ws8+C13zTCZkZt9CaQsrp3QOGDx5wKBgQDTul39hp3ZPwGNFeZdkGoUoViOSd5Lhowd5wYMGAEXWRLlU8z+smT5v0POz9JnIbCRchIY2FAPKRdVTICzmPk2EPJFxYTcwaNbVqL6lN7J2IlXXMiit5QbiLauo55w7plwV6LQmKm9KV7JsZs5XwqF7CEovI7GevFzyD3w+uizAQKBgC3LY1eRhOlpWOIAhpjG6qOoohmeXOphvdmMlfSHq6WYFqbWwmV4rS5d/6LNpNdL6fItXqIGd8I34jzql49taCmi+A2nlR/E559j0mvM20gjGDIYeZUz5MOE8k+K6/IcrhcgofgqZ2ZED1ksHdB/E8DNWCswZl16V1FrfvjeWSNnAoGAMrBplCrIW5xz+J0Hm9rZKrs+AkK5D4fUv8vxbK/KgxZ2KaUYbNm0xv39c+PZUYuFRCz1HDGdaSPDTE6WeWjkMQd5mS6ikl9hhpqFRkyh0d0fdGToO9yLftQKOGE/q3XUEktI1XvXF0xyPwNgUCnq0QkpHyGVZPtGFxwXiDvpvgECgYA5PoB+nY8iDiRaJNko9w0hL4AeKogwf+4TbCw+KWVEn6jhuJa4LFTdSqp89PktQaoVpwv92el/AhYjWOl/jVCm122f9b7GyoelbjMNolToDwe5pF5RnSpEuDdLy9MfE8LnE3PlbE7E5BipQ3UjSebkgNboLHH/lNZA5qvEtvbfvQ==', 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAut9evKRuHJ/2QNfDlLwvN/S8l9hRAgPbb0u61bm4AtzaTGsLeMtScetxTWJnVvAVpMS9luhEJjt+Sbk5TNLArsgzzwARgaTKOLMT1TvWAK5EbHyI+eSrc3s7Awe1VYGwcubRFWDm16eQLv0k7iqiw+4mweHSz/wWyvBJVgwLoQ02btVtAQErCfSJCOmt0Q/oJQjj08YNRV4EKzB19+f5A+HQVAKy72dSybTzAK+3FPtTtNen/+b5wGeat7c32dhYHnGorPkPeXLtsqqUTp1su5fMfd4lElNdZaoCI7osZxWWUo17vBCZnyeXc9fk0qwD9mK6yRAxNbrY72Xx5VqIqwIDAQAB', 'http://xiswl.xyz/aliPay/return', 'RSA2', '2088102176044281'); + -- ---------------------------- -- Table structure for zj_email_config -- ---------------------------- @@ -56,7 +80,7 @@ CREATE TABLE `zj_menu` ( `sys` bit(1) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_cbhg0bi3f1emxkhqqtvca9btx`(`soft`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_menu @@ -72,15 +96,16 @@ INSERT INTO `zj_menu` VALUES (8, 'layui-icon-tree', 7, 2, '菜单管理', 6, '/m INSERT INTO `zj_menu` VALUES (9, 'layui-icon-tree', 5, 2, '系统日志', 13, '/sysLog/index', '2018-08-29 11:40:17', '2018-09-27 12:56:27', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (10, 'layui-icon-tree', 7, 2, '权限管理', 4, '/permission/index', '2018-08-29 11:40:17', '2018-09-04 07:40:25', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (11, 'layui-icon-tree', 7, 2, '角色管理', 3, '/role/index', '2018-08-29 11:40:17', '2018-09-04 07:40:25', 0, b'0', b'1'); -INSERT INTO `zj_menu` VALUES (12, 'layui-icon-website', 0, 1, '网络资源', 30, '', '2018-09-20 11:35:56', '2018-09-20 11:40:53', 1, b'0', b'1'); +INSERT INTO `zj_menu` VALUES (12, 'layui-icon-website', 0, 1, '网络资源', 30, '', '2018-09-20 11:35:56', '2018-09-30 15:20:51', 1, b'0', b'1'); INSERT INTO `zj_menu` VALUES (13, 'layui-icon-tree', 12, 2, '图床管理', 31, '/picture/index', '2018-09-20 11:40:53', '2018-09-20 11:40:53', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (14, 'layui-icon-tree', 5, 2, '在线用户', 12, '/online/index', '2018-09-21 16:09:38', '2018-09-22 10:17:09', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (16, 'layui-icon-tree', 5, 2, 'Redis终端', 16, '/redis/terminal', '2018-09-22 11:18:21', '2018-09-27 13:25:09', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (17, 'layui-icon-tree', 7, 2, '接口文档', 7, '/swagger/index', '2018-09-23 09:16:17', '2018-09-23 10:01:06', 0, b'0', b'1'); -INSERT INTO `zj_menu` VALUES (18, 'layui-icon-util', 0, 1, '工具管理', 40, '', '2018-09-24 23:46:02', '2018-09-28 07:32:57', 2, b'0', b'1'); +INSERT INTO `zj_menu` VALUES (18, 'layui-icon-util', 0, 1, '工具管理', 40, '', '2018-09-24 23:46:02', '2018-09-30 15:16:43', 3, b'0', b'1'); INSERT INTO `zj_menu` VALUES (19, 'layui-icon-tree', 18, 2, '富文本编辑', 45, '/ueditor/index', '2018-09-24 23:46:47', '2018-09-24 23:46:47', 0, b'0', b'1'); INSERT INTO `zj_menu` VALUES (21, 'layui-icon-tree', 5, 2, 'SQL监控', 15, '/druid/index.html', '2018-09-27 13:24:25', '2018-09-27 13:24:25', 0, b'1', b'1'); INSERT INTO `zj_menu` VALUES (22, 'layui-icon-edit', 18, 2, '邮件工具', 41, '/email/index', '2018-09-28 07:32:57', '2018-09-28 07:32:57', 0, b'0', b'1'); +INSERT INTO `zj_menu` VALUES (24, 'layui-icon-tree', 18, 2, '支付宝工具', 42, '/aliPay/index', '2018-09-30 15:16:43', '2018-09-30 15:16:43', 0, b'0', b'0'); -- ---------------------------- -- Table structure for zj_menus_roles @@ -118,6 +143,7 @@ INSERT INTO `zj_menus_roles` VALUES (18, 1); INSERT INTO `zj_menus_roles` VALUES (19, 1); INSERT INTO `zj_menus_roles` VALUES (21, 1); INSERT INTO `zj_menus_roles` VALUES (22, 1); +INSERT INTO `zj_menus_roles` VALUES (24, 1); INSERT INTO `zj_menus_roles` VALUES (5, 3); INSERT INTO `zj_menus_roles` VALUES (7, 3); INSERT INTO `zj_menus_roles` VALUES (9, 3); @@ -138,7 +164,7 @@ CREATE TABLE `zj_permission` ( `pid` int(11) NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_djtxn2vldlgrkfk21d155b48i`(`perms`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_permission @@ -209,7 +235,7 @@ CREATE TABLE `zj_picture` ( PRIMARY KEY (`id`) USING BTREE, INDEX `FK5qtt7wql9517j0e2read2pdus`(`user_id`) USING BTREE, CONSTRAINT `FK5qtt7wql9517j0e2read2pdus` FOREIGN KEY (`user_id`) REFERENCES `zj_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT -) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_picture @@ -227,7 +253,7 @@ CREATE TABLE `zj_role` ( `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `updateDateTime` datetime NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_role @@ -235,6 +261,23 @@ CREATE TABLE `zj_role` ( INSERT INTO `zj_role` VALUES (1, '2018-08-23 09:13:54', '超级管理员', '系统所有权', '2018-08-23 09:14:02'); INSERT INTO `zj_role` VALUES (3, '2018-09-03 15:17:31', '测试', NULL, '2018-09-20 17:28:03'); +-- ---------------------------- +-- Table structure for zj_syslog +-- ---------------------------- +DROP TABLE IF EXISTS `zj_syslog`; +CREATE TABLE `zj_syslog` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `createTime` datetime NULL DEFAULT NULL, + `ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `operation` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `params` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `time` int(11) NULL DEFAULT NULL, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 88 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + -- ---------------------------- -- Table structure for zj_user -- ---------------------------- @@ -250,12 +293,12 @@ CREATE TABLE `zj_user` ( `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_kpubos9gc2cvtkb0thktkbkes`(`email`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of zj_user -- ---------------------------- -INSERT INTO `zj_user` VALUES (1, 'https://www.zhengjie.me/images/avatar.jpg', '2018-08-23 09:11:56', 'zhengjie@tom.com', 1, '2018-09-29 06:56:34', '65a674ce6632479005ea7a9071234cfb', 'aurora'); +INSERT INTO `zj_user` VALUES (1, 'https://www.zhengjie.me/images/avatar.jpg', '2018-08-23 09:11:56', 'zhengjie@tom.com', 1, '2018-09-30 15:30:16', '65a674ce6632479005ea7a9071234cfb', 'aurora'); -- ---------------------------- -- Table structure for zj_user_pictures diff --git a/src/main/resources/templates/system/online/index.html b/src/main/resources/templates/system/online/index.html index 09ee37b..b6e2bf3 100644 --- a/src/main/resources/templates/system/online/index.html +++ b/src/main/resources/templates/system/online/index.html @@ -25,7 +25,7 @@ table.render({ elem: '#myTable' , url: '/online/getOnlineInfo' - , page: false + , page: true , id: "ID" , cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增 , cols: [ diff --git a/src/main/resources/templates/utils/alipay/index.html b/src/main/resources/templates/utils/alipay/index.html new file mode 100644 index 0000000..19a0516 --- /dev/null +++ b/src/main/resources/templates/utils/alipay/index.html @@ -0,0 +1,210 @@ + + + + 支付宝支付 + + + + + +
+
    +
  • 参数配置
  • +
  • 支付测试
  • +
  • 使用说明
  • +
+
+
+
+
+ +
+ +
+
应用APPID,收款账号既是APPID对应支付宝账号
+
+
+ +
+ +
+
商家账号
+
+
+ +
+ +
+
商户私钥,你的PKCS8格式RSA2私钥
+
+
+ +
+ +
+
支付宝公钥
+
+ +
+ +
+ +
+
订单完成后返回的地址
+
+ +
+ +
+ +
+
支付结果异步通知地址
+
+ +
+ +
+ +
+
支付宝开放安全地址,一般不会变
+
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
商品名称不能为空
+
+
+ +
+ +
+
商品价格不能为空,测试允许区间(0,500]
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+
+ 使用说明 +
+
+ 注意
+
+测试所用参数都是沙箱环境,仅供测试所用,申请地址:支付宝开发平台
+如需付款测试,请使用
+账号:uuxesw9745@sandbox.com
+密码:111111
+支付密码:111111
+文明测试谢谢
+
支付设置
+
+本系统提供两个测试地址
+PC端与手机端,并且使用如下代码识别
+if (/(Android)/i.test(navigator.userAgent)){     // 判断是否为Android手机
+    url = "/aliPay/toPayAsWeb"
+}else if(/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)){  // 判断是否为苹果手机
+    url = "/aliPay/toPayAsWeb"
+} else {
+    url = "/aliPay/toPayAsPC"
+}
+
更多帮助
+
更多帮助请查看系统源码
+
+
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/utils/email/index.html b/src/main/resources/templates/utils/email/index.html index 2fa7f79..008213f 100644 --- a/src/main/resources/templates/utils/email/index.html +++ b/src/main/resources/templates/utils/email/index.html @@ -68,7 +68,7 @@
- +