mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-26 17:21:53 +08:00
支付宝手机网站支付
This commit is contained in:
parent
aa77eb029f
commit
2c60a3aafa
@ -1,9 +1,11 @@
|
|||||||
package cn.iocoder.yudao.coreservice.modules.pay.service.order;
|
package cn.iocoder.yudao.coreservice.modules.pay.service.order;
|
||||||
|
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
|
import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
|
||||||
|
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
@ -46,6 +48,6 @@ public interface PayOrderCoreService {
|
|||||||
* @param channelCode 渠道编码
|
* @param channelCode 渠道编码
|
||||||
* @param notifyData 通知数据
|
* @param notifyData 通知数据
|
||||||
*/
|
*/
|
||||||
void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception;
|
void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreS
|
|||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService;
|
||||||
|
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
|
||||||
@ -26,6 +27,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
|||||||
import cn.iocoder.yudao.framework.pay.config.PayProperties;
|
import cn.iocoder.yudao.framework.pay.config.PayProperties;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClient;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClient;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -135,9 +137,11 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
|
|||||||
// 调用三方接口
|
// 调用三方接口
|
||||||
PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO);
|
PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO);
|
||||||
// 商户相关字段
|
// 商户相关字段
|
||||||
|
//TODO jason @芋艿 是否加一个属性 如tradeNo 支付订单号, 用这个merchantOrderId让人迷糊
|
||||||
unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性!
|
unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性!
|
||||||
.setSubject(order.getSubject()).setBody(order.getBody())
|
.setSubject(order.getSubject()).setBody(order.getBody())
|
||||||
.setNotifyUrl(genChannelPayNotifyUrl(channel));
|
.setNotifyUrl(genChannelPayNotifyUrl(channel))
|
||||||
|
.setReturnUrl(genChannelReturnUrl(channel));
|
||||||
// 订单相关字段
|
// 订单相关字段
|
||||||
unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime());
|
unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime());
|
||||||
CommonResult<?> unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO);
|
CommonResult<?> unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO);
|
||||||
@ -149,6 +153,16 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
|
|||||||
.setInvokeResponse(unifiedOrderResult.getData());
|
.setInvokeResponse(unifiedOrderResult.getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据支付渠道的编码,生成支付渠道的返回地址
|
||||||
|
* @param channel
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private String genChannelReturnUrl(PayChannelDO channel) {
|
||||||
|
return payProperties.getReturnUrl() + "/" + StrUtil.replace(channel.getCode(), "_", "-")
|
||||||
|
+ "/" + channel.getId();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据支付渠道的编码,生成支付渠道的回调地址
|
* 根据支付渠道的编码,生成支付渠道的回调地址
|
||||||
*
|
*
|
||||||
@ -181,9 +195,9 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception {
|
public void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception {
|
||||||
// TODO 芋艿,记录回调日志
|
// TODO 芋艿,记录回调日志
|
||||||
log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData);
|
log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getOrigData());
|
||||||
|
|
||||||
// 校验支付渠道是否有效
|
// 校验支付渠道是否有效
|
||||||
PayChannelDO channel = payChannelCoreService.validPayChannel(channelId);
|
PayChannelDO channel = payChannelCoreService.validPayChannel(channelId);
|
||||||
@ -193,6 +207,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
|
|||||||
log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId());
|
log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId());
|
||||||
throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND);
|
throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
//TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey 或者payclient 加一个校验方法
|
||||||
// 解析支付结果
|
// 解析支付结果
|
||||||
PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData);
|
PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData);
|
||||||
|
|
||||||
@ -207,9 +222,10 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
|
|||||||
throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
|
throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
|
||||||
}
|
}
|
||||||
// 1.2 更新 PayOrderExtensionDO
|
// 1.2 更新 PayOrderExtensionDO
|
||||||
|
//TODO @jason notifyRespDTO.getTradeStatus() 需要根据不同的状态更新成不同的值 PayOrderStatusEnum
|
||||||
int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(),
|
int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(),
|
||||||
PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
|
PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
|
||||||
.status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData).build());
|
.status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getOrigData()).build());
|
||||||
if (updateCounts == 0) { // 校验状态,必须是待支付
|
if (updateCounts == 0) { // 校验状态,必须是待支付
|
||||||
throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
|
throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
|
||||||
}
|
}
|
||||||
|
@ -29,4 +29,11 @@ public class PayProperties {
|
|||||||
@URL(message = "退款回调地址的格式必须是 URL")
|
@URL(message = "退款回调地址的格式必须是 URL")
|
||||||
private String refundNotifyUrl;
|
private String refundNotifyUrl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付完成的返回地址
|
||||||
|
*/
|
||||||
|
@URL(message = "支付返回的地址的格式必须是 URL")
|
||||||
|
private String returnUrl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.framework.pay.core.client;
|
package cn.iocoder.yudao.framework.pay.core.client;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
||||||
|
|
||||||
@ -32,6 +33,6 @@ public interface PayClient {
|
|||||||
* @return 解析结果
|
* @return 解析结果
|
||||||
* @throws Exception 解析失败,抛出异常
|
* @throws Exception 解析失败,抛出异常
|
||||||
*/
|
*/
|
||||||
PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception;
|
PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package cn.iocoder.yudao.framework.pay.core.client.dto;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@ToString
|
||||||
|
@Builder
|
||||||
|
public class NotifyDataDTO {
|
||||||
|
|
||||||
|
private String origData;
|
||||||
|
//1:xml 2:form
|
||||||
|
private int format;
|
||||||
|
|
||||||
|
//form 格式的 data;
|
||||||
|
private Map<String,String> params;
|
||||||
|
}
|
@ -42,4 +42,14 @@ public class PayOrderNotifyRespDTO {
|
|||||||
*/
|
*/
|
||||||
private String data;
|
private String data;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO @jason 结合其他的渠道定义成枚举,
|
||||||
|
* alipay
|
||||||
|
* TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。
|
||||||
|
* TRADE_SUCCESS, 交易支付成功
|
||||||
|
* TRADE_FINISHED 交易结束,不可退款。
|
||||||
|
*/
|
||||||
|
private String tradeStatus;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,9 @@ public class PayOrderUnifiedReqDTO {
|
|||||||
@URL(message = "支付结果的回调地址必须是 URL 格式")
|
@URL(message = "支付结果的回调地址必须是 URL 格式")
|
||||||
private String notifyUrl;
|
private String notifyUrl;
|
||||||
|
|
||||||
|
@URL(message = "支付结果的return 必须是 URL 格式")
|
||||||
|
private String returnUrl;
|
||||||
|
|
||||||
// ========== 订单相关字段 ==========
|
// ========== 订单相关字段 ==========
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,6 +18,10 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping {
|
|||||||
if (Objects.equals(apiCode, "10000")) {
|
if (Objects.equals(apiCode, "10000")) {
|
||||||
return GlobalErrorCodeConstants.SUCCESS;
|
return GlobalErrorCodeConstants.SUCCESS;
|
||||||
}
|
}
|
||||||
|
// alipay wap api code 返回为null, 暂时定为-9999
|
||||||
|
if(Objects.equals(apiCode, "-9999")){
|
||||||
|
return GlobalErrorCodeConstants.SUCCESS;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
|
|||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
|
import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
|
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
|
||||||
@ -68,7 +69,7 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
|
public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
|
||||||
// TODO 芋艿:待完成
|
// TODO 芋艿:待完成
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
|
package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
|
import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
|
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
|
||||||
@ -14,6 +16,9 @@ import com.alipay.api.request.AlipayTradeWapPayRequest;
|
|||||||
import com.alipay.api.response.AlipayTradeWapPayResponse;
|
import com.alipay.api.response.AlipayTradeWapPayResponse;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付宝【手机网站】的 PayClient 实现类
|
* 支付宝【手机网站】的 PayClient 实现类
|
||||||
* 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay
|
* 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay
|
||||||
@ -45,12 +50,15 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig>
|
|||||||
model.setBody(reqDTO.getBody());
|
model.setBody(reqDTO.getBody());
|
||||||
model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString());
|
model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString());
|
||||||
model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整
|
model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整
|
||||||
model.setSellerId("2088102147948060"); // TODO 芋艿:这里咋整
|
//TODO 芋艿:这里咋整 jason @芋艿 可以去掉吧,
|
||||||
// TODO 芋艿:userIp + expireTime
|
//model.setSellerId("2088102147948060");
|
||||||
|
model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss"));
|
||||||
|
// TODO 芋艿:userIp
|
||||||
// 构建 AlipayTradeWapPayRequest
|
// 构建 AlipayTradeWapPayRequest
|
||||||
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
|
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
|
||||||
request.setBizModel(model);
|
request.setBizModel(model);
|
||||||
|
request.setNotifyUrl(reqDTO.getNotifyUrl());
|
||||||
|
request.setReturnUrl(reqDTO.getReturnUrl());
|
||||||
// 执行请求
|
// 执行请求
|
||||||
AlipayTradeWapPayResponse response;
|
AlipayTradeWapPayResponse response;
|
||||||
try {
|
try {
|
||||||
@ -58,13 +66,30 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig>
|
|||||||
} catch (AlipayApiException e) {
|
} catch (AlipayApiException e) {
|
||||||
return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping);
|
return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping);
|
||||||
}
|
}
|
||||||
// TODO 芋艿:sub Code
|
|
||||||
return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
|
// TODO 芋艿:sub Code
|
||||||
|
if(response.isSuccess() && Objects.isNull(response.getCode()) && Objects.nonNull(response.getBody())){
|
||||||
|
//成功alipay wap 成功 code 为 null , body 为form 表单
|
||||||
|
return PayCommonResult.build("-9999", "Success", response, codeMapping);
|
||||||
|
}else {
|
||||||
|
return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* //https://opendocs.alipay.com/open/203/105286
|
||||||
|
* @param data 通知结果
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
|
public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
|
||||||
// TODO 芋艿:待完成
|
Map<String, String> params = data.getParams();
|
||||||
return null;
|
return PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no"))
|
||||||
|
.channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id"))
|
||||||
|
.tradeStatus(params.get("trade_status"))
|
||||||
|
.successTime(DateUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss"))
|
||||||
|
.data(data.getOrigData()).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import cn.iocoder.yudao.framework.common.util.io.FileUtils;
|
import cn.iocoder.yudao.framework.common.util.io.FileUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
|
import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
|
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
|
||||||
@ -131,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayOrderNotifyRespDTO parseOrderNotify(String data) throws WxPayException {
|
public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws WxPayException {
|
||||||
WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data);
|
WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getOrigData());
|
||||||
Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
|
Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
|
||||||
// 转换结果
|
// 转换结果
|
||||||
return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo())
|
return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo())
|
||||||
.channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid())
|
.channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid())
|
||||||
.successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
|
.successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
|
||||||
.data(data).build();
|
.data(data.getOrigData()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,17 +6,21 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreServic
|
|||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
|
||||||
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
|
import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
|
import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
|
||||||
import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO;
|
import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO;
|
||||||
import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO;
|
import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
|
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
|
||||||
|
|
||||||
@ -54,7 +58,7 @@ public class PayOrderController {
|
|||||||
@ApiOperation("通知微信公众号支付的结果")
|
@ApiOperation("通知微信公众号支付的结果")
|
||||||
public String notifyWxPayOrder(@PathVariable("channelId") Long channelId,
|
public String notifyWxPayOrder(@PathVariable("channelId") Long channelId,
|
||||||
@RequestBody String xmlData) throws Exception {
|
@RequestBody String xmlData) throws Exception {
|
||||||
payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), xmlData);
|
payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), NotifyDataDTO.builder().origData(xmlData).build());
|
||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,4 +76,27 @@ public class PayOrderController {
|
|||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/notify/alipay-wap/{channelId}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
|
||||||
|
@ApiOperation("支付宝wap页面回调")
|
||||||
|
public String notifyAliPayWapPayOrder(@PathVariable("channelId") Long channelId,
|
||||||
|
@RequestParam Map<String, String> params,
|
||||||
|
@RequestBody String originData) throws Exception {
|
||||||
|
//TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey payclient 或许加一个校验方法
|
||||||
|
payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), NotifyDataDTO.builder().params(params).origData(originData).build());
|
||||||
|
return "success";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://opendocs.alipay.com/open/203/105285#%E5%89%8D%E5%8F%B0%E5%9B%9E%E8%B7%B3%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
|
||||||
|
* @param channelId
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@GetMapping(value = "/return/alipay-wap/{channelId}")
|
||||||
|
@ApiOperation("支付宝wap页面回跳")
|
||||||
|
public String returnAliPayWapPayOrder(@PathVariable("channelId") Long channelId){
|
||||||
|
//TODO @jason 校验 是否支付宝调用。 支付宝publickey 可以根据 appId 跳转不同的页面
|
||||||
|
return "支付成功";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -153,5 +153,6 @@ yudao:
|
|||||||
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
|
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
|
||||||
demo: false # 关闭演示模式
|
demo: false # 关闭演示模式
|
||||||
pay:
|
pay:
|
||||||
pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
|
pay-notify-url: http://jg6rde.natappfree.cc/api/pay/order/notify
|
||||||
refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
|
refund-notify-url: http://jg6rde.natappfree.cc/api/pay/refund/notify
|
||||||
|
return-url: http://jg6rde.natappfree.cc/api/pay/order/return
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
|
||||||
|
<title>支付测试页</title>
|
||||||
|
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div>点击如下按钮,发起支付的测试</div>
|
||||||
|
<div>
|
||||||
|
<button id="alipay_wap">支付宝h5</button>
|
||||||
|
</div>
|
||||||
|
<div id="dynamic_form"></div>
|
||||||
|
</body>
|
||||||
|
<script>
|
||||||
|
let shopOrderId = undefined;
|
||||||
|
let payOrderId = undefined;
|
||||||
|
let server = 'http://127.0.0.1:28080';
|
||||||
|
//let server = 'http://niubi.natapp1.cc';
|
||||||
|
// TODO openid
|
||||||
|
//let openid = "ockUAwIZ-0OeMZl9ogcZ4ILrGba0";
|
||||||
|
$(function() {
|
||||||
|
// 自动发起商城订单编号
|
||||||
|
$.ajax({
|
||||||
|
url: server + "/api/shop/order/create",
|
||||||
|
method: 'POST',
|
||||||
|
success: function( result ) {
|
||||||
|
if (result.code !== 0) {
|
||||||
|
alert('创建商城订单失败,原因:' + result.msg)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
shopOrderId = result.data.id;
|
||||||
|
payOrderId = result.data.payOrderId;
|
||||||
|
console.log("商城订单:" + shopOrderId)
|
||||||
|
console.log("支付订单:" + payOrderId)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
// 微信公众号
|
||||||
|
$( "#alipay_wap").on( "click", function() {
|
||||||
|
// 提交支付
|
||||||
|
$.ajax({
|
||||||
|
url: server + "/api/pay/order/submit",
|
||||||
|
method: 'POST',
|
||||||
|
dataType: "json",
|
||||||
|
contentType: "application/json",
|
||||||
|
data: JSON.stringify({
|
||||||
|
"id": payOrderId,
|
||||||
|
"channelCode": 'alipay_wap'
|
||||||
|
}),
|
||||||
|
success: function( result ) {
|
||||||
|
if (result.code !== 0) {
|
||||||
|
alert('提交支付订单失败,原因:' + result.msg)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
alert('点击确定,开始支付');
|
||||||
|
// 开始调用微信支付
|
||||||
|
let data = result.data.invokeResponse;
|
||||||
|
$("#dynamic_form").html(data.body);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user