在支付宝开通网页开通沙箱支付:支付宝开放平台 (alipay.com)
步骤:
1.导入相关依赖
<!--alipay(支付宝)支付的依赖-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.52.ALL</version>
</dependency>
2.在util中添加AlipayConfig文件,配置支付宝支付接口的信息
package cn.com.fjxuan.utils;
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明: ksfxhw3818@sandbox.com 111111
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2021000122673141";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOt5tAZZLMfVz2b86nST5bGPz9CuxCshIKzkkYV6kucAyU1JKlMLp/o3A2e5NInfc20cO+scFQEMkx0unAMKhicjMqBbdUjMYj3WY2cD+bTw4sU1E+GSCov8jWS1cOXL1vW7yhp2pK5mP6m4w1CV8uHR25jOr+zGG9kOgcFcD3tAzXHV34rZPVvjgF1Q0JOSOnU9LV81+ytgrjLl5vxhFv4EV5eRN8BPUCfWBWm26K0c1px8i0ZhjddI5rX2K3vjro5TZEw0qu6rKw+XeCc27FLedyhYwJFI+79setkqUAHvdVKRgbXCf1E49QH84+lhPBI1RN8cgex6uKUZCqCSCVAgMBAAECggEAFcHJ6kRR39jQvkUHRRt2ZR7nGpB6uiQ5eeo+3HYotYqhcGMDxCkslV7OMZAfQPfMA1BxPfYNWW5lrbHQrtr8IJ32TNa4PyyC3F7ZQT1VhRDFQV6mSQg9oVwzeu/bYrYirwJWPHKwUqDS5xalhkRafUY1DN99x8BSujqIGBf85gYTaebrwSXxvfdmRoITbX0my1L9J0a29d/7di9d5XfyZu2SfGyQ5WxG1es3V4pHHtpvzbu/KP/HW8mBMiTwu0xbTrCaek3XJdKmj67/fT98JBSRAyM/Pj7dreJZZITLLrRgJbyQRiCAUCsedDFKmq/CaNiuX2lR22l++oB7Y2Mz1QKBgQDN8xnEozo7qXQsMSuiLODf33NGJk2XIxKsWNaQMJgJaQA9jJsigocQJEYpFv/0BOIjEbuAbrWRZOIqesJp+ivtMZosCygfw5/DglVNs7A+su5X7rJ2oN0AP/d7txO9YaiBaSVmqgMhB1IAGB5RxmEBjRhPm3zLxHS+PTWFtG6X5wKBgQCxZpSiYIB3W8pv6rBJOpJRwj7hpTjuPMzeunEegKAIG1/NdBqo5a5Dg71E3E1WQ2D6uBhAQjtlolC4CzTXu12bZ2cXyDC3xxetp8xjGDLk9KKxoHboX/AgFOo6PC+IPLjakQI7e2xjBsdcJN81L9AWkb6HJEhRYIQCv22G5sdEIwKBgQCj+0qrLSRy2MvtXAFYEc/DsZGBa4IgMwbtP5coG+kSpQ5R86Caa7/K9HcAxJVr4G+GaNoYuw3LBL6oADLIWy+anwIYy5FZKVQOQbpWMhrE8YehcCedGRye1E/jq7QF+LpIwEXNZtUy+TcraAjMJ96Zc5TF3hIR1Qz3ZJk3KqFcRQKBgGP8l0W18nJTsBPISTfc5V9jhiGUCDRu3GGk3+D7SjeHhkW8bNJJMiEnfWP0bzpxm5V0cWa2bdfo1moFFvGIz0epzjdfQ+YxNq1P6CjqGLVnFNPcx2hNun+6ihHsnjXBU8cM+B8if4KI7ZCHz66glj5CQwrUblY/eeg6kLb6F9HVAoGASfZSjklJEvPcqmEWvpVAk+E5I6epKgHRDEosTSZQbhX+jEN3JiefcaRfJ3JvLODlsW7dDDx5rIqC8dCQyG9e0byGkbwLAE/YRwPvlmQUHYzGL3R/DHf8L+C3g9uQ71tpkw3e6Qu3xLi7ThBvTbiA/IA8yd2T8KXkqH+o3syoqF0=";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjrebQGWSzH1c9m/Op0k+Wxj8/QrsQrISCs5JGFepLnAMlNSSpTC6f6NwNnuTSJ33NtHDvrHBUBDJMdLpwDCoYnIzKgW3VIzGI91mNnA/m08OLFNRPhkgqL/I1ktXDly9b1u8oadqSuZj+puMNQlfLh0duYzq/sxhvZDoHBXA97QM1x1d+K2T1b44BdUNCTkjp1PS1fNfsrYK4y5eb8YRb+BFeXkTfAT1An1gVptuitHNacfItGYY3XSOa19it7466OU2RMNKruqysPl3gnNuxS3ncoWMCRSPu/bHrZKlAB73VSkYG1wn9ROPUB/OPpYTwSNUTfHIHserilGQqgkglQIDAQAB";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,支付成功
public static String return_url = "http://localhost:8080/orders/afterOrdersPay";
// 签名方式
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi-sandbox.dl.alipaydev.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();
}
}
}
}
}
3.在controller层创建支付方法,去到支付的jsp页面
/**
* @methodName toOrdersPay
* @effect: 去到支付的页面(jsp)
*/
@RequestMapping("/toOrdersPay")
public String toOrdersPay(){
return "/WEB-INF/alipay/ordersPay.jsp";
}
4. 添加支付界面的jsp(src/main/webapp/WEB-INF/alipay/ordersPay.jsp)
<!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">
<title>付款</title>
</head>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="cn.com.fjxuan.utils.*"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.request.*"%>
<%
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
//商户订单号,商户网站订单系统中唯一订单号,必填,支付后有支付宝服务器发送请求回调,能够自动带上此参数
String out_trade_no = new String(request.getParameter("orderNum").getBytes("ISO-8859-1"),"UTF-8");
//付款金额,必填
String total_amount = new String(request.getParameter("orderMoney").getBytes("ISO-8859-1"),"UTF-8");
//订单名称,必填
String subject = new String("韦氏集团酒店房间入住支付".getBytes("ISO-8859-1"),"UTF-8");
//商品描述,可空
String body = new String("酒店住宿费用".getBytes("ISO-8859-1"),"UTF-8");
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ "韦氏集团酒店房间入住支付" +"\","
+ "\"body\":\""+ "酒店住宿费用" +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
// + "\"total_amount\":\""+ total_amount +"\","
// + "\"subject\":\""+ subject +"\","
// + "\"body\":\""+ body +"\","
// + "\"timeout_express\":\"10m\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节
//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
//输出
out.println(result);
%>
<body>
</body>
</html>
5.在业务层写支付成功后的业务层方法
/**
* @methodName afterOrdersPay
* @effect: 支付成功后的业务层操作
* @param orderNum 订单编号
* 1.修改订单支付状态 由0(未结算)---->1(已结算)
* 2.添加销售记录数据
*/
@Override
public String afterOrdersPay(String orderNum) throws Exception {
//1.根据订单编号获取订单信息
Orders queryOrders = new Orders();
queryOrders.setOrderNum(orderNum);
//根据订单号查询支付的订单数据
Orders alipayOrders = baseMapper.queryObjectByPramas(queryOrders);
//2.修改订单的支付状态 由0(未结算)---->1(已结算)
//创建修改的订单对象,将订单号和订单状态设置到对象中
Orders updOrders = new Orders();
updOrders.setId(alipayOrders.getId());
updOrders.setOrderStatus("1");
//执行动态修改
int updOrdersCount = baseMapper.update(updOrders);
//3.在Roomsale表(销售数据表)添加销售数据
//新建销售记录对象
Roomsale roomSale = new Roomsale();
//根据订单表中的数据,装对销售对象中 OrderOther:8201,独角大仙,2019/07/12 08:27:28,2019/07/14 10:14:41,2
String[] orderOthers = alipayOrders.getOrderOther().split(",");
roomSale.setRoomNum(orderOthers[0]); //房间号
roomSale.setCustomerName(orderOthers[1]); //客人姓名
roomSale.setStartDate(DateUitls.strToDate(orderOthers[2])); //入住时间
roomSale.setEndDate(DateUitls.strToDate(orderOthers[3])); //退房时间
roomSale.setDays(Integer.valueOf(orderOthers[4])); //入住天数
// OrderPrice: 140,90,252.00
String[] orderPrice = alipayOrders.getOrderPrice().split(",");
roomSale.setRoomPrice(Double.valueOf(orderPrice[0])); //客房单价
roomSale.setOtherPrice(Double.valueOf(orderPrice[1])); //其它消费
roomSale.setRentPrice(Double.valueOf(orderPrice[2])); //实际的住房金额
roomSale.setSalePrice(alipayOrders.getOrderMoney()); //订单的实际支付金额(订单的支付总金额)
Double discountPrice = roomSale.getRoomPrice()*roomSale.getDays()-roomSale.getRentPrice();
roomSale.setDiscountPrice(discountPrice); //优惠金额(客房单价*天数-实际的住房金额)
//3.3.执行消费记录的添加
int insRoomSaleCount = roomsaleMapper.insert(roomSale);
if(updOrdersCount>0&&insRoomSaleCount>0){
return "/WEB-INF/alipay/paySuccess.jsp"; //跳转到首页
}else {
return "/WEB-INF/alipay/payFail.jsp"; //跳转到异常页
}
}
6.在controller层创建支付成功后的方法,去到对应的jsp页面
/**
* @methodName afterOrdersPay
* @effect: 订单值支付成功后操作
* @param out_trade_no 支付成功之后的回调地址中的订单编号参数
* 1.修改订单支付状态 由0(未结算)---->1(已结算)
* 2.添加销售记录数据
*/
@RequestMapping("/afterOrdersPay")
public String afterOrdersPay(String out_trade_no){
//在业务层完成上述的操作
try {
return ordersService.afterOrdersPay(out_trade_no);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
7.添加对应的支付后的界面