完美集成支付宝支付,并提供沙箱测试环境,更新sql文件

This commit is contained in:
郑杰
2018-09-30 16:18:06 +08:00
parent 53e38ec5b1
commit 03dda5165d
15 changed files with 901 additions and 20 deletions
+9
View File
@@ -158,12 +158,21 @@
<artifactId>hutool-all</artifactId>
<version>4.1.8</version>
</dependency>
<!--邮件依赖-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!--支付宝依赖-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>
<!--httpcomponents-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
+52 -9
View File
@@ -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
@@ -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<String, String[]> 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();
}
}
@@ -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{};
}
@@ -7,6 +7,8 @@ import java.io.Serializable;
/**
* 邮件配置类,数据存覆盖式存入数据存
* @author 郑杰
* @date 2018/09/29
*/
@Entity
@Data
@@ -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{};
}
@@ -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<AlipayConfig,Long> {
}
@@ -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);
}
@@ -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> alipayConfig = alipayRepo.findById(1L);
return alipayConfig.get();
}
@Override
public AlipayConfig updateConfig(AlipayConfig alipayConfig) {
alipayConfig.setId(1L);
alipayRepo.saveAndFlush(alipayConfig);
return alipayConfig;
}
}
@@ -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;
}
}
@@ -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<String,String> 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);
}
}
+52 -9
View File
@@ -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
@@ -25,7 +25,7 @@
table.render({
elem: '#myTable'
, url: '/online/getOnlineInfo'
, page: false
, page: true
, id: "ID"
, cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
, cols: [
@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>支付宝支付</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<link rel="stylesheet" th:href="@{'/plugins/css/layui.css'}">
<style>
.layui-form-label{float:left;display:block;padding:9px 15px;width:100px;font-weight:400;line-height:20px;text-align:right}
</style>
</head>
<body>
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<ul class="layui-tab-title">
<li class="layui-this">参数配置</li>
<li>支付测试</li>
<li>使用说明</li>
</ul>
<div class="layui-tab-content" style="height: 100px;">
<div class="layui-tab-item layui-show">
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;APPID</label>
<div class="layui-input-inline" style="width: 40%">
<input name="appID" th:value="${alipay.appID}" lay-verify="required" placeholder="APPID" autocomplete="off" class="layui-input" type="text">
</div>
<div class="layui-form-mid layui-word-aux">应用APPID,收款账号既是APPID对应支付宝账号</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;商家账号</label>
<div class="layui-input-inline" style="width: 40%">
<input name="sysServiceProviderId" th:value="${alipay.sysServiceProviderId}" lay-verify="required" placeholder="请输入商户账号" autocomplete="off" class="layui-input" type="text">
</div>
<div class="layui-form-mid layui-word-aux">商家账号</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;商户私钥</label>
<div class="layui-input-inline" style="width: 40%">
<input name="privateKey" th:value="${alipay.privateKey}" lay-verify="required" placeholder="请输入商户私钥" autocomplete="off" class="layui-input" type="password">
</div>
<div class="layui-form-mid layui-word-aux">商户私钥,你的PKCS8格式RSA2私钥</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;支付宝公钥</label>
<div class="layui-input-inline" style="width: 40%">
<input name="publicKey" th:value="${alipay.publicKey}" lay-verify="required" placeholder="请输入支付宝公钥" autocomplete="off" class="layui-input" type="password">
</div>
<div class="layui-form-mid layui-word-aux">支付宝公钥</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;回调地址</label>
<div class="layui-input-inline" style="width: 40%">
<input name="returnUrl" th:value="${alipay.returnUrl}" lay-verify="required" placeholder="请输入回调地址" autocomplete="off" class="layui-input" type="text">
</div>
<div class="layui-form-mid layui-word-aux">订单完成后返回的地址</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;异步通知</label>
<div class="layui-input-inline" style="width: 40%">
<input name="notifyUrl" th:value="${alipay.notifyUrl}" lay-verify="required" placeholder="请输入异步通知地址" autocomplete="off" class="layui-input" type="text">
</div>
<div class="layui-form-mid layui-word-aux">支付结果异步通知地址</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="layui-badge-dot"></span> &nbsp;网关地址</label>
<div class="layui-input-inline" style="width: 40%">
<input name="gatewayUrl" disabled th:value="${alipay.gatewayUrl}" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux">支付宝开放安全地址,一般不会变</div>
</div>
<div class="layui-form-item" style="margin-left:4%;">
<button class="layui-btn" lay-submit="required" lay-filter="saveConfig">保存配置</button>
</div>
</form>
</div>
<div class="layui-tab-item">
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">商品名称</label>
<div class="layui-input-inline" style="width: 460px">
<input name="subject" lay-verify="required" placeholder="请输入商品名称" autocomplete="off" class="layui-input" type="text">
</div>
<div class="layui-form-mid layui-word-aux">商品名称不能为空</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品价格</label>
<div class="layui-input-inline" style="width: 460px">
<input name="totalAmount" lay-verify="required|number" placeholder="请输入商品价格" autocomplete="off" class="layui-input" type="text">
</div>
<div class="layui-form-mid layui-word-aux">商品价格不能为空,测试允许区间(0,500]</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">商品描述</label>
<div class="layui-input-block">
<textarea name="body" style="height: 280px;width: 460px;" lay-verify="required" placeholder="请输入商品详情" class="layui-textarea">Aurora测试商品</textarea>
</div>
</div>
<div class="layui-form-item" style="margin-left:5%;margin-top:5px;">
<button class="layui-btn" lay-submit lay-filter="pay">立即支付</button>
</div>
</form>
</div>
<div class="layui-tab-item">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>使用说明</legend>
</fieldset>
<blockquote class="layui-elem-quote">
注意</blockquote>
<pre class="layui-code">
测试所用参数都是沙箱环境,仅供测试所用,申请地址:<a style="color: #00a0e9" href="https://openhome.alipay.com/platform/appDaily.htm?tab=info" target="_blank">支付宝开发平台</a>
如需付款测试,请使用
账号:uuxesw9745@sandbox.com
密码:111111
支付密码:111111
文明测试谢谢</pre>
<blockquote class="layui-elem-quote">支付设置</blockquote>
<pre class="layui-code">
本系统提供两个测试地址
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"
}</pre>
<blockquote class="layui-elem-quote">更多帮助</blockquote>
<pre class="layui-code">更多帮助请查看系统源码</pre>
</div>
</div>
</div>
<script>
layui.use(['form', 'layedit', 'element', 'layer'], function(){
var form = layui.form,
layer = layui.layer,
element = layui.element;
form.render();
//监听提交,发送请求
form.on('submit(saveConfig)', function(){
$.ajax({
url:"/aliPay/config",
contentType: "application/json",
type: "POST",
data:JSON.stringify({
appID:$("input[name='appID']").val(),
privateKey:$("input[name='privateKey']").val(),
publicKey:$("input[name='publicKey']").val(),
notifyUrl:$("input[name='notifyUrl']").val(),
returnUrl:$("input[name='returnUrl']").val(),
sysServiceProviderId:$("input[name='sysServiceProviderId']").val()
}),
success:function(result){
if (result.code == 200) {
layer.msg(result.msg, {icon: 6, time: 1500});
} else {
layer.alert(result.msg, {icon: 5});
}
}
});
return false;
});
//监听提交,发送请求
form.on('submit(pay)', function(){
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"
}
$.ajax({
url:url,
contentType: "application/json",
type: "POST",
data:JSON.stringify({
subject:$("input[name='subject']").val(),
body:$("textarea[name='body']").val(),
totalAmount:$("input[name='totalAmount']").val()
}),
success:function(result){
if (result.code == 200) {
openWin(result.msg);
} else {
layer.alert(result.msg, {icon: 5});
}
}
});
return false;
});
function openWin(url) {
$('body').append($('<a href="'+url+'" target="_blank" id="openWin"></a>'))
document.getElementById("openWin").click();//点击事件
$('#openWin').remove();
}
});
</script>
</body>
</html>
@@ -68,7 +68,7 @@
</div>
<div class="layui-form-item" style="margin-left:5%;">
<button class="layui-btn" lay-submit="required" lay-filter="saveConfig">保存</button>
<button class="layui-btn" lay-submit="required" lay-filter="saveConfig">保存配置</button>
</div>
</form>