All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dennisit.vplus.data.utils.AlipayUtils Maven / Gradle / Ivy

There is a newer version: 2.0.8
Show newest version
package com.github.dennisit.vplus.data.utils;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.github.dennisit.vplus.data.exception.ApiException;
import com.github.dennisit.vplus.data.pay.AlipayStatus;
import com.github.dennisit.vplus.data.pay.AlipayConfig;
import com.github.dennisit.vplus.data.pay.TradeEntry;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Slf4j
public class AlipayUtils {

    /**
     * 手机支付
     *
     * @param alipay 支付宝配置
     * @param trade  交易信息
     * @return 交易结果
     * @throws Exception 异常处理
     */
    public static String payWithPC(AlipayConfig alipay, TradeEntry trade) throws Exception {
        if (alipay.getId() == null) {
            throw new ApiException("请先添加相应配置,再操作");
        }
        AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppId(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType());
        double money = Double.parseDouble(trade.getTotalAmount());
        if (money <= 0 || money >= 5000) {
            throw new ApiException("测试金额过大");
        }
        // 创建API对应的request(电脑网页版)
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        // 订单完成后返回的页面和异步通知地址
        request.setReturnUrl(alipay.getReturnUrl());
        request.setNotifyUrl(alipay.getNotifyUrl());
        // 填充订单参数
        request.setBizContent("{" +
                "    \"out_trade_no\":\"" + trade.getOutTradeNo() + "\"," +
                "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
                "    \"total_amount\":" + trade.getTotalAmount() + "," +
                "    \"subject\":\"" + trade.getSubject() + "\"," +
                "    \"body\":\"" + trade.getBody() + "\"," +
                "    \"extend_params\":{" +
                "    \"sys_service_provider_id\":\"" + alipay.getSysServiceProviderId() + "\"" +
                "    }" +
                "  }"); //填充业务参数
        return alipayClient.pageExecute(request, "GET").getBody();

    }

    /**
     * 终端支付
     *
     * @param alipay 支付宝配置
     * @param trade  交易信息
     * @return 交易结果
     * @throws Exception 异常处理
     */
    public static String payWithWeb(AlipayConfig alipay, TradeEntry trade) throws Exception {
        if (alipay.getId() == null) {
            throw new ApiException("请先添加相应配置,再操作");
        }
        AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppId(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType());

        double money = Double.parseDouble(trade.getTotalAmount());
        if (money <= 0 || money >= 5000) {
            throw new ApiException("测试金额过大");
        }
        // 创建API对应的request(手机网页版)
        AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
        // 订单完成后返回的页面和异步通知地址
        request.setReturnUrl(alipay.getReturnUrl());
        request.setNotifyUrl(alipay.getNotifyUrl());
        // 填充业务参数
        request.setBizContent("{" +
                "    \"out_trade_no\":\"" + trade.getOutTradeNo() + "\"," +
                "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
                "    \"total_amount\":" + trade.getTotalAmount() + "," +
                "    \"subject\":\"" + trade.getSubject() + "\"," +
                "    \"body\":\"" + trade.getBody() + "\"," +
                "    \"extend_params\":{" +
                "    \"sys_service_provider_id\":\"" + alipay.getSysServiceProviderId() + "\"" +
                "    }" +
                "  }");
        return alipayClient.pageExecute(request, "GET").getBody();
    }

    /**
     * 支付异步通知
     * (要公网访问),接收异步通知,检查通知内容app_id、out_trade_no、total_amount是否与请求中的一致,根据trade_status进行后续业务处理
     *
     * @param alipayConfig 支付宝配置
     * @return 交易结果
     */
    public static boolean notifyAccept(AlipayConfig alipayConfig) {
        HttpServletRequest request = WebUtils.getHttpServletRequest();

        Map parameterMap = request.getParameterMap();
        StringBuilder notifyKvs = new StringBuilder();
        parameterMap.forEach((key, value) -> notifyKvs.append(key + "=" + value[0] + "\n"));
        log.debug(notifyKvs.toString());

        // 内容验签,防止黑客篡改参数
        if (!AlipayUtils.rsaCheck(request, alipayConfig)) {
            throw new ApiException("内容被篡改");
        }

        // 交易状态
        String tradeStatus = sourceToUTF8(request.getParameter("trade_status"));
        // 商户订单号
        String outTradeNo = sourceToUTF8(request.getParameter("out_trade_no"));
        // 支付宝交易号
        String tradeNo = sourceToUTF8(request.getParameter("trade_no"));
        // 付款金额
        String totalAmount = sourceToUTF8(request.getParameter("total_amount"));

        log.info("tradeStatus:{}, outTradeNo:{}, tradeNo:{}, totalAmount:{}", tradeStatus, outTradeNo, tradeNo, totalAmount);

        return tradeStatus.equals(AlipayStatus.SUCCESS.getValue()) || tradeStatus.equals(AlipayStatus.FINISHED.getValue());
    }


    public static String sourceToUTF8(String source) {
        if (StringUtils.isBlank(source)) {
            return StringUtils.EMPTY;
        }
        try {
            return new String(source.getBytes("ISO-8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            log.error(e.getLocalizedMessage());
        }
        return source;
    }

    /**
     * 生成订单号
     *
     * @return 订单编号
     */
    public static String getOrderCode() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int a = (int) (Math.random() * 9000.0D) + 1000;
        Date date = new Date();
        String str = sdf.format(date);
        String[] split = str.split("-");
        String s = split[0] + split[1] + split[2];
        String[] split1 = s.split(" ");
        String s1 = split1[0] + split1[1];
        String[] split2 = s1.split(":");
        String s2 = split2[0] + split2[1] + split2[2] + a;
        return s2;
    }

    /**
     * 校验签名
     *
     * @param request      Http请求
     * @param aliPayConfig 支付宝配置
     * @return 签名校验结果
     */
    public static boolean rsaCheck(HttpServletRequest request, AlipayConfig aliPayConfig) {
        // 获取支付宝POST过来反馈信息
        Map params = new HashMap<>(1);
        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] + ",";
            }
            params.put(name, valueStr);
        }
        try {
            return AlipaySignature.rsaCheckV1(params, aliPayConfig.getPublicKey(), aliPayConfig.getCharset(), aliPayConfig.getSignType());
        } catch (AlipayApiException e) {
            return false;
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy