支付宝开放平台下载alipay-java-sdk
https://open.alipay.com
目前官方没有提供maven,下载sdk后,可以用maven命令安装到本地仓库,执行如下命令
mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-sdk-java -Dversion=xxx -Dpackaging=jar -Dfile=D:\alipay-sdk-javaxxx.jar
项目增加maven配置
<dependency> <groupId>com.alipay</groupId> <artifactId>alipay-sdk-java</artifactId> <version>xxx</version> </dependency>
前端付款界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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> <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script> </head> <body> <%-- <form action="${pageContext.request.contextPath}/AliPay/pay" method="post"> <!-- 这里是表单内容 --> <button type="submit">付 款</button> </form> --%> <input type="button" id="btnPay" value="付款"> <div id="resultForm"></div> </body> </html> <script type="text/javascript"> $(function(){ $(‘#btnPay‘).click(function() { $.ajax({ url : ‘${pageContext.request.contextPath}/AliPay/pay2‘, type : "POST", data : "", contentType : "application/json", success : function(data) { //后台会返回一个新的交易表单,并自动提交。所以随便放在一个地方就行 console.log(data); $("#resultForm").append(data); }, error : function() { } }); }); }); </script>
增加一个AlipayConfig
package com.zns.pay.alipay; public class AlipayConfig { // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 public static String app_id = ""; // 商户私钥,您的PKCS8格式RSA2私钥 public static String merchant_private_key = ""; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 public static String alipay_public_key = ""; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String notify_url = "http://domain.com/AliPay/notifyUrl"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String return_url = "http://domain.com/AliPay/returnUrl"; // 签名方式 public static String sign_type = "RSA2"; // 字符编码格式 public static String charset = "utf-8"; // 支付宝网关 public static String gatewayUrl = "https://openapi.alipay.com/gateway.do"; }
后台控制器代码
package com.zns.controller; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.AlipayTradePagePayRequest; import com.zns.pay.alipay.AlipayConfig; @Controller @RequestMapping("/AliPay") public class AliPayController { protected final Logger logger = Logger.getLogger(AliPayController.class); @RequestMapping("/pay") public void pay(HttpServletRequest request,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 =String.valueOf(new Date().getTime()); //销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY String product_code="FAST_INSTANT_TRADE_PAY"; //付款金额,必填 String total_amount = "0.01"; //订单名称,必填 String subject = "订单"+String.valueOf(new Date().getTime()); //商品描述,可空 String body = ""; alipayRequest.setBizContent("" + "{" + "\"out_trade_no\":\""+ out_trade_no +"\"," + "\"product_code\":\""+ product_code +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"" + "}" ); //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节 //调用SDK生成表单 String form = alipayClient.pageExecute(alipayRequest).getBody(); response.setContentType("text/html;charset=utf-8"); response.getWriter().println(form); } @RequestMapping(value="/pay2",produces = "application/text;charset=utf-8") @ResponseBody public String pay2(HttpServletRequest request,HttpServletResponse response) throws Exception { //代码和上面一样 //调用SDK生成表单 //String form = alipayClient.pageExecute(alipayRequest).getBody(); String form=""; return form; } /** * 支付宝服务器同步通知url */ @RequestMapping(value="/returnUrl") public String returnUrl(HttpServletRequest request,HttpServletResponse response){ logger.info("支付宝服务器同步通知url..."); //处理逻辑省略... return "web/pay/success"; } /** * 支付宝服务器异步通知url * @throws Exception */ @RequestMapping(value="/notifyUrl") public void notifyUrl(HttpServletRequest request,HttpServletResponse response) throws Exception{ logger.info("进入支付宝服务器异步通知url..."); //获取支付宝POST过来的信息 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); } //调用SDK验证签名 boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //——请在这里编写您的程序(以下代码仅作参考)—— /* 实际验证过程建议商户务必添加以下校验: 1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if(signVerified) {//验证成功 //商户订单号 String out_trade_no =request.getParameter("out_trade_no"); //支付宝交易号 String trade_no =request.getParameter("trade_no"); //交易状态 String trade_status =request.getParameter("trade_status"); if(trade_status.equals("TRADE_FINISHED")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统会发送该交易状态通知 }else if (trade_status.equals("TRADE_SUCCESS")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统会发送该交易状态通知 } //记录日志信息 }else {//验证失败 //调试用,记录日志信息 //Logger.error(AlipaySignature.getSignCheckContentV1(params)); } } }
原文地址:https://www.cnblogs.com/zengnansheng/p/10389766.html
时间: 2024-11-13 04:28:00