支付宝手机网站支付

This commit is contained in:
jason
2021-11-04 00:26:56 +08:00
parent aa77eb029f
commit 2c60a3aafa
14 changed files with 204 additions and 21 deletions

View File

@ -29,4 +29,11 @@ public class PayProperties {
@URL(message = "退款回调地址的格式必须是 URL")
private String refundNotifyUrl;
/**
* 支付完成的返回地址
*/
@URL(message = "支付返回的地址的格式必须是 URL")
private String returnUrl;
}

View File

@ -1,5 +1,6 @@
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.PayOrderUnifiedReqDTO;
@ -32,6 +33,6 @@ public interface PayClient {
* @return 解析结果
* @throws Exception 解析失败,抛出异常
*/
PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception;
PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception;
}

View File

@ -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;
}

View File

@ -42,4 +42,14 @@ public class PayOrderNotifyRespDTO {
*/
private String data;
/**
* TODO @jason 结合其他的渠道定义成枚举,
* alipay
* TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。
* TRADE_SUCCESS, 交易支付成功
* TRADE_FINISHED 交易结束,不可退款。
*/
private String tradeStatus;
}

View File

@ -50,6 +50,9 @@ public class PayOrderUnifiedReqDTO {
@URL(message = "支付结果的回调地址必须是 URL 格式")
private String notifyUrl;
@URL(message = "支付结果的return 必须是 URL 格式")
private String returnUrl;
// ========== 订单相关字段 ==========
/**

View File

@ -18,6 +18,10 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping {
if (Objects.equals(apiCode, "10000")) {
return GlobalErrorCodeConstants.SUCCESS;
}
// alipay wap api code 返回为null, 暂时定为-9999
if(Objects.equals(apiCode, "-9999")){
return GlobalErrorCodeConstants.SUCCESS;
}
return null;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
import cn.hutool.core.bean.BeanUtil;
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.PayOrderUnifiedReqDTO;
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@ -68,7 +69,7 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig>
}
@Override
public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
// TODO 芋艿:待完成
return null;
}

View File

@ -1,7 +1,9 @@
package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
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.dto.NotifyDataDTO;
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.impl.AbstractPayClient;
@ -14,6 +16,9 @@ import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import lombok.SneakyThrows;
import java.util.Map;
import java.util.Objects;
/**
* 支付宝【手机网站】的 PayClient 实现类
* 文档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.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString());
model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整
model.setSellerId("2088102147948060"); // TODO 芋艿:这里咋整
// TODO 芋艿userIp + expireTime
//TODO 芋艿:这里咋整 jason @芋艿 可以去掉吧,
//model.setSellerId("2088102147948060");
model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss"));
// TODO 芋艿userIp
// 构建 AlipayTradeWapPayRequest
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setBizModel(model);
request.setNotifyUrl(reqDTO.getNotifyUrl());
request.setReturnUrl(reqDTO.getReturnUrl());
// 执行请求
AlipayTradeWapPayResponse response;
try {
@ -58,13 +66,30 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig>
} catch (AlipayApiException e) {
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
public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
// TODO 芋艿:待完成
return null;
public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
Map<String, String> params = data.getParams();
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();
}
}

View File

@ -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.object.ObjectUtils;
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.PayOrderUnifiedReqDTO;
import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@ -131,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
}
@Override
public PayOrderNotifyRespDTO parseOrderNotify(String data) throws WxPayException {
WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data);
public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws WxPayException {
WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getOrigData());
Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
// 转换结果
return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo())
.channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid())
.successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
.data(data).build();
.data(data.getOrigData()).build();
}
}