下面是“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);
}
}
}
示例说明
示例一:使用支付宝即时到账接口实现在线支付功能
假设网站需要支持支付宝即时到账,可以按照以下步骤实现:
- 确定使用支付宝即时到账接口,文档链接为:https://docs.open.alipay.com/api_1/alipay.trade.page.pay
- 创建订单时需要设置订单号、商品名称、商品数量、总价等信息,并将该订单保存到数据库中。
- 跳转到支付页面时需要向支付宝支付接口提交表单,表单中包含支付金额、支付方式、订单号和回调地址等信息。表单代码示例:
<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);
}
}
}
示例二:使用微信支付统一下单接口实现在线支付功能
假设网站需要支持微信支付,可以按照以下步骤实现:
- 确定使用微信支付统一下单接口,文档链接为:https://pay.weixin.qq.com/wiki/doc/api/web/wechat_pay/wechat_pay_api.shtml
- 创建订单时需要设置订单号、商品名称、商品数量、总价等信息,并将该订单保存到数据库中。
- 跳转到支付页面时需要向微信支付接口提交表单,表单中包含支付金额、支付方式、订单号和回调地址等信息。表单代码示例:
<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>
- 处理支付结果需要在网站的回调地址中获取支付结果并更新对应订单的支付状态。微信支付接口会向该地址发送请求通知支付结果。代码示例:
@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在线支付功能实现代码
基础教程推荐
猜你喜欢
- java – 在MySQL集群上使用JPA / Hibernate进行外键约束检查 2023-11-07
- Java 内存模型中的happen-before关系详解 2023-06-30
- Java实现优先队列式广度优先搜索算法的示例代码 2022-09-03
- SpringBoot中利用AOP和拦截器实现自定义注解 2023-02-05
- 详解SpringBoot实现事件同步与异步监听 2023-01-24
- java – 服务方法的事务管理器,它对来自多个模式的表执行数据库操作 2023-11-10
- 使用JPA单项一对多外键关联 2023-01-24
- SpringBoot图文并茂详解如何引入mybatis与连接Mysql数据库 2023-03-07
- jsp中点击图片弹出文件上传界面及实现预览实例详解 2023-08-01
- mybatis中使用InsertProvider注解报错解决全过程 2023-02-19