最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java對接支付寶支付接口簡單步驟記錄

 更新時間:2024年05月03日 10:56:53   作者:子木凝煙  
最近項(xiàng)目APP需要接入微信、支付寶支付功能,在分配開發(fā)任務(wù)時,聽說微信支付接口比支付寶支付接口要難實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于java對接支付寶支付接口的簡單步驟,需要的朋友可以參考下

1、登錄支付寶開放平臺,獲取支付寶對接參數(shù)

參考地址:支付寶開放平臺

1)進(jìn)入控制臺,創(chuàng)建應(yīng)用,得到應(yīng)用ID。

2)進(jìn)入應(yīng)用,開發(fā)設(shè)置,設(shè)置接口加密方式,得到應(yīng)用私鑰、支付寶公鑰。

3)進(jìn)入應(yīng)用,產(chǎn)品綁定,綁定支付產(chǎn)品。

2、java代碼的靜態(tài)配置文件中配置支付寶對接參數(shù)以及回調(diào)地址,并讀取到代碼中


/**
 * 支付寶配置參數(shù)
 */
@Configuration
public class AlipayConfig {
	//應(yīng)用id
	public  static String appId;
	//應(yīng)用私鑰

	public static String privateKey;
	//支付寶公鑰
	public static String alipayPublicKey;
	//請求網(wǎng)關(guān)地址
	public static String  alipayGateway;
	// 異步接收地址
	public static String notifyUrl;
	// 同步跳轉(zhuǎn)地址
	public static String returnUrl;
	// 編碼格式
	public static String input_charset_utf = "utf-8";
	//編碼格式
	public static String input_charset_gbk = "GBK";
	// 簽名方式
	public static String sign_type_md5 = "MD5";
	//簽名方式
	public static String sign_type_rsa2 = "RSA2";
	//字符串格式
	public static String format="json";

	@Value("${alipay.appId}")
	public void setAppId(String appId) {
		AlipayConfig.appId = appId;
	}

	@Value("${alipay.privateKey}")
	public void setPrivateKey(String privateKey) {
		AlipayConfig.privateKey = privateKey;
	}

	@Value("${alipay.alipayPublicKey}")
	public void setAlipayPublicKey(String alipayPublicKey) {
		AlipayConfig.alipayPublicKey = alipayPublicKey;
	}

	@Value("${alipay.alipayGateway}")
	public void setAlipayGateway(String alipayGateway) {
		AlipayConfig.alipayGateway = alipayGateway;
	}

	@Value("${alipay.notifyUrl}")
	public void setNotifyUrl(String notifyUrl) {
		AlipayConfig.notifyUrl = notifyUrl;
	}

	@Value("${alipay.returnUrl}")
	public void setReturnUrl(String returnUrl) {
		AlipayConfig.returnUrl = returnUrl;
	}
}

3、查看文檔小程序文檔 - 支付寶文檔中心,根據(jù)支付寶提供的api實(shí)現(xiàn)接口對接。

/**
 * 支付寶接口對接
 */
public class AlipayPayUtil {
	/**
	 * 發(fā)起支付請求
	 * 統(tǒng)一收單下單并支付頁面接口
	 *
	 * @return
	 */
	public static AjaxResult alipayPay(String orderNum, BigDecimal price, String title){
		try{
			AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.alipayGateway, AlipayConfig.appId,  AlipayConfig.privateKey, AlipayConfig.format, AlipayConfig.input_charset_utf,  AlipayConfig.alipayPublicKey, AlipayConfig.sign_type_rsa2);
			AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
			//異步接收地址,僅支持http/https,公網(wǎng)可訪問
			request.setNotifyUrl(AlipayConfig.notifyUrl);
			//同步跳轉(zhuǎn)地址,僅支持http/https
			request.setReturnUrl(AlipayConfig.returnUrl);
			/******必傳參數(shù)******/
			JSONObject bizContent = new JSONObject();
			//商戶訂單號,商家自定義,保持唯一性
			bizContent.put("out_trade_no",orderNum);
			//支付金額,最小值0.01元
			bizContent.put("total_amount", price);
			//訂單標(biāo)題,不可使用特殊符號
			bizContent.put("subject",title);
			//訂單描述
			bizContent.put("body", title);
			//電腦網(wǎng)站支付場景固定傳值FAST_INSTANT_TRADE_PAY
			bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");

			request.setBizContent(bizContent.toString());

			AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
			if (response.isSuccess()) {
				return AjaxResult.success(response.getBody());
			} else {
				return AjaxResult.error("調(diào)用失敗");
			}
		}catch (Exception e){
			e.printStackTrace();
			return AjaxResult.error("調(diào)用失敗");
		}

	}

	/**
	 * 統(tǒng)一收單線下交易查詢接口
	 * @param tradeNo  支付寶交易號
	 */
	public AjaxResult alipayQuery(String tradeNo){
       try{
		   AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.alipayGateway, AlipayConfig.appId,  AlipayConfig.privateKey, AlipayConfig.format, AlipayConfig.input_charset_utf,  AlipayConfig.alipayPublicKey, AlipayConfig.sign_type_rsa2);
		   AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
		   JSONObject bizContent = new JSONObject();
		   bizContent.put("trade_no", tradeNo);
		   request.setBizContent(bizContent.toString());
		   AlipayTradeQueryResponse response = alipayClient.execute(request);
		   if(response.isSuccess()){
			   return AjaxResult.success(response.getBody());
		   } else {
			   return AjaxResult.error("調(diào)用失敗");
		   }
	   }catch (Exception e){
		   e.printStackTrace();
		   return AjaxResult.error("調(diào)用失敗");
	   }
	}

	/**
	 * 統(tǒng)一收單交易關(guān)閉接口
	 * @param tradeNo 支付寶交易號
	 */
	public AjaxResult alipayClose(String tradeNo){
       try{
		   AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.alipayGateway, AlipayConfig.appId,  AlipayConfig.privateKey, AlipayConfig.format, AlipayConfig.input_charset_utf,  AlipayConfig.alipayPublicKey, AlipayConfig.sign_type_rsa2);
		   AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
		   JSONObject bizContent = new JSONObject();
		   bizContent.put("trade_no", tradeNo);
		   request.setBizContent(bizContent.toString());
		   AlipayTradeCloseResponse response = alipayClient.execute(request);
		   if(response.isSuccess()){
			   return AjaxResult.success(response.getBody());
		   } else {
			   return AjaxResult.error("調(diào)用失敗");
		   }
	   }catch (Exception e){
		   e.printStackTrace();
		   return AjaxResult.error("調(diào)用失敗");
	   }
	}

	/**
	 * 統(tǒng)一收單交易退款請求
	 *  全額退款,out_request_no 選填。
	 * 	部分退款,out_request_no 必傳。
	 * @param tradeNo 支付寶交易號
	 */
	public AjaxResult alipayRefund(String tradeNo,BigDecimal price){
		try{
			AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.alipayGateway, AlipayConfig.appId,  AlipayConfig.privateKey, AlipayConfig.format, AlipayConfig.input_charset_utf,  AlipayConfig.alipayPublicKey, AlipayConfig.sign_type_rsa2);
			AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
			JSONObject bizContent = new JSONObject();
			bizContent.put("trade_no", tradeNo);
			bizContent.put("refund_amount", price);
			bizContent.put("out_request_no", "T"+Seq.getOrderNum());
			request.setBizContent(bizContent.toString());
			AlipayTradeRefundResponse response = alipayClient.execute(request);
			if(response.isSuccess()){
				return AjaxResult.success(response.getBody());
			} else {
				return AjaxResult.error("調(diào)用失敗");
			}
		}catch (Exception e){
			e.printStackTrace();
			return AjaxResult.error("調(diào)用失敗");
		}
	}

	/**
	 * 統(tǒng)一收單交易退款查詢
	 * @param tradeNo 支付寶交易號
	 */
	public AjaxResult alipayRefundQuery(String tradeNo){
		try{
			AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.alipayGateway, AlipayConfig.appId,  AlipayConfig.privateKey, AlipayConfig.format, AlipayConfig.input_charset_utf,  AlipayConfig.alipayPublicKey, AlipayConfig.sign_type_rsa2);
			AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
			JSONObject bizContent = new JSONObject();
			bizContent.put("trade_no", tradeNo);
			bizContent.put("out_request_no","T"+ Seq.getOrderNum());
			request.setBizContent(bizContent.toString());
			AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
			if(response.isSuccess()){
				return AjaxResult.success(response.getBody());
			} else {
				return AjaxResult.error("調(diào)用失敗");
			}
		}catch (Exception e){
			e.printStackTrace();
			return AjaxResult.error("調(diào)用失敗");
		}
	}

}

4、回調(diào)接口處理,支付寶回調(diào)接口分為同步回調(diào)、異步回調(diào),同步接口,業(yè)務(wù)處理后,可直接跳轉(zhuǎn)至配置的網(wǎng)頁,并返回處理信息

/**
     * 支付寶回調(diào)地址-同步通知頁面路徑
     *
     * @return
     */
    @RequestMapping(value = "/returnUrl")
    public void returnUrl(HttpServletRequest request,HttpServletResponse response) throws IOException {
        try {
            //獲取支付寶GET過來反饋信息
            Map<String, String> params = new HashMap<String, String>();
            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] + ",";
                }
                params.put(name, valueStr);
            }
            // 獲取支付寶的通知返回參數(shù)
            String out_trade_no = request.getParameter("out_trade_no");// 商戶訂單號
            String trade_no = request.getParameter("trade_no");// 支付寶交易號
            String seller_id=request.getParameter("seller_id");// 收款支付寶賬號對應(yīng)的支付寶唯一用戶號
            String total_amount=request.getParameter("total_amount");// 交易金額
            log.info("returnUrl支付寶訂單交易:[商戶訂單號]"+out_trade_no+",[支付寶交易號trade_no]"+trade_no+",[收款支付寶賬號seller_id]"+seller_id+",[交易金額total_amount]"+total_amount);

            //調(diào)用SDK驗(yàn)證簽名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipayPublicKey, AlipayConfig.input_charset_utf, AlipayConfig.sign_type_rsa2);
            if(signVerified) {
                //修改訂單狀態(tài),根據(jù)商戶訂單號查詢訂單信息
               
                response.sendRedirect(this.alerturl + "?type=ZF&status=300");
            }else {
                log.error("驗(yàn)簽失敗,請聯(lián)系管理員解決");
                response.sendRedirect(this.alerturl + "?type=ZF&status=303");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("訂單修改失敗,請聯(lián)系管理員解決");
            response.sendRedirect(this.alerturl + "?type=ZF&status=304");
        }
    }
    /**
     * 支付寶回調(diào)地址-異步通知頁面路徑
     *
     * @return
     */
    @PostMapping(value = "/notifyUrl")
    public String notifyUrl(HttpServletRequest request) {
        try {
            // 獲取支付寶GET過來反饋信息
            Map<String, String> params = new HashMap<String, String>();
            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] + ",";
                }
                params.put(name, valueStr);
            }
            // 獲取支付寶的通知返回參數(shù)
            String out_trade_no = request.getParameter("out_trade_no");// 商戶訂單號
            String trade_no = request.getParameter("trade_no");// 支付寶交易號
            String seller_id=request.getParameter("seller_id");// 收款支付寶賬號對應(yīng)的支付寶唯一用戶號
            String total_amount=request.getParameter("total_amount");// 交易金額
            String trade_status = request.getParameter("trade_status");// 交易狀態(tài)
            log.info("notifyUrl異步回調(diào),支付寶訂單交易:[商戶訂單號]"+out_trade_no+",[支付寶交易號trade_no]"+trade_no+",[收款支付寶賬號seller_id]"+seller_id+",[交易金額total_amount]"+total_amount+",[交易狀態(tài)]"+trade_status);
            //調(diào)用SDK驗(yàn)證簽名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipayPublicKey, AlipayConfig.input_charset_utf, AlipayConfig.sign_type_rsa2); //調(diào)用SDK驗(yàn)證簽名
            if(signVerified) {
                if(trade_status.equals("TRADE_FINISHED")||trade_status.equals("TRADE_SUCCESS")){
                    //根據(jù)商戶訂單號查詢訂單信息處理
               
                    return "success";
                }else {
                    return "fail";
                }
            }else {
                //驗(yàn)證失敗
                log.error("驗(yàn)簽失敗,請聯(lián)系管理員解決");
                return "fail";
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("訂單修改失敗,請聯(lián)系管理員解決");
            return "fail";
        }

    }

注意:

如果框架接口訪問有權(quán)限限制,需要放開支付寶異步回調(diào)地址,否則無法訪問

總結(jié)

到此這篇關(guān)于java對接支付寶支付接口的文章就介紹到這了,更多相關(guān)java對接支付寶支付接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • 劍指Offer之Java算法習(xí)題精講二叉搜索樹與數(shù)組查找

    劍指Offer之Java算法習(xí)題精講二叉搜索樹與數(shù)組查找

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • JAVA異常分類和處理解析

    JAVA異常分類和處理解析

    這篇文章主要介紹了JAVA異常分類和處理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 深入理解Java之jvm啟動流程

    深入理解Java之jvm啟動流程

    這篇文章主要介紹了深入理解Java之jvm啟動流程,文章內(nèi)容講解的很清晰,有對這方面感興趣的同學(xué)可以研究下
    2021-02-02
  • SpringBoot集成Drools打造動態(tài)規(guī)則管理模板引擎

    SpringBoot集成Drools打造動態(tài)規(guī)則管理模板引擎

    本文詳解SpringBoot與Drools的整合方法,涵蓋依賴管理、規(guī)則文件編寫、KieService配置等,旨在通過規(guī)則引擎實(shí)現(xiàn)業(yè)務(wù)邏輯動態(tài)化管理,提升微服務(wù)應(yīng)用的靈活性、可維護(hù)性及快速部署能力,對SpringBoot Drools相關(guān)知識感興趣的朋友一起看看吧
    2025-07-07
  • SpringBoot實(shí)現(xiàn)驗(yàn)證碼的案例分享

    SpringBoot實(shí)現(xiàn)驗(yàn)證碼的案例分享

    驗(yàn)證碼可以有效防止其他人對某一個特定的注冊用戶用特定的程序,破解方式進(jìn)行不斷的登錄嘗試,我們其實(shí)很經(jīng)??吹?登錄一些網(wǎng)站其實(shí)是需要驗(yàn)證碼的,所以本文給大家分享了SpringBoot實(shí)現(xiàn)驗(yàn)證碼的案例,需要的朋友可以參考下
    2024-11-11
  • SpringBoot整合SpringAI配置多平臺API密鑰的解決方案

    SpringBoot整合SpringAI配置多平臺API密鑰的解決方案

    本文介紹了如何在SpringBoot項(xiàng)目中整合SpringAI配置平臺API密鑰,包括添加依賴、配置文件、配置屬性類及核心配置類等,通過動態(tài)切換不同AI平臺,實(shí)現(xiàn)統(tǒng)一接口調(diào)用,此外,支持YAML配置和環(huán)境變量,便于靈活配置和擴(kuò)展新平臺,需要的朋友可以參考下
    2026-05-05
  • Java字母加數(shù)字組合比較大小

    Java字母加數(shù)字組合比較大小

    這篇文章主要通過實(shí)現(xiàn)Comarable接口來比較(如"a20"和"a9"這種)字符串的大小,希望能給大家做一個參考。
    2016-06-06
  • SpringBoot整合Gson 整合Fastjson的實(shí)例詳解

    SpringBoot整合Gson 整合Fastjson的實(shí)例詳解

    這篇文章主要介紹了SpringBoot整合Gson 整合Fastjson的實(shí)例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • JPA多條件復(fù)雜SQL動態(tài)分頁查詢功能

    JPA多條件復(fù)雜SQL動態(tài)分頁查詢功能

    這篇文章主要介紹了JPA多條件復(fù)雜SQL動態(tài)分頁查詢功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 最新評論

    榆中县| 宝坻区| 沙洋县| 浦城县| 鄄城县| 安乡县| 弥勒县| 博罗县| 罗田县| 遵义市| 元阳县| 平罗县| 汶上县| 揭东县| 加查县| 堆龙德庆县| 大渡口区| 通州市| 临清市| 岳阳市| 上思县| 丰镇市| 陵川县| 高平市| 天峨县| 通江县| 宁陕县| 巴中市| 临江市| 东乡| 墨竹工卡县| 民勤县| 大姚县| 运城市| 景宁| 隆化县| 泽库县| 孟州市| 齐齐哈尔市| 宜州市| 石柱|