本人研究了半天终于完成了支付宝支付操作,至于支付完成后的回调由于是本机无法测试,所以暂时未作,现在把步骤写一下,以免以后有用。
1.商户审核,这就不用说了。支付宝那里就有,而且主要是沙箱测试,所以只需申请密钥就可以
2.application.yml的配置
ali_return_url: 同步回调地址
ali_notify_url: 异步回调地址
product_code: FAST_INSTANT_TRADE_PAY
timeout_express: 15m
url: https://openapi.alipaydev.com/gateway.do
appid: **************
private_key: 生成密钥时的私钥
ali_public_key: 查看支付宝公钥
sign_type: RSA2
3.商品信息的实体类
import org.springframework.web.servlet.tags.Param;
public class AlipayParam extends Param {
/*金额*/
private String amount;
/*订单名称*/
private String orderName;
/*订单号唯一标识*/
private String orderId;
public String getAmount() {
return amount;
}
public String getOrderName() {
return orderName;
}
public String getOrderId() {
return orderId;
}
public void setAmount(String amount) {
this.amount = amount;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
}
4.controller
import com.cy.param.AlipayParam;
import com.cy.service.AliPayService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
@RequestMapping("alipay")
public class AliPayController {
@Resource
private AliPayService alipayService;
//1.申请付款
@RequestMapping(value = "/pay", method = RequestMethod.POST)
public String alipay(AlipayParam alipayParam, ModelMap map){
map.addAttribute("form", alipayService.alipay(alipayParam));
return "pay";
}
}
5.传入的商品信息类(此类可以和商品信息实体类合并,只是正式项目有很多其他操作,现分开使用)
import org.springframework.web.servlet.tags.Param;
public class AlipayOrderParam extends Param {
private String out_trade_no;//商户订单号
private String total_amount;//总金额
private String subject;//订单标题
private String product_code;//销售产品码,与支付宝签约的产品码名称。
private String timeout_express;//该笔订单允许的最晚付款时间,逾期将关闭交易。
public String getOut_trade_no() {
return out_trade_no;
}
public String getTotal_amount() {
return total_amount;
}
public String getSubject() {
return subject;
}
public String getProduct_code() {
return product_code;
}
public String getTimeout_express() {
return timeout_express;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
public void setTotal_amount(String total_amount) {
this.total_amount = total_amount;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setProduct_code(String product_code) {
this.product_code = product_code;
}
public void setTimeout_express(String timeout_express) {
this.timeout_express = timeout_express;
}
}
6.支付处理的接口类
import com.cy.param.AlipayParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface AliPayService {
/**
* 付款
* @param alipayParam 付款参数
* @return 付款返回值
*/
String alipay(AlipayParam alipayParam);
/**
* 付款同步返回地址
* @param request
* @return
*/
String synchronous(HttpServletRequest request);
/**
* 付款异步通知调用地址
* @param request 新增参数
* @return 新增返回值
*/
void notify(HttpServletRequest request, HttpServletResponse response);
}
7.支付处理
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.cy.param.AlipayOrderParam;
import com.cy.param.AlipayParam;
import com.cy.service.AliPayService;
import com.cy.untils.CustomAnnotationScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Service
public class AlipayServiceImpl implements AliPayService {
private static final Logger logger = LoggerFactory.getLogger(CustomAnnotationScan.class);
@Value("${ali_return_url}")
private String ali_return_url;
@Value("${ali_notify_url}")
private String ali_notify_url;
@Value("${product_code}")
private String product_code;
@Value("${timeout_express}")
private String timeout_express;
@Value("${url}")
private String url;
@Value("${appid}")
private String appid;
@Value("${private_key}")
private String private_key;
@Value("${ali_public_key}")
private String ali_public_key;
@Value("${sign_type}")
private String sign_type;
@Override
public String alipay(AlipayParam alipayParam) {
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, private_key, "json", "UTF-8", ali_public_key, sign_type);
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(ali_return_url);
alipayRequest.setNotifyUrl(ali_notify_url);
AlipayOrderParam alipayOrderParam = new AlipayOrderParam();
alipayOrderParam.setOut_trade_no(alipayParam.getOrderId());//唯一标识
alipayOrderParam.setSubject(alipayParam.getOrderName());
alipayOrderParam.setTotal_amount(alipayParam.getAmount());
alipayOrderParam.setProduct_code(product_code);
alipayOrderParam.setTimeout_express(timeout_express);
alipayRequest.setBizContent(JSON.toJSONString(alipayOrderParam));
String webForm = "";
try {
webForm = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (Exception e) {
logger.error("支付请求发送失败");
}
return webForm;
}
@Override
public String synchronous(HttpServletRequest request) {
return null;
}
@Override
public void notify(HttpServletRequest request, HttpServletResponse response) {
}
}
8.支付页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>支付宝电脑网站支付</title>
</head>
<body th:utext=${form}>
</body>
</html>
9.项目使用的maven需要的包
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.26.ALL</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
统一收单下单并支付页面接口的地址:小程序文档 - 支付宝文档中心
快速接入的地址:小程序文档 - 支付宝文档中心
SDK&Demo的地址:小程序文档 - 支付宝文档中心