必备的Jar支持
<!-- 官网说明地址:https://docs.open.alipay.com/54/103419 -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.26.ALL</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
蚂蚁金服开放平申请创建应用
申请地址:https://openhome.alipay.com/platform/appManage.htm#/apps
电脑网站支付快速接入
文档地址:https://docs.open.alipay.com/270/105899/
支付宝参数配置(AliPayConfig.class)
package com.pay.alipay;
/**
* 支付宝支付的配置类
* RSA1升级到RSA2的方式:https://opensupport.alipay.com/support/knowledge/20069/201602242782#/?_k=xj2m2v
* @author xxx
*/
public class AliPayConfig {
//支付宝网关(固定)
public static final String URL = "https://openapi.alipay.com/gateway.do";
//APPID 即创建应用后生成
public static final String APP_ID = "";
//开发者私钥,由开发者自己生成
public static final String APP_PRIVATE_KEY = "";
//参数返回格式,只支持json
public static final String FORMAT = "json";
//编码集,支持GBK/UTF-8
public static final String CHARSET = "UTF-8";
//支付宝公钥,由支付宝生成
public static final String ALIPAY_PUBLIC_KEY = "";
//商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
public static final String SIGN_TYPE = "RSA2";
}
支付宝下单支付接口
public void doPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException {
//初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL,
AliPayConfig.APP_ID, AliPayConfig.APP_PRIVATE_KEY,
AliPayConfig.FORMAT, AliPayConfig.CHARSET,
AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
//创建API对应的request
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//支付成功后跳转的页面,千万不要加端口号(同步网页重定向通知)
alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
//支付完成设置回调通知地址,千万不要加端口号(异步服务器通知)
alipayRequest.setNotifyUrl("http://domain.com/CallBack/alipayNotifyUrl");
//下单时传递的请求参数, 详情参照(https://docs.open.alipay.com/api_1/alipay.trade.page.pay/)请求参数
Map<String, Object> bizContentMap = new TreeMap<String, Object>();
//商户网站唯一订单号(必填,类型为String), 最大长度64
String out_trade_no = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
bizContentMap.put("out_trade_no", out_trade_no);
//商品的标题/交易标题/订单标题/订单关键字等(必填,类型为String), 最大长度256。
bizContentMap.put("subject", "Iphone6 16G");
//订单总金额,单位为元,精确到小数点后两位(必填,类型为String), 最大长度9。
bizContentMap.put("total_amount", "0.01");
//销售产品码,与支付宝签约的产品码名称(必填,类型为String), 目前仅支持FAST_INSTANT_TRADE_PAY
bizContentMap.put("product_code", "FAST_INSTANT_TRADE_PAY");
//对一笔交易的具体描述信息。 (非必填,类型为String), 最大长度128。
bizContentMap.put("body", "新品苹果手机");
//填充业务参数
alipayRequest.setBizContent(JSONObject.toJSONString(bizContentMap));
String form="";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
支付宝下单支付后的回调接口(一定要是否登录都能访问的方法)
/**
* 支付宝支付完成后异步通知回调函数
* 提交方式为:Post
* 注意事项:设置异步通知回调通知的时候,异步通知回调地址不能加端口号!!!
* AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
* alipayRequest.setNotifyUrl("异步通知回调地址");
* @return 如果通知成功并处理完业务就返回"success",反之返回"fail"。
*/
public String alipayNotifyUrl(HttpServletRequest request) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
//获取支付宝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] + ",";
}
params.put(name, valueStr);
}
//调用SDK验证签名
boolean signVerified = false;
try {
signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY,
AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
} catch (AlipayApiException e) {
e.printStackTrace();
}
if(signVerified){
//交易状态
String trade_status = request.getParameter("trade_status");
if(trade_status.equals("TRADE_FINISHED")){
//判断该笔订单是否在商户网站中已经做过处理
}else if (trade_status.equals("TRADE_SUCCESS")){
//判断该笔订单是否在商户网站中已经做过处理
System.out.println("订单号: "+request.getParameter("out_trade_no"));
}
return "success";
}else{
System.out.println("支付宝回调方法签名校验失败!");
return "fail";
}
}