一、支付寶的文檔中心
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;
}
}
六、代碼鏈接