SpringBoot项目整合支付宝

SpringBoot项目整合支付宝SpringBoot 项目整合支付宝进行支付在盈利性网站应用中 我们经常要用到支付 支付宝和微信作为日常使用量较多的支付方式 无疑是大多数人的选择 今天我们选择支付宝为例子来讲解一下怎么在 SpringBoot 中进行整合 先看一下整个项目的目录和整合后的效果 整个项目目录结构 项目整合效果 下面详细来完成此工程 1 登录支付宝进行申请 图中

  SpringBoot项目整合支付宝进行支付

     在盈利性网站应用中,我们经常要用到支付,支付宝和微信作为日常使用量较多的支付方式,无疑是大多数人的选择,今天我们选择支付宝为例子来讲解一下怎么在SpringBoot中进行整合。

先看一下整个项目的目录和整合后的效果:

整个项目目录结构:

SpringBoot项目整合支付宝

项目整合效果:

SpringBoot项目整合支付宝

SpringBoot项目整合支付宝

下面详细来完成此工程:

1.登录支付宝进行申请:

SpringBoot项目整合支付宝

SpringBoot项目整合支付宝

图中沙箱中的APPID已经存在,支付宝沙箱网关已经存在,这两个在后面的后台应用中需要用到。自己需要填的为RSA2(SHA256)秘钥。这个可以通过支付宝的秘钥生成工具进行生成,详细的生成过程可以点击下图中的红色标出按钮,然后点击生成方法,根据提示进行操作。

SpringBoot项目整合支付宝

然后将生成的公钥粘贴到此处。这里我已经配好了公钥如下图:

SpringBoot项目整合支付宝

2.配好了环境我们开始进行SpringBoot和支付接口的整合

(1)新建SpringBoot工程

这里用的是Idea。直接在idea里面通过springboot应用的引导进行创建。

(2)引入支付宝jar包

可以在https://docs.open.alipay.com/54/下载所需的jar包。如下图我们选择java版本的。

SpringBoot项目整合支付宝

(3) 解压后将jar包引入工程

  引入工程的方法有很多,这里提供一种:直接点击idea中如下图标。

SpringBoot项目整合支付宝

然后出现如下图界面。选择Modules,找到右图中的Dependeccies,然后点击下图中红色标出的“+”号,选择第一个定位到解压的jar包,然后将所有jar包引用。

SpringBoot项目整合支付宝

(3)进行pom文件配置

我们采用SpringBoot默认的thymeleaf末班引擎,所以在pom中加入以下依赖。

 
   
   
     org.springframework.boot 
    
   
     spring-boot-starter-thymeleaf 
    
   

(4)接下来新建AlipayConfig类,主要是支付宝的配置类。

该类也可以直接从官方文档里将该类复制过来。官方文档下载地址为:https://docs.open.alipay.com/270/

package com.lzh.zfbpaydemo.paycommon;
import java.io.FileWriter;
import java.io.IOException;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {
   
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
   // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
   public static String app_id = "对应沙箱中的APPID";
   
   // 商户私钥,您的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这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
   public static String notify_url = " http://49.269.31.237:8081 /pay/synnotify";

   // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
   public static String return_url = "http://49.269.31.237:8081/pay/return_notify";

   // 签名方式
   public static String sign_type = "RSA2";
   
   // 字符编码格式
   public static String charset = "utf-8";
   
   // 支付宝网关
   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();
                }
            }
        }
    }
}

(5)新建PayService类,该类主要用来调用支付宝接口进行实际的支付。

package com.lzh.zfbpaydemo.paycommon; 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.response.AlipayTradePagePayResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.*; @Controller public class PayService { @RequestMapping("/order/test") public String test(){ return "SynNotify"; } //支付宝支付确认付款跳转页面 @RequestMapping("/order/confrim") public void oderConfirm(HttpServletRequest request, HttpServletResponse response) { //虚拟一个订单,将其信息定义如下 String title = "支付订单"; String total = "1200"; String message = "备注"; //生成订单号 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String orderSn = simpleDateFormat.format(Calendar.getInstance().getTime()); Map 
  
    map=new LinkedHashMap<>(); //像支付宝发送请求 //初始化AlipClient 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 out_trade_no = orderSn; //付款金额,必填 String total_amount = total; //订单名称,必填 String subject = title; //商品描述,可空 String body = message; alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明 //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," // + "\"total_amount\":\""+ total_amount +"\"," // + "\"subject\":\""+ subject +"\"," // + "\"body\":\""+ body +"\"," // + "\"timeout_express\":\"10m\"," // + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节 AlipayTradePagePayResponse alipayResponse = null; try { alipayResponse=alipayClient.pageExecute(alipayRequest); response.setContentType("text/html;charset=" + AlipayConfig.charset); response.getWriter().write(alipayResponse.getBody());//直接将完整的表单html输出到页面 } catch (AlipayApiException e) { e.printStackTrace(); } catch (Exception e){ System.out.println("error"); e.printStackTrace(); } finally { } } //支付宝异步通知 @RequestMapping("pay/synnotify") public String synNotify(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException { Map 
   
     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); } boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名 //——请在这里编写您的程序(以下代码仅作参考)—— /* 实际验证过程建议商户务必添加以下校验: 1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if (signVerified) {//验证成功 //商户订单号 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"); if (trade_status.equals("TRADE_FINISHED")) { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } else if (trade_status.equals("TRADE_SUCCESS")) { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 } System.out.println("success"); } else {//验证失败 System.out.println("fail"); //调试用,写文本函数记录程序运行情况是否正常 //String sWord = AlipaySignature.getSignCheckContentV1(params); //AlipayConfig.logResult(sWord); } return "SynNotify"; } //支付宝同步通知 @RequestMapping("pay/return_notify") public String returnNotify(){ return "return_notify"; } } 
       
      
     
    
  

(6)建立return_notify.html同步通知页面、SynNotify.html异步通知页面

return_notify.html内容如下:

 
   
   Title 
   

支付成功!

SynNotify.html页面内容如下:

 
   
   Title 
   

支付宝异步通知!

(7)然后启动应用,在浏览器输入localhost:8081\order\confrim就可以看到如下的支付宝支付页面:

SpringBoot项目整合支付宝

(8)然后下载支付宝沙箱版app,在开发者中心下图所示,将其安装在手机。

SpringBoot项目整合支付宝

(9)登录沙箱账号,沙箱账号可在自己的支付宝官网沙箱应用中查看,如下图,登录后就可以进行支付测试。

SpringBoot项目整合支付宝

(10)支付后,我们看不到同步通知异步通知页面,因为支付宝同步异步通知需要公网能进行访问,下面我们打包我们的应用将其部署在服务器上进行测试。

在idea中,自己导入的jar包,用mvn进行打包的过程中会提示找不到支付宝的配置类。我们采用如下方式进行。在工程中新建一个名为jar的文件夹。将支付宝jar包复制到该文件夹。如下图

SpringBoot项目整合支付宝

然后在pom文件中进行配置加入下面的代码。其中groupid、artifactId,version可以便随填写。

 
   
   
     com 
    
   
     pay-sdk 
    
   
     4.8.0 
    
   
     system 
    
   
     ${project.basedir}/jar/alipay-sdk-java-4.8.0.jar 
    
   
   
   
     com 
    
   
     bcprov-jdk15on 
    
   
     1.62 
    
   
     system 
    
   
     ${project.basedir}/jar/bcprov-jdk15on-1.62.jar 
    
   
   
   
     com 
    
   
     log 
    
   
     1.1.1 
    
   
     system 
    
   
     ${project.basedir}/jar/commons-logging-1.1.1.jar 
    
   
   
   
     com 
    
   
     json 
    
   
     1.2.50 
    
   
     system 
    
   
     ${project.basedir}/jar/fastjson-1.2.50.jar 
    
   
   
    
     
     
       org.springframework.boot 
      
     
       spring-boot-maven-plugin 
      
      
       
        
        
          repackage 
         
        
       
      
      
      
        true 
       
      
     
    
   

然后找到右边maven,如下图,先点击:clean后点击package进行打包,这里打包为jar文件。

SpringBoot项目整合支付宝

(11)将其部署到服务器进行测试。最后支付后会出现如下图所示,至此,springboot整合支付宝接口完成。

 

SpringBoot项目整合支付宝

 

SpringBoot项目整合支付宝SpringBoot项目整合支付宝

 

 

SpringBoot项目整合支付宝

至此SpringBoot整合支付宝项目完成,测试环境已经搭好。。。。。。。。。。。。。。。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223811.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:23
下一篇 2026年3月17日 下午1:23


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号