####借鉴git上的大佬的准备工作说明,以及官方api说明。
准备工作:
1.配置AlipayConfig
(1).注册蚂蚁金服开发者账号(免费,不像苹果会收取费用)
注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研)。
(2).设置app_id和gatewayUrl
其中密钥需要自己生成,appID和支付宝网关是已经给好的,网关有dev字样,表明是用于开发测试。
(3).设置密钥
点击“生成方法”,打开界面如下:
下周密钥生成工具,解压打开后,选择2048位生成密钥:
如果没有设置过,此时显示文本是“设置应用公钥”,我这里是已经设置过得。
设置方法,“打开密钥文件路径”:
复制应用公钥2048.txt中的内容到点击“设置应用公钥”的弹出框中,保存:
- 商户私钥(merchant_private_key) 复制 应用私钥2048.txt 中的内容到merchant_private_key中。 - 支付宝公钥(alipay_public_key)
点击如上图链接,复制弹出框里面的内容到alipay_public_key。 如果这个设置不对,结果是:支付成功,但是验签失败。 如果是正式环境,需要上传到对应的应用中:
(4).服务器异步通知页面路径(notify_url) 如果没有改名,修改IP和端口号就可以了,我自己的如下:
(5).页面跳转同步通知页面路径(return_url)
http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp
4.测试运行
测试用的支付宝买家账户可以在“沙箱账号”这个页面可以找到:
支付成功后,验签结果:
问题解决 由于我们使用的是沙箱测试环境,测试环境和正式上线的环境的网关是不一样的,如果配置错误,会出现,appid错误的问题。配置如下
项目结构:
只有一个Java配置类,其余都是JSP
Pay-Manager
Pom.xml
<!-- 只定义依赖的版本,不会实际依赖 -->
<dependencies>
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.5</version>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.4</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.3</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- 连接池 阿里巴巴数据源 全世界最牛逼的data source 没有之一 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency>
<!-- fastDFS -->
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-RELEASE</version>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- use hibernate-validator to validate entity before enter controller -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<!-- spring rabbitmq -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>
<!-- http://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>mockwebserver</artifactId>
<version>1.5.4</version>
<scope>test</scope>
</dependency>
<!-- shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.3.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<!-- excel reporter -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<!-- alipay sdk -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xmlpull/xmlpull -->
<dependency>
<groupId>xmlpull</groupId>
<artifactId>xmlpull</artifactId>
<version>1.1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xpp3/xpp3 -->
<dependency>
<groupId>xpp3</groupId>
<artifactId>xpp3</artifactId>
<version>1.1.4c</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
Pay-Common
Pojo:
逆向工程生成的,我后面会上数据表,跑一下逆向工程就可以出来的
Mapper:
这些逆向工程出来的太多了,你懂的,所以我后面会上数据表,跑一下逆向工程就可以出来的。
Service:
OrdersServiceImpl:
package com.zsl.service.impl;
import java.util.Date;
import org.n3r.idworker.Sid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zsl.mapper.FlowMapper;
import com.zsl.mapper.OrdersMapper;
import com.zsl.pojo.Flow;
import com.zsl.pojo.Orders;
import com.zsl.service.OrdersService;
import com.zsl.utils.OrderStatusEnum;
@Service
public class OrdersServiceImpl implements OrdersService {
@Autowired
private OrdersMapper ordersMapper;
@Autowired
private FlowMapper flowMapper;
@Autowired
private Sid sid;
@Override
public void saveOrder(Orders order) {
ordersMapper.insert(order);
}
@Override
public Orders getOrderById(String orderId) {
return ordersMapper.selectByPrimaryKey(orderId);
}
@Override
public void updateOrderStatus(String orderId, String alpayFlowNum, String paidAmount) {
Orders order = getOrderById(orderId);
if (order.getOrderStatus().equals(OrderStatusEnum.WAIT_PAY.key)) {
order = new Orders();
order.setId(orderId);
order.setOrderStatus(OrderStatusEnum.PAID.key);
order.setPaidTime(new Date());
order.setPaidAmount(paidAmount);
ordersMapper.updateByPrimaryKeySelective(order);
order = getOrderById(orderId);
String flowId = sid.nextShort();
Flow flow = new Flow();
flow.setId(flowId);
flow.setFlowNum(alpayFlowNum);
flow.setBuyCounts(order.getBuyCounts());
flow.setCreateTime(new Date());
flow.setOrderNum(orderId);
flow.setPaidAmount(paidAmount);
flow.setPaidMethod(1);
flow.setProductId(order.getProductId());
flowMapper.insertSelective(flow);
}
}
}
ProductServiceImpl
package com.zsl.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zsl.mapper.ProductMapper;
import com.zsl.pojo.Product;
import com.zsl.pojo.ProductExample;
import com.zsl.service.ProductService;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductMapper productMapper;
@Override
public List<Product> getProducts() {
ProductExample pe = new ProductExample();
// Criteria pc = pe.createCriteria();
List<Product> list = productMapper.selectByExample(pe);
return list;
}
@Override
public Product getProductById(String productId) {
return productMapper.selectByPrimaryKey(productId);
}
}
AlipayController
package com.zsl.controller;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.n3r.idworker.Sid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.zsl.pojo.Orders;
import com.zsl.pojo.Product;
import com.zsl.service.OrdersService;
import com.zsl.service.ProductService;
import com.zsl.utils.AlipayConfig;
import com.zsl.utils.LeeJSONResult;
import com.zsl.utils.OrderStatusEnum;
/**
* 支付宝支付
*
* @author Administrator
*
*/
@Controller
@RequestMapping("/alipay")
public class AlipayController {
final static Logger log = LoggerFactory.getLogger(AlipayController.class);
@Autowired
private ProductService productService;
@Autowired
private OrdersService orderService;
@Autowired
private Sid sid;
/**
* 进入商品列表
*
* @return
* @throws Exception
*/
@RequestMapping(value = "/products")
public ModelAndView products() throws Exception {
List<Product> pList = productService.getProducts();
ModelAndView mv = new ModelAndView("products");
mv.addObject("pList", pList);
return mv;
}
/**
* 确认后查询商品信息
*
* @param productId
* @return
* @throws Exception
*/
@RequestMapping(value = "/goConfirm")
public ModelAndView goConfirm(String productId) throws Exception {
Product p = productService.getProductById(productId);
ModelAndView mv = new ModelAndView("goConfirm");
mv.addObject("p", p);
return mv;
}
/**
* 创建订单
*
* @param order
* @return
* @throws Exception
*/
@RequestMapping(value = "/createOrder2")
public ModelAndView createOrde2r(Orders order) throws Exception {
Product p = productService.getProductById(order.getProductId());
String orderId = sid.nextShort();
order.setId(orderId);
order.setOrderNum(orderId);
order.setCreateTime(new Date());
order.setOrderAmount(String.valueOf(Float.valueOf(p.getPrice()) * order.getBuyCounts()));
order.setOrderStatus(OrderStatusEnum.WAIT_PAY.key);
orderService.saveOrder(order);
ModelAndView mv = new ModelAndView("goPay");
mv.addObject("order", order);
mv.addObject("p", p);
return mv;
}
/**
* 创建订单
*
* @param order
* @return
* @throws Exception
*/
@RequestMapping(value = "/createOrder")
@ResponseBody
public LeeJSONResult createOrder(Orders order) throws Exception {
Product p = productService.getProductById(order.getProductId());
String orderId = sid.nextShort();
order.setId(orderId);
order.setOrderNum(orderId);
order.setCreateTime(new Date());
order.setOrderAmount(String.valueOf(Float.valueOf(p.getPrice()) * order.getBuyCounts()));
order.setOrderStatus(OrderStatusEnum.WAIT_PAY.key);
orderService.saveOrder(order);
return LeeJSONResult.ok(orderId);
}
/**
* 付款
*
* @param orderId
* @return
* @throws Exception
*/
@RequestMapping(value = "/goPay")
public ModelAndView goPay(String orderId) throws Exception {
Orders order = orderService.getOrderById(orderId);
Product p = productService.getProductById(order.getProductId());
ModelAndView mv = new ModelAndView("goPay");
mv.addObject("order", order);
mv.addObject("p", p);
return mv;
}
/**
* 支付宝付款
*
* @param orderId
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping(value = "/goAlipay", produces = "text/html; charset=UTF-8")
@ResponseBody
public String goAlipay(String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {
Orders order = orderService.getOrderById(orderId);
Product product = productService.getProductById(order.getProductId());
// 获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,
AlipayConfig.sign_type);
// 设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
// 商户订单号,商户网站订单系统中唯一订单号,必填(随机生成)
String out_trade_no = orderId;
// 付款金额
String total_amount = order.getOrderAmount();
// 订单名称,必填
String subject = product.getName();
// 商品描述,可空
String body = "购买数量:" + order.getBuyCounts();
// 自定义超时时间参数timeout_express
String timeout_express = "1c";
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount
+ "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"timeout_express\":\""
+ timeout_express + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
}
/**
* 网页端用户付款成功后支付宝同步通知回调接口
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping(value = "/alipayReturnNotice")
public ModelAndView alipayReturnNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {
log.info("付款成功同步通知回调...");
// 获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> 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] + ",";
}
// 乱码解决,这段代码在出现乱码时使用
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
AlipayConfig.sign_type); // 调用SDK验证签名
ModelAndView mv = new ModelAndView("alipaySuccess");
//成功返回页面
// 验证是否成功
if (signVerified) {// 验证成功
// 商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 交易状态
String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
// 进行业务操作
orderService.updateOrderStatus(out_trade_no, trade_no, total_amount);
Orders order = orderService.getOrderById(out_trade_no);
Product product = productService.getProductById(order.getProductId());
mv.addObject("out_trade_no", out_trade_no);
mv.addObject("trade_no", trade_no);
mv.addObject("total_amount", total_amount);
mv.addObject("productName", product.getName());
} else {// 验证失败
log.info("验证失败...");
}
return mv;
}
/**
* 网页端用户付款成功后支付宝异步通知回调接口
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping(value = "/alipayNotifyNotice")
@ResponseBody
public String alipayNotifyNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {
log.info("付款成功异步通知回调...");
// 获取支付宝POST过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> 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] + ",";
}
// 乱码解决,这段代码在出现乱码时使用
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
AlipayConfig.sign_type); // 调用SDK验证签名
if (signVerified) {// 验证成功
// 商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
// 交易金额
String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
if (trade_status.equals("TRADE_FINISHED")) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序
// 注意:
// 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (trade_status.equals("TRADE_SUCCESS")) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 如果有做过处理,不执行商户的业务程序
// 注意:
// 付款完成后,支付宝系统发送该交易状态通知
orderService.updateOrderStatus(out_trade_no, trade_no, total_amount);
Orders order = orderService.getOrderById(out_trade_no);
Product product = productService.getProductById(order.getProductId());
}
log.info("验证成功...");
} else {// 验证失败
log.info("验证失败...");
}
return "success";
}
}
最后上Mysql的表结构,数据不方便透露
/*
Navicat MySQL Data Transfer
Source Server : wxdvideo
Source Server Version : 50721
Source Host : localhost:3306
Source Database : alipay
Target Server Type : MYSQL
Target Server Version : 50721
File Encoding : 65001
Date: 2019-07-08 21:30:18
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for flow
-- ----------------------------
DROP TABLE IF EXISTS `flow`;
CREATE TABLE `flow` (
`id` varchar(20) NOT NULL,
`flow_num` varchar(20) DEFAULT NULL COMMENT '流水号',
`order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
`product_id` varchar(20) DEFAULT NULL COMMENT '产品主键ID',
`paid_amount` varchar(11) DEFAULT NULL COMMENT '支付金额',
`paid_method` int(11) DEFAULT NULL COMMENT '支付方式\r\n 1:支付宝\r\n 2:微信',
`buy_counts` int(11) DEFAULT NULL COMMENT '购买个数',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水表';
-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` varchar(20) NOT NULL,
`order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
`order_status` varchar(20) DEFAULT NULL COMMENT '订单状态\r\n 10:待付款\r\n 20:已付款',
`order_amount` varchar(11) DEFAULT NULL COMMENT '订单金额',
`paid_amount` varchar(11) DEFAULT NULL COMMENT '实际支付金额',
`product_id` varchar(20) DEFAULT NULL COMMENT '产品表外键ID',
`buy_counts` int(11) DEFAULT NULL COMMENT '产品购买的个数',
`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
`paid_time` datetime DEFAULT NULL COMMENT '支付时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` varchar(20) CHARACTER SET utf8 NOT NULL,
`name` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '产品名称',
`price` varchar(11) DEFAULT NULL COMMENT '价格'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品表 ';
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(20) NOT NULL,
`username` varchar(128) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';