AlipayCallbackController.java 9.4 KB
Newer Older
刘兴 已提交
1 2 3 4
package com.hqyj.seven.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
5 6 7
import com.hqyj.seven.pojo.Enter;
import com.hqyj.seven.pojo.Fee;
import com.hqyj.seven.service.EnterService;
8
import com.hqyj.seven.service.FeeService;
刘兴 已提交
9
import com.hqyj.seven.utils.AlipayConfig;
10
import org.springframework.beans.factory.annotation.Autowired;
刘兴 已提交
11 12
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
13
import org.springframework.web.bind.annotation.RequestMethod;
刘兴 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 *
 * @File AlipayCallbackController.java
 * @Auth liuxing
 * @Date 2021/8/17 12:13
 * @Email liuxing997@foxmail.com
 */
@Controller
public class AlipayCallbackController {

34

35 36
    private FeeService feeService;

37 38 39 40 41 42 43 44 45 46 47 48
    private EnterService enterService;

    @Autowired
    public void setFeeService(FeeService feeService) {
        this.feeService = feeService;
    }

    @Autowired
    public void setEnterService(EnterService enterService) {
        this.enterService = enterService;
    }

刘兴 已提交
49
    //异步回调
50
    @RequestMapping(value = "/notifyUrl", method = RequestMethod.POST)
刘兴 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
    public void notifyUrl(HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        //获取支付宝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 = false; //调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
        } catch (
                AlipayApiException e) {
            e.printStackTrace();
        }
        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)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序
94 95 96 97 98 99 100 101 102
                Enter enter = enterService.queryByOutTradeNo(out_trade_no);
                System.out.println("enter1:" + enter);
                if (enter != null) {
                    Fee fee = feeService.queryOneByFeeId(enter.getEnter_id());
                    System.out.println("fee1:" + fee);
                    if (fee != null ){
                        feeService.updateFeeInfoByFeeId(fee.getFeeId(), out_trade_no,"支付宝支付完成", "支付宝");
                    }
                }
刘兴 已提交
103 104 105 106 107 108
                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            } else if (trade_status.equals("TRADE_SUCCESS")) {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序
109 110 111 112 113 114 115 116 117
                Enter enter = enterService.queryByOutTradeNo(out_trade_no);
                System.out.println("enter2:" + enter);
                if (enter != null) {
                    Fee fee = feeService.queryOneByFeeId(enter.getEnter_id());
                    System.out.println("fee2:" + fee);
                    if (fee != null ){
                        feeService.updateFeeInfoByFeeId(fee.getFeeId(), out_trade_no,"支付宝支付完成", "支付宝");
                    }
                }
刘兴 已提交
118 119 120
                //注意:
                //付款完成后,支付宝系统发送该交易状态通知
            }
121

刘兴 已提交
122
            out.println("success");
123

刘兴 已提交
124 125 126 127 128 129 130 131 132 133
        } else {//验证失败
            out.println("fail");

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

    //同步回调
134
    @RequestMapping(value = "/returnUrl", method = RequestMethod.GET)
刘兴 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
    public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException {
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        //获取支付宝GET过来反馈信息
        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 = false; //调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
            //获取支付金额,转换为double类型
            double total_amount1 = Double.parseDouble(total_amount);

            //查询商户流水号在入住表中存在,存在更新订单表的支付状态为"支付宝支付完成"和入住表的缴费流水号为支付宝交易号
            //不存在更新订单表的支付状态为"支付宝支付取消"
            out.println("缴费成功!");
            response.sendRedirect("paidList");
            Enter enter = enterService.queryByOutTradeNo(out_trade_no);
            System.out.println("enter3:" + enter);
            if (enter != null) {
                Fee fee = feeService.queryOneByFeeId(enter.getEnter_id());
                System.out.println("fee2:" + fee);
                if (fee != null ){
                    feeService.updateFeeInfoByFeeId(fee.getFeeId(), trade_no,"支付宝支付中", "支付宝支付完成");
                }
            }
//            if (enter != null) {
//                //根据入住ID查找缴费信息
//                Fee fee = feeService.queryOneByFeeId(enter.getEnter_id());
//                if (fee != null) {
//                    //如果更新成功,对应支付也成功
//                    if (feeService.updateFeeInfoByFeeId(fee.getFeeId(), trade_no,"支付宝支付中", "支付宝") == 1) {
//                            out.println("缴费成功!");
//                            response.sendRedirect("paidList");
//                    } else {
//                        feeService.updateFeeInfoByFeeId(fee.getFeeId(), trade_no,"支付宝支付中", "支付宝支付取消");
//                        out.println("缴费失败!");
//                        response.sendRedirect("unpaidList");
//                    }
//                }
//            }
刘兴 已提交
203 204 205 206 207
        } else {
            out.println("验签失败");
        }
    }
}