依赖
上代码
package com.yuren.yoga.common.vendor.template;
import com.alibaba.fastjson.JSON;
import com.alipay.api.*;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@Slf4j
public class AliPayTemplate {
private AliPayProperties aliPayProperties;
private String PRODUCT_CODE = "CYCLE_PAY_AUTH";
private String SIGN_SCENE = "INDUSTRY|CARRENTAL";
private String url = "https://openapi.alipay.com/gateway.do";
public AliPayTemplate(AliPayProperties aliPayProperties) {
this.aliPayProperties = aliPayProperties;
}
public CertAlipayRequest getCertAlipayRequest() {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
certAlipayRequest.setAppId(aliPayProperties.getAppId());
certAlipayRequest.setPrivateKey(aliPayProperties.getPrivateKey());
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("UTF-8");
certAlipayRequest.setSignType("RSA2");
certAlipayRequest.setCertPath(aliPayProperties.getCertPath() + "appCertPublicKey_" + aliPayProperties.getAppId() + ".crt");
certAlipayRequest.setAlipayPublicCertPath(aliPayProperties.getCertPath() + "alipayCertPublicKey_RSA2.crt");
certAlipayRequest.setRootCertPath(aliPayProperties.getCertPath() + "alipayRootCert.crt");
return certAlipayRequest;
}
public String getOrder(String name, double price, Double originPrice, String courseId, String userId, String type) {
return getOrder(name, price, originPrice, courseId, userId, type, null);
}
public String getOrder(String name, double price, Double originPrice, String courseId, String userId, String type, String contactPhone) {
CertAlipayRequest certAlipayRequest = getCertAlipayRequest();
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(certAlipayRequest);
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
if (originPrice == null || 0 == originPrice) {
originPrice = price;
}
if (StringUtils.isEmpty(contactPhone)) {
contactPhone = "";
}
model.setBody(courseId + "-" + userId + "-" + type + "-" + originPrice + "-" + contactPhone);
model.setSubject("YUREN-" + name);
model.setGoodsType("0");//虚拟类商品
String outTradeNo = DateUtils.format(new Date(), "yyyyMMddHHmmss")
+ new Random().nextInt(8999) + 1000;
model.setOutTradeNo(outTradeNo);
model.setTimeoutExpress("30m");
model.setTotalAmount(price + "");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(aliPayProperties.getCallbackUrl());
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
public AlipayTradePrecreateResponse getQROrder(String name, double price, Double originPrice, String goodsId, String userId, String type) {
CertAlipayRequest certAlipayRequest = getCertAlipayRequest();
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(certAlipayRequest);
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); //创建API对应的request类
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
if (originPrice == null || 0 == originPrice) {
originPrice = price;
}
model.setBody(goodsId + "-" + userId + "-" + type + "-" + originPrice);
model.setSubject("YUREN-" + name);
String outTradeNo = DateUtils.format(new Date(), "yyyyMMddHHmmss")
+ new Random().nextInt(8999) + 1000;
// log.info(outTradeNo);
model.setOutTradeNo(outTradeNo);
model.setTimeoutExpress("30m");
model.setTotalAmount(price + "");
request.setBizModel(model);
request.setNotifyUrl(aliPayProperties.getCallbackUrl() + "Admin");
// log.info("callbackUrl:{},certPath:{}",callbackUrl,certPath);
AlipayTradePrecreateResponse response = null;
try {
response = alipayClient.certificateExecute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
public String getH5Pay(String name, double price, Double originPrice, String goodsId, String userId, String type, String outTradeNo) {
return getH5Pay(name, price, originPrice, goodsId, userId, type, outTradeNo, null);
}
public String getH5Pay(String name, double price, Double originPrice, String goodsId, String userId, String type, String outTradeNo, String contactPhone) {
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
request.setNotifyUrl(aliPayProperties.getCallbackUrl());
if (originPrice == null || 0 == originPrice) {
originPrice = price;
}
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(goodsId + "-" + userId + "-" + type + "-" + originPrice);
model.setOutTradeNo(outTradeNo);
model.setProductCode("QUICK_WAP_WAY");
model.setTimeoutExpress("30m");
model.setTotalAmount(price + "");
model.setSubject("YUREN-" + name);
if (StringUtils.isNotEmpty(contactPhone)) {
model.setBody(goodsId + "-" + userId + "-" + type + "-" + originPrice + "-" + contactPhone);
} else {
model.setBody(goodsId + "-" + userId + "-" + type + "-" + originPrice);
}
//bizContent.put("time_expire", "2022-08-01 22:00:00");
// 商品明细信息,按需传入
// 扩展信息,按需传入
request.setBizModel(model);
AlipayTradeWapPayResponse response = null;
try {
response = alipayClient.pageExecute(request, "GET");
} catch (AlipayApiException e) {
e.printStackTrace();
}
if (!org.springframework.util.StringUtils.isEmpty(response) && response.isSuccess()) {
log.debug("调用成功");
} else {
log.debug("调用失败");
}
return response.getBody();
}
public boolean queryOrder(String outTradeNo) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();
alipayTradeQueryRequest.setBizContent("{" +
""out_trade_no":"" + outTradeNo + """ +
"}");
AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.certificateExecute(alipayTradeQueryRequest);
return "TRADE_SUCCESS".equals(alipayTradeQueryResponse.getTradeStatus());
} catch (AlipayApiException e) {
e.printStackTrace();
}
return false;
}
public Map refund(String refundAmount, String tradeNo, String outTradeNo, String refundReason) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();
if (StringUtils.isNotEmpty(outTradeNo)) {
refundModel.setOutTradeNo(outTradeNo);
} else {
refundModel.setTradeNo(tradeNo);
}
refundModel.setRefundAmount(refundAmount);
refundModel.setRefundReason(refundReason);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizModel(refundModel);
try {
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
System.out.println("response.getBody() = " + response.getBody());
Map result = JSON.parseObject(response.getBody(), Map.class);
return result;
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
public String signUp(String externalAgreementNo, String money, int num, boolean isWeb) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();
request.setNotifyUrl(aliPayProperties.getSignUpUrl());
request.setReturnUrl(aliPayProperties.getSignReturnUrl());
Map optionalArgs = new HashMap<>();
//周期扣款销售产品码固定为CYCLE_PAY_AUTH。
optionalArgs.put("product_code", PRODUCT_CODE);
//周期扣款个人签约产品码固定为CYCLE_PAY_AUTH_P
optionalArgs.put("personal_product_code", "CYCLE_PAY_AUTH_P");
//协议签约场景,参见下文sign_scene参数说明 INDUSTRY|EDU教育行业
optionalArgs.put("sign_scene", SIGN_SCENE);
// 商户签约号,代扣协议中标示用户的唯一签约号(确保在商户系统中唯一
optionalArgs.put("external_agreement_no", externalAgreementNo);
Map accessParams = new HashMap<>();
accessParams.put("channel", "ALIPAYAPP");
optionalArgs.put("access_params", accessParams);
Map periodRuleParams = new HashMap<>();
//周期类型period_type是周期扣款产品必填,枚举值为DAY和MonTH
periodRuleParams.put("period_type", "MONTH");
//30天为一个扣款周期
periodRuleParams.put("period", String.valueOf(num));
Date date = new Date();
String dd = DateUtils.format(date, "dd");
//如果当天大于28号 修改到下月1号
if (Integer.valueOf(dd) > 28){
date = DateUtils.getTimesMonthmorning(DateUtils.addDateMonths(date, 1));
}
periodRuleParams.put("execute_time", DateUtils.format(date));
periodRuleParams.put("single_amount", money);
optionalArgs.put("period_rule_params", periodRuleParams);
//签约参数。如果希望在sdk中支付并签约,需要在这里传入签约信息。周期扣款场景 product_code 为 CYCLE_PAY_AUTH 时必填
String requestJson = JSON.toJSonString(optionalArgs);
log.info("用户{}:发起周期扣款签约请求,入参:{}", externalAgreementNo, requestJson);
request.setBizContent(requestJson);
AlipayUserAgreementPageSignResponse response;
try {
if (isWeb) {
response = alipayClient.pageExecute(request, "get");
} else {
response = alipayClient.sdkExecute(request);
}
if (response.isSuccess()) {
log.info("用户{}:周期扣款,发起签约成功", externalAgreementNo);
//获取需提交的form表单
return response.getBody();
}
log.info("用户{}:周期扣款,发起签约失败:{}", externalAgreementNo, response.getSubMsg());
} catch (AlipayApiException e) {
e.printStackTrace();
log.error("用户{}:周期扣款,发起签约异常:{}", externalAgreementNo, e);
}
return null;
}
public String getOutTradeNo() {
return "Y" + DateUtils.format(new Date(), "yyyyMMddHHmmss") + new Random().nextInt(8999) + 1000;
}
public AlipayUserAgreementQueryResponse querySign(String externalAgreementNo) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest();
Map requestMap = new HashMap<>();
requestMap.put("personal_product_code", "CYCLE_PAY_AUTH_P");
requestMap.put("sign_scene", SIGN_SCENE);
requestMap.put("external_agreement_no", externalAgreementNo);
String requestJson = JSON.toJSonString(requestMap);
log.info("{}:查询周期扣款签约结果入参:{}", externalAgreementNo, requestJson);
request.setBizContent(requestJson);
AlipayUserAgreementQueryResponse response = null;
try {
response = alipayClient.certificateExecute(request);
if (response.isSuccess()) {
log.info("{}:查询周期扣款签约结果,调用成功", externalAgreementNo);
return response;
} else {
log.info("{}:查询周期扣款签约结果,调用失败:{}", externalAgreementNo, response.getSubMsg());
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
public AlipayTradePayResponse aliPayTradePayByAuthCode(String agreementNo, String outTradeNo, String title, String totalAmount) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayTradePayRequest request = new AlipayTradePayRequest();
request.setNotifyUrl(aliPayProperties.getPayNotifyUrl());
Map requestMap = new HashMap<>();
//商户订单号
requestMap.put("out_trade_no", outTradeNo);
//必填,周期扣款代扣场景固定值
requestMap.put("scene", "deduct_pay");
//用户签约号 agreement_no
requestMap.put("auth_code", agreementNo);
//周期扣款固定
requestMap.put("product_code", "CYCLE_PAY_AUTH");
//订单标题
requestMap.put("subject", title);
//本次扣款金额
requestMap.put("total_amount", totalAmount);
String requestJson = JSON.toJSonString(requestMap);
log.info("{}:查询签约用户,进行自动续期扣费:{}", "", requestJson);
request.setBizContent(requestJson);
AlipayTradePayResponse response = null;
try {
response = alipayClient.certificateExecute(request);
if (response.isSuccess()) {
log.info("{}:周期扣款,主动扣费成功", agreementNo);
} else {
log.info("{}:周期扣款,主动扣费失败:{}", agreementNo, response.getSubMsg());
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public AlipayUserAgreementExecutionplanModifyResponse aliPayModifyPlan(String agreementNo, String deductTime) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayUserAgreementExecutionplanModifyRequest request = new AlipayUserAgreementExecutionplanModifyRequest();
Map requestMap = new HashMap<>();
requestMap.put("agreement_no", agreementNo);
requestMap.put("deduct_time", deductTime);
String requestJson = JSON.toJSonString(requestMap);
log.info("{}:周期扣款-修改协议执行计划入参:{}", agreementNo, requestJson);
request.setBizContent(requestJson);
try {
AlipayUserAgreementExecutionplanModifyResponse response = alipayClient.certificateExecute(request);
if (response.isSuccess()) {
log.info("{}:周期扣款-修改协议执行计划,调用成功", agreementNo);
return response;
} else {
log.info("{}:周期扣款-修改协议执行计划,调用失败:{}", agreementNo, response.getSubMsg());
}
} catch (AlipayApiException e) {
e.printStackTrace();
log.error("{}:周期扣款-修改协议执行计划,调用异常:{}", agreementNo, e);
}
return null;
}
public AlipayUserAgreementUnsignResponse aliPayUnSign(String externalAgreementNo) {
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(getCertAlipayRequest());
} catch (AlipayApiException e) {
e.printStackTrace();
}
AlipayUserAgreementUnsignRequest request = new AlipayUserAgreementUnsignRequest();
Map requestMap = new HashMap<>();
requestMap.put("personal_product_code", "CYCLE_PAY_AUTH_P");
requestMap.put("sign_scene", SIGN_SCENE);
requestMap.put("external_agreement_no", externalAgreementNo);
String requestJson = JSON.toJSonString(requestMap);
log.info("{}:周期扣款-解除签约入参:{}", externalAgreementNo, requestJson);
request.setBizContent(requestJson);
try {
AlipayUserAgreementUnsignResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
log.info("{}:周期扣款-解除签约,调用成功", externalAgreementNo);
return response;
} else {
log.info("{}:周期扣款-解除签约,调用失败:{}", externalAgreementNo, response.getSubMsg());
}
} catch (AlipayApiException e) {
e.printStackTrace();
log.error("{}:周期扣款-解除签约,调用异常:{}", externalAgreementNo, e);
}
return null;
}
}
配置类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "payment.ali")
@Data
public class AliPayProperties {
private String appId;
private String privateKey;
private String publicKey;
private String certPath;
private String callbackUrl;
private String signUpUrl;
private String signReturnUrl;
private String payNotifyUrl;
}



