javaweb在线支付功能实现代码

下面是“javaweb在线支付功能实现代码”的完整攻略。

确定支付方式和接口

首先需要确定网站支持哪些支付方式,例如支付宝、微信支付等,然后根据支付方式找到相应的支付接口,例如支付宝的即时到账接口或者微信支付的统一下单接口

创建订单

在用户确认需要支付时,需要创建对应的订单并保存到数据库中。订单包含以下信息:

  • 订单号:唯一标识该订单
  • 商品名称:用户购买的商品名称
  • 商品数量:用户购买的商品数量
  • 总价:用户需要支付的总价
  • 支付状态:用于记录该订单是否已支付

跳转到支付页面

创建订单后,需要将用户重定向到支付页面,该页面需要包含用于用户支付的表单。表单中包含以下信息:

  • 支付金额
  • 支付方式:例如支付宝、微信支付等
  • 订单号:用于将支付结果与对应的订单关联起来
  • 回调地址:用于支付平台通知网站支付结果的地址

例如支付宝的表单代码如下:

<form action="https://openapi.alipay.com/gateway.do" method="post">
  <input type="hidden" name="app_id" value="支付宝分配给开发者的应用ID">
  <input type="hidden" name="method" value="alipay.trade.page.pay">
  <input type="hidden" name="charset" value="utf-8">
  <input type="hidden" name="sign_type" value="RSA2">
  <input type="hidden" name="timestamp" value="请求时间">
  <input type="hidden" name="version" value="1.0">
  <input type="hidden" name="notify_url" value="支付宝服务器主动通知商户服务器里指定的页面http路径">
  <input type="hidden" name="return_url" value="支付成功后跳转的页面路径">
  <input type="hidden" name="biz_content" value="JSON格式的业务请求参数">
  <button type="submit">去支付</button>
</form>

处理支付结果

用户完成支付后支付平台会向网站的回调地址发送一个请求,用于通知网站该订单的支付结果。需要在网站的回调地址中处理该请求并更新对应订单的支付状态。

例如支付宝的回调处理代码如下:

@Service
public class AlipayService {

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

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

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

  public boolean verifySignature(Map<String, String> params) {
    String sign = params.get("sign");
    String content = AlipaySignature.getSignContent(params);
    try {
      return AlipaySignature.rsaCheck(content, sign, publicKey, "UTF-8", "RSA2");
    } catch (AlipayApiException e) {
      return false;
    }
  }

  public void handleCallback(Map<String, String> params) {
    String outTradeNo = params.get("out_trade_no");
    String tradeNo = params.get("trade_no");
    String tradeStatus = params.get("trade_status");

    // 根据outTradeNo查询对应的订单
    Order order = orderService.findOrderByOutTradeNo(outTradeNo);
    if (order == null || order.getPaid()) {
      // 订单不存在或者已支付,直接返回成功
      return;
    }

    if ("TRADE_SUCCESS".equals(tradeStatus)) {
      // 如果支付成功,更新订单状态
      order.setPaid(true);
      order.setTradeNo(tradeNo);
      order.setPaymentMethod(PaymentMethod.ALIPAY);
      order.setPaymentTime(new Date());
      orderService.saveOrder(order);
    }
  }
}

示例说明

示例一:使用支付宝即时到账接口实现在线支付功能

假设网站需要支持支付宝即时到账,可以按照以下步骤实现:

  1. 确定使用支付宝即时到账接口,文档链接为:https://docs.open.alipay.com/api_1/alipay.trade.page.pay
  2. 创建订单时需要设置订单号、商品名称、商品数量、总价等信息,并将该订单保存到数据库中。
  3. 跳转到支付页面时需要向支付宝支付接口提交表单,表单中包含支付金额、支付方式、订单号和回调地址等信息。表单代码示例:
<form action="https://openapi.alipay.com/gateway.do" method="post">
  <input type="hidden" name="app_id" value="支付宝分配给开发者的应用ID">
  <input type="hidden" name="method" value="alipay.trade.page.pay">
  <input type="hidden" name="charset" value="utf-8">
  <input type="hidden" name="sign_type" value="RSA2">
  <input type="hidden" name="timestamp" value="请求时间">
  <input type="hidden" name="version" value="1.0">
  <input type="hidden" name="notify_url" value="支付宝服务器主动通知商户服务器里指定的页面http路径">
  <input type="hidden" name="return_url" value="支付成功后跳转的页面路径">
  <input type="hidden" name="biz_content" value="JSON格式的业务请求参数">
  <button type="submit">去支付</button>
</form>
  1. 处理支付结果需要在网站的回调地址中获取支付结果并更新对应订单的支付状态。支付宝支付接口会向该地址发送请求通知支付结果。代码示例:
@Service
public class AlipayService {

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

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

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

  public boolean verifySignature(Map<String, String> params) {
    String sign = params.get("sign");
    String content = AlipaySignature.getSignContent(params);
    try {
      return AlipaySignature.rsaCheck(content, sign, publicKey, "UTF-8", "RSA2");
    } catch (AlipayApiException e) {
      return false;
    }
  }

  public void handleCallback(Map<String, String> params) {
    String outTradeNo = params.get("out_trade_no");
    String tradeNo = params.get("trade_no");
    String tradeStatus = params.get("trade_status");

    // 根据outTradeNo查询对应的订单
    Order order = orderService.findOrderByOutTradeNo(outTradeNo);
    if (order == null || order.getPaid()) {
      // 订单不存在或者已支付,直接返回成功
      return;
    }

    if ("TRADE_SUCCESS".equals(tradeStatus)) {
      // 如果支付成功,更新订单状态
      order.setPaid(true);
      order.setTradeNo(tradeNo);
      order.setPaymentMethod(PaymentMethod.ALIPAY);
      order.setPaymentTime(new Date());
      orderService.saveOrder(order);
    }
  }
}

示例二:使用微信支付统一下单接口实现在线支付功能

假设网站需要支持微信支付,可以按照以下步骤实现:

  1. 确定使用微信支付统一下单接口,文档链接为:https://pay.weixin.qq.com/wiki/doc/api/web/wechat_pay/wechat_pay_api.shtml
  2. 创建订单时需要设置订单号、商品名称、商品数量、总价等信息,并将该订单保存到数据库中。
  3. 跳转到支付页面时需要向微信支付接口提交表单,表单中包含支付金额、支付方式、订单号和回调地址等信息。表单代码示例:
<form action="https://api.mch.weixin.qq.com/pay/unifiedorder" method="post">
  <input type="hidden" name="appid" value="wx2421b1c4370ec43b">
  <input type="hidden" name="mch_id" value="10000100">
  <input type="hidden" name="nonce_str" value="IITRi8Iabbblz1Jc">
  <input type="hidden" name="body" value="test">
  <input type="hidden" name="out_trade_no" value="20150806125346">
  <input type="hidden" name="total_fee" value="1">
  <input type="hidden" name="spbill_create_ip" value="123.12.12.123">
  <input type="hidden" name="notify_url" value="http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php">
  <input type="hidden" name="trade_type" value="NATIVE">
  <input type="hidden" name="sign" value="C29DB7DB1867B2C5B8E9726B8E74BF17">
  <input type="hidden" name="sign_type" value="MD5">
  <button type="submit">去支付</button>
</form>
  1. 处理支付结果需要在网站的回调地址中获取支付结果并更新对应订单的支付状态。微信支付接口会向该地址发送请求通知支付结果。代码示例:
@Service
public class WechatPayService {

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

  @Value("${wechatpay.mch-id}")
  private String mchId;

  @Value("${wechatpay.api-key}")
  private String apiKey;

  public boolean verifySignature(Map<String, String> params) {
    String sign = params.get("sign");
    String content = buildSignContent(params, apiKey);
    return sign.equals(MD5.contentToMD5(content));
  }

  public void handleCallback(Map<String, String> params) {
    String outTradeNo = params.get("out_trade_no");
    String transactionId = params.get("transaction_id");
    String resultCode = params.get("result_code");

    // 根据outTradeNo查询对应的订单
    Order order = orderService.findOrderByOutTradeNo(outTradeNo);
    if (order == null || order.getPaid()) {
      // 订单不存在或者已支付,直接返回成功
      return;
    }

    if ("SUCCESS".equals(resultCode)) {
      // 如果支付成功,更新订单状态
      order.setPaid(true);
      order.setTradeNo(transactionId);
      order.setPaymentMethod(PaymentMethod.WECHATPAY);
      order.setPaymentTime(new Date());
      orderService.saveOrder(order);
    }
  }

  private String buildSignContent(Map<String, String> params, String apiKey) {
    String[] keys = params.keySet().toArray(new String[params.size()]);
    Arrays.sort(keys);

    StringBuilder content = new StringBuilder();
    for (String key : keys) {
      String value = params.get(key);
      if (StringUtils.isNotBlank(value) && !key.equals("sign")) {
        content.append(key).append("=").append(value).append("&");
      }
    }
    content.append("key=").append(apiKey);
    return content.toString();
  }

}

以上就是实现“javaweb在线支付功能实现代码”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javaweb在线支付功能实现代码 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • springboot如何整合elasticsearch

    下面我将为你详细讲解springboot如何整合Elasticsearch的完整攻略。 环境准备 首先,我们需要安装好Elasticsearch和Java开发环境。具体安装方法可以参考Elasticsearch官方文档和Java官方文档。此外,我们还需要添加Elasticsearch依赖到我们的Spring Boot项目中。 <dependency&g…

    Java 2023年5月20日
    00
  • Java后端长时间无操作自动退出的实现方式

    实现Java后端长时间无操作自动退出,主要需要使用Java的定时器和线程等相关技术。 以下是实现Java后端长时间无操作自动退出的完整攻略: 第一步:设置最大空闲时间和定时器 首先,我们需要设置一个最大空闲时间,当用户最后一次请求后,超过了该时间,就会被认为是无操作状态。例如,我们设置最大空闲时间为10分钟。 接下来,我们需要使用Java的定时器,定时器会在…

    Java 2023年5月20日
    00
  • Java String类的性质与比较

    针对“Java String类的性质与比较”,我准备了以下攻略: Java String类的性质 不可变性 Java中的String类是不可变的。这意味着,一旦创建了一个字符串对象,就不能更改它的内容。如果您需要修改一个字符串,必须创建一个新的对象,然后将原始对象的引用更改为指向新的字符串对象。 字符串池 Java中的字符串池是一种特殊的内存区域,它存储了所…

    Java 2023年5月27日
    00
  • JSP 开发之Spring Boot 动态创建Bean

    针对“JSP 开发之Spring Boot 动态创建Bean”,我会提供下面的完整攻略。 一、简介 在Spring Boot开发中,我们可以通过定义Java类来定义Bean,但有些场景下我们需要在程序运行时动态创建Bean,这就需要使用Spring Boot的动态Bean创建特性。 二、动态创建Bean 下面是Spring Boot创建Bean的示例代码: …

    Java 2023年6月15日
    00
  • jsp中EL表达式获取数据

    获取页面数据是JSP页面中最常见的操作之一,EL表达式是JSP中最常用的获取数据的手段之一,下面是获取数据的完整攻略: 1. EL表达式语法 EL表达式可以获取对象属性、容器中的元素、数组中的元素。EL表达式语法如下: ${对象名.属性名} ${容器名[下标]} ${数组名[下标]} 其中,对象名和容器名是JSP页面中定义的属性名,下标指元素的序号,从0开始…

    Java 2023年6月15日
    00
  • 从实战角度详解Disruptor高性能队列

    关于”从实战角度详解Disruptor高性能队列”的完整攻略,我将从以下几个方面给出一些详细的讲解: 什么是Disruptor高性能队列? Disruptor高性能队列的优缺点 Disruptor高性能队列的基本原理 实战演示一:使用Disruptor实现高性能的消费者-生产者模型 实战演示二:使用Disruptor实现多消费者的高性能队列 什么是Disru…

    Java 2023年5月20日
    00
  • 详解JDBC使用

    详解JDBC使用 什么是JDBC? Java Database Connectivity(JDBC)是Java编程语言用于执行与关系数据库的连接和访问的标准API。 JDBC的使用步骤 JDBC的使用步骤通常为以下5步: 加载JDBC驱动程序 创建数据库连接 创建Statement对象 执行SQL语句 处理结果 下面将会逐一讲解这5个步骤。 1. 加载JDB…

    Java 2023年6月15日
    00
  • java8学习教程之lambda表达式的使用方法

    Java 8 学习教程之Lambda表达式的使用方法 Lambda表达式是什么? Lambda表达式是Java 8中的一个新特性,它允许我们以一种更简洁的方式来定义匿名内部类。通过使用Lambda表达式,我们可以在一行代码中定义函数接口的实现,并且可以直接将Lambda表达式传递给接口方法。 Lambda表达式的语法 Lambda表达式的语法非常简单,它有以…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部