项目中如何调用支付宝 API 实现沙箱支付功能

    科技2025-06-05  27

    项目中如何调用支付宝 API 实现支付功能

    功能展示:

    添加购物车:

    结账:

    确认结账:

    支付:

    支付成功:

    跳转到首页:

    如何实现:

    1.在蚂蚁金服开发平台下载Demo

    2.调试Demo   并下载           支付宝开发平台开发助手

    3.设置应用公钥和支付宝公钥:

    Demo对应的

    package com.bookstore.utils; import java.io.FileWriter; import java.io.IOException; /* * *类名:AlipayConfig *功能:基础配置类 *详细:设置帐户有关信息及返回路径 *修改日期:2017-04-05 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 public static String app_id = "2016102200738645"; // 商户私钥,您的PKCS8格式RSA2私钥 public static String merchant_private_key = "xxxxwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDO7Zf5X3rU92Tps9HmOPF4jSZ78vkpHJ/orrxYf0MC7frAmNw5cN1c0YqBVetL3aC0bGo9lS+wIdRccRU/GSfZ4DxY+rIUP8ZQGzrij+To0FAnCk9wGMGl9Pt39IlqtPZvNZ/y9OMsTRr0nTcvGdbB9x4zfPbF7Y9IJA6g+2Zs0yk4OlYsNp96d+3CjU2ITWxY+h15occYdyQpmDQjpdY/4Bqz/GnXQKLCo3nXRRIA8p0DpzINhM20R94fnk3CcH4Ycp/jRLAxL0Ld2YuvcMierbCIpZjuvO6TwnDJuFGCxvWYtseHHu8bNFwoLhFLmlI21AdXA5KwVVSQ7/RMxPzFAgMBAAECggEBAI1slxyJZBLfjmmnS4K0UlyY4798/Uta0/OcUP+O4sbCzUkKcCEWAUSptabViP4N2ALXwfia2L/hLxmK9AFu+OyQs84AcOsj9y7SnXkw7Tss/EriYg5z7Q22lJOUXsK+MVsqZEoRkp25iP274XZgi4V/lnWMJ8B4rx+X/SOLDqK6qFcv+ISidy7tMukmK1WJbuKk/PJ/8taqNpirDpnPVGZI9oxR0hBy2wVlJ9wnSze89NHqungBhVyj5XInz5NbdoTLntVLYF3qAeRYJrrXB0Fm5bkQMAO+l1xBVSWGujMPbCdd3BHeAxpza7qBc701JzpAoOZV72iqG7fKoy6+D6ECgYEA60LDbqv/txWswoLNRMDB6Ie4PywhiyEVBGIA+rhGmMihufW0Wm58309bsDWpOo94I492fKdwjUj6juPkeZzbJHZavskauN1TZChDsVQDbc6yKJ8nfurPLW7whheZo8XpTTGW/xKMZxCINEtoDEBVmrJRfX9zEEtoeToFLDe3Wj0CgYEA4Stu/AEdYMOlEKiphLhn99z2lkYoPMwbEYDQEYbFsCR4fk6/lzBzdAb3WlU3I6QpcYtf6P/LtwfXLTzT11c9JneWOJmrGMulgYAAv5AwDmCiMq2UBRX4CTL9hHzLqd6flM5Jo+9vxTMsvZKpE0nwU3SHx1QyOSon+xPxDqjzPSkCgYEA6US7rwLQfOL696rmiaNvIXdhExJY+DEHO99JBVCuf1OAOHkOKRSgsHNpgGDUuYIEJ45ad+M2UIDqH8CLjKIhEBhihgW1f1PFGexqomuhMsHeGTUl3kxIvM3ho7PG3YKhf68J/0SO/qp/wwp50pv/xXHGJ1+14ZRDtN/4vQ1JuikCgYA/+VMjDj4GjA+N2B2xs6L2bTUyJOSxwVu/cVWsZRotnW8Ok9kjX4St5nzIkYWE/tM3i13ImUSL0BJ2q92URRj+oONxWVefR9zSGkgcJR9CNnpe46o2d7NtCau1xK8oqDO215Vcml6rLIr9oXmgHVXGoEkjfOx4CV4qm9PVUnMpYQKBgQCtLE6rTLDW5cG4PdCl/+tZ5u/JiIVNEpGWC+vN9x1xAzRmAJ+93f2PrPzwvVM8m3gDsoMh51i5GQiij+PZUa6Wi6Csc7dFNRScV9EYvJi+KP2Vz+sme27UvklWHE2GpQmJddz5Nec22cOLXtxEHt00suS00qX/h1PqgYEFZTK7Pg=="; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgYYO1arY1W3qYCsTN1R+IW5BUU9Di8fov94sC6JeIOYfiiDAt5PJ+Eq8y7yUin3BAFYBUk4jb1+wJ4Yhxn/bEY54EVqBq8SpmaBmqMSisGw1bCcHUpceI8TzoiczGr3s/FxMxkjfglOfiWMMNZzo3XFXiCo9uU8spArA81FZT1BVCqV9sAzdKzhnYEwICOmadwvctULEDLBuR8J9saePcxMd5v8VAfWz8qszfmBiokJDobX0CPno5yEqd8SBoteIKwBIlMpsbNhLXnRXr8TPbCgGbpumFPdybgEIUfYc4uxsCdjVqvAdd0OXi2L2BxZqc23GNP10f5SQNVznAYbCJwIDAQAB"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String return_url = "http://localhost:8080/client/order/paysuccess"; // 签名方式 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(); } } } } }

    Handler层的支持:

    @RequestMapping("/pay") public void pay(String id, String money, HttpServletResponse response) throws Exception { //获得初始化的AlipayClient 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 = id; //付款金额,必填 String total_amount = money; //订单名称,必填 String subject = id; //商品描述,可空 String body = ""; 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(); //输出 //out.println(result); response.setContentType("text/html"); response.getWriter().println(result); }

    支付成功后修改支付状态为1:

    @RequestMapping("/paysuccess") public String paysuccess(HttpServletRequest request) throws Exception { //获取支付宝GET过来反馈信息 Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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] + ","; } //乱码解决,这段代码在出现乱码时使用 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名 //——请在这里编写您的程序(以下代码仅作参考)—— if (signVerified) { //商户订单号 String order_id = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8"); //支付宝交易号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8"); //付款金额 String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"); //实现支付状态的修改,改为已支付,paystate=1 orderService.paySuccess(order_id); return "redirect:/client/paysuccess.jsp"; // out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount); } else { return "redirect:/client/fail.jsp"; // out.println("验签失败"); } } <update id="updatePayState"> update orders set paystate = 1 where id = #{order_id} </update>

    paysuccess.jsp页面:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>电子书城</title> <link rel="stylesheet" href="css/main.css" type="text/css" /> <script type="text/javascript" src="js/my.js"> </script> </head> <body class="main"> <jsp:include page="head.jsp"/> <jsp:include page="menu_search.jsp" /> <div id="divcontent"> <table width="850px" border="0" cellspacing="0"> <tr> <td style="padding:30px; text-align:center"><table width="60%" border="0" cellspacing="0" style="margin-top:70px"> <tr> <td style="width:98"> <img src="images/IconTexto_WebDev_009.jpg" width="128" height="128" /> </td> <td style="padding-top:30px"> <font style="font-weight:bold; color:#FF0000">支付成功</font><br /><br /> <a href="${pageContext.request.contextPath }/index.jsp"> <span id="second">5</span>秒后自动为您转跳回首页 </a> </td> </tr> </table> <h1>&nbsp;</h1> </td> </tr> </table> </div> <jsp:include page="foot.jsp"/> </body> </html>

     

     

     

     

     

     

    Processed: 0.013, SQL: 8