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日

相关文章

  • Java泛型机制的程序演示详解

    Java泛型机制的程序演示详解 什么是Java泛型? Java泛型是JDK1.5版本中引入的新特性。它的主要目的是用来规范和简化Java中的类型变量的使用。 在Java泛型出现之前,Java中的类或者方法的参数或者返回值只能使用具体的类型,比如String、Integer等。而Java泛型则提供了一种灵活的方式,可以在定义类或者方法时,以一个类型变量作为参数…

    Java 2023年5月30日
    00
  • Java深入讲解SPI的使用

    Java深入讲解SPI的使用 什么是SPI SPI全称为Service Provider Interface,是Java提供的一种服务发现机制,它通过在classpath路径下查找META-INF/services目录中的配置文件,来实现对接口的实现类自动发现。简单来说,它为接口的实现提供了解耦、可扩展的方式。 SPI的使用步骤 1.创建接口 public …

    Java 2023年5月26日
    00
  • 解析Spring 漏洞及其修复方案

    解析Spring 漏洞及其修复方案 Spring框架是一款非常流行的Java应用程序框架,广泛应用于企业级应用程序开发中。然而,Spring框架中也有一些漏洞风险,这些漏洞可能会被黑客利用来攻击应用程序。以下是关于Spring漏洞及其修复方案的详细攻略。 Spring 漏洞类型 Spring框架中的漏洞风险主要分为以下几类: 注入漏洞:包括SQL注入和代码注…

    Java 2023年5月19日
    00
  • mybatis二级缓存的实现代码

    MyBatis是一款优秀的ORM框架,并支持一级和二级缓存,其中二级缓存存在于SqlSessionFactory的生命周期内,能够提高查询效率,本文将详细讲解MyBatis二级缓存的实现代码攻略。下面分以下几步进行讲解: 一、开启二级缓存 MyBatis默认是关闭二级缓存的,需要手动开启。在MyBatis的配置文件中添加一行配置: <!–开启二级缓存…

    Java 2023年6月1日
    00
  • Java8方法引用和构造引用代码实例

    针对“Java8方法引用和构造引用代码实例”的完整攻略,我这里给出了以下步骤: 1. 概念介绍 首先需要了解方法引用和构造引用的概念。方法引用就是引用一个已经存在的函数,而不是像Lambda表达式那样提供一个匿名函数实现。其中有三种主要的引用类型: 静态方法引用:引用静态函数。 实例方法引用:引用实例方法。 构造方法引用:引用类的构造方法。 构造引用与方法引…

    Java 2023年5月30日
    00
  • MyBatis批量添加、修改和删除

    关于MyBatis批量添加、修改和删除的完整攻略,我会从以下几点进行详细讲解: 批量添加 INSERT INTO 批量修改 UPDATE 批量删除 DELETE 针对每个点,我会详细介绍其语法,以及两个示例。 1.批量添加 INSERT INTO 语法: <insert id="batchInsert" parameterType=…

    Java 2023年5月20日
    00
  • Java实现简单的五子棋游戏示例代码

    一、介绍 五子棋是一种非常古老的中国传统游戏,它简单易懂,规则简单,同时又非常有趣,是大众化的棋类游戏之一。本文将介绍如何用 Java 语言实现一个简单的五子棋游戏,让小伙伴们体验一下自己编写游戏的快感。 二、准备工作 开发五子棋游戏需要熟悉 Java 语言的基础代码编写,同时需要掌握一些基础的图形界面编程知识,推荐使用 Swing 或 JavaFX 进行图…

    Java 2023年5月19日
    00
  • 利用iText在JSP中生成PDF报表

    生成PDF报表可以利用Java中的iText库来实现,iText使用方便,具有灵活性和可定制性,支持多语言,功能强大,可以创建、读取和操作PDF文档、表单和模板,生成安全性高的PDF文档。 以下是在JSP中使用iText生成PDF报表的完整攻略: 步骤1:下载iText库 在iText官网(https://itextpdf.com/)下载最新版的iText库…

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