作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服

1.本项目中使用的工具可以在百度云下载:  

    Eclipse:  https://pan.baidu.com/s/1ci4Nim

    Tomcat:   https://pan.baidu.com/s/1eS6JlrO

    Maven:    https://pan.baidu.com/s/1i4Ud35F

    JDK1.7:   http://pan.baidu.com/s/1pLBMCHH

   2.项目配置准备:

      配置参数:APPID, 应用私钥,支付宝公钥,将生成的参数在代码中进行替换, 配置参数生成步骤见下面

      blob.png

      2.1 访问支付宝开放平台官网:  https://open.alipay.com/platform/home.htm, 使用支付宝app扫码登录

      2.2 访问开放平台的【开发者中心】->【研发服务】功能,进入沙箱环境

         blob.png

      2.3 沙箱环境中, 查看【研发服务】->【沙箱应用】,页面如下

          沙箱环境下默认为用户分配了APPID, 支付宝网关(注意这个地址中带dev字样,正式环境下没有dev), 用户需要手动配置

          RSA2密钥,也可以配置RSA密钥(推荐RSA2)



         blob.png

          点击上图的【设置应用公钥】后,弹出如下图A所示, 点击下图A中的【设置应用公钥】,弹出编辑框(图B),在编辑框中          填写应用公钥,此公钥可以使用工具生成, 工具的下载可参见图B中【查看密钥生成】, 图C为密钥工具截图

         blob.png

                                                   图A

         

         blob.png

                                                    图B

            blob.png

                                                    图C

         2.4  密钥工具生成了 应用的公钥和私钥,请上传公钥,自己保留 私钥(后面会用到), 公钥上传成功后,支付宝生成相               应的公钥(见图D)  注意: 这里分【应用公钥】和【支付宝公钥】, 代码使用中请注意使用的是哪种密钥

            blob.png

                                                   图D

     3 项目运行效果图   

       项目本地运行后,访问地址: http://localhost:8080/Alipay/index.jsp

       3.1 支付页面

           付款时,商户订单号(out_trade_no)必须唯一,订单号由应用程序根据算法生成, 点击【下图】(图E)付款后,弹出图F        对应的付款页面,扫码付款成功后,返回商户提前设定的页面(图G), 图G地址栏url中 return_url.jsp为提前设置的付款成        功调用页面,此页面开发者可根据业务自行定制,本例中显示支付成功后返回的支付信息,支付宝对应的订单号 trade_no

       blob.png

                                                       图E

         blob.png

                                                   图F

         blob.png

                                                     图G

        3.2 交易查询

            交易查询功能为用户提供了历史订单查询功能,查询条件为: 商户订单号(out_trade_no),支付宝交易号(trade_no), 

         二个条件至少要选填一个, 调用此接口后,返回交易结果信息(见图I), code=10000, msg="Success" 表明交易成功

         blob.png

                                                           图H

        blob.png

                                                           图 I

      3.3 退款

          退款操作将A付给B的钱退给B, 退给B的钱可以进行一次或者多次,但数次累加总和不能超过之前A给B的钱,具体见代码

        blob.png

     4 代码详解:

       4.1 支付页面jsp代码, 代码中包含了 支付宝开发网关 gatewayUrl, appid, 应用私钥:merchant_private_key

           支付宝公钥:  alipay_public_key

           注意: 支付宝付款成功后,支付宝服务器调用应用程序的接口告之付款是否真正成功,也就是说付款成功之后的逻辑应            该放在此接口中进行处理,一笔交易成功后,会回调多次(注意逻辑控制),

           回调接口设置代码:  alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

           支付成功后跳转页面设置: AlipayConfig.return_url

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>付款</title>
</head>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="com.alipay.config.*"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.request.*"%>
<%-- <%@ page import="com.alipay.sdk.app.EnvUtils"%> --%>
<%
	//获得初始化的AlipayClient
	//com.alipay.sdk.app.EnvUtils
	/* EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); */
	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 = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
	//付款金额,必填
	String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
	//订单名称,必填
	String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
	//商品描述,可空
	String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");
	
	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-请求参数】章节
	
	//请求
	String result = alipayClient.pageExecute(alipayRequest).getBody();
	System.out.println("result:" + result);
	
	//输出
	out.println(result);
%>
<body>
</body>
</html>


      4.2 交易查询

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>交易查询</title>
</head>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="com.alipay.config.*"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.request.*"%>
<%
	//获得初始化的AlipayClient
	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();
	
	//商户订单号,商户网站订单系统中唯一订单号
	String out_trade_no = new String(request.getParameter("WIDTQout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
	//支付宝交易号
	String trade_no = new String(request.getParameter("WIDTQtrade_no").getBytes("ISO-8859-1"),"UTF-8");
	//请二选一设置
	
	alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+"\"trade_no\":\""+ trade_no +"\"}");
	
	//请求
	String result = alipayClient.execute(alipayRequest).getBody();
	
	//输出
	out.println(result);
%>
<body>
</body>
</html>


    4.3 交易退款

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>退款</title>
</head>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="com.alipay.config.*"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.request.*"%>
<%
	//获得初始化的AlipayClient
	AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, 
	               AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, 
	               AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
	
	//设置请求参数
	AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
	
	//商户订单号,商户网站订单系统中唯一订单号
	String out_trade_no = new String(request.getParameter("WIDTRout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
	//支付宝交易号
	String trade_no = new String(request.getParameter("WIDTRtrade_no").getBytes("ISO-8859-1"),"UTF-8");
	//请二选一设置
	//需要退款的金额,该金额不能大于订单金额,必填
	String refund_amount = new String(request.getParameter("WIDTRrefund_amount").getBytes("ISO-8859-1"),"UTF-8");
	//退款的原因说明
	String refund_reason = new String(request.getParameter("WIDTRrefund_reason").getBytes("ISO-8859-1"),"UTF-8");
	//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
	String out_request_no = new String(request.getParameter("WIDTRout_request_no").getBytes("ISO-8859-1"),"UTF-8");
	
	alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," 
			+ "\"trade_no\":\""+ trade_no +"\"," 
			+ "\"refund_amount\":\""+ refund_amount +"\"," 
			+ "\"refund_reason\":\""+ refund_reason +"\"," 
			+ "\"out_request_no\":\""+ out_request_no +"\"}");
	
	//请求
	String result = alipayClient.execute(alipayRequest).getBody();
	
	//输出
	out.println(result);
%>
<body>
</body>
</html>


Home