Java 支付宝支付

652 阅读1分钟

本文提供的是证书的方式实现的。

1、首先引入支付宝支付的 jar 包。

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.5.0.ALL</version>
</dependency>

2、核心代码

    @Override
    public void pay(List<OrderInfo> list,Integer userId,List<UserCoupon>couponList) {
        JSONObject json = new JSONObject();
        System.out.println("===========开始调用支付接口============");
        try {
                //构造client
                CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
                //设置网关地址
                certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
                //设置应用Id
                certAlipayRequest.setAppId("xxx");
                //设置应用私钥
                certAlipayRequest.setPrivateKey("xxx");
                //设置请求格式,固定值json
                certAlipayRequest.setFormat("json");
                //设置字符集
                certAlipayRequest.setCharset("utf-8");
                //设置签名类型
                certAlipayRequest.setSignType(RSA2);
                //设置应用公钥证书路径
                certAlipayRequest.setCertPath("xxx");
                //设置支付宝公钥证书路径
                certAlipayRequest.setAlipayPublicCertPath("xxx");
                //设置支付宝根证书路径
                certAlipayRequest.setRootCertPath("xxx");
                //构造client
                AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

                //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
                AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
                //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
                AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
                //商品详情
                model.setBody("商品购买");
                //商品名称
                model.setSubject("支付宝支付");
                //订单号(唯一订单号)
                model.setOutTradeNo("xxx");
                //支付时间
                model.setTimeoutExpress("30m");
                model.setTotalAmount("0.01");
                model.setProductCode("QUICK_MSECURITY_PAY");
                request.setBizModel(model);
                request.setNotifyUrl("xxx");
                //这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse
                AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
                System.out.println("=============调用支付宝结束查看返回==============="+response.isSuccess());
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String notify(HttpServletRequest request) {
        try {
            //获取支付宝POST过来反馈信息
            Map<String,String> params = new HashMap<>();
            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] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用。
                //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
            //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
            //boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
            boolean flag = AlipaySignature.rsaCertCheckV1(params, AlibabapayConfig.ALIPAY_CERT_PUBLIC_KEY_RSA2, AlibabapayConfig.CHATSET,AlibabapayConfig.SINGNTYPE);
            if(flag){
                //订单完成  支付完成
                if ("TRADE_SUCCESS".equals(params.get("trade_status")) || "TRADE_FINISHED".equals(params.get("trade_status"))) {
                    /**
                     *回调成功之后处理业务逻辑(比如,更新订单状态,增加积分,通知仓库发货等等。)
                     */

                    return "success";
                }
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "fail";
    }

3、到此,支付宝支付已经集成。