javaweb在线支付功能实现代码

下面是“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在线支付功能实现代码

基础教程推荐