关键词

SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码

这里是“SpringMVC+Spring+Mybatis实现支付宝支付功能”的完整攻略,包含示例代码。读者可以根据这个攻略来实现他们自己的支付宝支付功能。

概述

在这个攻略中,我们将使用SpringMVC、Spring和Mybatis框架,来实现一个支付宝支付功能的示例。我们会使用支付宝提供的SDK来操作支付宝的API接口。这个示例中会包括以下几个步骤:

  1. 在支付宝开放平台上创建并配置应用。
  2. 创建数据库表,用于存储订单信息。
  3. 编写Java代码,实现调用支付宝API接口和处理返回结果的功能。
  4. 构建一个Web应用,来演示支付宝支付功能的完整流程。

步骤一:创建支付宝应用

首先我们需要在支付宝开放平台上创建一个应用,这个应用会为我们提供一个App ID,以及一些必要的API密钥和加密密钥。我们需要这些信息来调用支付宝API接口。

  1. 打开支付宝开放平台的开发者中心(https://openhome.alipay.com/platform/developerIndex.htm),然后登录你的支付宝账号。如果你没有支付宝账号,你需要先注册一个。

  2. 点击 “管理中心”按钮,然后选择“应用管理”。

  3. 点击“创建应用”,并根据提示填写应用的名称和描述。

  4. 在管理中心的“应用管理”页面,你可以看到新创建的应用的App ID和其他信息。你可以在这个页面上管理你的应用配置。

步骤二:创建数据库表

接下来我们需要在数据库中创建一个表,用于存储订单信息。这个表中将会包含每一个订单的关键信息,比如订单号、订单价格、买家信息等等。

首先,我们需要创建一个名为“order”的数据库,并在里面创建一个名为“order_info”的表。

CREATE DATABASE IF NOT EXISTS `order` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `order`;

CREATE TABLE IF NOT EXISTS `order_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_no` varchar(32) DEFAULT NULL,
  `order_price` decimal(10,2) DEFAULT NULL,
  `buyer_id` int(11) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_no_UNIQUE` (`order_no`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

步骤三:编写Java代码

现在我们需要编写一些Java代码来实现调用支付宝API接口。我们会使用Java的SpringMVC、Spring和Mybatis框架来编写这些代码。

配置文件

我们需要在src/main/resources目录下创建一个名为“application.properties”的文件,用于配置数据库连接和支付宝API密钥等信息。

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/order
spring.datasource.username=root
spring.datasource.password=rootroot

alipay.app-id=你的应用App ID
alipay.return-url=http://localhost:8080/alipay/make-order/return
alipay.notify-url=http://localhost:8080/alipay/make-order/notify
alipay.gateway-url=https://openapi.alipay.com/gateway.do
alipay.sign-type=RSA2
alipay.charset=UTF-8
alipay.public-key=应用的公钥
alipay.private-key=应用的私钥

创建订单数据访问对象

我们需要创建一个名为“OrderMapper”的接口和一个实现类“OrderMapperImpl”,用于访问订单数据。

public interface OrderMapper {
  public void insertOrder(Order order);
  public Order getOrderById(int id);
}

@Repository
public class OrderMapperImpl implements OrderMapper {

  @Autowired
  JdbcTemplate jdbcTemplate;

  @Override
  public void insertOrder(Order order) {
    String sql = "INSERT INTO order_info (order_no, order_price, buyer_id, create_time) VALUES (?,?,?,?)";
    jdbcTemplate.update(sql, order.getOrderNo(), order.getOrderPrice(), order.getBuyerId(), order.getCreateTime());
  }

  @Override
  public Order getOrderById(int id) {
    String sql = "SELECT id, order_no AS orderNo, order_price AS orderPrice, buyer_id AS buyerId, create_time AS createTime FROM order_info WHERE id = ?";
    return jdbcTemplate.queryForObject(sql, new Object[] { id },
        (rs, rowNum) -> new Order(rs.getInt("id"), rs.getString("orderNo"), rs.getBigDecimal("orderPrice"),
            rs.getInt("buyerId"), rs.getTimestamp("createTime").toLocalDateTime()));
  }
}

创建订单业务逻辑层

我们还需要创建一个名为“OrderService”的接口和一个实现类“OrderServiceImpl”,用于处理业务逻辑。

订单的创建过程如下:

  1. 根据传入的订单信息生成订单号。

  2. 将生成的订单号和订单详细信息存入数据库中。

  3. 调用支付宝接口进行支付。

  4. 根据支付结果更新订单状态。

public interface OrderService {
  public Order createOrder(OrderInfo orderInfo);
}
@Service
public class OrderServiceImpl implements OrderService {

  @Autowired
  OrderMapper orderMapper;

  @Autowired
  AlipayService alipayService;

  @Override
  public Order createOrder(OrderInfo orderInfo) {

    // 生成订单号
    String orderNo = generateOrderNo();
    Order order = new Order(orderNo, orderInfo.getPrice(), orderInfo.getBuyerId(),
        LocalDateTime.now());

    // 将订单写入数据库
    orderMapper.insertOrder(order);

    // 支付
    AlipayTradePagePayRequest alipayRequest = alipayService.createPagePayRequest(orderNo,
        orderInfo.getPrice().toString(), orderInfo.getProductName(), orderInfo.getProductDesc());
    String form = alipayService.buildRequest(alipayRequest);

    // 返回支付表单
    order.setPayHtml(form);    

    return order;
  }
  private String generateOrderNo() {
    // TODO: 生成订单号
    return UUID.randomUUID().toString();
  }
}

创建支付宝服务

我们需要创建一个名为“AlipayService”的服务,用于调用支付宝接口。

public interface AlipayService {
  public AlipayTradePagePayRequest createPagePayRequest(String outTradeNo, String totalAmount, String subject,
      String body);
  public String buildRequest(AlipayRequest<?> alipayRequest);
}
@Service
public class AlipayServiceImpl implements AlipayService {

  @Value("${alipay.app-id}")
  String appId;

  @Value("${alipay.gateway-url}")
  String gatewayUrl;

  @Value("${alipay.private-key}")
  String privateKey;

  @Value("${alipay.charset}")
  String charset;

  @Value("${alipay.sign-type}")
  String signType;

  @Value("${alipay.public-key}")
  String publicKey;

  @Autowired
  AlipayClient alipayClient;

  @Override
  public AlipayTradePagePayRequest createPagePayRequest(String outTradeNo, String totalAmount, String subject,
      String body) {
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    alipayRequest.setReturnUrl(returnUrl);
    alipayRequest.setNotifyUrl(notifyUrl);
    alipayRequest.setBizContent(
        "{\"out_trade_no\":\"" + outTradeNo + "\","
         + "\"total_amount\":\"" + totalAmount + "\","
         + "\"subject\":\"" + subject + "\","
         + "\"body\":\"" + body + "\","
         + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
    return alipayRequest;
  }

  @Override
  public String buildRequest(AlipayRequest<?> alipayRequest) {
    String result = null;
    try {
      AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);
      result = response.getBody();
    } catch (AlipayApiException e) {
      e.printStackTrace();
    }
    return result;
  }
}

创建支付宝回调处理器

我们需要创建一个名为“AlipayCallbackHandler”的处理器,用于处理支付宝的回调请求。

@Component
public class AlipayCallbackHandler {

  @Autowired
  OrderMapper orderMapper;

  public boolean handleNotify(Map<String, String> params) {

    // TODO: 验证签名

    // 订单号
    String outTradeNo = params.get("out_trade_no");
    // 支付宝交易号
    String tradeNo = params.get("trade_no");
    // 交易状态
    String tradeStatus = params.get("trade_status");

    Order order = orderMapper.getOrderByOrderNo(outTradeNo);
    if (order == null) {
      // 订单不存在
      return false;
    }
    if (order.getPayStatus() == PayStatus.SUCCESS) {
      // 已经处理过这个订单
      return true;
    }

    // 更新订单状态
    if (tradeStatus.equals("TRADE_SUCCESS")) {
      order.setPayStatus(PayStatus.SUCCESS);
      orderMapper.updateOrder(order);
    } else {
      order.setPayStatus(PayStatus.FAIL);
      orderMapper.updateOrder(order);
    }

    return true;
  }
}

创建支付宝回调控制器

我们需要创建一个名为“AlipayCallbackController”的控制器,用于处理支付宝回调请求。

@Controller
@RequestMapping("/alipay/make-order")
public class AlipayCallbackController {

  @Autowired
  AlipayCallbackHandler alipayCallbackHandler;

  @PostMapping("/notify")
  @ResponseBody
  public String notify(@RequestParam Map<String, String> params) {
    boolean result = alipayCallbackHandler.handleNotify(params);
    if (result) {
      return "success";
    } else {
      return "fail";
    }
  }

  @GetMapping("/return")
  public ModelAndView returnUrl(@RequestParam Map<String, String> params) {
    ModelAndView modelAndView = new ModelAndView("redirect:/");
    // TODO: 处理返回结果
    return modelAndView;
  }
}

创建支付宝支付页面控制器

最后,我们需要创建一个名为“MakeOrderController”的控制器,用于展示支付页面并处理支付请求。

@Controller
@RequestMapping("/alipay/make-order")
public class MakeOrderController {

  @Autowired
  OrderService orderService;

  @GetMapping
  public ModelAndView makeOrder() {
    ModelAndView modelAndView = new ModelAndView("make-order");
    OrderInfo orderInfo = new OrderInfo();    
    modelAndView.addObject("orderInfo", orderInfo);
    return modelAndView;
  }

  @PostMapping
  public ModelAndView submitOrder(OrderInfo orderInfo) {
    Order order = orderService.createOrder(orderInfo);
    ModelAndView modelAndView = new ModelAndView("submit-order");
    modelAndView.addObject("order", order);
    return modelAndView;
  }
}

步骤四:构建Web应用

我们已经完成了Java代码的编写,现在我们需要将这些代码打包成一个Web应用。用mvn package命令构建出一个名为war文件,然后部署到Tomcat服务器上即可。

如果一切顺利,我们应该可以在浏览器中看到示例支付页面。用户填写订单信息后,点击确认支付按钮,即可跳转到支付宝的支付页面完成支付。支付完成后,支付宝将会重定向回我们的网站,并调用我们设定的回调接口。我们可以在回调接口中根据支付结果来更新订单状态。

这个示例代码还有很多需要完善的地方,比如需要根据实际业务需求生成订单号、在创建订单时需要验证买家身份信息、添加订单查询和退款等功能。但是这份代码已经可以作为一个基础版本,让读者了解到在SpringMVC、Spring和Mybatis框架下如何实现支付宝支付功能。

本文链接:http://task.lmcjl.com/news/6237.html

展开阅读全文