支付宝支付,首先要有一个支付宝商户平台,在平台里面找到对应需要的参数,
具体参数在AlipayConfig类中,请自行到该平台中查找

主要jar包 alipay-sdk-java 可以到maven中下载最新sdk
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.4.27.ALL</version>
</dependency>


function alpay(money){
window.location.href="/user/pay?money="+money;
}

@RequestMapping(value = "/pay")
public ModelAndView pay(@RequestParam("money") String money)throws IOException {
ModelAndView mav = new ModelAndView("/pay");
String out_trade_no = "";

out_trade_no = "自己生成的随机订单号,确保唯一";
UserOrder order = new UserOrder();
order.setDate(new Date());
order.setGold(money);
order.setOrderId(out_trade_no);
order.setStatus(0);
userOrderService.save(order);

AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
// 订单名称,必填
String subject = "XXXX在线充值";

// 付款金额,必填
String total_fee = money;

// 商品描述,可空
String body = "XXXX在线充值";
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no
+ "\"," + "\"total_amount\":\"" + total_fee + "\","
+ "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body
+ "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
String sHtmlText = null;
try {
sHtmlText = AlipayClientFactory.getAlipayClient()
.pageExecute(alipayRequest).getBody();
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mav.addObject("html", sHtmlText);
return mav;
}


package cp.pay.mj.alipay;

import java.io.FileWriter;
import java.io.IOException;
public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "xxx";

// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key ="xxxx";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "xxxxx";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://www.xxxxxx.com/notify_url.jsp";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://www.xxxxx.com/user/orderReturn";

// 签名方式
public static String sign_type = "RSA2";

// 字符编码格式
public static String charset = "utf-8";


// 支付宝网关
public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";

// 支付宝网关
public static String log_path = "C:\\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

/**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

 

package cp.pay.mj.alipay;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;

public class AlipayClientFactory {
public static AlipayClient getAlipayClient() {
if(alipayClient==null){
alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
}
return alipayClient;
}
public static void setAlipayClient(AlipayClient alipayClient) {
AlipayClientFactory.alipayClient = alipayClient;
}
private static AlipayClient alipayClient;
static {
alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
}
}

@RequestMapping(value = "/orderReturn")
public String orderReturn(HttpServletRequest request, Model model)throws IOException {
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}

// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
// 商户订单号

String out_trade_no = new String(request.getParameter("out_trade_no")
.getBytes("ISO-8859-1"), "UTF-8");
// 支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes(
"ISO-8859-1"), "UTF-8");

// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(params,
AlipayConfig.alipay_public_key, AlipayConfig.charset,
AlipayConfig.sign_type);
System.out.println(signVerified + "1------------------------");
} catch (AlipayApiException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} // 调用SDK验证签名
System.out.println(signVerified + "2------------------------");
if (signVerified) {// 验证成功

// 请在这里加上商户的业务逻辑程序代码

// ——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

System.out.println("-------");
try {
userOrderService.updateUserOrderStatus(out_trade_no, trade_no);
model.addAttribute("msg", "充值成功");
} catch (Exception e) {
e.printStackTrace();
model.addAttribute("msg", e.getMessage());
}

} else {// 验证失败
model.addAttribute("msg", "充值失败");
}
return "payResult";
}


payResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="renderer" content="webkit">
<title>SDK登陆</title>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<base href="${contextPath }/" />
<%-- <link rel="stylesheet" href="${contextPath}/resources/css/login/css/login.css"> --%>
<link rel="shortcut icon" type="image/x-icon"
href="resources/images/favicon.ico" />
<link rel="stylesheet"
href="${contextPath}/resources/js/bootstrap/css/bootstrap.min.css">

<style>
#btn {
color: #fef4e9;
border: solid 1px #da7c0c;
background: #f78d1d;
background: -webkit-gradient(linear, left top, left bottom, from(#faa51a),
to(#f47a20) );
background: -moz-linear-gradient(top, #faa51a, #f47a20);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a',
endColorstr='#f47a20' );
height: 35px;
}
</style>
<script type="text/javascript" src="resources/js/jquery-3.1.0.min.js"></script>

<script type="text/javascript"
src="resources/js/bootstrap/js/bootstrap.min.js"></script>
</head>

<body>

<nav class="navbar navbar-mainnav navbar-static-top"> <!-- We use the fluid option here to avoid overriding the fixed width of a normal container within the narrow content columns. -->
<div class="container">
<div class="navbar-header">
<button type="button"
class="navbar-toggle collapsed main-top-nav-collapsed"
data-toggle="collapse" data-target="#main-top-nav"
aria-expanded="false">
<span class="sr-only">Toggle navigation</span> <span
class="icon-bar"></span> <span class="icon-bar"></span> <span
class="icon-bar"></span>
</button>
<a class="navbar-brand hvr-buzz-out" href="#"><img
src="resources/images/banner/logo.png" alt="欧伦达"></a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
</div>
</nav>
<div class="container" style="margin-top: 200px">

<div class="row" style="float: left;">
<h1 style="float: left;">${msg}</h1>
<input type="button" id="btn" value="立即跳转至首页"
style="margin-top: 28px;margin-left: 30px" />
</div>
</div>
</body>
<script type="text/javascript">
var wait = 3;
function time() {
if (wait == 0) {
window.location.href = "";
} else {
$("#btn").val("立即跳转至首页(" + wait + ")");
wait--;
setTimeout(function() {
time();
}, 1000);
}
}
$(document).ready(function() {
$("#btn").on("click", function() {
window.open("");
});
time();
});
</script>
</html>


服务器异步通知页面路径notify_url.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Map"%>
<%@ page import="cp.pay.mj.alipay.AlipayConfig"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.internal.util.*"%>
<%

//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

//——请在这里编写您的程序(以下代码仅作参考)——

/* 实际验证过程建议商户务必添加以下校验:
1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if(signVerified) {//验证成功
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

//交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

if(trade_status.equals("TRADE_FINISHED")){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}else if (trade_status.equals("TRADE_SUCCESS")){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

//注意:
//付款完成后,支付宝系统发送该交易状态通知
}

out.println("success");

}else {//验证失败
out.println("fail");

//调试用,写文本函数记录程序运行情况是否正常
//String sWord = AlipaySignature.getSignCheckContentV1(params);
//AlipayConfig.logResult(sWord);
}

//——请在这里编写您的程序(以上代码仅作参考)——

%>
本人亲测,是可以的,欢迎小伙伴们一起研究探讨
愿意打赏的也可以哦,一分钱也是爱
欢迎转载,转载请注明出处,谢谢