支付宝开放平台下载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配置
com.alipay alipay-sdk-java xxx
前端付款界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>--%><%--
增加一个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过来的信息 Mapparams = new HashMap (); 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] + ","; } //乱码解决,这段代码在出现乱码时使用 //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)); } }}