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日

相关文章

  • 浅谈Springboot2.0防止XSS攻击的几种方式

    浅谈Springboot2.0防止XSS攻击的几种方式 什么是XSS攻击? XSS(跨站脚本攻击),是指攻击者在web页面中插入恶意脚本,当用户浏览网页时,脚本会被执行,从而达到攻击者的目的。 常见的XSS攻击方式有反射型、存储型,以及DOM Based。在本文中,我们将围绕Springboot2.0介绍防止XSS攻击的几种方式。 1.使用HtmlUtils…

    Java 2023年5月20日
    00
  • SpringMVC拦截器运行原理及配置详解

    下面我就来详细讲解一下“SpringMVC拦截器运行原理及配置详解”。我们先从原理讲起。 SpringMVC拦截器运行原理 SpringMVC拦截器是一个非常重要的概念,它在SpringMVC框架的基础上进行了一定的封装,可以对请求进行拦截和处理。在SpringMVC中,可以通过实现拦截器接口,来实现自己的拦截器。 SpringMVC拦截器在处理流程中的位置…

    Java 2023年5月16日
    00
  • 关于IDEA git 只有Commit没有Push的问题

    下面是关于IDEA git只有Commit没有Push的问题的完整攻略: 问题描述 在使用IntelliJ IDEA进行git提交时,有时候只有Commit并没有进行Push操作,导致提交的代码并没有同步到仓库中,其他人无法看到最新的代码。 原因分析 首先,需要明确Commit和Push的区别: Commit:将代码提交到本地git仓库中,并生成一个comm…

    Java 2023年6月15日
    00
  • JavaScript实现图片倒影效果 – reflex.js

    下面我将详细讲解“JavaScript实现图片倒影效果 – reflex.js”的完整攻略。 介绍 reflex.js是一个用于实现图片倒影效果的JavaScript插件。使用reflex.js,您可以很容易地在网页中添加图片倒影效果。 步骤 步骤一:加入源代码 要使用reflex.js,您需要将它的源代码(可以在GitHub上下载)加入到您的网页中。您可以…

    Java 2023年6月15日
    00
  • 详解Java Spring AOP

    详解Java Spring AOP 什么是AOP? AOP代表面向切面编程。它是一种编程范例,它允许开发人员将行为分割成各个部分或单独的功能,在这些功能之间划清界限。AOP可以在程序的多个模块中实现可重用性,并使它更加容易测试和维护。 为什么要使用AOP? AOP 可以很好地解决几个横跨多个对象和层的问题: 记录日志、时间性能、监控对象的方法 对象在不同时间…

    Java 2023年5月19日
    00
  • JAVA如何调用wsdl过程详解

    在JAVA中调用WSDL过程需要使用SOAP协议,以实现在网络间的交互。 以下是JAVA调用WSDL过程的详细攻略: 1. 导入WSDL文件 首先需要导入WSDL文件,可以使用JAVA的wsimport工具实现自动生成JAVA代码。在命令行中进入wsimport所在文件夹,输入以下命令: wsimport <WSDL地址> 实际执行时,可以将替换…

    Java 2023年5月26日
    00
  • 张孝祥JAVA全集 Ftp下载[100%能下载]

    标题:张孝祥JAVA全集 Ftp下载攻略 背景 张孝祥是一位知名的程序员,他的JAVA全集备受业界关注。由于文件较大,多数人在下载时会遇到一些困难。本文将介绍如何使用FTP下载张孝祥JAVA全集,让大家能够快速地获取这份宝贵的资源。 准备工作 确认自己的操作系统是否有FTP客户端,如没有可安装一款FTP客户端,如FileZilla、FlashFXP等。 需要…

    Java 2023年6月15日
    00
  • springData使用QueryDsl的示例代码

    让我来详细讲解一下“Spring Data 使用 Querydsl 的示例代码”的完整攻略。 简介 Querydsl 是一个基于 Java 类型化查询的框架,使得编写类型安全、易于理解的查询变得容易。 Spring Data 是 Spring 框架的一部分,通过提供抽象化的数据存储层来简化对数据访问的开发。Spring Data Querydsl 是 Spr…

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