Java中Spring Boot支付宝扫码支付及支付回调的实现代码

 更新时间:2021年02月22日 10:05:23   作者:Yy夜雨  
这篇文章主要介绍了Java中Spring Boot支付宝扫码支付及支付回调的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言:最近开发支付宝支付功能,总结一下做个分享

官方文档:https://opendocs.alipay.com/apis
支付宝沙箱地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info
支付宝支付流程:

准备工作:获取支付宝沙箱数据(APPID,支付宝网关,RSA2秘,沙箱支付账号等)
集成SpringBoot,使用Java代码发起支付请求
支付宝收到支付请求后,返回HTML代码片段,用于前端展示二维码
扫码支付成功后,支付宝发送同步、异步通知请求,同步、异步通知路径可在配置文件中进行配置
收到异步通知结果后,进行验签,验签通过,返回成功信息通知支付宝不在进行异步通知
此时支付宝支付流程完成,调用支付宝查询接口,确认支付成功

一、获取支付宝沙箱数据

打开上述沙箱地址,获取沙箱配置,查看下图信息

在这里插入图片描述

二、集成SpringBoot,使用Java代码发起支付请求

1、在pom.xml文件添加支付宝依赖

<!-- 支付宝支付 -->
		<dependency>
			<groupId>com.alipay.sdk</groupId>
			<artifactId>alipay-sdk-java</artifactId>
			<version>3.7.26.ALL</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/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp"; 
	
	// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	
	// TODO 这里需要配置支付宝回调的前端路径,必须要外网可以访问
	public static String return_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";	

	// 签名方式
	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();
				}
			}
		}
	}
}

3、定义Service

public interface AlipayService {

  /**
   * 发起支付
   * @param outTradeNo  订单编号(唯一)
   * @param totalAmount  订单价格
   * @param subject    商品名称
   */
  String goPay(String outTradeNo,BigDecimal totalAmount,String subject) throws Exception;
  
  /**
   * 交易查询
   * @param outTradeNo 订单编号(唯一)
   */
  String query(String outTradeNo) throws AlipayApiException;
  
  /**
   * 交易关闭
   * @param outTradeNo订单编号(唯一)
   */
  String close(String outTradeNo) throws AlipayApiException;
}

4、实现ServiceImpl,发起支付请求,交易查询等

public class AlipayServiceImpl implements AlipayService {

	@Autowired
	private RechargeDetailService rechargeDetailService;

	@Override
	public String goPay(String outTradeNo, BigDecimal totalAmount, String subject) throws Exception {

		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);

		alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount
				+ "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"付款\"," + "\"timeout_express\":\"15m\","
				+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

		/** 转换格式 */
		String form = "";

		form = alipayClient.pageExecute(alipayRequest).getBody();

		return form;

	}
	@Override
	public String query(String outTradeNo) throws AlipayApiException {
		AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
				AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,
				AlipayConfig.sign_type);
		AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
		/** 请求接口 */
		alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");
		/** 转换格式 */
		String result = alipayClient.execute(alipayRequest).getBody();
		return result;
	}

	@Override
	public String close(String outTradeNo) throws AlipayApiException {
		AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();
		AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
				AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,
				AlipayConfig.sign_type);
		alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");

		String result = alipayClient.execute(alipayRequest).getBody();

		return result;
	}
}

5、创建支付宝controller

public class AlipayController {

  @Autowired
  private AlipayService alipayService;
  
  /**
   * 订单支付
   */
  @GetMapping("goPay")
  public Map<Object, Object> goPay() throws Exception{
    /** 模仿数据库,从后台调数据*/
    String outTradeNo = "202101010001";
    BigDecimaltotalAmount = new BigDecimal(10000);
    String subject = "苹果12";
    
    String pay = alipayService.goPay(outTradeNo, totalAmount, subject);
    
    Map<Object, Object> pays = new HashMap<>();
    pays.put("pay", pay);
    
    return pays;
  }
  
  /**
   * 交易查询
   */
  @PostMapping("aipayQuery")
  public Result<Object> alipayQuery() throws Exception{
    /**调取支付订单号*/
    String outTradeNo = "13123";
    
    String query = alipayService.query(outTradeNo);
    
    Object json = JSONObject.toJSON(query);
    
    /*JSONObject jObject = new JSONObject();
    jObject.get(query);*/
    return Result.success(json);
  }
  
  /**
   * 交易关闭
   * @throws AlipayApiException 
   */
  @PostMapping("alipayclose")
  public Result<Object> alipaycolse() throws AlipayApiException{
    
    /** 调取数据*/
    String outTradeNo = "13123";
    
    String close = alipayService.close(outTradeNo);
    
    return Result.success(close);
  }
  /**
	 * 异步通知支付结果
	 * 
	 * @param request
	 * @return String
	 * @throws AlipayApiException
	 * @throws ParseException
	 */
	@PostMapping("/callBack")
	public String alipayNotify(HttpServletRequest request) throws Exception {

		// 获取支付宝的请求信息
		Map<String, String> map = new HashMap<>();
		Map<String, String[]> requestParams = request.getParameterMap();
		if(requestParams.isEmpty()) {
			return "failure";
		}
		// 将 Map<String,String[]> 转为 Map<String,String>
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = iter.next();
			String[] values = requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			map.put(name, valueStr);
		}
		// 验签
		boolean signVerified = AlipaySignature.rsaCheckV1(map, AlipayConfig.alipay_public_key, AlipayConfig.charset,
				AlipayConfig.sign_type);
		// 验签通过
		if (signVerified) {
			//支付成功后进行操作
		}
		return "failure";
	}
}

到此SpringBoot整合支付宝扫码支付,就完成了

到此这篇关于Java中Spring Boot支付宝扫码支付及支付回调的实现代码的文章就介绍到这了,更多相关Spring Boot支付宝扫码支付内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现AI五子棋游戏的示例代码

    Java实现AI五子棋游戏的示例代码

    本文只是介绍五子棋AI的实现,最终的成品只是一个 AI 接口,并不包括 GUI,且不依赖 GUI,文中的示例代码讲解详细,感兴趣的可以尝试一下
    2022-09-09
  • JavaWeb中Session对象的学习笔记

    JavaWeb中Session对象的学习笔记

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象,即session对象,这篇文章就为大家详细介绍Session对象的定义、实现原理等基础知识点,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • JAVA不可变类(immutable)机制与String的不可变性(推荐)

    JAVA不可变类(immutable)机制与String的不可变性(推荐)

    这篇文章主要介绍了JAVA不可变类(immutable)机制与String的不可变性(推荐)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • Springboot下使用Redis管道(pipeline)进行批量操作

    Springboot下使用Redis管道(pipeline)进行批量操作

    本文主要介绍了Spring boot 下使用Redis管道(pipeline)进行批量操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • SpringBoot使用Mybatis-Generator配置过程详解

    SpringBoot使用Mybatis-Generator配置过程详解

    这篇文章主要介绍了SpringBoot使用Mybatis-Generator配置过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • MyBatis源码分析之日志记录详解

    MyBatis源码分析之日志记录详解

    这篇文章主要给大家介绍了关于MyBatis源码分析之日志记录的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java中Semaphore(信号量)的使用方法

    Java中Semaphore(信号量)的使用方法

    这篇文章主要介绍了Java中Semaphore(信号量)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 微信公众号获取access_token的方法实例分析

    微信公众号获取access_token的方法实例分析

    这篇文章主要介绍了微信公众号获取access_token的方法,结合实例形式分析了java实现微信公众号获取access_token的相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • 解析idea内嵌浏览器翻译

    解析idea内嵌浏览器翻译

    这篇文章主要介绍了解析idea内嵌浏览器翻译的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • java读取解析xml文件实例

    java读取解析xml文件实例

    这篇文章主要介绍了java读取解析xml文件实例,本文创建了一个XML解析类同时讲解了循环节点输出方式,需要的朋友可以参考下
    2015-03-03

最新评论