前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot整合支付宝支付

springboot整合支付宝支付

作者头像
java后端指南
发布2021-05-13 17:04:40
8410
发布2021-05-13 17:04:40
举报
文章被收录于专栏:java后端java后端

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

简介

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

环境

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

实现过程

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

代码语言:javascript
复制
   <!-- 支付宝支付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、创建一个配置类

代码语言:javascript
复制
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.我们需要添加一个控制类

代码语言:javascript
复制
   @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";
    }

业务类的实现方式

代码语言:javascript
复制
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、直接访问控制器的地址,就可以弹出支付界面

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java后端指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今日主题:springboot整合支付宝支付
    • 简介
      • 环境
        • 实现过程
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档