feat: 支付宝相关支付

pull/2/head
tangqian 2023-05-19 13:53:33 +08:00
parent 21a020f430
commit bde92cebdf
10 changed files with 157 additions and 56 deletions

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.shop.request.member;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* @Title:AlipayNotifyParamRequest
* @Description: TODO
* @author: tangqian
* @date: 2023/5/19 10:27
* @version: V1.0.0
*/
@Data
@Accessors(chain = true)
public class AlipayNotifyParamRequest implements Serializable {
private static final long serialVersionUID = 5839750515063699319L;
private String appId;
private String tradeNo; // 支付宝交易凭证号
private String outTradeNo; // 原支付请求的商户订单号
private String outBizNo; // 商户业务ID主要是退款通知中返回退款申请的流水号
private String buyerId; // 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字
private String buyerLogonId; // 买家支付宝账号
private String sellerId; // 卖家支付宝用户号
private String sellerEmail; // 卖家支付宝账号
private String tradeStatus; // 交易目前所处的状态,见交易状态说明
private String totalAmount; // 本次交易支付的订单金额
private String receiptAmount; // 商家在交易中实际收到的款项
private String buyerPayAmount; // 用户在交易中支付的金额
private String refundFee; // 退款通知中,返回总退款金额,单位为元,支持两位小数
private String subject; // 商品的标题/交易标题/订单标题/订单关键字等
private String body; // 该订单的备注、描述、明细等。对应请求时的body参数原样通知回来
private Date gmtCreate; // 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss
private Date gmtPayment; // 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss
private Date notifyTime; // 通知时间。格式为yyyy-MM-dd HH:mm:ss
private Date gmtRefund; // 该笔交易的退款时间。格式为yyyy-MM-dd HH:mm:ss.S
private Date gmtClose; // 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss
private String fundBillList; // 支付成功的各个渠道金额信息,array
private String passbackParams; // 公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回。
private String authAppId;
private String notifyId;
private String notifyType;
private String version;
private String invoiceAmount;//交易中可给用户开具发票的金额
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.shop.controller.admin.notify;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderService;
import com.alipay.api.AlipayApiException;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
@ -31,12 +34,13 @@ public class AliPayNotifyController {
@PermitAll
@PostMapping("pay_notify")
public Object payNotify(HttpServletRequest request, Map<String, String> params) {
return storeOrderService.aliNotify(request, params);
public Object payNotify(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException {
return storeOrderService.aliNotify(request, response);
}
@PermitAll
@PostMapping("refund_notify")
public Object refundNotify(HttpServletRequest request, @RequestBody Map<String, String> params) {
return storeOrderService.refundNotify(request, params);
public Object refundNotify(HttpServletRequest request, HttpServletResponse response) {
return storeOrderService.refundNotify(request, response);
}
}

View File

@ -15,6 +15,10 @@ public class RechargeOrderRespVO extends RechargeOrderBaseVO {
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "创建时间")
private String stringCreateTime;
@Schema(description = "档次")
private String grade;
@Schema(description = "组织名称")
private String parentOrganizationName;
@Schema(description = "推广员名称")

View File

@ -50,8 +50,7 @@ public class MemberController {
@RequestMapping(value = "/memberOrderInfo", method = RequestMethod.GET)
@PreAuthenticated
public CommonResult<List<RechargeOrderRespVO>> memberOrderInfo() {
List<RechargeOrderDO> orderDOS = rechargeOrderService.memberOrderInfo();
return CommonResult.success(RechargeOrderConvert.INSTANCE.convertList(orderDOS));
return CommonResult.success(rechargeOrderService.memberOrderInfo());
}
@Operation(summary = "会员头部信息")
@RequestMapping(value = "/memberHeadInfo", method = RequestMethod.GET)

View File

@ -71,7 +71,7 @@ public class RechargeOrderDO extends BaseDO {
/**
*
*/
private Byte paid;
private Integer paid;
/**
*
*/
@ -91,7 +91,7 @@ public class RechargeOrderDO extends BaseDO {
/**
* 0 退 1 2 退 3 退
*/
private Byte refundStatus;
private Integer refundStatus;
/**
* 退
*/
@ -131,11 +131,11 @@ public class RechargeOrderDO extends BaseDO {
/**
* (012)
*/
private Byte isChannel;
private Integer isChannel;
/**
*
*/
private Byte isRemind;
private Integer isRemind;
/**
*
*/

View File

@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.shop.response.member.ChangeOrderPayTypeResponse;
import cn.iocoder.yudao.module.shop.response.member.InitOrderResponse;
import cn.iocoder.yudao.module.shop.response.order.*;
import cn.iocoder.yudao.module.shop.vo.order.LogisticsResultVo;
import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
import com.github.binarywang.wxpay.exception.WxPayException;
@ -391,14 +392,13 @@ public interface StoreOrderService extends IService<StoreOrder> {
/**
*
* @param request
* @param params
* @return
*/
Object aliNotify(HttpServletRequest request, Map<String, String> params);
Object aliNotify(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException;
Object memberRefund(RefundRequest request, HttpServletRequest servletRequest);
Object refundNotify(HttpServletRequest request, Map<String, String> params);
Object refundNotify(HttpServletRequest request, HttpServletResponse response);
Boolean wxPayNotify(WxPayOrderNotifyV3Result.DecryptNotifyResult result);

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.shop.service.order.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
@ -26,6 +27,7 @@ import cn.iocoder.yudao.module.shop.dal.mysql.order.StoreOrderMapper;
import cn.iocoder.yudao.module.shop.dal.mysql.recharge.PhoneRecordMapper;
import cn.iocoder.yudao.module.shop.dal.mysql.recharge.RechargeOrderInfoMapper;
import cn.iocoder.yudao.module.shop.dal.mysql.recharge.RechargeOrderMapper;
import cn.iocoder.yudao.module.shop.request.member.AlipayNotifyParamRequest;
import cn.iocoder.yudao.module.shop.request.member.OrderContentRequest;
import cn.iocoder.yudao.module.shop.request.member.RefundRequest;
import cn.iocoder.yudao.module.shop.request.order.StoreOrderRefundRequest;
@ -41,9 +43,7 @@ import cn.iocoder.yudao.module.shop.service.order.StoreOrderService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderStatusService;
import cn.iocoder.yudao.module.shop.support.StrategySupport;
import cn.iocoder.yudao.module.shop.support.pay.IPayStrategy;
import cn.iocoder.yudao.module.shop.utils.CommonPage;
import cn.iocoder.yudao.module.shop.utils.OrderUtil;
import cn.iocoder.yudao.module.shop.utils.RedisUtil;
import cn.iocoder.yudao.module.shop.utils.*;
import cn.iocoder.yudao.module.shop.vo.order.LogisticsResultVo;
import cn.iocoder.yudao.module.shop.vo.order.StoreDateRangeSqlPram;
import cn.iocoder.yudao.module.shop.vo.order.StoreOrderInfoOldVo;
@ -74,6 +74,10 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
@ -1163,36 +1167,40 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
}
@Override
public Object aliNotify(HttpServletRequest request, Map<String, String> params) {
boolean verifyResult = false;
try {
Map<String, String[]> map = request.getParameterMap();
verifyResult = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
log.debug("支付宝验证签名结果:{}", verifyResult);
} catch (AlipayApiException e) {
e.printStackTrace();
public Object aliNotify(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException {
Map<String, String> params = new HashMap<String, String>();
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] + ",";
}
if (verifyResult) {
/** 乱码解决,这段代码在出现乱码时使用 **/
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
boolean flag = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
log.debug("支付宝验证签名结果:{}", flag);
if (flag) {
log.info("ALIPAY====MAP===>{}", params);
String orderId = params.get("out_trade_no");
String amount = params.get("refund_amount");
String total_amount = params.get("total_amount");
log.info("orderId:{}", orderId);
log.info("amount:{}", amount);
log.info("amount:{}", total_amount);
// 处理相关逻辑
RechargeOrderDO orderDO = rechargeOrderMapper.selectOne(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getOrderId, orderId));
if (Objects.isNull(orderDO)) {
log.error("订单号错误,未查询到相关信息!入参订单号:{}", orderId);
return "failure";
}
// 验证相关参数-金额
String amount = params.get("receipt_amount");
if (new BigDecimal(amount).compareTo(orderDO.getPayPrice()) != 0) {
log.error("支付金额不匹配,订单实际支付金额:{},支付宝入参验证金额:{}", orderDO.getPayPrice(), amount);
return "failure";
}
// 修改订单状态
orderDO.setPaid((byte) 1);
orderDO.setPaid(1);
orderDO.setPaySerialNumber(params.get("trade_no"));
rechargeOrderMapper.updateById(orderDO);
// 写入 充值档位记录表
addPhoneRecord(orderDO, orderId);
@ -1244,28 +1252,32 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
}
@Override
public Object refundNotify(HttpServletRequest request, Map<String, String> params) {
String tradeNo = params.get("trade_no"); // 支付宝交易号
String outTradeNo = params.get("out_trade_no"); // 商户订单号
String refundAmount = params.get("refund_amount"); // 退款金额
String tradeStatus = params.get("trade_status");
log.info("tradeStatus:{}", tradeStatus);
log.info("tradeNo:{}", tradeNo);
log.info("outTradeNo:{}", outTradeNo);
log.info("refundAmount:{}", refundAmount);
// 2. 验证回调签名
Map<String, String> paramMap = new HashMap<>(params);
paramMap.remove("sign_type"); // 移除sign_type参数
public Object refundNotify(HttpServletRequest request, HttpServletResponse response) {
Map<String, String> params = new HashMap<String, String>();
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] + ",";
}
/** 乱码解决,这段代码在出现乱码时使用 **/
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
params.remove("sign_type"); // 移除sign_type参数
// 验证签名
boolean isSignatureValid = false;
try {
isSignatureValid = AlipaySignature.rsaCheckV1(paramMap, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
isSignatureValid = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
} catch (AlipayApiException e) {
e.printStackTrace();
}
log.info("支付宝退款回调验证结果{}", isSignatureValid);
if (isSignatureValid) {
if ("TRADE_SUCCESS".equals(tradeStatus)) {
if ("TRADE_SUCCESS".equals("")) {
// 处理相关逻辑
// 验证相关参数-金额
// 修改订单状态
@ -1296,7 +1308,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
return Boolean.FALSE;
}
// 修改订单状态
orderDO.setPaid((byte) 1);
orderDO.setPaid(1);
orderDO.setPaySerialNumber(result.getTransactionId());
rechargeOrderMapper.updateById(orderDO);
// 写入 充值档位记录表
addPhoneRecord(orderDO, outTradeNo);
@ -1308,7 +1321,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
@Override
public Boolean memberApplyRefund(RefundRequest request) {
RechargeOrderDO orderDO = rechargeOrderMapper.selectById(request.getOrderId());
orderDO.setRefundStatus((byte) 1);
orderDO.setRefundStatus(1);
return rechargeOrderMapper.updateById(orderDO) > 0;
}
@ -1566,6 +1579,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
// MyRecord myRecord = onePassService.expressDump(record);
// storeOrder.setDeliveryId(myRecord.getStr("kuaidinum"));
// }
/**
*
*/

View File

@ -68,7 +68,7 @@ public interface RechargeOrderService {
*/
List<RechargeOrderDO> getRechargeOrderList(RechargeOrderExportReqVO exportReqVO);
List<RechargeOrderDO> memberOrderInfo();
List<RechargeOrderRespVO> memberOrderInfo();
MemberHeadResponse memberHeadInfo();
}

View File

@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.shop.service.recharge;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderInfoDO;
import cn.iocoder.yudao.module.shop.dal.mysql.recharge.RechargeOrderInfoMapper;
import cn.iocoder.yudao.module.shop.response.member.MemberHeadResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -14,7 +16,9 @@ import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*;
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderDO;
@ -37,6 +41,8 @@ public class RechargeOrderServiceImpl implements RechargeOrderService {
@Resource
private RechargeOrderMapper rechargeOrderMapper;
@Resource
private RechargeOrderInfoMapper infoMapper;
@Override
public Integer createRechargeOrder(RechargeOrderCreateReqVO createReqVO) {
@ -93,10 +99,36 @@ public class RechargeOrderServiceImpl implements RechargeOrderService {
}
@Override
public List<RechargeOrderDO> memberOrderInfo() {
public List<RechargeOrderRespVO> memberOrderInfo() {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
Assert.notNull(loginUser, "登录失效,请重新登录!");
return rechargeOrderMapper.selectList(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getUid, loginUser.getId()));
List<RechargeOrderDO> orderDOS = rechargeOrderMapper.selectList(Wrappers.<RechargeOrderDO>lambdaQuery()
.eq(RechargeOrderDO::getUid, loginUser.getId()).eq(RechargeOrderDO::getPaid, 1));
if (!CollectionUtils.isEmpty(orderDOS)) {
List<RechargeOrderRespVO> rechargeOrderRespVOS = RechargeOrderConvert.INSTANCE.convertList(orderDOS);
List<String> collect1 = rechargeOrderRespVOS.stream().map(RechargeOrderBaseVO::getOrderId).collect(Collectors.toList());
List<RechargeOrderInfoDO> infoDOS = infoMapper.selectList(Wrappers.<RechargeOrderInfoDO>lambdaQuery().in(RechargeOrderInfoDO::getOrderNo, collect1));
Map<String, List<RechargeOrderInfoDO>> collect = infoDOS.stream().collect(Collectors.groupingBy(RechargeOrderInfoDO::getOrderNo));
for (RechargeOrderRespVO orderDO : rechargeOrderRespVOS) {
StringBuilder grade = new StringBuilder();
List<RechargeOrderInfoDO> infoDOS1 = collect.get(orderDO.getOrderId());
for (RechargeOrderInfoDO infoDO : infoDOS1) {
if (infoDO.getPrice().compareTo(new BigDecimal("240")) == 0) {
grade.append("套餐1,");
} else if (infoDO.getPrice().compareTo(new BigDecimal("400")) == 0) {
grade.append("套餐2,");
} else if (infoDO.getPrice().compareTo(new BigDecimal("640")) == 0) {
grade.append("套餐3");
}
}
orderDO.setGrade(grade.toString());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
orderDO.setStringCreateTime(orderDO.getCreateTime().format(formatter));
}
return rechargeOrderRespVOS;
}
return null;
}
@Override

View File

@ -200,16 +200,17 @@ wx:
key-path: classpath:/2/apiclient_cert.p12
cert-serial-no: 47F04D51F958FFEF56A6DFC25BDE83CF89353E19
notify-url: http://yuxy.perrymake.com/app-api/pay/wxpay/pay_notify
refund-notify-url: http://yuxy.perrymake.com/app-api/pay/wxpay/refund_notify
refund-notify-url: http://yuxy.perrymake.com/admin-api/pay/wxpay/refund_notify
--- #################### 芋道相关配置 ####################
ali:
pay:
one:
appId: 2021003196623046
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAhydIKD244uxHaCAE8N4KA0kfK2UkhXayUwarvc09s/JHC7WkrtwgmeHx+JyFA/QQA1WHQREJ8jyS9HrgasmmA+BaE0vGwbu/c0R4Cde5dLeITZb4w4X1RlH+xjtF34pKLH3oVi29q9jUTRii41eCBeztL/XcbJDsxAnCNnuxcak0gk4cl8j9aoMBP/opIc5sTDSqYFSSTDSMPGh90M6KowFtCHyVZxEszcIRX9cRIuf9KtfGvBzljJMjNGshIMuaHVCFpy72E0s50HmMxC4Kodhp6HEdLV1GUBZy87PYiKTqp9WVn0CndzcfmmdUUXVUvqWPKzRN3YSxExJ0Z5KFAgMBAAECggEABovbulciXaphMnnhN581D/l+3fGN40BQ/WAxNMokDAKAUpIMHGkzmQ19bp+lCTlcUvx4fL0ZqxIFd86v+4I05xnHcY8OCv+PGn86e4q0zCNfvbeF+wGqbwW342whVLvABWsitpS9G64HCzkqChHeQScgHCyXLzTwZL7PaG7x+eWnQ3WyA5KlCpUQWOz6OBPD7flkaflVRbDDZqmhcpEwwSXC9vSQb5+E0BZ118+5nJA65Wi/EPtqCzWX4k6ioiQcN5OeJrScZ4fnQm4h4j+TRLeKqkAKCZFpAZcB7RERxA/4Mzz9mEzHOBzSbrUU+miJ3oSkd4S4ldrOZU4EVkI1AQKBgQDe5t+Qij0hOPQaMpiM2hiQnMAI3TzHRbrYf6JUlMqdzad9oasY2ap+iit60TD9OLwjRGzjy7S9WL2bUgmmU4/sOjR0NMl8z3iUTYun6EubNoMUiu9UhQXBThxBCZv/H2agJ4Uswq2lBjUuGyp383lj9qSkScngGknYgrUd/pUa5QKBgQCTnNzCsIU/1N3fhzpvh1RmUwz8JalcmPNxQqrxE53Je+hVQ4BoeVMCov8U62TjBrxmHFEDVwXqAlRUUOWsWu4ac7V/VvFlwQoqPjkjNteOW6aO+BMDAlb2FVg5GzFy/MvLw4EUtU/Sx8EmWZpyaIzjRV4IUHx4WzJoORKEUIH/IQKBgQCh+9F37p3h6Murxh0KLuwvG1qKlow2nDveXVKQeNiNuQgAyl3WX0gBUVOrmx4oxvQiBPXEzSJ5f2W62/FbR9qNZvb7g+jwpK0RyRC2Yp+fGgxD/3tRRqIaCjOKJ/uPeThRJqcnEgqypEI9UUyZgvwyYuje4yirjS8hAkuwknO06QKBgHH4tnbX5jovuBPDjHnaSm8rBqaUyZxGOAimCehTVgvgULWshbOkoVQy17KmQWIMrGBG0sI6acWRgN0NDRgzqQ3hcyxby8zd7GRLYMBwsqQm3YYbwkobf1tHhbOp7Fc1GoE8dSixCW3cb6SVoGtfkBBWWdEfm8st1tCj6EkjBAwhAoGAShd1PY/QOEJ6Cj9IDXvD25DAh0dKs54PRxENetbIxPgYpH7db6n/smmbwM69U4TXZyFfqme1Bc0JwM2J7D6gs4OV88AhXJvfj091eJQhYC5e80Eo8dySserwLp8/ka6FV/EFUplg/DD4JR/jbVzO2fbOPCLm6I+sZqG3K7mg6IM=
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIcnSCg9uOLsR2ggBPDeCgNJHytlJIV2slMGq73NPbPyRwu1pK7cIJnh8fichQP0EANVh0ERCfI8kvR64GrJpgPgWhNLxsG7v3NEeAnXuXS3iE2W+MOF9UZR/sY7Rd+KSix96FYtvavY1E0YouNXggXs7S/13GyQ7MQJwjZ7sXGpNIJOHJfI/WqDAT/6KSHObEw0qmBUkkw0jDxofdDOiqMBbQh8lWcRLM3CEV/XESLn/SrXxrwc5YyTIzRrISDLmh1Qhacu9hNLOdB5jMQuCqHYaehxHS1dRlAWcvOz2Iik6qfVlZ9Ap3c3H5pnVFF1VL6ljys0Td2EsRMSdGeShQIDAQAB
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4AmKmcg8NImIDHlY1dz/DgBlIB1EVXv5gI2S17/Ddt7kDEdY2Uq0TV5NmVxf1RQ6EXQCDpBm83IOkduMeGsnD3zad6Vpit6hdjfvMJ4au9pAaoe4nYAy0CoMVTKDIR7XunSJZqfOZTihLXD8GbqMFTMPRyuh/JNCHoeDfDhca2nD6hyVOLE7XqZK8gVq9WgUM8uVkXDHJJfPHFmQaU8jJt3pyuItsVi1id8vJvHdng/rFy0USPwSq9kVv9DaIxI2197UBvjtyt4iTTYE5esOiJeulUggwmpWoss7Cx2fbN0pLVors+DybJGZjEW3GdwL+R6FStvQNAVcIf2Ty/NgKwIDAQAB
gatewayUrl: https://openapi.alipay.com/gateway.do
notify-url: http://yuxy.perrymake.com/admin-api/notify/ali/pay_notify
refund-notify: http://yuxy.perrymake.com/admin-api/notify/ali/refund_notify
# 芋道配置项,设置当前项目所有自定义的配置
yudao:
captcha: