Loading...
墨滴

java后端指南

2021/04/11  阅读:54  主题:雁栖湖

springboot整合支付宝支付

Part1文章首推

Part2今日主题:springboot整合支付宝支付

1简介

相信大家在项目开发中可能会碰到需要整合支付宝支付的功能,这个时候,我们需要知道应该如何整合,我之前写过一篇普通的支付宝支付的文章,今天来讲一下springboot如何整合支付宝支付。

2环境

  • springboot
  • 支付宝开发平台助手

3实现过程

1、首先我们需要建立一个springboot工程,支付宝开发助手需要去支付宝开发平台去下载

   <!-- 支付宝支付SDK -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.3.49.ALL</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.7</version>
        </dependency>

2、创建一个配置类

public class AlipayConfig {
 
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
 public static String app_id = "";
 
 // 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "";
 
 // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "";

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

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

    public static String return_url2 = "http://localhost:8080/payment/alipayReturnNotice2";

 // 签名方式
 public static String sign_type = "RSA2";
 
 // 字符编码格式
 public static String charset = "utf-8";

    public final static String FORMAT = "JSON";// 返回格式
 
 // 支付宝网关
 public static String gatewayUrl = "https://openapi.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.我们需要添加一个控制类

   @Autowired
    private AlipayService alipayService;
    /**
     * 直接购买商品逻辑
     * @param response
     * @param request
     */

    @RequestMapping(value = "/pay")
    @ResponseBody
    public void payMent(String money, HttpServletResponse response, HttpServletRequest request) {
        try {
            String result=alipayService.aliPay(money,response,request);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 支付宝同步通知页面,成功返回
     * @param request
     * @param response
     * @param httpSession
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/alipayReturnNotice")
    public String alipayReturnNotice(HttpServletRequest request, HttpServletRequest response, HttpSession httpSession) throws Exception {
        log.info("支付成功, 进入同步通知接口...");
        //获取支付宝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);
        }
        log.info("支付宝返回参数:"+params);
        // 调用SDK验证签名
        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
        if(signVerified) {
            //商户订单号
            String orderNo = 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");

            //alipayService.onlyBuy(orderNo);

            log.info("******************** 支付成功(支付宝同步通知) ********************");
            log.info("* 订单号: {}", orderNo);
            log.info("* 支付宝交易号: {}", trade_no);
            log.info("* 实付金额: {}", total_amount);
            log.info("***************************************************************");

        }else{
            log.error("同步回调签名验证失败");
        }
        return "redirect:/index.html";
    }

业务类的实现方式

public String aliPay(String money, HttpServletResponse response, HttpServletRequest request) throws Exception {
        response.setContentType("text/html;charset=utf-8");

        //将数据进行插入到订单表中


        //调用支付宝支付
        PrintWriter out = response.getWriter();
        //获得初始化的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 order_number = new String(System.currentTimeMillis()+"");
        //付款金额,从前台获取,必填
        String total_amount = new String(money);
        //订单名称,必填
        String subject = new String("订单");

        aliPayRequest.setBizContent("{\"out_trade_no\":\"" + order_number + "\","
                + "\"total_amount\":\"" + total_amount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        String result = null;

        result = alipayClient.pageExecute(aliPayRequest).getBody();

        //输出
        out.println(result);
        log.info("返回结果={}",result);
        return result;
    }

4、直接访问控制器的地址,就可以弹出支付界面

回复:支付宝支付 获取demo


欢迎关注:java后端指南

java后端指南

2021/04/11  阅读:54  主题:雁栖湖

作者介绍

java后端指南

公众号:java后端指南