
com.luues.alipay.AliPay Maven / Gradle / Ivy
package com.luues.alipay;
import cn.luues.tool.core.datawrap.R;
import cn.luues.tool.core.util.StrUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.response.*;
import com.luues.alipay.configuration.AliPayInfo;
import com.luues.alipay.constant.CommonConstants;
import com.luues.alipay.entity.back.AliOrderBack;
import com.luues.alipay.entity.back.TradeCloseCallBack;
import com.luues.alipay.entity.back.TradeSuccessCallBack;
import com.luues.alipay.entity.back.TradeWaitPayCallBack;
import com.luues.alipay.entity.order.AliOrder;
import com.luues.alipay.entity.order.AliOrderMustFillRequest;
import com.luues.alipay.entity.order.AliOrderSelectiveFillRequest;
import com.luues.alipay.entity.pay.AliPayOrderInfo;
import com.luues.alipay.entity.trans.AliPayTrans;
import com.luues.alipay.util.AliPayOrder;
import com.luues.alipay.util.Pay;
import com.luues.core.core.SpringContextHolder;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
/**
* 支付宝相关类
* @author Mr-Wu
* @category 支付宝支付
* @version 1.0
* 2020年02月12日
*
* @see :@Autowired private AliPay aliPay
* 需要配置 alipay.properties 文件,放在resources下面
* 文件属性:{
* *alipay.appid = appid
* *alipay.app_private_key = 私钥
* *alipay.app_public_key = 公钥
* alipay.charset = 编码,支持GBK/UTF-8 默认UTF-8
* alipay.sign_type = 商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,默认RSA2
* }
*
*/
@Component
@Slf4j(topic = "c.l.a.a")
public class AliPay {
@Autowired
private AliPayInfo aliPayInfo;
@Autowired
private AliPayOrder aliPayOrder;
@Autowired
private Pay pay;
@PostConstruct
public void init() {
if(!StrUtil.isAllNotBlank(aliPayInfo.getAppId(), aliPayInfo.getPrivateKey(), aliPayInfo.getPublicKey())){
log.error("{}", "" +
"\n{\n" +
" -- Failed to read the configuration file, because the file does not exist! -- \n" +
" -- Please configure the file first,Configuration is as follows: -- \n" +
" -- Explain(Please create a folder in the resources below for the payment file named properties configuration file, that is, (*.properties)) -- \n" +
" -- spring.luues.alipay.appid = Merchant appid (*) -- \n" +
" -- spring.luues.alipay.app_private_key = Merchant app_private_key (*) -- \n" +
" -- spring.luues.alipay.app_public_key = Merchant app_public_key (*) -- \n" +
" -- spring.luues.alipay.charset = Merchant charset -- \n" +
" -- spring.luues.alipay.sign_type = Merchant sign_type -- \n}\n");
}
}
/**
* 创建pc端web订单信息
* @param aliOrderMustFillRequest
* @return
*/
@SneakyThrows
public AliOrder createPcOrder(AliOrderMustFillRequest aliOrderMustFillRequest, AliOrderSelectiveFillRequest aliOrderSelectiveFillRequest) {
return aliPayOrder.createPcOrder(aliOrderMustFillRequest, aliOrderSelectiveFillRequest);
}
/**
* 构建alipay pc端web支付对象
* @param return_url
* @param notify_url
* @param aliOrder 通过 aliPay.create*Order()创建
* @return
*/
public AliPayOrderInfo createAliPayOrderInfo(String return_url, String notify_url, AliOrder aliOrder){
if(Objects.isNull(return_url))
return_url = aliPayInfo.getReturn_url();
if(Objects.isNull(notify_url))
notify_url = aliPayInfo.getNotify_url();
return new AliPayOrderInfo(return_url, notify_url, aliOrder);
}
/**
* 构建alipay pc端web支付对象
* @param aliOrder 通过 aliPay.create*Order()创建
* @return
*/
public AliPayOrderInfo createAliPayOrderInfo(AliOrder aliOrder){
return new AliPayOrderInfo(aliPayInfo.getReturn_url(), aliPayInfo.getNotify_url(), aliOrder);
}
/**
* pc端web构建支付
* @param aliPayOrderInfo
* @return String
*/
@SneakyThrows
public AlipayTradePagePayResponse pc_pay(AliPayOrderInfo aliPayOrderInfo) {
return pay.pc_pay(aliPayOrderInfo);
}
/**
* 创建wap端订单信息
* @param aliOrderMustFillRequest
* @return
*/
@SneakyThrows
public AliOrder createWapOrder(AliOrderMustFillRequest aliOrderMustFillRequest, AliOrderSelectiveFillRequest aliOrderSelectiveFillRequest) {
return aliPayOrder.createWapOrder(aliOrderMustFillRequest, aliOrderSelectiveFillRequest);
}
/**
* wap端构建支付
* @param aliPayOrderInfo
* @return String
*/
@SneakyThrows
public AlipayTradeWapPayResponse wap_pay(AliPayOrderInfo aliPayOrderInfo) {
return pay.wap_pay(aliPayOrderInfo);
}
/**
* 创建app端订单信息
* @param aliOrderMustFillRequest
* @return
*/
@SneakyThrows
public AliOrder createAppOrder(AliOrderMustFillRequest aliOrderMustFillRequest, AliOrderSelectiveFillRequest aliOrderSelectiveFillRequest) {
return aliPayOrder.createAppOrder(aliOrderMustFillRequest, aliOrderSelectiveFillRequest);
}
/**
* app端构建支付
* @param aliPayOrderInfo
* @return String
*/
@SneakyThrows
public AlipayTradeAppPayResponse app_pay(AliPayOrderInfo aliPayOrderInfo) {
return pay.app_pay(aliPayOrderInfo);
}
/**
* 创建扫码支付订单信息
* @param aliOrderMustFillRequest
* @return
*/
@SneakyThrows
public AliOrder createNativeOrder(AliOrderMustFillRequest aliOrderMustFillRequest, AliOrderSelectiveFillRequest aliOrderSelectiveFillRequest) {
return aliPayOrder.createNativeOrder(aliOrderMustFillRequest, aliOrderSelectiveFillRequest);
}
/**
* 扫码构建支付
* @param aliPayOrderInfo
* @return String
*/
@SneakyThrows
public AlipayTradePrecreateResponse native_pay(AliPayOrderInfo aliPayOrderInfo) {
return pay.native_pay(aliPayOrderInfo);
}
/**
* 扫码构建支付
* @param aliPayOrderInfo
* @param logoPath
* @return String
*/
@SneakyThrows
public AlipayTradePrecreateResponse native_pay(AliPayOrderInfo aliPayOrderInfo, String logoPath) {
return pay.native_pay(aliPayOrderInfo, logoPath);
}
/**
* 查询订单
* @param trade_no
* 支付宝订单号(任选其一,支付宝订单号优先)
* @param out_trade_no
* 商户订单号(任选其一,支付宝订单号优先)
* @return Object
*/
@SneakyThrows
public AlipayTradeQueryResponse queryAliOrderInfo(String trade_no, String out_trade_no) {
return aliPayOrder.queryAliOrderInfo(trade_no, out_trade_no);
}
/**
* 商户提交退款申请(支付宝订单号和商户订单号任选其一,如果都传支付宝订单号优先)
* @param trade_no
* 支付宝订单号
* @param out_trade_no
* 商户订单号
* @param refund_amount
* 退款金额(单位元,保留2位小数)
* @param refund_reason
* 退款原因(说明)
* @param out_request_no
* 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
* @param operator_id
* 商户的操作员编号
* @return Object
*/
@SneakyThrows
public AlipayTradeRefundResponse refund(String trade_no, String out_trade_no, String refund_amount, String refund_reason, String out_request_no, String operator_id) {
return aliPayOrder.refund(trade_no, out_trade_no, refund_amount, refund_reason, out_request_no, operator_id);
}
/**
* 查询退款详情(参数四选一)
* @param trade_no
* 支付宝订单
* @param out_trade_no
* 商户订单号
* @param out_request_no
* 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号
* @return Object
*/
@SneakyThrows
public AlipayTradeFastpayRefundQueryResponse queryRefund(String trade_no, String out_trade_no, String out_request_no) {
return aliPayOrder.queryRefund(trade_no, out_trade_no, out_request_no);
}
/**
* 关闭订单
* @param trade_no
* 支付宝订单号
* @param out_trade_no
* 商户订单号
* @param operator_id
* 操作员
* @return Object
*/
@SneakyThrows
public AlipayTradeCloseResponse closeOrder(String trade_no, String out_trade_no, String operator_id) {
return aliPayOrder.closeOrder(trade_no, out_trade_no, operator_id);
}
/**
* 下载对账单
* @param bill_date
* (y) 账单时间:日账单格式为yyyy-MM-dd,最早可下载2016年1月1日开始的日账单;月账单格式为yyyy-MM,最早可下载2016年1月开始的月账单。
* @param bill_type
* (y) 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单。
*
* @return Object
*/
@SneakyThrows
public AlipayDataDataserviceBillDownloadurlQueryResponse downloadBill(String bill_date, String bill_type) {
return aliPayOrder.downloadBill(bill_date, bill_type);
}
/**
* 转账给用户
* @param aliPayTrans
* @return Object
*/
@SneakyThrows
public AlipayFundTransUniTransferResponse transfers(AliPayTrans aliPayTrans) {
return pay.transfers(aliPayTrans);
}
/**
* 查询转账订单详情
* @param order_id
* 支付宝转账订单号
* @param pay_fund_order_id
* 支付宝流水号
* @param out_biz_no
* 商户转账号
* @return Object
*/
@SneakyThrows
public AlipayFundTransCommonQueryResponse queryAliTranesInfo(String order_id, String pay_fund_order_id, String out_biz_no) {
return aliPayOrder.queryAliTranesInfo(order_id, pay_fund_order_id, out_biz_no);
}
/**
* 查询商户余额
* @param alipay_user_id
* 蚂蚁统一会员ID
* @return Object
*/
@SneakyThrows
public AlipayFundAccountQueryResponse queryAccountBalance(String alipay_user_id) {
return aliPayOrder.queryAccountBalance(alipay_user_id);
}
/**
* 异步回调的时候调用该方法验证是否支付宝请求
* @return
*/
public R valiAliPaySign(TradeCloseCallBack tradeCloseCallBack, TradeWaitPayCallBack tradeWaitPayCallBack, TradeSuccessCallBack tradeSuccessCallBack) {
Map paramsMap = convertRequestParamsToMap(SpringContextHolder.getRequest()); //将异步通知中收到的所有参数都存放到 map 中
boolean signVerified = false; //调用SDK验证签名
try {
signVerified = AlipaySignature.rsaCheckV1(paramsMap, aliPayInfo.getPublicKey(), aliPayInfo.getCharset(), aliPayInfo.getSignType());
} catch (AlipayApiException e) {
return R.FAIL("failure");
}
if(!signVerified){
return R.FAIL("failure");
}else{
AliOrderBack aliOrderBack = new AliOrderBack();
aliOrderBack.setTrade_status(paramsMap.get("trade_status"));
aliOrderBack.setOut_trade_no(paramsMap.get("out_trade_no"));
aliOrderBack.setTrade_no(paramsMap.get("trade_no"));
aliOrderBack.setBuyer_id(paramsMap.get("buyer_id"));
if(aliOrderBack.getTrade_status().equals(CommonConstants.TRADE_CLOSED) && null != tradeCloseCallBack){
tradeCloseCallBack.close(aliOrderBack);
}
if(aliOrderBack.getTrade_status().equals(CommonConstants.WAIT_BUYER_PAY) && null != tradeWaitPayCallBack){
tradeWaitPayCallBack.waitPay(aliOrderBack);
}
if(aliOrderBack.getTrade_status().equals(CommonConstants.TRADE_SUCCESS) && null != tradeSuccessCallBack){
tradeSuccessCallBack.success(aliOrderBack);
}
return R.SUCCESS();
}
}
// 将request中的参数转换成Map
protected Map convertRequestParamsToMap(HttpServletRequest request) {
Map retMap = new HashMap();
Set> entrySet = request.getParameterMap().entrySet();
for (Map.Entry entry : entrySet) {
String name = entry.getKey();
String[] values = entry.getValue();
int valLen = values.length;
if (valLen == 1) {
retMap.put(name, values[0]);
} else if (valLen > 1) {
StringBuilder sb = new StringBuilder();
for (String val : values) {
sb.append(",").append(val);
}
retMap.put(name, sb.toString().substring(1));
} else {
retMap.put(name, "");
}
}
return retMap;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy