package cn.stylefeng.rest.ijpay.controller;
|
|
import cn.hutool.core.lang.UUID;
|
import cn.hutool.core.util.StrUtil;
|
import cn.stylefeng.guns.modular.business.dto.request.OrderPayRequest;
|
import cn.stylefeng.guns.modular.business.entity.CounsellingOrder;
|
import cn.stylefeng.guns.modular.business.entity.CourseOrder;
|
import cn.stylefeng.guns.modular.business.entity.OrderConsultOne;
|
import cn.stylefeng.guns.modular.business.entity.OrderMentalTest;
|
import cn.stylefeng.guns.modular.business.service.ICounsellingOrderService;
|
import cn.stylefeng.guns.modular.business.service.ICourseOrderService;
|
import cn.stylefeng.guns.modular.business.service.IOrderConsultOneService;
|
import cn.stylefeng.guns.modular.business.service.IOrderMentalTestService;
|
import cn.stylefeng.guns.utils.GeneralUtil;
|
import cn.stylefeng.rest.ijpay.entity.AliPayBean;
|
import cn.stylefeng.rest.ijpay.entity.request.AliAppPayRequest;
|
import cn.stylefeng.rest.modular.order.service.MentalTestOrderBizService;
|
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
|
import cn.stylefeng.roses.kernel.rule.enums.OrderStatusFlagEnum;
|
import cn.stylefeng.roses.kernel.rule.enums.OrderTypeEnum;
|
import cn.stylefeng.roses.kernel.rule.enums.PayTypeEnum;
|
import cn.stylefeng.roses.kernel.rule.pojo.response.ErrorResponseData;
|
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
|
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
|
import com.alibaba.fastjson.JSONObject;
|
import com.alipay.api.AlipayApiException;
|
import com.alipay.api.domain.*;
|
import com.alipay.api.internal.util.AlipaySignature;
|
import com.alipay.api.response.AlipayFundAuthOrderFreezeResponse;
|
import com.alipay.api.response.AlipayFundCouponOrderAgreementPayResponse;
|
import com.alipay.api.response.AlipayTradeCreateResponse;
|
import com.alipay.api.response.AlipayTradeRefundResponse;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.ijpay.alipay.AliPayApi;
|
import com.ijpay.alipay.AliPayApiConfig;
|
import com.ijpay.alipay.AliPayApiConfigKit;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
@Slf4j
|
@Controller
|
@Api(tags = "支付接口")
|
@RequestMapping("/aliPay")
|
public class AliPayController {
|
|
@Resource
|
AliPayBean aliPayBean;
|
|
@Resource
|
IOrderMentalTestService orderMentalTestService;
|
|
@Resource
|
IOrderConsultOneService orderConsultOneService;
|
|
@Resource
|
MentalTestOrderBizService mentalTestOrderBizService;
|
|
@Resource
|
ICourseOrderService courseOrderService;
|
|
@Resource
|
ICounsellingOrderService counsellingOrderService;
|
|
// 普通公钥模式
|
private final static String NOTIFY_URL = "/aliPay" + RuleConstants.NOT_LOGIN + "/notify_url";
|
private final static String RETURN_URL = "/aliPay" + RuleConstants.NOT_LOGIN + "/return_url";
|
|
/**
|
* app支付
|
*/
|
@ApiOperation(value = "支付宝APP支付")
|
@PostMapping(value = "/appPay")
|
@ResponseBody
|
public ResponseData<String> appPay(@RequestBody @Validated AliAppPayRequest req) {
|
// 支付金额
|
String totalAmount = "";
|
|
// 订单编号判断订单类型
|
if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
|
// 心理测试订单
|
OrderMentalTest order = orderMentalTestService.getOrderByNo(req.getOrderNo());
|
totalAmount = order.getPayAmount().toString();
|
} else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
|
// 心理咨询1V1订单
|
OrderConsultOne order = orderConsultOneService.getOrderByNo(req.getOrderNo());
|
totalAmount = order.getPayAmount().toString();
|
}else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())){
|
CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(req.getOrderNo());
|
totalAmount = courseOrder.getPayAmount().toString();
|
} else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
|
CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(req.getOrderNo());
|
totalAmount = counsellingOrder.getPayAmount().toString();
|
}
|
|
// 判断支付金额是否为0
|
BigDecimal amount = new BigDecimal(totalAmount);
|
// 判断转换后的BigDecimal是否为0
|
if (amount.compareTo(BigDecimal.ZERO) == 0) {
|
if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
|
// 心理测试订单
|
orderMentalTestService.paySuccess(req.getOrderNo(), req.getOrderNo(), totalAmount, PayTypeEnum.ALIPAY.getCode());
|
} else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
|
// 心理咨询1V1订单
|
mentalTestOrderBizService.paySuccessOrderConsultOne(req.getOrderNo(), req.getOrderNo(), totalAmount, PayTypeEnum.ALIPAY.getCode());
|
} else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
|
//课程订单
|
OrderPayRequest orderPayRequest = new OrderPayRequest();
|
orderPayRequest.setOrderNo(req.getOrderNo());
|
orderPayRequest.setTransactionNo(req.getOrderNo());
|
orderPayRequest.setPayType("2");
|
orderPayRequest.setOrderType(1);
|
courseOrderService.payCourseOrder(orderPayRequest);
|
} else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
|
//咨询订单
|
OrderPayRequest orderPayRequest = new OrderPayRequest();
|
orderPayRequest.setOrderNo(req.getOrderNo());
|
orderPayRequest.setTransactionNo(req.getOrderNo());
|
orderPayRequest.setPayType("2");
|
orderPayRequest.setOrderType(2);
|
counsellingOrderService.payCounsellingOrder(orderPayRequest);
|
}
|
return new SuccessResponseData("支付成功");
|
}
|
|
try {
|
// 设置支付配置
|
AliPayApiConfigKit.putApiConfig(getApiConfig());
|
//AliPayApiConfigKit.setThreadLocalAppId(aliPayBean.getAppId());
|
//AliPayApiConfigKit.setThreadLocalAliPayApiConfig(getApiConfig());
|
|
// 设置支付参数
|
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
|
model.setBody(req.getSubject());
|
model.setSubject(req.getSubject());
|
//model.setOutTradeNo(UUID.randomUUID().toString(true));
|
model.setOutTradeNo(req.getOrderNo());
|
model.setTotalAmount(totalAmount);
|
model.setTimeoutExpress("30m");
|
model.setPassbackParams("callback params");
|
model.setProductCode("QUICK_MSECURITY_PAY");
|
String orderInfo = AliPayApi.appPayToResponse(model, aliPayBean.getDomain() + NOTIFY_URL).getBody();
|
log.info("支付宝APP支付返回参数:{}", orderInfo);
|
return new SuccessResponseData(orderInfo);
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
log.error("支付宝APP支付异常!", e.getMessage());
|
return new ErrorResponseData("500", e.getMessage());
|
}
|
}
|
|
|
|
@PostMapping(value = RuleConstants.NOT_LOGIN + "/freePay")
|
@ResponseBody
|
public String freePay(HttpServletRequest request) {
|
try {
|
log.info("支付宝异步通知");
|
|
// 获取支付宝POST过来反馈信息
|
Map<String, String> params = AliPayApi.toMap(request);
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
log.info(entry.getKey() + " = " + entry.getValue());
|
}
|
if (params.get("out_biz_no") != null){
|
log.info(params.get("out_biz_no").toString()+",退费成功!");
|
return "success";
|
}
|
boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2");
|
|
if (verifyResult) {
|
// 参数文档:https://opendocs.alipay.com/open/204/105301?pathHash=fef00e6d
|
String tradeNo = params.get("trade_no");
|
String totalAmount = params.get("total_amount");
|
// 获取订单号
|
String orderNo = params.get("out_trade_no");
|
// 订单编号判断订单类型
|
if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
|
// 心理测试订单
|
orderMentalTestService.paySuccess(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode());
|
} else if (orderNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
|
// 心理咨询1V1订单
|
mentalTestOrderBizService.paySuccessOrderConsultOne(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode());
|
} else if (orderNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
|
//课程订单
|
OrderPayRequest orderPayRequest = new OrderPayRequest();
|
orderPayRequest.setOrderNo(orderNo);
|
orderPayRequest.setTransactionNo(tradeNo);
|
orderPayRequest.setPayType("2");
|
orderPayRequest.setOrderType(1);
|
courseOrderService.payCourseOrder(orderPayRequest);
|
} else if (orderNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
|
//咨询订单
|
OrderPayRequest orderPayRequest = new OrderPayRequest();
|
orderPayRequest.setOrderNo(orderNo);
|
orderPayRequest.setTransactionNo(tradeNo);
|
orderPayRequest.setPayType("2");
|
orderPayRequest.setOrderType(2);
|
counsellingOrderService.payCounsellingOrder(orderPayRequest);
|
}
|
|
log.info("notify_url 验证成功succcess");
|
return "success";
|
} else {
|
log.error("notify_url 验证失败");
|
return "failure";
|
}
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
return "failure";
|
}
|
}
|
|
@RequestMapping(value = RuleConstants.NOT_LOGIN + "/notify_url", method = {RequestMethod.POST, RequestMethod.GET})
|
@ResponseBody
|
public String notifyUrl(HttpServletRequest request) {
|
try {
|
log.info("支付宝异步通知");
|
|
// 获取支付宝POST过来反馈信息
|
Map<String, String> params = AliPayApi.toMap(request);
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
log.info(entry.getKey() + " = " + entry.getValue());
|
}
|
if (params.get("out_biz_no") != null){
|
log.info(params.get("out_biz_no").toString()+",退费成功!");
|
return "success";
|
}
|
boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2");
|
|
if (verifyResult) {
|
// 参数文档:https://opendocs.alipay.com/open/204/105301?pathHash=fef00e6d
|
String tradeNo = params.get("trade_no");
|
String totalAmount = params.get("total_amount");
|
// 获取订单号
|
String orderNo = params.get("out_trade_no");
|
// 订单编号判断订单类型
|
if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
|
// 心理测试订单
|
orderMentalTestService.paySuccess(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode());
|
} else if (orderNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
|
// 心理咨询1V1订单
|
mentalTestOrderBizService.paySuccessOrderConsultOne(orderNo, tradeNo, totalAmount, PayTypeEnum.ALIPAY.getCode());
|
} else if (orderNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
|
//课程订单
|
OrderPayRequest orderPayRequest = new OrderPayRequest();
|
orderPayRequest.setOrderNo(orderNo);
|
orderPayRequest.setTransactionNo(tradeNo);
|
orderPayRequest.setPayType("2");
|
orderPayRequest.setOrderType(1);
|
courseOrderService.payCourseOrder(orderPayRequest);
|
} else if (orderNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
|
//咨询订单
|
OrderPayRequest orderPayRequest = new OrderPayRequest();
|
orderPayRequest.setOrderNo(orderNo);
|
orderPayRequest.setTransactionNo(tradeNo);
|
orderPayRequest.setPayType("2");
|
orderPayRequest.setOrderType(2);
|
counsellingOrderService.payCounsellingOrder(orderPayRequest);
|
}
|
|
log.info("notify_url 验证成功succcess");
|
return "success";
|
} else {
|
log.error("notify_url 验证失败");
|
return "failure";
|
}
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
return "failure";
|
}
|
}
|
|
/**
|
* 获取Api配置
|
* @return
|
*/
|
public AliPayApiConfig getApiConfig() {
|
AliPayApiConfig aliPayApiConfig;
|
try {
|
aliPayApiConfig = AliPayApiConfigKit.getApiConfig(aliPayBean.getAppId());
|
} catch (Exception e) {
|
aliPayApiConfig = AliPayApiConfig.builder()
|
.setAppId(aliPayBean.getAppId())
|
.setAliPayPublicKey(aliPayBean.getPublicKey())
|
.setAppCertPath(aliPayBean.getAppCertPath())
|
.setAliPayCertPath(aliPayBean.getAliPayCertPath())
|
.setAliPayRootCertPath(aliPayBean.getAliPayRootCertPath())
|
.setCharset("UTF-8")
|
.setPrivateKey(aliPayBean.getPrivateKey())
|
.setServiceUrl(aliPayBean.getServerUrl())
|
.setSignType("RSA2")
|
.build(); // 普通公钥模式
|
}
|
return aliPayApiConfig;
|
}
|
|
@RequestMapping(value = "/wapPay")
|
@ResponseBody
|
public void wapPay(HttpServletResponse response) {
|
String body = "我是测试数据-By Javen";
|
String subject = "Javen Wap支付测试";
|
String totalAmount = "1";
|
String passBackParams = "1";
|
String returnUrl = aliPayBean.getDomain() + RETURN_URL;
|
String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
|
|
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
|
model.setBody(body);
|
model.setSubject(subject);
|
model.setTotalAmount(totalAmount);
|
model.setPassbackParams(passBackParams);
|
String outTradeNo = UUID.randomUUID().toString(true);
|
System.out.println("wap outTradeNo>" + outTradeNo);
|
model.setOutTradeNo(outTradeNo);
|
model.setProductCode("QUICK_WAP_PAY");
|
|
try {
|
AliPayApi.wapPay(response, model, returnUrl, notifyUrl);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
/**
|
* PC支付
|
*/
|
@RequestMapping(value = "/pcPay")
|
@ResponseBody
|
public void pcPay(HttpServletResponse response) {
|
try {
|
String totalAmount = "88.88";
|
String outTradeNo = UUID.randomUUID().toString(true);
|
log.info("pc outTradeNo>" + outTradeNo);
|
|
String returnUrl = aliPayBean.getDomain() + RETURN_URL;
|
String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
|
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
|
|
model.setOutTradeNo(outTradeNo);
|
model.setProductCode("FAST_INSTANT_TRADE_PAY");
|
model.setTotalAmount(totalAmount);
|
model.setSubject("Javen PC支付测试");
|
model.setBody("Javen IJPay PC支付测试");
|
model.setPassbackParams("passback_params");
|
/**
|
* 花呗分期相关的设置,测试环境不支持花呗分期的测试
|
* hb_fq_num代表花呗分期数,仅支持传入3、6、12,其他期数暂不支持,传入会报错;
|
* hb_fq_seller_percent代表卖家承担收费比例,商家承担手续费传入100,用户承担手续费传入0,仅支持传入100、0两种,其他比例暂不支持,传入会报错。
|
*/
|
// ExtendParams extendParams = new ExtendParams();
|
// extendParams.setHbFqNum("3");
|
// extendParams.setHbFqSellerPercent("0");
|
// model.setExtendParams(extendParams);
|
|
AliPayApi.tradePage(response, model, notifyUrl, returnUrl);
|
// https://opensupport.alipay.com/support/helpcenter/192/201602488772?ant_source=antsupport
|
// Alipay Easy SDK(新版)目前只支持输出form表单,不支持打印出url链接。
|
// AliPayApi.tradePage(response, "GET", model, notifyUrl, returnUrl);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
}
|
|
@RequestMapping(value = "/tradePay")
|
@ResponseBody
|
public String tradePay(@RequestParam("authCode") String authCode, @RequestParam("scene") String scene) {
|
String subject = null;
|
String waveCode = "wave_code";
|
String barCode = "bar_code";
|
if (scene.equals(waveCode)) {
|
subject = "Javen 支付宝声波支付测试";
|
} else if (scene.equals(barCode)) {
|
subject = "Javen 支付宝条形码支付测试";
|
}
|
String totalAmount = "100";
|
String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
|
|
AlipayTradePayModel model = new AlipayTradePayModel();
|
model.setAuthCode(authCode);
|
model.setSubject(subject);
|
model.setTotalAmount(totalAmount);
|
model.setOutTradeNo(UUID.randomUUID().toString(true));
|
model.setScene(scene);
|
try {
|
return AliPayApi.tradePayToResponse(model, notifyUrl).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return null;
|
}
|
|
/**
|
* 扫码支付
|
*/
|
@RequestMapping(value = "/tradePreCreatePay")
|
@ResponseBody
|
public String tradePreCreatePay() {
|
String subject = "Javen 支付宝扫码支付测试";
|
String totalAmount = "86";
|
String storeId = "123";
|
// String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
|
String notifyUrl = aliPayBean.getDomain() + "/aliPay/cert_notify_url";
|
|
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
|
model.setSubject(subject);
|
model.setTotalAmount(totalAmount);
|
model.setStoreId(storeId);
|
model.setTimeoutExpress("5m");
|
model.setOutTradeNo(UUID.randomUUID().toString(true));
|
try {
|
String resultStr = AliPayApi.tradePrecreatePayToResponse(model, notifyUrl).getBody();
|
JSONObject jsonObject = JSONObject.parseObject(resultStr);
|
return jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 单笔转账到支付宝账户
|
* https://docs.open.alipay.com/309/106235/
|
*/
|
@RequestMapping(value = "/transfer")
|
@ResponseBody
|
public String transfer() {
|
String totalAmount = "66";
|
AlipayFundTransToaccountTransferModel model = new AlipayFundTransToaccountTransferModel();
|
model.setOutBizNo(UUID.randomUUID().toString(true));
|
model.setPayeeType("ALIPAY_LOGONID");
|
model.setPayeeAccount("gxthqd7606@sandbox.com");
|
model.setAmount(totalAmount);
|
model.setPayerShowName("测试退款");
|
model.setPayerRealName("沙箱环境");
|
model.setRemark("javen测试单笔转账到支付宝");
|
|
try {
|
return AliPayApi.transferToResponse(model).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@RequestMapping(value = "/transferQuery")
|
@ResponseBody
|
public String transferQuery(@RequestParam(required = false, name = "outBizNo") String outBizNo,
|
@RequestParam(required = false, name = "orderId") String orderId) {
|
AlipayFundTransOrderQueryModel model = new AlipayFundTransOrderQueryModel();
|
if (StrUtil.isNotEmpty(outBizNo)) {
|
model.setOutBizNo(outBizNo);
|
}
|
if (StrUtil.isNotEmpty(orderId)) {
|
model.setOrderId(orderId);
|
}
|
|
try {
|
return AliPayApi.transferQueryToResponse(model).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@RequestMapping(value = "/uniTransfer")
|
@ResponseBody
|
public String uniTransfer() {
|
String totalAmount = "1";
|
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
|
model.setOutBizNo(UUID.randomUUID().toString(true));
|
model.setTransAmount(totalAmount);
|
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
|
model.setBizScene("DIRECT_TRANSFER");
|
model.setOrderTitle("统一转账-转账至支付宝账户");
|
model.setRemark("IJPay 测试统一转账");
|
|
Participant payeeInfo = new Participant();
|
payeeInfo.setIdentity("gxthqd7606@sandbox.com");
|
payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
|
payeeInfo.setName("沙箱环境");
|
model.setPayeeInfo(payeeInfo);
|
|
try {
|
return AliPayApi.uniTransferToResponse(model, null).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@RequestMapping(value = "/uniTransferQuery")
|
@ResponseBody
|
public String uniTransferQuery(@RequestParam(required = false, name = "outBizNo") String outBizNo,
|
@RequestParam(required = false, name = "orderId") String orderId) {
|
AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel();
|
if (StrUtil.isNotEmpty(outBizNo)) {
|
model.setOutBizNo(outBizNo);
|
}
|
if (StrUtil.isNotEmpty(orderId)) {
|
model.setOrderId(orderId);
|
}
|
|
try {
|
return AliPayApi.transCommonQueryToResponse(model, null).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@RequestMapping(value = "/accountQuery")
|
@ResponseBody
|
public String accountQuery(@RequestParam(required = true, name = "aliPayUserId") String aliPayUserId) {
|
AlipayFundAccountQueryModel model = new AlipayFundAccountQueryModel();
|
model.setAlipayUserId(aliPayUserId);
|
model.setAccountType("ACCTRANS_ACCOUNT");
|
try {
|
return AliPayApi.accountQueryToResponse(model, null).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 资金授权冻结接口
|
*/
|
@RequestMapping(value = "/authOrderFreeze")
|
@ResponseBody
|
public AlipayFundAuthOrderFreezeResponse authOrderFreeze(@RequestParam("auth_code") String authCode) {
|
try {
|
AlipayFundAuthOrderFreezeModel model = new AlipayFundAuthOrderFreezeModel();
|
model.setOutOrderNo(UUID.randomUUID().toString(true));
|
model.setOutRequestNo(UUID.randomUUID().toString(true));
|
model.setAuthCode(authCode);
|
model.setAuthCodeType("bar_code");
|
model.setOrderTitle("资金授权冻结-By IJPay");
|
model.setAmount("36");
|
model.setProductCode("PRE_AUTH");
|
|
return AliPayApi.authOrderFreezeToResponse(model);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
|
/**
|
* 红包协议支付接口
|
* https://docs.open.alipay.com/301/106168/
|
*/
|
@RequestMapping(value = "/agreementPay")
|
@ResponseBody
|
public AlipayFundCouponOrderAgreementPayResponse agreementPay() {
|
try {
|
AlipayFundCouponOrderAgreementPayModel model = new AlipayFundCouponOrderAgreementPayModel();
|
model.setOutOrderNo(UUID.randomUUID().toString(true));
|
model.setOutRequestNo(UUID.randomUUID().toString(true));
|
model.setOrderTitle("红包协议支付接口-By IJPay");
|
model.setAmount("36");
|
model.setPayerUserId("2088102180432465");
|
|
return AliPayApi.fundCouponOrderAgreementPayToResponse(model);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 下载对账单
|
*/
|
@RequestMapping(value = "/dataDataServiceBill")
|
@ResponseBody
|
public String dataDataServiceBill(@RequestParam("billDate") String billDate) {
|
try {
|
AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel();
|
model.setBillType("trade");
|
model.setBillDate(billDate);
|
return AliPayApi.billDownloadUrlQuery(model);
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 退款
|
*/
|
@ApiOperation("支付宝退款")
|
@RequestMapping(value = RuleConstants.NOT_LOGIN + "/tradeRefund", method = {RequestMethod.POST, RequestMethod.GET})
|
@ResponseBody
|
public Boolean tradeRefund(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) {
|
log.info("支付宝-退款信息-outTradeNo:"+outTradeNo+", tradeNo:"+tradeNo);
|
try {
|
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
|
if (StrUtil.isNotEmpty(outTradeNo)) {
|
// 生成退款单号
|
model.setOutTradeNo(GeneralUtil.generateRefundOrderNo(outTradeNo));
|
|
}
|
if (StrUtil.isNotEmpty(tradeNo)) {
|
model.setTradeNo(tradeNo);
|
}
|
if (outTradeNo.startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
|
//课程订单
|
CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(outTradeNo);
|
//状态:0待支付,1已支付,2已过期,9取消,10退款
|
// if (courseOrder.getStatusFlag().intValue() == 1){
|
model.setRefundAmount(courseOrder.getPayAmount().toString());
|
model.setRefundReason("课程订单退款");
|
AlipayTradeRefundResponse apipay = AliPayApi.tradeRefundToResponse(model);
|
log.info("课程订单信息退款:"+JSONObject.toJSONString(apipay));
|
if (apipay.getCode().equals("10000")){
|
courseOrder.setStatusFlag(9);
|
courseOrder.setRefundTime(new Date());
|
courseOrder.setRefundAmount(courseOrder.getPayAmount());
|
this.courseOrderService.update(new LambdaUpdateWrapper<CourseOrder>()
|
.set(CourseOrder::getStatusFlag,9).set(CourseOrder::getRefundTime,new Date())
|
.set(CourseOrder::getRefundAmount,courseOrder.getPayAmount())
|
.eq(CourseOrder::getId,courseOrder.getId()));
|
|
return true;
|
}
|
// }
|
|
} else if (outTradeNo.startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
|
//咨询订单
|
CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(outTradeNo);
|
//状态:0待支付,1已支付,2已完成,9取消,10退款
|
// if (counsellingOrder.getStatusFlag().intValue() == 1){
|
model.setRefundAmount(counsellingOrder.getPayAmount().toString());
|
model.setRefundReason("咨询订单退款");
|
AlipayTradeRefundResponse apipay = AliPayApi.tradeRefundToResponse(model);
|
log.info("咨询订单信息退款:"+JSONObject.toJSONString(apipay));
|
if (apipay.getCode().equals("10000")){
|
counsellingOrder.setStatusFlag(9);
|
counsellingOrder.setRefundTime(new Date());
|
counsellingOrder.setRefundAmount(counsellingOrder.getPayAmount());
|
this.counsellingOrderService.update(new LambdaUpdateWrapper<CounsellingOrder>()
|
.set(CounsellingOrder::getStatusFlag,9).set(CounsellingOrder::getRefundTime,new Date())
|
.set(CounsellingOrder::getRefundAmount,counsellingOrder.getPayAmount())
|
.eq(CounsellingOrder::getId,counsellingOrder.getId()));
|
return true;
|
}
|
// }
|
} else if (outTradeNo.startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
|
// 1v1咨询订单
|
OrderConsultOne orderConsultOne = this.orderConsultOneService.getOrderByNo(outTradeNo);
|
//状态:0待支付,1已支付,2已完成,9取消,10退款
|
if (orderConsultOne.getStatusFlag().equals(OrderStatusFlagEnum.PAY_SUCCESS.getCode())) {
|
model.setRefundAmount(orderConsultOne.getPayAmount().toString());
|
model.setRefundReason("1v1咨询订单退款");
|
AlipayTradeRefundResponse apipay = AliPayApi.tradeRefundToResponse(model);
|
log.info("1v1咨询订单退款:" + JSONObject.toJSONString(apipay));
|
if (apipay.getCode().equals("10000")) {
|
return true;
|
}
|
}
|
}
|
|
return false;
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return false;
|
}
|
|
/**
|
* 交易查询
|
*/
|
@RequestMapping(value = "/tradeQuery")
|
@ResponseBody
|
public String tradeQuery(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) {
|
try {
|
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
|
if (StrUtil.isNotEmpty(outTradeNo)) {
|
model.setOutTradeNo(outTradeNo);
|
}
|
if (StrUtil.isNotEmpty(tradeNo)) {
|
model.setTradeNo(tradeNo);
|
}
|
return AliPayApi.tradeQueryToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@RequestMapping(value = "/tradeQueryByStr")
|
@ResponseBody
|
public String tradeQueryByStr(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) {
|
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
|
if (StrUtil.isNotEmpty(outTradeNo)) {
|
model.setOutTradeNo(outTradeNo);
|
}
|
if (StrUtil.isNotEmpty(tradeNo)) {
|
model.setTradeNo(tradeNo);
|
}
|
|
try {
|
return AliPayApi.tradeQueryToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
|
return null;
|
}
|
|
/**
|
* 创建订单
|
* {"alipay_trade_create_response":{"code":"10000","msg":"Success","out_trade_no":"081014283315033","trade_no":"2017081021001004200200274066"},"sign":"ZagfFZntf0loojZzdrBNnHhenhyRrsXwHLBNt1Z/dBbx7cF1o7SZQrzNjRHHmVypHKuCmYifikZIqbNNrFJauSuhT4MQkBJE+YGPDtHqDf4Ajdsv3JEyAM3TR/Xm5gUOpzCY7w+RZzkHevsTd4cjKeGM54GBh0hQH/gSyhs4pEN3lRWopqcKkrkOGZPcmunkbrUAF7+AhKGUpK+AqDw4xmKFuVChDKaRdnhM6/yVsezJFXzlQeVgFjbfiWqULxBXq1gqicntyUxvRygKA+5zDTqE5Jj3XRDjVFIDBeOBAnM+u03fUP489wV5V5apyI449RWeybLg08Wo+jUmeOuXOA=="}
|
*/
|
@RequestMapping(value = "/tradeCreate")
|
@ResponseBody
|
public String tradeCreate(@RequestParam("outTradeNo") String outTradeNo) {
|
|
String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
|
|
AlipayTradeCreateModel model = new AlipayTradeCreateModel();
|
model.setOutTradeNo(outTradeNo);
|
model.setTotalAmount("88.88");
|
model.setBody("Body");
|
model.setSubject("Javen 测试统一收单交易创建接口");
|
//买家支付宝账号,和buyer_id不能同时为空
|
model.setBuyerLogonId("abpkvd0206@sandbox.com");
|
try {
|
AlipayTradeCreateResponse response = AliPayApi.tradeCreateToResponse(model, notifyUrl);
|
return response.getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 撤销订单
|
*/
|
@RequestMapping(value = "/tradeCancel")
|
@ResponseBody
|
public String tradeCancel(@RequestParam(required = false, name = "outTradeNo") String outTradeNo, @RequestParam(required = false, name = "tradeNo") String tradeNo) {
|
try {
|
AlipayTradeCancelModel model = new AlipayTradeCancelModel();
|
if (StrUtil.isNotEmpty(outTradeNo)) {
|
model.setOutTradeNo(outTradeNo);
|
}
|
if (StrUtil.isNotEmpty(tradeNo)) {
|
model.setTradeNo(tradeNo);
|
}
|
|
return AliPayApi.tradeCancelToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 关闭订单
|
*/
|
@RequestMapping(value = "/tradeClose")
|
@ResponseBody
|
public String tradeClose(@RequestParam("outTradeNo") String outTradeNo, @RequestParam("tradeNo") String tradeNo) {
|
try {
|
AlipayTradeCloseModel model = new AlipayTradeCloseModel();
|
if (StrUtil.isNotEmpty(outTradeNo)) {
|
model.setOutTradeNo(outTradeNo);
|
}
|
if (StrUtil.isNotEmpty(tradeNo)) {
|
model.setTradeNo(tradeNo);
|
}
|
|
return AliPayApi.tradeCloseToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 结算
|
*/
|
@RequestMapping(value = "/tradeOrderSettle")
|
@ResponseBody
|
public String tradeOrderSettle(@RequestParam("tradeNo") String tradeNo) {
|
try {
|
AlipayTradeOrderSettleModel model = new AlipayTradeOrderSettleModel();
|
model.setOutRequestNo(UUID.randomUUID().toString(true));
|
model.setTradeNo(tradeNo);
|
|
return AliPayApi.tradeOrderSettleToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 获取应用授权URL并授权
|
*/
|
@RequestMapping(value = "/toOauth")
|
@ResponseBody
|
public void toOauth(HttpServletResponse response) {
|
try {
|
String redirectUri = aliPayBean.getDomain() + "/aliPay/redirect_uri";
|
String oauth2Url = AliPayApi.getOauth2Url(aliPayBean.getAppId(), redirectUri);
|
response.sendRedirect(oauth2Url);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 应用授权回调
|
*/
|
@RequestMapping(value = "/redirect_uri")
|
@ResponseBody
|
public String redirectUri(@RequestParam("app_id") String appId, @RequestParam("app_auth_code") String appAuthCode) {
|
try {
|
System.out.println("app_id:" + appId);
|
System.out.println("app_auth_code:" + appAuthCode);
|
//使用app_auth_code换取app_auth_token
|
AlipayOpenAuthTokenAppModel model = new AlipayOpenAuthTokenAppModel();
|
model.setGrantType("authorization_code");
|
model.setCode(appAuthCode);
|
return AliPayApi.openAuthTokenAppToResponse(model).getBody();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 查询授权信息
|
*/
|
@RequestMapping(value = "/openAuthTokenAppQuery")
|
@ResponseBody
|
public String openAuthTokenAppQuery(@RequestParam("appAuthToken") String appAuthToken) {
|
try {
|
AlipayOpenAuthTokenAppQueryModel model = new AlipayOpenAuthTokenAppQueryModel();
|
model.setAppAuthToken(appAuthToken);
|
return AliPayApi.openAuthTokenAppQueryToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 批量付款到支付宝账户有密接口
|
*/
|
@RequestMapping(value = "/batchTrans")
|
@ResponseBody
|
public void batchTrans(HttpServletResponse response) {
|
try {
|
String signType = "MD5";
|
String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
|
Map<String, String> params = new HashMap<>(15);
|
params.put("partner", "PID");
|
params.put("sign_type", signType);
|
params.put("notify_url", notifyUrl);
|
params.put("account_name", "xxx");
|
params.put("detail_data", "流水号1^收款方账号1^收款账号姓名1^付款金额1^备注说明1|流水号2^收款方账号2^收款账号姓名2^付款金额2^备注说明2");
|
params.put("batch_no", String.valueOf(System.currentTimeMillis()));
|
params.put("batch_num", 1 + "");
|
params.put("batch_fee", 10.00 + "");
|
params.put("email", "xx@xxx.com");
|
|
AliPayApi.batchTrans(params, aliPayBean.getPrivateKey(), signType, response);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
/**
|
* 地铁购票核销码发码
|
*/
|
@RequestMapping(value = "/voucherGenerate")
|
@ResponseBody
|
public String voucherGenerate(@RequestParam("tradeNo") String tradeNo) {
|
try {
|
//需要支付成功的订单号
|
// String tradeNo = getPara("tradeNo");
|
|
AlipayCommerceCityfacilitatorVoucherGenerateModel model = new AlipayCommerceCityfacilitatorVoucherGenerateModel();
|
model.setCityCode("440300");
|
model.setTradeNo(tradeNo);
|
model.setTotalFee("8");
|
model.setTicketNum("2");
|
model.setTicketType("oneway");
|
model.setSiteBegin("001");
|
model.setSiteEnd("002");
|
model.setTicketPrice("4");
|
return AliPayApi.voucherGenerateToResponse(model).getBody();
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@RequestMapping(value = "/return_url")
|
@ResponseBody
|
public String returnUrl(HttpServletRequest request) {
|
try {
|
// 获取支付宝GET过来反馈信息
|
Map<String, String> map = AliPayApi.toMap(request);
|
for (Map.Entry<String, String> entry : map.entrySet()) {
|
System.out.println(entry.getKey() + " = " + entry.getValue());
|
}
|
|
boolean verifyResult = AlipaySignature.rsaCheckV1(map, aliPayBean.getPublicKey(), "UTF-8",
|
"RSA2");
|
|
if (verifyResult) {
|
// TODO 请在这里加上商户的业务逻辑程序代码
|
System.out.println("return_url 验证成功");
|
|
return "success";
|
} else {
|
System.out.println("return_url 验证失败");
|
// TODO
|
return "failure";
|
}
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
return "failure";
|
}
|
}
|
|
@RequestMapping(value = "/cert_return_url")
|
@ResponseBody
|
public String certReturnUrl(HttpServletRequest request) {
|
try {
|
// 获取支付宝GET过来反馈信息
|
Map<String, String> map = AliPayApi.toMap(request);
|
for (Map.Entry<String, String> entry : map.entrySet()) {
|
System.out.println(entry.getKey() + " = " + entry.getValue());
|
}
|
|
boolean verifyResult = AlipaySignature.rsaCertCheckV1(map, aliPayBean.getAliPayCertPath(), "UTF-8",
|
"RSA2");
|
|
if (verifyResult) {
|
// TODO 请在这里加上商户的业务逻辑程序代码
|
System.out.println("certReturnUrl 验证成功");
|
|
return "success";
|
} else {
|
System.out.println("certReturnUrl 验证失败");
|
// TODO
|
return "failure";
|
}
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
return "failure";
|
}
|
}
|
|
@RequestMapping(value = "/cert_notify_url")
|
@ResponseBody
|
public String certNotifyUrl(HttpServletRequest request) {
|
try {
|
// 获取支付宝POST过来反馈信息
|
Map<String, String> params = AliPayApi.toMap(request);
|
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
System.out.println(entry.getKey() + " = " + entry.getValue());
|
}
|
|
boolean verifyResult = AlipaySignature.rsaCertCheckV1(params, aliPayBean.getAliPayCertPath(), "UTF-8", "RSA2");
|
|
if (verifyResult) {
|
// TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理
|
System.out.println("certNotifyUrl 验证成功succcess");
|
return "success";
|
} else {
|
System.out.println("certNotifyUrl 验证失败");
|
// TODO
|
return "failure";
|
}
|
} catch (AlipayApiException e) {
|
e.printStackTrace();
|
return "failure";
|
}
|
}
|
|
}
|