package org.yeshi.utils.alipay;
|
|
import com.alipay.api.AlipayApiException;
|
import com.alipay.api.AlipayClient;
|
import com.alipay.api.DefaultAlipayClient;
|
import com.alipay.api.internal.util.AlipaySignature;
|
import com.alipay.api.request.*;
|
import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse;
|
import com.alipay.api.response.AlipayTradeCancelResponse;
|
import com.alipay.api.response.AlipayTradeQueryResponse;
|
import com.alipay.api.response.AlipayTradeRefundResponse;
|
import net.sf.json.JSONObject;
|
import org.yeshi.utils.StringUtil;
|
import org.yeshi.utils.TimeUtil;
|
import org.yeshi.utils.entity.alipay.AlipayAppInfo;
|
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.Map;
|
|
/**
|
* 支付宝H5支付
|
*/
|
public class AlipayH5PayUtil {
|
|
private static AlipayClient getAlipayClient(AlipayAppInfo app) {
|
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", app.getAppId(), app.getPrivateKey(), "json", "GBK", app.getAlipayPublicKey(), "RSA2"); //获得初始化的AlipayClient
|
return alipayClient;
|
}
|
|
|
/**
|
* 创建订单(支付宝API为https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay)
|
*
|
* @param app
|
* @param orderNo
|
* @param money
|
* @param goodsTitle
|
* @param returnUrl
|
* @param notifyUrl
|
* @return
|
*/
|
|
public static String createOrderForm(AlipayAppInfo app, String orderNo, BigDecimal money, String goodsTitle, String returnUrl, String notifyUrl) throws AlipayApiException {
|
AlipayClient alipayClient = getAlipayClient(app);
|
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
|
alipayRequest.setReturnUrl(returnUrl);
|
alipayRequest.setNotifyUrl(notifyUrl);//在公共参数中设置回跳和通知地址
|
JSONObject bizContent = new JSONObject();
|
bizContent.put("out_trade_no", orderNo);
|
bizContent.put("total_amount", money);
|
bizContent.put("subject", goodsTitle);
|
bizContent.put("product_code", "QUICK_WAP_PAY");
|
alipayRequest.setBizContent(bizContent.toString());//填充业务参数
|
String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
|
|
|
return form;
|
}
|
|
/**
|
* 订单查询
|
*
|
* @param app
|
* @param outTradeNo
|
* @param alipayTradeNo
|
* @return
|
* @throws AlipayApiException
|
*/
|
public static AlipayTradeQueryResponse queryOrder(AlipayAppInfo app, String outTradeNo, String alipayTradeNo) throws AlipayApiException {
|
AlipayClient alipayClient = getAlipayClient(app);
|
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //创建API对应的request类
|
JSONObject content = new JSONObject();
|
if (!StringUtil.isNullOrEmpty(outTradeNo)) {
|
content.put("out_trade_no", outTradeNo);
|
}
|
if (!StringUtil.isNullOrEmpty(alipayTradeNo)) {
|
content.put("trade_no", alipayTradeNo);
|
}
|
request.setBizContent(content.toString());
|
AlipayTradeQueryResponse response = alipayClient.execute(request); //通过alipayClient调用API,获得对应的response类
|
return response;
|
}
|
|
|
/**
|
* 取消订单
|
* 如果此订单用户支付失败,支付宝将关闭此订单。
|
* 如果此订单用户支付成功,支付宝将退还订单资金给用户。
|
*
|
* @param app
|
* @param outTradeNo
|
* @param alipayTradeNo
|
* @return
|
* @throws AlipayApiException
|
*/
|
public static AlipayTradeCancelResponse cancelOrder(AlipayAppInfo app, String outTradeNo, String alipayTradeNo) throws AlipayApiException {
|
AlipayClient alipayClient = getAlipayClient(app);
|
AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); //创建API对应的request类
|
JSONObject content = new JSONObject();
|
if (!StringUtil.isNullOrEmpty(outTradeNo)) {
|
content.put("out_trade_no", outTradeNo);
|
}
|
if (!StringUtil.isNullOrEmpty(alipayTradeNo)) {
|
content.put("trade_no", alipayTradeNo);
|
}
|
request.setBizContent(content.toString()); //设置业务参数
|
AlipayTradeCancelResponse response = alipayClient.execute(request); //通过alipayClient调用API,获得对应的response类
|
return response;
|
}
|
|
|
/**
|
* 退款
|
*
|
* @param app
|
* @param outTradeNo
|
* @param alipayTradeNo
|
* @param refundAmount 本次退款金额
|
* @param outRequestNo 本次退款请求流水号,部分退款时必传。
|
* @return
|
* @throws AlipayApiException
|
*/
|
public static AlipayTradeRefundResponse refund(AlipayAppInfo app, String outTradeNo, String alipayTradeNo, BigDecimal refundAmount, String outRequestNo) throws AlipayApiException {
|
AlipayClient alipayClient = getAlipayClient(app);
|
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();//创建API对应的request类
|
JSONObject content = new JSONObject();
|
if (!StringUtil.isNullOrEmpty(outTradeNo)) {
|
content.put("out_trade_no", outTradeNo);
|
}
|
if (!StringUtil.isNullOrEmpty(alipayTradeNo)) {
|
content.put("trade_no", alipayTradeNo);
|
}
|
|
if (!StringUtil.isNullOrEmpty(outRequestNo)) {
|
content.put("out_request_no", outRequestNo);
|
}
|
|
content.put("refund_amount", refundAmount);
|
|
request.setBizContent(content.toString()); //设置业务参数
|
AlipayTradeRefundResponse response = alipayClient.execute(request);//通过alipayClient调用API,获得对应的response类
|
return response;
|
}
|
|
|
/**
|
* 获取账单的链接
|
*
|
* @param app
|
* @param date 需要下载的账单日期,最晚是当期日期的前一天。
|
* @return
|
* @throws AlipayApiException
|
*/
|
public static String getBillLink(AlipayAppInfo app, Date date) throws AlipayApiException {
|
AlipayClient alipayClient = getAlipayClient(app);
|
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类
|
JSONObject content = new JSONObject();
|
content.put("bill_type", "trade");
|
content.put("bill_date", TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd"));
|
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);//通过alipayClient调用API,获得对应的response类
|
return response.getBillDownloadUrl();
|
}
|
|
|
/**
|
* 获取支付成功的外部订单号
|
*
|
* @param params
|
* @param app
|
* @return
|
*/
|
public static String getPaySuccessNotifyOutOrderNo(Map<String, String> params, AlipayAppInfo app) throws Exception {
|
try {
|
boolean right = AlipaySignature.rsaCheckV1(params, app.getAlipayPublicKey(), "GBK", params.get("sign_type"));
|
if (right) {
|
String tradeStatus = params.get("trade_status");
|
String outTradeNo = params.get("out_trade_no");
|
//支付成功
|
if ("TRADE_SUCCESS".equalsIgnoreCase(tradeStatus)) {
|
return outTradeNo;
|
} else {
|
throw new Exception("订单为支付成功:" + tradeStatus);
|
}
|
} else {
|
throw new Exception("签名错误");
|
}
|
} catch (AlipayApiException | IOException e) {
|
throw e;
|
}
|
}
|
|
}
|