|
|
|
@ -1,78 +1,109 @@
|
|
|
|
|
package com.cn.servlet;
|
|
|
|
|
package com.cn.servlet; // 定义Servlet所在的包名
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.io.IOException; // 导入IOException,用于处理输入输出异常
|
|
|
|
|
import java.util.Date; // 导入Date类,用于处理日期
|
|
|
|
|
|
|
|
|
|
import javax.servlet.ServletException;
|
|
|
|
|
import javax.servlet.http.HttpServlet;
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
import javax.servlet.ServletException; // 导入ServletException,用于处理Servlet运行时的异常
|
|
|
|
|
import javax.servlet.http.HttpServlet; // 导入HttpServlet,是所有HTTP servlet的父类
|
|
|
|
|
import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest,代表客户端的请求信息
|
|
|
|
|
import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse,代表服务器对客户端的响应
|
|
|
|
|
|
|
|
|
|
import com.alipay.api.AlipayApiException;
|
|
|
|
|
import com.alipay.api.AlipayClient;
|
|
|
|
|
import com.alipay.api.DefaultAlipayClient;
|
|
|
|
|
import com.alipay.api.request.AlipayTradePagePayRequest;
|
|
|
|
|
import com.cn.domain.Prep;
|
|
|
|
|
import com.alipay.api.AlipayApiException; // 导入AlipayApiException,用于处理支付宝API异常
|
|
|
|
|
import com.alipay.api.AlipayClient; // 导入AlipayClient,支付宝API客户端
|
|
|
|
|
import com.alipay.api.DefaultAlipayClient; // 导入DefaultAlipayClient,支付宝API客户端默认实现
|
|
|
|
|
import com.alipay.api.request.AlipayTradePagePayRequest; // 导入AlipayTradePagePayRequest,支付宝电脑网站支付请求
|
|
|
|
|
import com.cn.domain.Prep; // 导入Prep类,该类定义了订单的数据结构
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @ClassName: AlipayServlet
|
|
|
|
|
* @Description: 支付宝支付接口 PC端
|
|
|
|
|
* @author: ljy
|
|
|
|
|
* @date: 2019年11月14日 上午1:10:23
|
|
|
|
|
* AlipayServlet类,用于处理支付宝支付接口的请求。
|
|
|
|
|
* @ClassName: AlipayServlet 类名:AlipayServlet
|
|
|
|
|
* @Description: 支付宝支付接口,PC端
|
|
|
|
|
* @author: ljy Servlet的作者
|
|
|
|
|
* @date: 2019年11月14日 上午1:10:23 Servlet创建的日期和时间
|
|
|
|
|
*/
|
|
|
|
|
public class AlipayServlet extends HttpServlet {
|
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
|
private static final long serialVersionUID = 1L; // 用于序列化
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 默认构造函数。
|
|
|
|
|
*/
|
|
|
|
|
public AlipayServlet() {
|
|
|
|
|
super(); // 调用父类的构造函数
|
|
|
|
|
// TODO Auto-generated constructor stub
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理GET请求的方法。
|
|
|
|
|
* @param request HttpServletRequest对象,包含客户端的请求信息
|
|
|
|
|
* @param response HttpServletResponse对象,包含服务器对客户端的响应信息
|
|
|
|
|
* @throws ServletException 抛出Servlet异常
|
|
|
|
|
* @throws IOException 抛出输入输出异常
|
|
|
|
|
*/
|
|
|
|
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
|
|
|
|
String URL = "https://openapi.alipaydev.com/gateway.do"; //沙箱环境使用
|
|
|
|
|
//String URL = "https://openapi.alipay.com/gateway.do"; //外网真实环境使用
|
|
|
|
|
String APP_ID = "2016101400683589"; // 即创建应用后生成
|
|
|
|
|
String APP_PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCHuMiTsXiHv1CS+VnqpiY90+iT1PZRHAFcKFb7Zoe2+1Re1/TNTlZ1CGSlJ1XKub5jRZKsL+a+Eqd2sDBBojv639nQj9yuf5on2PsNopzJLVnDyvH+WQHjZJiW/3kGNsj4oI9tB1dBIxLO1DaB3jtuVBi1wDlJRdK3pIeibgwy3jGOnPHE8wtq901KejI1XSJMrClvJfQ0f5G10GVA9Rl3dfnph/VrAm3v21Qkj6rM3HJ58/CYf/tqbl2VPrCjn+7AmuximGgD/GHRpjZtJJZ9nhDguRnPGWwsyQdAu91hWoOMEKCkur7CYyHajjmAFFjtLvLf6tdFMpxvKzCIrOnDAgMBAAECggEAe73V4hKkud+MLvR5Lp9drnFOU7qO+VR3SPbel0fb5NExE2gCIk2SNhH48Trz1WmUVB5So/rofdO0K1poJO8tkIYXqTgBFHfyrPH/s2bXW/SlKwYVrLiqKBDHrqQuS6QXh9eb7OQMga7grwJ8z9s2hFjYTp17nXqzrAuuPkHnjVgBTcvK4G9hmnYl1kSwu+swCRADutGawZab07B66y6poAy0pMLerS14XhIfjwxo1H4FVKZtQtG5IJGyWfhrRVceEiCFgH6R7gjpzR3oInSFrX1Vej4q4F1QbvPARKv/6/HDy6nKmDy3NgAtfJpnDc7kyNT63F+kJ4EpVBbmpjkHwQKBgQDUCWHLBQuv6Fm8eZlD0ONqwQAnbxAhtnmI/hU1ukEzceua0nlnjA/VCY4DLlxZ0dyen0FG8+4Eh+xOhjYQdMAAO0mR5WNS+vQqM5QhohVuwj5FHGiwg+1jDsI5NMsYDo1HMjQcQMa4uKI6Y7CNorqZWRZUuRM78G0LXqPAESAhxwKBgQCj3LabZ1PUQM79LLDHdBaK3fdKGlEpo9KzgAzVrPsrgKnZne5a8CLMZle++r31kK7lfpW589F+S6bSyZ1s4g3hQEJ6zlplsuvN0aff8Ik+AIc72RGzTLassZAC1A3Q+ijJD5kJgYBQRCBhHr7O5I6foqfNjFqjSV6ioAmaoze4JQKBgQCW4Aom9PMo+zMHKptFJxj7OFPMu3mGE5qNQQaEkYCdg507MDLU3FPTqhXT66QpAWxzriw7uYyOysz53wQPV5PbVlR2LPws6obclJD+EaAgjLTUZm+T0nwS9Uh8fjVZa9lZZL6xr+H3ROGinJbfYYBXZ429QWgPSXe+FFx+aXEstwKBgQCe8lKDbfhH1FG0Dayw3G+dZnAghmSiQpH4okZQ4omFCjo3qFV0CqmGoeONkkW/NQgh/ucXyGU24AVDRGSbIK+cBqw12YKgUa0gKbVwqS9HYFXNfOMJjGlKHLb3t2BrjK0RUzr8mIyxz1OlQaCOqe+a87lXzkSBTYMptpl6UcaTrQKBgQDTUOCkM5OOC8PvgjVP996vlBcY3DISH5FVtiaxbyR58SnxlAkTgZsRzEb36V5RaqS0bcjE3UOEaFKM5EBPFuGxWOca85mFcwFkiIgbvP8K9kaOYNVecGIU5HdDLTwfIEGAR1OsQBLFnEjvVI13XSMAyfjrmiyFT5llgTLBuZvR6Q=="; //开发者私钥,由开发者自己生成
|
|
|
|
|
// 支付宝网关地址,沙箱环境和外网真实环境使用不同的URL
|
|
|
|
|
String URL = "https://openapi.alipaydev.com/gateway.do"; // 沙箱环境使用
|
|
|
|
|
//String URL = "https://openapi.alipay.com/gateway.do"; // 外网真实环境使用
|
|
|
|
|
String APP_ID = "2016101400683589"; // 支付宝分配给开发者的应用ID
|
|
|
|
|
String APP_PRIVATE_KEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQ..."; // 开发者私钥,由开发者自己生成
|
|
|
|
|
String FORMAT = "json"; // 参数返回格式,只支持 json
|
|
|
|
|
String CHARSET = "UTF-8"; // 编码集,支持 GBK/UTF-8
|
|
|
|
|
String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvjme7kFbZAMU9TDn6iZBvOFAGUaQu47mXNhZ7EgD6s5K3/NkVTDOCaqRAZ7qBpKwNdsYOeCl2JsugIZzEPtIbuPZhYSUgXlLg4+nTt5k4IHu6hQylTX82nLVlMAaCw7xmMc8OH99ym/mLvf/Os1UQVvvtbta+19bFzuaHn8fem8IXtIP3PN1NuHpYVTzKTtbJIwgM9yDCD5lfg9qIRWiSlnrzc+t+R5+aUwolORg/eyea0i/sMghbPyb/rUY6LPVKgZXhvIE8k0ebnVoVREGzilFb3L8fZWfsenLvEuiubjFJ4CpEOV7YbmorsC9KsKNMfFg3UMqimSCY+4y6hDYHQIDAQAB"; //支付宝公钥,由支付宝生成
|
|
|
|
|
String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvjme..."; // 支付宝公钥,由支付宝生成
|
|
|
|
|
String SIGN_TYPE = "RSA2"; // 商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐使用 RSA2
|
|
|
|
|
|
|
|
|
|
// 从PayServlet获取的订单信息
|
|
|
|
|
Prep prep = (Prep) request.getAttribute("prep");
|
|
|
|
|
Prep prep = (Prep) request.getAttribute("prep"); // 从请求中获取订单对象
|
|
|
|
|
|
|
|
|
|
// 构造商户订单号,确保唯一性
|
|
|
|
|
String out_trade_no = String.valueOf(new Date()) + String.valueOf(prep.getPrepId());
|
|
|
|
|
String total_amount = String.valueOf(prep.getPrice())+".00"; // 付款金额,必填
|
|
|
|
|
String subject = prep.getStartStation()+"站 - "+prep.getEndStation() + "站 火车票"; // 商品名称
|
|
|
|
|
// 回跳地址,用户支付完成后跳转的地址
|
|
|
|
|
String returnUrl = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/ticketing/PayServlet?temp=1&prepId="+prep.getPrepId()+"";
|
|
|
|
|
|
|
|
|
|
// 初始化AlipayClient
|
|
|
|
|
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
|
|
|
|
|
// 创建支付请求
|
|
|
|
|
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
|
|
|
|
|
alipayRequest.setReturnUrl(returnUrl); // 设置回跳地址
|
|
|
|
|
alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp"); // 设置异步通知地址
|
|
|
|
|
// 填充业务参数
|
|
|
|
|
alipayRequest.setBizContent("{" +
|
|
|
|
|
" \"out_trade_no\":\""+out_trade_no+"\"," +
|
|
|
|
|
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
|
|
|
|
|
" \"total_amount\":"+total_amount+"," +
|
|
|
|
|
" \"subject\":\""+subject+"\"," +
|
|
|
|
|
" \"body\":\""+subject+"\"," +
|
|
|
|
|
" \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," +
|
|
|
|
|
" \"extend_params\":{" +
|
|
|
|
|
" \"sys_service_provider_id\":\"2088511833207846\"" +
|
|
|
|
|
" }" +
|
|
|
|
|
" }");// 填充业务参数
|
|
|
|
|
|
|
|
|
|
String out_trade_no = String.valueOf(new Date()) + String.valueOf(prep.getPrepId()); // 商户订单号,商户网站订单系统中唯一订单号,必填
|
|
|
|
|
String total_amount = String.valueOf(prep.getPrice())+".00"; // 付款金额,必填
|
|
|
|
|
String subject = prep.getStartStation()+"站 - "+prep.getEndStation() + "站 火车票"; // 商品名称
|
|
|
|
|
//String returnUrl = "http://localhost:8080/ticketing/PayServlet?temp=1&prepId="+prep.getPrepId()+""; // 回跳地址
|
|
|
|
|
String returnUrl = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/ticketing/PayServlet?temp=1&prepId="+prep.getPrepId()+"";
|
|
|
|
|
|
|
|
|
|
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); // 获得初始化的AlipayClient
|
|
|
|
|
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();// 创建API对应的request
|
|
|
|
|
alipayRequest.setReturnUrl(returnUrl);
|
|
|
|
|
alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");// 在公共参数中设置回跳和通知地址
|
|
|
|
|
alipayRequest.setBizContent("{" + " \"out_trade_no\":\""+out_trade_no+"\","
|
|
|
|
|
+ " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + " \"total_amount\":"+total_amount+","
|
|
|
|
|
+ " \"subject\":\""+subject+"\"," + " \"body\":\""+subject+"\","
|
|
|
|
|
+ " \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\","
|
|
|
|
|
+ " \"extend_params\":{" + " \"sys_service_provider_id\":\"2088511833207846\"" + " }" + " }");// 填充业务参数
|
|
|
|
|
String form = "";
|
|
|
|
|
String form = ""; // 用于存放生成的表单HTML代码
|
|
|
|
|
try {
|
|
|
|
|
form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
|
|
|
|
|
} catch (AlipayApiException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
e.printStackTrace(); // 异常处理
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置响应内容类型
|
|
|
|
|
response.setContentType("text/html;charset=" + CHARSET);
|
|
|
|
|
response.getWriter().write(form);// 直接将完整的表单html输出到页面
|
|
|
|
|
// 输出表单HTML代码到页面
|
|
|
|
|
response.getWriter().write(form);
|
|
|
|
|
// 刷新和关闭PrintWriter
|
|
|
|
|
response.getWriter().flush();
|
|
|
|
|
response.getWriter().close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
|
|
|
|
|
* 处理POST请求的方法,此实现中直接调用doGet方法。
|
|
|
|
|
* @param request HttpServletRequest对象,包含客户端的请求信息
|
|
|
|
|
* @param response HttpServletResponse对象,包含服务器对客户端的响应信息
|
|
|
|
|
* @throws ServletException 抛出Servlet异常
|
|
|
|
|
* @throws IOException 抛出输入输出异常
|
|
|
|
|
*/
|
|
|
|
|
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
doGet(request, response);
|
|
|
|
|
doGet(request, response); // 直接调用doGet方法处理
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|