一、支付宝的文档中心
https://opendocs.alipay.com/apis/api_1/alipay.trade.refund
这三个接口是PC页面最重要的三个接口,在支付宝的文档中心,有代码的式例,封装参数不要使用支付宝的式例代码那样,使用map集合封装参数,然后使用Json转化为String,接口的回复按照文档中说的,用get和文档中的回复参数(用驼峰表示)
二、maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.21.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
三、支付宝的配置文件 alipay.properties
#支付宝的接口地址
alipay_url=https://openapi.alipay.com/gateway.do
#商家我们自己企业的合作伙伴id
app_id=
#商家我们自己的私钥
app_private_key=
#支付宝的公钥
alipay_public_key=
# 同步回调地址 重定向地址本地浏览器
return_payment_url=http://127.0.0.1:8080/alipay/callback/return
# 异步通知地址 公网接口(webService)
notify_payment_url=http://60.205.215.91/alipay/callback/notify
return_order_url=http://127.0.0.1:8080/orderList
四、加载Alipay的配置导spring容器中 AlipayConfig
package com.junlaninfo.alipay.config;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* @param
* @return
*/
@Configuration
@PropertySource("classpath:alipay.properties")
public class AlipayConfig {
@Value("${alipay_url}")
private String alipay_url;
@Value("${app_private_key}")
private String app_private_key;
@Value("${app_id}")
private String app_id;
public final static String format = "json";
public final static String charset = "utf-8";
public final static String sign_type = "RSA2";
public static String return_payment_url;
public static String notify_payment_url;
public static String return_order_url;
public static String alipay_public_key;
@Value("${alipay_public_key}")
public void setAlipay_public_key(String alipay_public_key) {
AlipayConfig.alipay_public_key = alipay_public_key;
}
@Value("${return_payment_url}")
public void setReturn_url(String return_payment_url) {
AlipayConfig.return_payment_url = return_payment_url;
}
@Value("${notify_payment_url}")
public void setNotify_url(String notify_payment_url) {
AlipayConfig.notify_payment_url = notify_payment_url;
}
@Value("${return_order_url}")
public void setReturn_order_url(String return_order_url) {
AlipayConfig.return_order_url = return_order_url;
}
@Bean
public AlipayClient alipayClient() {
AlipayClient alipayClient = new DefaultAlipayClient(alipay_url, app_id, app_private_key, format, charset, alipay_public_key, sign_type);
return alipayClient;
}
}
五、编写代码 (支付、查询订单状态、退款)
package com.junlaninfo.controller;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.junlaninfo.alipay.config.AlipayConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* Created by 辉 on 2020/3/29.
*/
@Controller
public class AlipayController {
@Autowired
AlipayClient alipayClient;
@RequestMapping(value = "/alipay",method = RequestMethod.GET)
@ResponseBody
public String Alipay(){
// 获得一个支付宝请求的客户端(它并不是一个链接,而是一个封装好的http的表单请求)
String form = null;
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
// 回调函数
alipayRequest.setReturnUrl(AlipayConfig.return_payment_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);
Map<String,Object> map = new HashMap<String,Object>();
map.put("out_trade_no", UUID.randomUUID());
map.put("product_code","FAST_INSTANT_TRADE_PAY");
map.put("total_amount",0.01);
map.put("subject","测试用的");
String param = JSON.toJSONString(map);
alipayRequest.setBizContent(param);
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
System.out.println(form);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return form;
}
/*
支付同步回调
*/
@RequestMapping("/alipay/callback/return")
@ResponseBody
public String AlipayReturn(HttpServletRequest request){
String trade_no = request.getParameter("trade_no");
System.out.println("支付宝交易号是:"+trade_no);
return trade_no;
}
/*
统一收单线下交易查询
*/
@RequestMapping(value = "/alipayQuery",method = RequestMethod.GET)
@ResponseBody
public String AlipayQuery() throws AlipayApiException {
// 获得一个支付宝请求的客户端(它并不是一个链接,而是一个封装好的http的表单请求)
String form = null;
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();;//创建API对应的request
// 回调函数
alipayRequest.setReturnUrl(AlipayConfig.return_payment_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);
Map<String,Object> map = new HashMap<String,Object>();
map.put("trade_no","2020040222001425041434036943");//测试用时生成的支付宝订单号
String param = JSON.toJSONString(map);
alipayRequest.setBizContent(param);
AlipayTradeQueryResponse response = alipayClient.execute(alipayRequest);
String msg = response.getMsg();
String outTradeNo = response.getOutTradeNo();
String tradeNo = response.getTradeNo();
String tradeStatus = response.getTradeStatus();
String call_back_content=response.getMsg();
System.out.println(msg);
return msg;
}
@RequestMapping(value = "/AlipayRefund")
@ResponseBody
public String AlipayRefund() throws AlipayApiException {
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("trade_no","2020040222001425041434036943");
map.put("refund_amount",0.01);
String param = JSON.toJSONString(map);
request.setBizContent(param);
AlipayTradeRefundResponse response = alipayClient.execute(request);
String fundChange = response.getFundChange();// 本次退款是否发生了资金变化
System.out.println("\t本次退款是否发生了资金变化:"+fundChange);
Date gmtRefundPay = response.getGmtRefundPay(); //退款时间
System.out.println("退款时间:"+gmtRefundPay);
return fundChange;
}
}
六、代码链接