欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼

 更新時(shí)間:2021年02月22日 10:05:23   作者:Yy夜雨  
這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言:最近開(kāi)發(fā)支付寶支付功能,總結(jié)一下做個(gè)分享

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

準(zhǔn)備工作:獲取支付寶沙箱數(shù)據(jù)(APPID,支付寶網(wǎng)關(guān),RSA2秘,沙箱支付賬號(hào)等)
集成SpringBoot,使用Java代碼發(fā)起支付請(qǐng)求
支付寶收到支付請(qǐng)求后,返回HTML代碼片段,用于前端展示二維碼
掃碼支付成功后,支付寶發(fā)送同步、異步通知請(qǐng)求,同步、異步通知路徑可在配置文件中進(jìn)行配置
收到異步通知結(jié)果后,進(jìn)行驗(yàn)簽,驗(yàn)簽通過(guò),返回成功信息通知支付寶不在進(jìn)行異步通知
此時(shí)支付寶支付流程完成,調(diào)用支付寶查詢接口,確認(rèn)支付成功

一、獲取支付寶沙箱數(shù)據(jù)

打開(kāi)上述沙箱地址,獲取沙箱配置,查看下圖信息

在這里插入圖片描述

二、集成SpringBoot,使用Java代碼發(fā)起支付請(qǐng)求

1、在pom.xml文件添加支付寶依賴

<!-- 支付寶支付 -->
		<dependency>
			<groupId>com.alipay.sdk</groupId>
			<artifactId>alipay-sdk-java</artifactId>
			<version>3.7.26.ALL</version>
		</dependency>

2、在項(xiàng)目中新建一個(gè)支付寶工具類

public class AlipayConfig {
	// ↓↓↓↓↓↓↓↓↓↓請(qǐng)?jiān)谶@里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

	// 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào)
	public static String app_id = "";

	// 商戶私鑰,您的PKCS8格式RSA2私鑰
	public static String merchant_private_key = "";

	// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對(duì)應(yīng)APPID下的支付寶公鑰。
	public static String alipay_public_key = "";

	// 服務(wù)器異步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)
	
	// 這里需要配置支付寶回調(diào)的后端路徑,必須要外網(wǎng)可以訪問(wèn)
	public static String notify_url = "http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp"; 
	
	// 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)
	
	// TODO 這里需要配置支付寶回調(diào)的前端路徑,必須要外網(wǎng)可以訪問(wèn)
	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";

	// 支付寶網(wǎng)關(guān)
	public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

	// 日志路徑
	public static String log_path = "C:\\";

	// ↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

	/**
	 * 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫(kù))
	 * 
	 * @param sWord 要寫(xiě)入日志里的文本內(nèi)容
	 */
	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 {

  /**
   * 發(fā)起支付
   * @param outTradeNo  訂單編號(hào)(唯一)
   * @param totalAmount  訂單價(jià)格
   * @param subject    商品名稱
   */
  String goPay(String outTradeNo,BigDecimal totalAmount,String subject) throws Exception;
  
  /**
   * 交易查詢
   * @param outTradeNo 訂單編號(hào)(唯一)
   */
  String query(String outTradeNo) throws AlipayApiException;
  
  /**
   * 交易關(guān)閉
   * @param outTradeNo訂單編號(hào)(唯一)
   */
  String close(String outTradeNo) throws AlipayApiException;
}

4、實(shí)現(xiàn)ServiceImpl,發(fā)起支付請(qǐng)求,交易查詢等

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

		/** 同步通知,支付完成后,支付成功頁(yè)面 */
		alipayRequest.setReturnUrl(AlipayConfig.return_url);
		/** 異步通知,支付完成后,需要進(jìn)行的異步處理 */
		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\"}");

		/** 轉(zhuǎn)換格式 */
		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();
		/** 請(qǐng)求接口 */
		alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");
		/** 轉(zhuǎn)換格式 */
		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、創(chuàng)建支付寶controller

public class AlipayController {

  @Autowired
  private AlipayService alipayService;
  
  /**
   * 訂單支付
   */
  @GetMapping("goPay")
  public Map<Object, Object> goPay() throws Exception{
    /** 模仿數(shù)據(jù)庫(kù),從后臺(tái)調(diào)數(shù)據(jù)*/
    String outTradeNo = "202101010001";
    BigDecimaltotalAmount = new BigDecimal(10000);
    String subject = "蘋(píng)果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{
    /**調(diào)取支付訂單號(hào)*/
    String outTradeNo = "13123";
    
    String query = alipayService.query(outTradeNo);
    
    Object json = JSONObject.toJSON(query);
    
    /*JSONObject jObject = new JSONObject();
    jObject.get(query);*/
    return Result.success(json);
  }
  
  /**
   * 交易關(guān)閉
   * @throws AlipayApiException 
   */
  @PostMapping("alipayclose")
  public Result<Object> alipaycolse() throws AlipayApiException{
    
    /** 調(diào)取數(shù)據(jù)*/
    String outTradeNo = "13123";
    
    String close = alipayService.close(outTradeNo);
    
    return Result.success(close);
  }
  /**
	 * 異步通知支付結(jié)果
	 * 
	 * @param request
	 * @return String
	 * @throws AlipayApiException
	 * @throws ParseException
	 */
	@PostMapping("/callBack")
	public String alipayNotify(HttpServletRequest request) throws Exception {

		// 獲取支付寶的請(qǐng)求信息
		Map<String, String> map = new HashMap<>();
		Map<String, String[]> requestParams = request.getParameterMap();
		if(requestParams.isEmpty()) {
			return "failure";
		}
		// 將 Map<String,String[]> 轉(zhuǎn)為 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);
		}
		// 驗(yàn)簽
		boolean signVerified = AlipaySignature.rsaCheckV1(map, AlipayConfig.alipay_public_key, AlipayConfig.charset,
				AlipayConfig.sign_type);
		// 驗(yàn)簽通過(guò)
		if (signVerified) {
			//支付成功后進(jìn)行操作
		}
		return "failure";
	}
}

到此SpringBoot整合支付寶掃碼支付,就完成了

到此這篇關(guān)于Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Spring Boot支付寶掃碼支付內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java -D參數(shù)設(shè)置系統(tǒng)屬性無(wú)效問(wèn)題及解決

    java -D參數(shù)設(shè)置系統(tǒng)屬性無(wú)效問(wèn)題及解決

    這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • SpringBoot JMX的基本使用方式

    SpringBoot JMX的基本使用方式

    這篇文章主要介紹了SpringBoot JMX的基本使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringCloud Feign服務(wù)調(diào)用請(qǐng)求方式總結(jié)

    SpringCloud Feign服務(wù)調(diào)用請(qǐng)求方式總結(jié)

    這篇文章主要介紹了SpringCloud Feign服務(wù)調(diào)用方式總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Spring事務(wù)管理詳細(xì)講解

    Spring事務(wù)管理詳細(xì)講解

    事務(wù)的作用就是為了保證用戶的每一個(gè)操作都是可靠的,事務(wù)中的每一步操作都必須成功執(zhí)行,只要有發(fā)生異常就?回退到事務(wù)開(kāi)始未進(jìn)行操作的狀態(tài)。事務(wù)管理是Spring框架中最為常用的功能之一,我們?cè)谑褂肧pring?Boot開(kāi)發(fā)應(yīng)用時(shí),大部分情況下也都需要使用事務(wù)
    2022-10-10
  • Maven添加reactor依賴失敗的解決方案

    Maven添加reactor依賴失敗的解決方案

    起初是自己在學(xué)spring boot3,結(jié)果到了reactor這一部分的時(shí)候,在項(xiàng)目的pom.xml文件中添加下列依賴報(bào)錯(cuò),接下來(lái)通過(guò)本文給大家介紹Maven添加reactor依賴失敗的解決方案,需要的朋友可以參考下
    2024-06-06
  • 在springboot3微項(xiàng)目中如何用idea批量創(chuàng)建單元測(cè)試邏輯

    在springboot3微項(xiàng)目中如何用idea批量創(chuàng)建單元測(cè)試邏輯

    這篇文章主要介紹了在SpringBoot3項(xiàng)目中使用IntelliJIDEA批量創(chuàng)建單元測(cè)試包括準(zhǔn)備工作(確保項(xiàng)目配置正確,添加測(cè)試依賴),使用IntelliJIDEA創(chuàng)建測(cè)試,感興趣的朋友一起看看吧
    2024-10-10
  • 詳解spring boot引入外部jar包的坑

    詳解spring boot引入外部jar包的坑

    本篇文章主要介紹了spring boot引入外部jar的坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java 語(yǔ)言實(shí)現(xiàn)清除帶 html 標(biāo)簽的內(nèi)容方法

    Java 語(yǔ)言實(shí)現(xiàn)清除帶 html 標(biāo)簽的內(nèi)容方法

    下面小編就為大家?guī)?lái)一篇Java 語(yǔ)言實(shí)現(xiàn)清除帶 html 標(biāo)簽的內(nèi)容方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 詳解Java如何優(yōu)雅的處理異常

    詳解Java如何優(yōu)雅的處理異常

    在編寫(xiě) Java 程序的過(guò)程中,有一種異常幾乎每個(gè)開(kāi)發(fā)者都會(huì)遇到——空指針異常(NullPointerException),那么我們應(yīng)該如何有效且優(yōu)雅的處理空指針異常呢,下面小編就來(lái)詳細(xì)介紹這個(gè)處理方案吧
    2023-08-08
  • IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目

    IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目

    在 Java 開(kāi)發(fā)中,使用 Maven 是一種廣泛采用的構(gòu)建工具,本文主要介紹了IntelliJ IDEA基于Maven構(gòu)建Java項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論