SSM整合支付宝app支付

在支付宝开通网页开通沙箱支付:支付宝开放平台 (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.添加对应的支付后的界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值