From b19f787a15c99faa3c89fdd2b778fd5a113c2c83 Mon Sep 17 00:00:00 2001 From: lizhengwu <641876684@qq.com> Date: Tue, 23 Jul 2024 18:34:05 +0800 Subject: [PATCH 1/4] =?UTF-8?q?:art:=20=E3=80=90=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=8F=B7=E5=B0=8F=E5=BA=97=E3=80=91=E8=8E=B7=E5=8F=96=E5=94=AE?= =?UTF-8?q?=E5=90=8E=E5=8D=95=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E9=83=A8=E5=88=86=E8=BF=94=E5=9B=9E=E5=80=BC=E3=80=81?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/channel/bean/after/RefundInfo.java | 4 ++ .../weixin/channel/enums/RefundReason.java | 51 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/RefundReason.java diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/RefundInfo.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/RefundInfo.java index 9837b72b28..73aedf99cf 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/RefundInfo.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/RefundInfo.java @@ -18,4 +18,8 @@ public class RefundInfo implements Serializable { /** 退款金额(分) */ @JsonProperty("amount") private Integer amount; + + /** 标明售后单退款直接原因, 枚举值详情请参考 {@link me.chanjar.weixin.channel.enums.RefundReason} */ + @JsonProperty("refund_reason") + private Integer refundReason; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/RefundReason.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/RefundReason.java new file mode 100644 index 0000000000..8a2825c28c --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/RefundReason.java @@ -0,0 +1,51 @@ +package me.chanjar.weixin.channel.enums; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 售后单退款直接原因 + * + * @author lizhengwu + */ +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum RefundReason { + /** 1 商家通过店铺管理页或者小助手发起退款 */ + MERCHANT_INITIATED_REFUND(1, "商家通过店铺管理页或者小助手发起退款"), + /** 2 退货退款场景,商家同意买家未上传物流单号情况下确认收货并退款,该场景限于订单无运费险 */ + MERCHANT_AGREES_NO_TRACKING_REFUND(2, "退货退款场景,商家同意买家未上传物流单号情况下确认收货并退款,该场景限于订单无运费险"), + /** 3 商家通过后台api发起退款 */ + MERCHANT_API_INITIATED_REFUND(3, "商家通过后台api发起退款"), + /** 4 未发货售后平台自动同意 */ + PRE_SHIPMENT_AUTOMATIC_REFUND(4, "未发货售后平台自动同意"), + /** 5 平台介入纠纷退款 */ + PLATFORM_INTERVENED_DISPUTE_REFUND(5, "平台介入纠纷退款"), + /** 6 特殊场景下平台强制退款 */ + PLATFORM_FORCED_REFUND(6, "特殊场景下平台强制退款"), + /** 7 退货退款场景,买家同意没有上传物流单号情况下,商家确认收货并退款,该场景限于订单包含运费险,并无法理赔 */ + BUYER_AGREES_NO_TRACKING_REFUND(7, "退货退款场景,买家同意没有上传物流单号情况下,商家确认收货并退款,该场景限于订单包含运费险,并无法理赔"), + /** 8 商家发货超时,平台退款 */ + LATE_SHIPMENT_PLATFORM_REFUND(8, "商家发货超时,平台退款"), + /** 9 商家处理买家售后申请超时,平台自动同意退款 */ + MERCHANT_OVERDUE_AUTO_REFUND(9, "商家处理买家售后申请超时,平台自动同意退款"), + /** 10 用户确认收货超时,平台退款 */ + BUYER_OVERDUE_AUTO_REFUND(10, "用户确认收货超时,平台退款"), + /** 11 商家确认收货超时,平台退款 */ + MERCHANT_OVERDUE_CONFIRMATION_REFUND(11, "商家确认收货超时,平台退款"), + ; + + private final int key; + private final String value; + + RefundReason(int key, String value) { + this.key = key; + this.value = value; + } + + public int getKey() { + return key; + } + + public String getValue() { + return value; + } +} From fa23d17e1a693ea8419c4ca7d906ef23e9503178 Mon Sep 17 00:00:00 2001 From: lizhengwu <641876684@qq.com> Date: Thu, 25 Jul 2024 10:58:19 +0800 Subject: [PATCH 2/4] =?UTF-8?q?:art:=20=E3=80=90=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=8F=B7=E5=B0=8F=E5=BA=97=E3=80=91=E8=8E=B7=E5=8F=96=E5=94=AE?= =?UTF-8?q?=E5=90=8E=E5=8D=95=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E9=83=A8=E5=88=86=E8=BF=94=E5=9B=9E=E5=80=BC=E3=80=81?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E7=B1=BB=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=94=AE=E5=90=8E=E5=8E=9F=E5=9B=A0API=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=84=8F=E3=80=81=E6=8B=92=E6=8E=A5=E5=94=AE=E5=90=8E?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/WxChannelAfterSaleService.java | 34 +++++++++++++-- .../impl/WxChannelAfterSaleServiceImpl.java | 43 ++++++++++--------- .../bean/after/AfterSaleAcceptParam.java | 10 +++++ .../channel/bean/after/AfterSaleInfo.java | 4 ++ .../channel/bean/after/AfterSaleReason.java | 33 ++++++++++++++ .../bean/after/AfterSaleReasonResponse.java | 28 ++++++++++++ .../bean/after/AfterSaleRejectParam.java | 16 ++++++- .../bean/after/AfterSaleRejectReason.java | 39 +++++++++++++++++ .../after/AfterSaleRejectReasonResponse.java | 29 +++++++++++++ .../constant/WxChannelApiUrlConstants.java | 4 ++ .../weixin/channel/enums/AfterSaleStatus.java | 4 ++ .../WxChannelAfterSaleServiceImplTest.java | 27 ++++++++++-- 12 files changed, 242 insertions(+), 29 deletions(-) create mode 100644 weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReason.java create mode 100644 weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReasonResponse.java create mode 100644 weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReason.java create mode 100644 weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReasonResponse.java diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelAfterSaleService.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelAfterSaleService.java index ac1e61729b..418feab7ac 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelAfterSaleService.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/WxChannelAfterSaleService.java @@ -4,6 +4,8 @@ import java.util.List; import me.chanjar.weixin.channel.bean.after.AfterSaleInfoResponse; import me.chanjar.weixin.channel.bean.after.AfterSaleListResponse; +import me.chanjar.weixin.channel.bean.after.AfterSaleReasonResponse; +import me.chanjar.weixin.channel.bean.after.AfterSaleRejectReasonResponse; import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; import me.chanjar.weixin.channel.bean.complaint.ComplaintOrderResponse; import me.chanjar.weixin.common.error.WxErrorException; @@ -39,26 +41,31 @@ AfterSaleListResponse listIds(Long beginCreateTime, Long endCreateTime, String n AfterSaleInfoResponse get(String afterSaleOrderId) throws WxErrorException; /** - * 同意退款 + * 同意售后 + * 文档地址 https://developers.weixin.qq.com/doc/channels/API/aftersale/acceptapply.html * * @param afterSaleOrderId 售后单号 * @param addressId 同意退货时传入地址id + * @param acceptType 1. 同意退货退款,并通知用户退货; 2. 确认收到货并退款给用户。 如果不填则将根据当前的售后单状态自动选择相应操作。对于仅退款的情况,由于只存在一种同意的场景,无需填写此字段。 * @return BaseResponse * * @throws WxErrorException 异常 */ - WxChannelBaseResponse accept(String afterSaleOrderId, String addressId) throws WxErrorException; + WxChannelBaseResponse accept(String afterSaleOrderId, String addressId, Integer acceptType) throws WxErrorException; /** * 拒绝售后 + * 文档地址 https://developers.weixin.qq.com/doc/channels/API/aftersale/rejectapply.html * * @param afterSaleOrderId 售后单号 * @param rejectReason 拒绝原因 + * @param rejectReasonType 拒绝原因枚举值 + * @see #getRejectReason() * @return BaseResponse * * @throws WxErrorException 异常 */ - WxChannelBaseResponse reject(String afterSaleOrderId, String rejectReason) throws WxErrorException; + WxChannelBaseResponse reject(String afterSaleOrderId, String rejectReason, Integer rejectReasonType) throws WxErrorException; /** * 上传退款凭证 @@ -108,4 +115,25 @@ WxChannelBaseResponse addComplaintEvidence(String complaintId, String content, L * @throws WxErrorException 异常 */ ComplaintOrderResponse getComplaint(String complaintId) throws WxErrorException; + + + /** + * 获取全量售后原因 + * 文档地址:https://developers.weixin.qq.com/doc/channels/API/aftersale/getaftersalereason.html + * + * @return 售后原因 + * + * @throws WxErrorException 异常 + */ + AfterSaleReasonResponse getAllReason() throws WxErrorException; + + /** + * 获取拒绝售后原因 + * 文档地址:https://developers.weixin.qq.com/doc/channels/API/aftersale/getrejectreason.html + * + * @return 拒绝售后原因 + * + * @throws WxErrorException 异常 + */ + AfterSaleRejectReasonResponse getRejectReason() throws WxErrorException; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImpl.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImpl.java index c29ea49b34..a4be86f28d 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImpl.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImpl.java @@ -1,30 +1,19 @@ package me.chanjar.weixin.channel.api.impl; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.AfterSale.AFTER_SALE_ACCEPT_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.AfterSale.AFTER_SALE_GET_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.AfterSale.AFTER_SALE_LIST_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.AfterSale.AFTER_SALE_REJECT_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.AfterSale.AFTER_SALE_UPLOAD_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Complaint.ADD_COMPLAINT_MATERIAL_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Complaint.ADD_COMPLAINT_PROOF_URL; -import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Complaint.GET_COMPLAINT_ORDER_URL; - -import java.util.List; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.channel.api.WxChannelAfterSaleService; -import me.chanjar.weixin.channel.bean.after.AfterSaleAcceptParam; -import me.chanjar.weixin.channel.bean.after.AfterSaleIdParam; -import me.chanjar.weixin.channel.bean.after.AfterSaleInfoResponse; -import me.chanjar.weixin.channel.bean.after.AfterSaleListParam; -import me.chanjar.weixin.channel.bean.after.AfterSaleListResponse; -import me.chanjar.weixin.channel.bean.after.AfterSaleRejectParam; -import me.chanjar.weixin.channel.bean.after.RefundEvidenceParam; +import me.chanjar.weixin.channel.bean.after.*; import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; import me.chanjar.weixin.channel.bean.complaint.ComplaintOrderResponse; import me.chanjar.weixin.channel.bean.complaint.ComplaintParam; import me.chanjar.weixin.channel.util.ResponseUtils; import me.chanjar.weixin.common.error.WxErrorException; +import java.util.List; + +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.AfterSale.*; +import static me.chanjar.weixin.channel.constant.WxChannelApiUrlConstants.Complaint.*; + /** * 视频号小店 售后服务实现 * @@ -56,15 +45,15 @@ public AfterSaleInfoResponse get(String afterSaleOrderId) throws WxErrorExceptio } @Override - public WxChannelBaseResponse accept(String afterSaleOrderId, String addressId) throws WxErrorException { - AfterSaleAcceptParam param = new AfterSaleAcceptParam(afterSaleOrderId, addressId); + public WxChannelBaseResponse accept(String afterSaleOrderId, String addressId, Integer acceptType) throws WxErrorException { + AfterSaleAcceptParam param = new AfterSaleAcceptParam(afterSaleOrderId, addressId, acceptType); String resJson = shopService.post(AFTER_SALE_ACCEPT_URL, param); return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); } @Override - public WxChannelBaseResponse reject(String afterSaleOrderId, String rejectReason) throws WxErrorException { - AfterSaleRejectParam param = new AfterSaleRejectParam(afterSaleOrderId, rejectReason); + public WxChannelBaseResponse reject(String afterSaleOrderId, String rejectReason, Integer rejectReasonType) throws WxErrorException { + AfterSaleRejectParam param = new AfterSaleRejectParam(afterSaleOrderId, rejectReason, rejectReasonType); String resJson = shopService.post(AFTER_SALE_REJECT_URL, param); return ResponseUtils.decode(resJson, WxChannelBaseResponse.class); } @@ -100,4 +89,16 @@ public ComplaintOrderResponse getComplaint(String complaintId) throws WxErrorExc String resJson = shopService.post(GET_COMPLAINT_ORDER_URL, reqJson); return ResponseUtils.decode(resJson, ComplaintOrderResponse.class); } + + @Override + public AfterSaleReasonResponse getAllReason() throws WxErrorException { + String resJson = shopService.post(AFTER_SALE_REASON_GET_URL, "{}"); + return ResponseUtils.decode(resJson, AfterSaleReasonResponse.class); + } + + @Override + public AfterSaleRejectReasonResponse getRejectReason() throws WxErrorException { + String resJson = shopService.post(AFTER_SALE_REJECT_REASON_GET_URL, "{}"); + return ResponseUtils.decode(resJson, AfterSaleRejectReasonResponse.class); + } } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleAcceptParam.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleAcceptParam.java index ebc63a2190..32ad9154ee 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleAcceptParam.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleAcceptParam.java @@ -19,6 +19,10 @@ public class AfterSaleAcceptParam extends AfterSaleIdParam { @JsonProperty("address_id") private String addressId; + /** 针对退货退款同意售后的阶段: 1. 同意退货退款,并通知用户退货; 2. 确认收到货并退款给用户。 如果不填则将根据当前的售后单状态自动选择相应操作。对于仅退款的情况,由于只存在一种同意的场景,无需填写此字段。*/ + @JsonProperty("accept_type") + private Integer acceptType; + public AfterSaleAcceptParam() { } @@ -26,4 +30,10 @@ public AfterSaleAcceptParam(String afterSaleOrderId, String addressId) { super(afterSaleOrderId); this.addressId = addressId; } + + public AfterSaleAcceptParam(String afterSaleOrderId, String addressId, Integer acceptType) { + super(afterSaleOrderId); + this.addressId = addressId; + this.acceptType = acceptType; + } } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleInfo.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleInfo.java index b0d668b30e..3a9d390c95 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleInfo.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleInfo.java @@ -82,4 +82,8 @@ public class AfterSaleInfo implements Serializable { /** 纠纷id,该字段可用于获取纠纷信息 */ @JsonProperty("complaint_id") private String complaintId; + + /** 仅在待商家审核退款退货申请或收货期间返回,表示操作剩余时间(秒数)*/ + @JsonProperty("deadline") + private Long deadline; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReason.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReason.java new file mode 100644 index 0000000000..7c66eff18f --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReason.java @@ -0,0 +1,33 @@ +package me.chanjar.weixin.channel.bean.after; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 全量售后原因 + * + * @author lizhengwu + * @date 2024/7/24 + */ +@Data +@NoArgsConstructor +public class AfterSaleReason implements Serializable { + + private static final long serialVersionUID = -3674527884494606230L; + + /** + * 售后原因枚举 + */ + @JsonProperty("reason") + private Integer reason; + + /** + * 售后原因说明 + */ + @JsonProperty("reason_text") + private String reasonText; + +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReasonResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReasonResponse.java new file mode 100644 index 0000000000..7372dea1f1 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleReasonResponse.java @@ -0,0 +1,28 @@ +package me.chanjar.weixin.channel.bean.after; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; + +import java.util.List; + +/** + * 售后原因 + * + * + * @author lizhengwu + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode +public class AfterSaleReasonResponse extends WxChannelBaseResponse { + + + private static final long serialVersionUID = -580378623915041396L; + + @JsonProperty("reason_list") + private List reasonList; + +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectParam.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectParam.java index 080665ac00..cbde459fea 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectParam.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectParam.java @@ -15,10 +15,18 @@ public class AfterSaleRejectParam extends AfterSaleIdParam { private static final long serialVersionUID = -7507483859864253314L; - /** 拒绝原因 */ + /** + * 拒绝原因 + */ @JsonProperty("reject_reason") private String rejectReason; + /** + * 拒绝原因枚举值 + */ + @JsonProperty("reject_reason_type") + private Integer rejectReasonType; + public AfterSaleRejectParam() { } @@ -26,4 +34,10 @@ public AfterSaleRejectParam(String afterSaleOrderId, String rejectReason) { super(afterSaleOrderId); this.rejectReason = rejectReason; } + + public AfterSaleRejectParam(String afterSaleOrderId, String rejectReason, Integer rejectReasonType) { + super(afterSaleOrderId); + this.rejectReason = rejectReason; + this.rejectReasonType = rejectReasonType; + } } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReason.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReason.java new file mode 100644 index 0000000000..51c88ae222 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReason.java @@ -0,0 +1,39 @@ +package me.chanjar.weixin.channel.bean.after; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 拒绝售后原因 + * + * @author lizhengwu + * @date 2024/7/24 + */ +@Data +@NoArgsConstructor +public class AfterSaleRejectReason implements Serializable { + + private static final long serialVersionUID = -3672834150982780L; + + /** + * 售后拒绝原因枚举 + */ + @JsonProperty("reject_reason_type") + private Integer rejectReasonType; + + /** + * 售后拒绝原因说明 + */ + @JsonProperty("reject_reason_type_text") + private String rejectReasonTypeText; + + /** + * 售后拒绝原因默认描述 + */ + @JsonProperty("reject_reason") + private String rejectReason; + +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReasonResponse.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReasonResponse.java new file mode 100644 index 0000000000..7b50691d00 --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/after/AfterSaleRejectReasonResponse.java @@ -0,0 +1,29 @@ +package me.chanjar.weixin.channel.bean.after; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; + +import java.util.List; + +/** + * 售后原因 + * + * @author lizhengwu + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode +public class AfterSaleRejectReasonResponse extends WxChannelBaseResponse { + + private static final long serialVersionUID = -7946679037747710613L; + + /** + * 售后原因列表 + */ + @JsonProperty("reject_reason_list") + private List rejectReasonList; + +} diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java index 4be90c370b..79ff5f8f8d 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/constant/WxChannelApiUrlConstants.java @@ -170,6 +170,10 @@ public interface AfterSale { String AFTER_SALE_REJECT_URL = "https://api.weixin.qq.com/channels/ec/aftersale/rejectapply"; /** 上传退款凭证 */ String AFTER_SALE_UPLOAD_URL = "https://api.weixin.qq.com/channels/ec/aftersale/uploadrefundcertificate"; + /** 获取全量售后原因*/ + String AFTER_SALE_REASON_GET_URL = "https://api.weixin.qq.com/channels/ec/aftersale/reason/get"; + /** 获取拒绝售后原因*/ + String AFTER_SALE_REJECT_REASON_GET_URL = "https://api.weixin.qq.com/channels/ec/aftersale/rejectreason/get"; } /** 纠纷相关接口 */ diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/AfterSaleStatus.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/AfterSaleStatus.java index 60e77d9e53..b249c96bcb 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/AfterSaleStatus.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/AfterSaleStatus.java @@ -39,6 +39,10 @@ public enum AfterSaleStatus { MERCHANT_REFUND_RETRY_FAIL("MERCHANT_REFUND_RETRY_FAIL", "商家打款失败,客服关闭售后"), /** 售后关闭 */ MERCHANT_FAIL("MERCHANT_FAIL", "售后关闭"), + /** 待用户处理商家协商 */ + USER_WAIT_CONFIRM_UPDATE("USER_WAIT_CONFIRM_UPDATE", "待用户处理商家协商"), + /** 待用户处理商家代发起的售后申请 */ + USER_WAIT_HANDLE_MERCHANT_AFTER_SALE("USER_WAIT_HANDLE_MERCHANT_AFTER_SALE", "待用户处理商家代发起的售后申请"), ; private final String key; diff --git a/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImplTest.java b/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImplTest.java index 7e54a9eaae..81122f7a03 100644 --- a/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImplTest.java +++ b/weixin-java-channel/src/test/java/me/chanjar/weixin/channel/api/impl/WxChannelAfterSaleServiceImplTest.java @@ -12,6 +12,8 @@ import me.chanjar.weixin.channel.api.WxChannelService; import me.chanjar.weixin.channel.bean.after.AfterSaleInfoResponse; import me.chanjar.weixin.channel.bean.after.AfterSaleListResponse; +import me.chanjar.weixin.channel.bean.after.AfterSaleReasonResponse; +import me.chanjar.weixin.channel.bean.after.AfterSaleRejectReasonResponse; import me.chanjar.weixin.channel.bean.base.WxChannelBaseResponse; import me.chanjar.weixin.channel.bean.complaint.ComplaintOrderResponse; import me.chanjar.weixin.channel.test.ApiTestModule; @@ -52,8 +54,8 @@ public void testGet() throws WxErrorException { public void testAccept() throws WxErrorException { WxChannelAfterSaleService afterSaleService = channelService.getAfterSaleService(); String afterSaleOrderId = ""; - String addressId = "123"; - WxChannelBaseResponse response = afterSaleService.accept(afterSaleOrderId, addressId); + String addressId = null; + WxChannelBaseResponse response = afterSaleService.accept(afterSaleOrderId, addressId, 2); assertNotNull(response); assertTrue(response.isSuccess()); } @@ -62,8 +64,8 @@ public void testAccept() throws WxErrorException { public void testReject() throws WxErrorException { WxChannelAfterSaleService afterSaleService = channelService.getAfterSaleService(); String afterSaleOrderId = ""; - String rejectReason = "123"; - WxChannelBaseResponse response = afterSaleService.reject(afterSaleOrderId, rejectReason); + String rejectReason = null; + WxChannelBaseResponse response = afterSaleService.reject(afterSaleOrderId, rejectReason,1); assertNotNull(response); assertTrue(response.isSuccess()); } @@ -109,4 +111,21 @@ public void testGetComplaint() throws WxErrorException { assertNotNull(response); assertTrue(response.isSuccess()); } + + + @Test + public void testGetAllReason() throws WxErrorException { + WxChannelAfterSaleService afterSaleService = channelService.getAfterSaleService(); + AfterSaleReasonResponse allReason = afterSaleService.getAllReason(); + assertNotNull(allReason); + assertTrue(allReason.isSuccess()); + } + + @Test + public void testGetRejectReason() throws WxErrorException { + WxChannelAfterSaleService afterSaleService = channelService.getAfterSaleService(); + AfterSaleRejectReasonResponse rejectReason = afterSaleService.getRejectReason(); + assertNotNull(rejectReason); + assertTrue(rejectReason.isSuccess()); + } } From f7385f755e59994e665cafac67a22c70ccda42d3 Mon Sep 17 00:00:00 2001 From: lizhengwu <641876684@qq.com> Date: Thu, 25 Jul 2024 11:42:32 +0800 Subject: [PATCH 3/4] =?UTF-8?q?:art:=20=E3=80=90=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=8F=B7=E5=B0=8F=E5=BA=97=E3=80=91=E8=8E=B7=E5=8F=96=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E8=AF=A6=E6=83=85=E5=AD=97=E6=AE=B5=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../channel/bean/order/OrderExtInfo.java | 34 +++++- .../channel/bean/order/OrderProductInfo.java | 105 ++++++++++++++---- .../channel/bean/order/OrderSettleInfo.java | 27 ++++- .../channel/bean/order/OrderSharerInfo.java | 24 +++- .../weixin/channel/enums/OrderScene.java | 50 +++++++++ 5 files changed, 208 insertions(+), 32 deletions(-) create mode 100644 weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderExtInfo.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderExtInfo.java index 3338d1a428..a846311c61 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderExtInfo.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderExtInfo.java @@ -1,10 +1,11 @@ package me.chanjar.weixin.channel.bean.order; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; + /** * 订单备注信息 * @@ -15,12 +16,39 @@ public class OrderExtInfo implements Serializable { private static final long serialVersionUID = 4568097877621455429L; - /** 用户备注 */ + /** + * 用户备注 + */ @JsonProperty("customer_notes") private String customerNotes; - /** 商家备注 */ + /** + * 商家备注 + */ @JsonProperty("merchant_notes") private String merchantNotes; + /** + * 确认收货时间,包括用户主动确认收货和超时自动确认收货 + */ + @JsonProperty("confirm_receipt_time") + private Long confirmReceiptTime; + + /** + * 视频号id + */ + @JsonProperty("finder_id") + private String finderId; + + /** + * 直播id + */ + @JsonProperty("live_id") + private String liveId; + + /** + * 下单场景,枚举值见 {@link me.chanjar.weixin.channel.enums.OrderScene} + */ + @JsonProperty("order_scene") + private Integer orderScene; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderProductInfo.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderProductInfo.java index acef8cc4f6..e7edeb8912 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderProductInfo.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderProductInfo.java @@ -1,8 +1,10 @@ package me.chanjar.weixin.channel.bean.order; import com.fasterxml.jackson.annotation.JsonProperty; + import java.io.Serializable; import java.util.List; + import lombok.Data; import lombok.NoArgsConstructor; import me.chanjar.weixin.channel.bean.base.AttrInfo; @@ -17,96 +19,153 @@ public class OrderProductInfo implements Serializable { private static final long serialVersionUID = -2193536732955185928L; - /** 商品spu id */ + /** + * 商品spu id + */ @JsonProperty("product_id") private String productId; - /** sku_id */ + /** + * sku_id + */ @JsonProperty("sku_id") private String skuId; - /** sku小图 */ + /** + * sku小图 + */ @JsonProperty("thumb_img") private String thumbImg; - /** sku数量 */ + /** + * sku数量 + */ @JsonProperty("sku_cnt") private Integer skuCnt; - /** 售卖价格(单位:分) */ + /** + * 售卖价格(单位:分) + */ @JsonProperty("sale_price") private Integer salePrice; - /** 商品标题 */ + /** + * 商品标题 + */ @JsonProperty("title") private String title; - /** 正在售后/退款流程中的 sku 数量 */ + /** + * 正在售后/退款流程中的 sku 数量 + */ @JsonProperty("on_aftersale_sku_cnt") private Integer onAfterSaleSkuCnt; - /** 完成售后/退款的 sku 数量 */ + /** + * 完成售后/退款的 sku 数量 + */ @JsonProperty("finish_aftersale_sku_cnt") private Integer finishAfterSaleSkuCnt; - /** 商品编码 */ + /** + * 商品编码 + */ @JsonProperty("sku_code") private String skuCode; - /** 市场价格(单位:分) */ + /** + * 市场价格(单位:分) + */ @JsonProperty("market_price") private Integer marketPrice; - /** sku属性 */ + /** + * sku属性 + */ @JsonProperty("sku_attrs") private List skuAttrs; - /** sku实付价格 */ + /** + * sku实付价格 + */ @JsonProperty("real_price") private Integer realPrice; - /** 商品外部spu id */ + /** + * 商品外部spu id + */ @JsonProperty("out_product_id") private String outProductId; - /** 商品外部sku id */ + /** + * 商品外部sku id + */ @JsonProperty("out_sku_id") private String outSkuId; - /** 是否有优惠金额,非必填,默认为false */ + /** + * 是否有优惠金额,非必填,默认为false + */ @JsonProperty("is_discounted") private Boolean isDiscounted; - /** 优惠后 sku 价格,非必填,is_discounted为 true 时有值 */ + /** + * 优惠后 sku 价格,非必填,is_discounted为 true 时有值 + */ @JsonProperty("estimate_price") private Integer estimatePrice; - /** 是否修改过价格,非必填,默认为false */ + /** + * 是否修改过价格,非必填,默认为false + */ @JsonProperty("is_change_price") private Boolean changePriced; - /** 改价后 sku 价格,非必填,is_change_price为 true 时有值 */ + /** + * 改价后 sku 价格,非必填,is_change_price为 true 时有值 + */ @JsonProperty("change_price") private Integer changePrice; - /** 区域库存id */ + /** + * 区域库存id + */ @JsonProperty("out_warehouse_id") private String outWarehouseId; - /** 商品发货信息 */ + /** + * 商品发货信息 + */ @JsonProperty("sku_deliver_info") private OrderSkuDeliverInfo skuDeliverInfo; - /** 商品额外服务信息 */ + /** + * 商品额外服务信息 + */ @JsonProperty("extra_service") private OrderProductExtraService extraService; - /** 是否使用了会员积分抵扣 */ + /** + * 是否使用了会员积分抵扣 + */ @JsonProperty("use_deduction") private Boolean useDeduction; - /** 会员积分抵扣金额,单位为分 */ + /** + * 会员积分抵扣金额,单位为分 + */ @JsonProperty("deduction_price") private Integer deductionPrice; + /** + * 商品优惠券信息,具体结构请参考OrderProductCouponInfo结构体,逐步替换 order.order_detail.coupon_info + */ + @JsonProperty("order_product_coupon_info_list") + private List orderProductCouponInfoList; + + /** + * 商品发货时效,超时此时间未发货即为发货超时 + */ + @JsonProperty("delivery_deadline") + private Long deliveryDeadline; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSettleInfo.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSettleInfo.java index c264a6289a..bd31931444 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSettleInfo.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSettleInfo.java @@ -1,7 +1,9 @@ package me.chanjar.weixin.channel.bean.order; import com.fasterxml.jackson.annotation.JsonProperty; + import java.io.Serializable; + import lombok.Data; import lombok.NoArgsConstructor; @@ -15,12 +17,33 @@ public class OrderSettleInfo implements Serializable { private static final long serialVersionUID = 2140632631448343656L; - /** 预计技术服务费(单位为分) */ + /** + * 预计技术服务费(单位为分) + */ @JsonProperty("predict_commission_fee") private Integer predictCommissionFee; - /** 实际技术服务费(单位为分)(未结算时本字段为空) */ + /** + * 实际技术服务费(单位为分)(未结算时本字段为空) + */ @JsonProperty("commission_fee") private Integer commissionFee; + /** + * 预计人气卡返佣金额,单位为分(未发起结算时本字段为空) + */ + @JsonProperty("predict_wecoin_commission") + private Integer predictWecoinCommission; + + /** + * 实际人气卡返佣金额,单位为分(未结算时本字段为空) + */ + @JsonProperty("wecoin_commission") + private Integer wecoinCommission; + + /** + * 商家结算时间 + */ + @JsonProperty("settle_time") + private Long settleTime; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSharerInfo.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSharerInfo.java index be66463445..7ed41d2edf 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSharerInfo.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/bean/order/OrderSharerInfo.java @@ -1,7 +1,9 @@ package me.chanjar.weixin.channel.bean.order; import com.fasterxml.jackson.annotation.JsonProperty; + import java.io.Serializable; + import lombok.Data; import lombok.NoArgsConstructor; @@ -15,19 +17,33 @@ public class OrderSharerInfo implements Serializable { private static final long serialVersionUID = 7183259072254660971L; - /** 分享员openid */ + /** + * 分享员openid + */ @JsonProperty("sharer_openid") private String sharerOpenid; - /** 分享员unionid */ + /** + * 分享员unionid + */ @JsonProperty("sharer_unionid") private String sharerUnionid; - /** 分享员类型,0:普通分享员,1:店铺分享员 */ + /** + * 分享员类型,0:普通分享员,1:店铺分享员 + */ @JsonProperty("sharer_type") private Integer sharerType; - /** 分享场景 {@link me.chanjar.weixin.channel.enums.ShareScene} */ + /** + * 分享场景 {@link me.chanjar.weixin.channel.enums.ShareScene} + */ @JsonProperty("share_scene") private Integer shareScene; + + /** + * 分享员数据是否已经解析完成【1:解析完成 0:解析中】 + */ + @JsonProperty("handling_progress") + private Integer handlingProgress; } diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java new file mode 100644 index 0000000000..7e94295dbd --- /dev/null +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java @@ -0,0 +1,50 @@ +package me.chanjar.weixin.channel.enums; + +/** + * 下单场景 + * @author lizhengwu + * + * @description + */ +public enum OrderScene { + /** + * 其他 + */ + OTHER(1, "其他"), + /** + * 直播间下单 + */ + LIVE(2 ,"直播间"), + /** + * 短视频 + */ + VIDEO(3, "短视频"), + /** + * 商品分享 + */ + SHARE(4, "商品分享"), + /** + * 商品橱窗主页 + */ + SHOW_CASE(5, "商品橱窗主页"), + /** + * 公众号文章商品卡片 + */ + ARTICLE_CARD(6, "公众号文章商品卡片"), + ; + + private final int key; + private final String value; + + OrderScene(int key, String value) { + this.key = key; + this.value = value; + } + public int getKey() { + return key; + } + public String getValue() { + return value; + } + +} From c8c6f1e3a216e2950af65a68bb55668c6fe3b4bd Mon Sep 17 00:00:00 2001 From: lizhengwu <641876684@qq.com> Date: Thu, 25 Jul 2024 11:50:23 +0800 Subject: [PATCH 4/4] =?UTF-8?q?:art:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/channel/enums/OrderScene.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java index 7e94295dbd..c00f6a8002 100644 --- a/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java +++ b/weixin-java-channel/src/main/java/me/chanjar/weixin/channel/enums/OrderScene.java @@ -2,8 +2,8 @@ /** * 下单场景 - * @author lizhengwu * + * @author lizhengwu * @description */ public enum OrderScene { @@ -14,7 +14,7 @@ public enum OrderScene { /** * 直播间下单 */ - LIVE(2 ,"直播间"), + LIVE(2, "直播间"), /** * 短视频 */ @@ -40,9 +40,11 @@ public enum OrderScene { this.key = key; this.value = value; } + public int getKey() { return key; } + public String getValue() { return value; }