JAVAWEB进行PC支付宝支付、查询订单支付状态

 

官方文档:https://opendocs.alipay.com/open/270/105899

 

本地开发环境支付回调调试方法可以参考:https://www.cnblogs.com/pxblog/p/11623053.html

 

所需内容:

1、APPID(APPID) 即创建应用后生成 获取:https://opendocs.alipay.com/open/200/105310
2、APP_PRIVATE_KEY(开发者私钥) 获取:https://opendocs.alipay.com/open/291/105971
3、ALIPAY_PUBLIC_KEY(支付宝公钥) 获取: https://opendocs.alipay.com/open/291/105971

 

jar包下载:https://yvioo.lanzous.com/iGR8pe3qkha

 

配置类

AliPayConfig.java

package com.alipay;

public class AliPayConfig {
    /*******支付宝支付参数*********/

    // 商户appid  教程:https://opendocs.alipay.com/open/200/105310
    public static String APPID = "";

    // 私钥 pkcs8格式的 由开发者自己生成  教程:https://opendocs.alipay.com/open/291/105971
    public static String RSA_PRIVATE_KEY = "";

    // 支付宝公钥 由支付宝生成  教程:https://opendocs.alipay.com/open/291/105971
    public static String ALIPAY_PUBLIC_KEY = "";

    // 服务器异步通知路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "/alipay_notice";

    // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
    public static String return_url = "/alipay_return";

    // 请求网关地址
    public static String URL = "https://openapi.alipay.com/gateway.do";

    // 编码
    public static String CHARSET = "UTF-8";

    // 返回格式
    public static String FORMAT = "json";

    // 日志记录目录
    public static String log_path = "/log";

    // RSA2
    public static String SIGNTYPE = "RSA2";

}

 

 

支付工具类

AliPay.java

package com.alipay;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;

import javax.servlet.http.HttpServletResponse;

public class AliPay {


    /**
     * PC网站快速支付
     *
     * @param response
     * @param orderNo 订单号
     * @param totalAmount 支付金额
     */
    public static void enterAlipayInPC(HttpServletResponse response,
                                       String orderNo, Double totalAmount,String returnUrl,String notifyUrl) {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APPID, AliPayConfig.RSA_PRIVATE_KEY,AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGNTYPE);
        //创建API对应的request
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        //在公共参数中设置回跳地址
        //同步跳转链接
        alipayRequest.setReturnUrl(returnUrl);

        //异步跳转链接
        alipayRequest.setNotifyUrl(notifyUrl);

        //填充业务数据
        alipayRequest.setBizContent( "{"  +
                "    \"out_trade_no\":\""+orderNo+"\","  +
                "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\","  +
                "    \"total_amount\":"+totalAmount+","  +
                "    \"subject\":\"订单标题\","  +
                "    \"extend_params\":{"  +
                "    \"sys_service_provider_id\":\"\""  +
                "    }" +
                "  }" );//填充业务参数
        String form;
        try {
            //调用SDK生成表单
            form = alipayClient.pageExecute(alipayRequest).getBody();
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write(form);//直接将完整的表单html输出到页面
            response.getWriter().flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }







}

 

 

控制器调用方法

AliPayController.java

 

package com.alipay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import org.apache.commons.lang.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

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

@Controller
public class AliPayController {

    /**
     * 支付宝PC支付,
     * 这只是简单的demo,需要自行完善逻辑
     */
    @RequestMapping(value = "/aliPCPay")
    public void aliPay(HttpServletResponse response) {

        //订单号
        String orderNo = "";

        //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]。  可以参考:https://www.cnblogs.com/pxblog/p/13186037.html
        Double totalAmount = 1.00;

        AliPay.enterAlipayInPC(response, orderNo, totalAmount,AliPayConfig.returnUrl,AliPayConfig.notifyUrl);
    }


    /**
     * 支付宝异步通知地址
     *
     * @return
     * @throws IOException
     * @throws AlipayApiException
     */
    @RequestMapping(value = "/alipay_notice")
    public String alipayNotice(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws IOException, AlipayApiException {
        PrintWriter out = response.getWriter();
        //获取支付宝POST过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }

        System.out.println(new JSONObject(params));


        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号
        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");

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        //计算得出通知验证结果
        String sign = params.get("sign");
        String content = AlipaySignature.getSignCheckContentV1(params);
        boolean verify_result = AlipaySignature.rsaCheck(content,sign, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET,AliPayConfig.SIGNTYPE);



        Order order = orderMng.findByOrderNo(out_trade_no);
        //支付宝交易号
        order.setTransactionId(trade_no);
        String result = "success";
        System.out.println("订单编号:" + order.getOrderNo());
        System.out.println("验证结果:" + verify_result);
        if (verify_result) {
            //验证成功
            //判断支付宝是否返回付款成功状态
            if ("TRADE_SUCCESS".equalsIgnoreCase(trade_status)){
                //判断订单状态是否是未支付状态
                if (!order.getStatus().equals(PayEnums.PAY_SUCCESS.getCode())) {
                    order.setStatus(PayEnums.PAY_SUCCESS.getCode());
                    orderMng.update(order);
                }
                System.out.println("支付成功");
            }
            out.println(result);    //请不要修改或删除
            out.flush();
            out.close();
        } else {
            //验证失败
            order.setStatus(PayEnums.PAY_FAIL.getCode());
            result = "fail";
            orderMng.update(order);
            System.out.println("支付失败");
            out.println(result);    //请不要修改或删除
            out.flush();
            out.close();
        }
        return null;
    }


    /**
     * 支付宝同步通知页面请求
     *
     * @return
     */
    @RequestMapping(value = "/alipay_return")
    public String alipayReturn(HttpServletRequest request, ModelMap model) {
        //跳转到支付结果页
        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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            try {
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            params.put(name, valueStr);
        }

        boolean signVerified = false;
        try {
            //调用SDK验证签名

            String sign = params.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(params);
            signVerified = AlipaySignature.rsaCheck(content,sign, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET,AliPayConfig.SIGNTYPE);

        } catch (Exception e) {
            e.printStackTrace();
        }

        String out_trade_no = null;
        if (signVerified) {
            //商户订单号
            try {
                out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        } else {
            System.out.println("验签失败");

        }

        Order order = new Order();if (StringUtils.isNotBlank(out_trade_no)) {
            order = orderMng.findByOrderNo(out_trade_no);
            if (order != null) {
                return "成功页面";
            }
        }

        return "失败页面";
    }


    @Autowired
    private OrderMng orderMng;

}

 

 

 

 

 

 

查询订单支付状态接口  
官方文档地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.query/

 

 

 

 /**
     * 交易查询
     * @param out_trade_no  订单号
     */
    public static AlipayTradeQueryResponse query(String out_trade_no) {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APPID, AliPayConfig.RSA_PRIVATE_KEY,AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGNTYPE);
        AlipayTradeQueryRequest alipayQueryRequest = new AlipayTradeQueryRequest();
        String biz_content = "{\"out_trade_no\":\"" + out_trade_no + "\"}";
        alipayQueryRequest.setBizContent(biz_content);
        AlipayTradeQueryResponse alipayQueryResponse = null;
        try {
            alipayQueryResponse = alipayClient.execute(alipayQueryRequest);

            if (null != alipayQueryResponse && alipayQueryResponse.isSuccess()) {
                if (alipayQueryResponse.getCode().equals("10000")) {
                    if ("TRADE_SUCCESS".equalsIgnoreCase(alipayQueryResponse
                            .getTradeStatus())) {

                        //表示支付成功
                    } else if ("TRADE_CLOSED".equalsIgnoreCase(alipayQueryResponse
                            .getTradeStatus())) {
                        // 表示未付款关闭,或已付款的订单全额退款后关闭
                    } else if ("TRADE_FINISHED".equalsIgnoreCase(alipayQueryResponse
                            .getTradeStatus())) {
                        // 此状态,订单不可退款或撤销
                    }
                } else {
                    // 如果请求未成功,请重试

                }
            }
        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return alipayQueryResponse;
    }

 

posted @ 2020-06-04 14:02  yvioo  阅读(1219)  评论(0编辑  收藏  举报