java对接支付宝支付接口简单步骤记录

 更新时间:2024年05月03日 10:56:53   作者:子木凝烟  
最近项目APP需要接入微信、支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,这篇文章主要给大家介绍了关于java对接支付宝支付接口的简单步骤,需要的朋友可以参考下

1、登录支付宝开放平台,获取支付宝对接参数

参考地址:支付宝开放平台

1)进入控制台,创建应用,得到应用ID。

2)进入应用,开发设置,设置接口加密方式,得到应用私钥、支付宝公钥。

3)进入应用,产品绑定,绑定支付产品。

2、java代码的静态配置文件中配置支付宝对接参数以及回调地址,并读取到代码中


/**
 * 支付宝配置参数
 */
@Configuration
public class AlipayConfig {
	//应用id
	public  static String appId;
	//应用私钥

	public static String privateKey;
	//支付宝公钥
	public static String alipayPublicKey;
	//请求网关地址
	public static String  alipayGateway;
	// 异步接收地址
	public static String notifyUrl;
	// 同步跳转地址
	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、查看文档小程序文档 - 支付宝文档中心,根据支付宝提供的api实现接口对接。

/**
 * 支付宝接口对接
 */
public class AlipayPayUtil {
	/**
	 * 发起支付请求
	 * 统一收单下单并支付页面接口
	 *
	 * @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,公网可访问
			request.setNotifyUrl(AlipayConfig.notifyUrl);
			//同步跳转地址,仅支持http/https
			request.setReturnUrl(AlipayConfig.returnUrl);
			/******必传参数******/
			JSONObject bizContent = new JSONObject();
			//商户订单号,商家自定义,保持唯一性
			bizContent.put("out_trade_no",orderNum);
			//支付金额,最小值0.01元
			bizContent.put("total_amount", price);
			//订单标题,不可使用特殊符号
			bizContent.put("subject",title);
			//订单描述
			bizContent.put("body", title);
			//电脑网站支付场景固定传值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("调用失败");
			}
		}catch (Exception e){
			e.printStackTrace();
			return AjaxResult.error("调用失败");
		}

	}

	/**
	 * 统一收单线下交易查询接口
	 * @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("调用失败");
		   }
	   }catch (Exception e){
		   e.printStackTrace();
		   return AjaxResult.error("调用失败");
	   }
	}

	/**
	 * 统一收单交易关闭接口
	 * @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("调用失败");
		   }
	   }catch (Exception e){
		   e.printStackTrace();
		   return AjaxResult.error("调用失败");
	   }
	}

	/**
	 * 统一收单交易退款请求
	 *  全额退款,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("调用失败");
			}
		}catch (Exception e){
			e.printStackTrace();
			return AjaxResult.error("调用失败");
		}
	}

	/**
	 * 统一收单交易退款查询
	 * @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("调用失败");
			}
		}catch (Exception e){
			e.printStackTrace();
			return AjaxResult.error("调用失败");
		}
	}

}

4、回调接口处理,支付宝回调接口分为同步回调、异步回调,同步接口,业务处理后,可直接跳转至配置的网页,并返回处理信息

/**
     * 支付宝回调地址-同步通知页面路径
     *
     * @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);
            }
            // 获取支付宝的通知返回参数
            String out_trade_no = request.getParameter("out_trade_no");// 商户订单号
            String trade_no = request.getParameter("trade_no");// 支付宝交易号
            String seller_id=request.getParameter("seller_id");// 收款支付宝账号对应的支付宝唯一用户号
            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);

            //调用SDK验证签名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipayPublicKey, AlipayConfig.input_charset_utf, AlipayConfig.sign_type_rsa2);
            if(signVerified) {
                //修改订单状态,根据商户订单号查询订单信息
               
                response.sendRedirect(this.alerturl + "?type=ZF&status=300");
            }else {
                log.error("验签失败,请联系管理员解决");
                response.sendRedirect(this.alerturl + "?type=ZF&status=303");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("订单修改失败,请联系管理员解决");
            response.sendRedirect(this.alerturl + "?type=ZF&status=304");
        }
    }
    /**
     * 支付宝回调地址-异步通知页面路径
     *
     * @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);
            }
            // 获取支付宝的通知返回参数
            String out_trade_no = request.getParameter("out_trade_no");// 商户订单号
            String trade_no = request.getParameter("trade_no");// 支付宝交易号
            String seller_id=request.getParameter("seller_id");// 收款支付宝账号对应的支付宝唯一用户号
            String total_amount=request.getParameter("total_amount");// 交易金额
            String trade_status = request.getParameter("trade_status");// 交易状态
            log.info("notifyUrl异步回调,支付宝订单交易:[商户订单号]"+out_trade_no+",[支付宝交易号trade_no]"+trade_no+",[收款支付宝账号seller_id]"+seller_id+",[交易金额total_amount]"+total_amount+",[交易状态]"+trade_status);
            //调用SDK验证签名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipayPublicKey, AlipayConfig.input_charset_utf, AlipayConfig.sign_type_rsa2); //调用SDK验证签名
            if(signVerified) {
                if(trade_status.equals("TRADE_FINISHED")||trade_status.equals("TRADE_SUCCESS")){
                    //根据商户订单号查询订单信息处理
               
                    return "success";
                }else {
                    return "fail";
                }
            }else {
                //验证失败
                log.error("验签失败,请联系管理员解决");
                return "fail";
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("订单修改失败,请联系管理员解决");
            return "fail";
        }

    }

注意:

如果框架接口访问有权限限制,需要放开支付宝异步回调地址,否则无法访问

总结

到此这篇关于java对接支付宝支付接口的文章就介绍到这了,更多相关java对接支付宝支付接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java数字和中文算数验证码的实现

    java数字和中文算数验证码的实现

    这篇文章主要介绍了java数字和中文算数验证码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 一文搞懂hashCode()和equals()方法的原理

    一文搞懂hashCode()和equals()方法的原理

    这篇文章主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下
    2020-06-06
  • 一篇文章带你了解java接口与继承

    一篇文章带你了解java接口与继承

    这篇文章主要介绍了Java接口和继承操作,结合具体实例形式分析了Java接口和继承与使用的相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2021-08-08
  • java实现时间控制的几种方案

    java实现时间控制的几种方案

    这篇文章主要介绍了java实现时间控制的几种方案,本文从多个方面给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Java web实现购物车案例

    Java web实现购物车案例

    这篇文章主要为大家详细介绍了Java web实现购物车案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 一文简介Java中BlockingQueue阻塞队列

    一文简介Java中BlockingQueue阻塞队列

    本文主要介绍了一文简介Java中BlockingQueue阻塞队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java 十大排序算法之计数排序刨析

    Java 十大排序算法之计数排序刨析

    计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法
    2021-11-11
  • 国内分布式框架Dubbo使用详解

    国内分布式框架Dubbo使用详解

    这篇文章主要为大家介绍了国内分布式框架Dubbo使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Mybatis的TypeHandler加解密数据实现

    Mybatis的TypeHandler加解密数据实现

    在我们数据库中有些时候会保存一些用户的敏感信息,所以就需要对这些数据进行加密,那么本文就介绍了Mybatis的TypeHandler加解密数据实现,感兴趣的可以了解一下
    2021-06-06
  • Gradle进阶使用结合Sonarqube进行代码审查的方法

    Gradle进阶使用结合Sonarqube进行代码审查的方法

    今天小编就为大家分享一篇关于Gradle进阶使用结合Sonarqube进行代码审查的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论