All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.github.dennisit.vplus.data.utils.AlipayUtils Maven / Gradle / Ivy
package com.github.dennisit.vplus.data.utils;
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.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.github.dennisit.vplus.data.exception.ApiException;
import com.github.dennisit.vplus.data.pay.AlipayStatus;
import com.github.dennisit.vplus.data.pay.AlipayConfig;
import com.github.dennisit.vplus.data.pay.TradeEntry;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Slf4j
public class AlipayUtils {
/**
* 手机支付
*
* @param alipay 支付宝配置
* @param trade 交易信息
* @return 交易结果
* @throws Exception 异常处理
*/
public static String payWithPC(AlipayConfig alipay, TradeEntry trade) throws Exception {
if (alipay.getId() == null) {
throw new ApiException("请先添加相应配置,再操作");
}
AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppId(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType());
double money = Double.parseDouble(trade.getTotalAmount());
if (money <= 0 || money >= 5000) {
throw new ApiException("测试金额过大");
}
// 创建API对应的request(电脑网页版)
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 订单完成后返回的页面和异步通知地址
request.setReturnUrl(alipay.getReturnUrl());
request.setNotifyUrl(alipay.getNotifyUrl());
// 填充订单参数
request.setBizContent("{" +
" \"out_trade_no\":\"" + trade.getOutTradeNo() + "\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
" \"total_amount\":" + trade.getTotalAmount() + "," +
" \"subject\":\"" + trade.getSubject() + "\"," +
" \"body\":\"" + trade.getBody() + "\"," +
" \"extend_params\":{" +
" \"sys_service_provider_id\":\"" + alipay.getSysServiceProviderId() + "\"" +
" }" +
" }"); //填充业务参数
return alipayClient.pageExecute(request, "GET").getBody();
}
/**
* 终端支付
*
* @param alipay 支付宝配置
* @param trade 交易信息
* @return 交易结果
* @throws Exception 异常处理
*/
public static String payWithWeb(AlipayConfig alipay, TradeEntry trade) throws Exception {
if (alipay.getId() == null) {
throw new ApiException("请先添加相应配置,再操作");
}
AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppId(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType());
double money = Double.parseDouble(trade.getTotalAmount());
if (money <= 0 || money >= 5000) {
throw new ApiException("测试金额过大");
}
// 创建API对应的request(手机网页版)
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
// 订单完成后返回的页面和异步通知地址
request.setReturnUrl(alipay.getReturnUrl());
request.setNotifyUrl(alipay.getNotifyUrl());
// 填充业务参数
request.setBizContent("{" +
" \"out_trade_no\":\"" + trade.getOutTradeNo() + "\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
" \"total_amount\":" + trade.getTotalAmount() + "," +
" \"subject\":\"" + trade.getSubject() + "\"," +
" \"body\":\"" + trade.getBody() + "\"," +
" \"extend_params\":{" +
" \"sys_service_provider_id\":\"" + alipay.getSysServiceProviderId() + "\"" +
" }" +
" }");
return alipayClient.pageExecute(request, "GET").getBody();
}
/**
* 支付异步通知
* (要公网访问),接收异步通知,检查通知内容app_id、out_trade_no、total_amount是否与请求中的一致,根据trade_status进行后续业务处理
*
* @param alipayConfig 支付宝配置
* @return 交易结果
*/
public static boolean notifyAccept(AlipayConfig alipayConfig) {
HttpServletRequest request = WebUtils.getHttpServletRequest();
Map parameterMap = request.getParameterMap();
StringBuilder notifyKvs = new StringBuilder();
parameterMap.forEach((key, value) -> notifyKvs.append(key + "=" + value[0] + "\n"));
log.debug(notifyKvs.toString());
// 内容验签,防止黑客篡改参数
if (!AlipayUtils.rsaCheck(request, alipayConfig)) {
throw new ApiException("内容被篡改");
}
// 交易状态
String tradeStatus = sourceToUTF8(request.getParameter("trade_status"));
// 商户订单号
String outTradeNo = sourceToUTF8(request.getParameter("out_trade_no"));
// 支付宝交易号
String tradeNo = sourceToUTF8(request.getParameter("trade_no"));
// 付款金额
String totalAmount = sourceToUTF8(request.getParameter("total_amount"));
log.info("tradeStatus:{}, outTradeNo:{}, tradeNo:{}, totalAmount:{}", tradeStatus, outTradeNo, tradeNo, totalAmount);
return tradeStatus.equals(AlipayStatus.SUCCESS.getValue()) || tradeStatus.equals(AlipayStatus.FINISHED.getValue());
}
public static String sourceToUTF8(String source) {
if (StringUtils.isBlank(source)) {
return StringUtils.EMPTY;
}
try {
return new String(source.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
log.error(e.getLocalizedMessage());
}
return source;
}
/**
* 生成订单号
*
* @return 订单编号
*/
public static String getOrderCode() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
int a = (int) (Math.random() * 9000.0D) + 1000;
Date date = new Date();
String str = sdf.format(date);
String[] split = str.split("-");
String s = split[0] + split[1] + split[2];
String[] split1 = s.split(" ");
String s1 = split1[0] + split1[1];
String[] split2 = s1.split(":");
String s2 = split2[0] + split2[1] + split2[2] + a;
return s2;
}
/**
* 校验签名
*
* @param request Http请求
* @param aliPayConfig 支付宝配置
* @return 签名校验结果
*/
public static boolean rsaCheck(HttpServletRequest request, AlipayConfig aliPayConfig) {
// 获取支付宝POST过来反馈信息
Map params = new HashMap<>(1);
Map requestParams = request.getParameterMap();
for (Iterator 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);
}
try {
return AlipaySignature.rsaCheckV1(params, aliPayConfig.getPublicKey(), aliPayConfig.getCharset(), aliPayConfig.getSignType());
} catch (AlipayApiException e) {
return false;
}
}
}