diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintDetailRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintDetailRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..2e8f23db16279e08db16c5d86d770197f644d668 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintDetailRequest.java @@ -0,0 +1,36 @@ +package com.github.binarywang.wxpay.bean.complaint; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 微信消费者投诉2.0 + * 查询投诉单详情请求实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +public class ComplaintDetailRequest implements Serializable { + + private static final long serialVersionUID = 3244929701614280801L; + + /** + *
+ * 字段名:投诉单号 + * 是否必填:是 + * 描述:投诉单对应的投诉单号 + *+ */ + @SerializedName("complaint_id") + private String complaintId; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintDetailResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintDetailResult.java new file mode 100644 index 0000000000000000000000000000000000000000..f62c9c1ddbd641d64f0accdad3f78fc973789bc1 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintDetailResult.java @@ -0,0 +1,236 @@ +package com.github.binarywang.wxpay.bean.complaint; + + +import com.github.binarywang.wxpay.v3.SpecEncrypt; +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 微信消费者投诉2.0 + * 查询投诉单列表返回的实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +public class ComplaintDetailResult implements Serializable { + + private static final long serialVersionUID = -6201692411535927503L; + + /** + *
+ * 字段名:投诉单号 + * 是否必填:是 + * 描述:投诉单对应的投诉单号 + *+ */ + @SerializedName("complaint_id") + private String complaintId; + + /** + *
+ * 字段名:投诉时间 + * 是否必填:是 + * 描述:投诉时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss.sss+TIMEZONE,yyyy-MM-DD表示年月日, + * T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。 + * 例如:2015-05-20T13:29:35.120+08:00表示北京时间2015年05月20日13点29分35秒 + * 示例值:2015-05-20T13:29:35.120+08:00 + *+ */ + @SerializedName("complaint_time") + private String complaintTime; + + /** + *
+ * 字段名:投诉详情 + * 是否必填:是 + * 投诉的具体描述 + *+ */ + @SerializedName("complaint_detail") + private String complaintDetail; + + /** + *
+ * 字段名:被诉商户号 + * 是否必填:是 + * 投诉单对应的被诉商户号。 + *+ */ + @SerializedName("complainted_mchid") + private String complaintedMchid; + + /** + *
+ * 字段名:投诉单状态 + * 是否必填:是 + * 标识当前投诉单所处的处理阶段,具体状态如下所示: + * PENDING:待处理 + * PROCESSING:处理中 + * PROCESSED:已处理完成 + *+ */ + @SerializedName("complaint_state") + private String complaintState; + + /** + *
+ * 字段名:投诉人联系方式 + * 是否必填:否 + * 投诉人联系方式。该字段已做加密处理,具体解密方法详见敏感信息加密说明。 + *+ */ + @SerializedName("payer_phone") + @SpecEncrypt + private String payerPhone; + + /** + *
+ * 字段名:投诉人openid + * 是否必填:是 + * 投诉人在商户appid下的唯一标识 + *+ */ + @SerializedName("payer_openid") + private String payerOpenid; + + + /** + *
+ * 字段名:投诉资料列表 + * 是否必填:是 + * 用户上传的投诉相关资料,包括图片凭证等 + *+ */ + @SerializedName("complaint_media_list") + private List
+ * 字段名:媒体文件业务类型 + * 是否必填:是 + * 描述: + * 媒体文件对应的业务类型 + * USER_COMPLAINT_IMAGE:用户投诉图片,用户提交投诉时上传的图片凭证 + * OPERATION_IMAGE:操作流水图片,用户、商户、微信支付客服在协商解决投诉时,上传的图片凭证 + * 注:用户上传的图片凭证会以白名单的形式提供给商户,若希望查看用户图片,联系微信支付客服 + * 示例值:USER_COMPLAINT_IMAGE + *+ */ + @SerializedName("media_type") + private String mediaType; + + /** + *
+ * 字段名:媒体文件请求url + * 是否必填:是 + * 描述: + * 微信返回的媒体文件请求url + *+ */ + @SerializedName("media_url") + private String mediaUrl; + + } + + /** + *
+ * 字段名:投诉单关联订单信息 + * 是否必填:是 + * 投诉单关联订单信息 + * 注:投诉单和订单目前是一对一关系,array是预留未来一对多的扩展 + *+ */ + @SerializedName("complaint_order_info") + private List
+ * 字段名:微信订单号 + * 是否必填:是 + * 描述: + * 投诉单关联的微信订单号 + *+ */ + @SerializedName("transaction_id") + private String transactionId; + + /** + *
+ * 字段名:商户订单号 + * 是否必填:是 + * 描述: + * 投诉单关联的商户订单号 + *+ */ + @SerializedName("out_trade_no") + private String outTradeNo; + + /** + *
+ * 字段名:订单金额 + * 是否必填:是 + * 描述: + * 订单金额,单位(分) + *+ */ + @SerializedName("amount") + private Integer amount; + + } + + /** + *
+ * 字段名:投诉单是否已全额退款 + * 是否必填:是 + * 描述: + * 投诉单下所有订单是否已全部全额退款 + *+ */ + @SerializedName("complaint_full_refunded") + private Boolean complaintFullRefunded; + + /** + *
+ * 字段名:是否有待回复的用户留言 + * 是否必填:是 + * 描述: + * 投诉单是否有待回复的用户留言 + *+ */ + @SerializedName("incoming_user_response") + private Boolean incomingUserResponse; + + /** + *
+ * 字段名:问题描述 + * 是否必填:是 + * 描述: + * 用户发起投诉前选择的faq标题(2021年7月15日之后的投诉单均包含此信息) + *+ */ + @SerializedName("problem_description") + private String problemDescription; + + /** + *
+ * 字段名:用户投诉次数 + * 是否必填:是 + * 描述: + * 用户投诉次数。用户首次发起投诉记为1次,用户每有一次继续投诉就加1 + *+ */ + @SerializedName("user_complaint_times") + private Integer userComplaintTimes; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintNotifyUrlRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintNotifyUrlRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..28a51bd02a205722e884b459cab7f8e1c539b37d --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintNotifyUrlRequest.java @@ -0,0 +1,36 @@ +package com.github.binarywang.wxpay.bean.complaint; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 微信消费者投诉2.0 + * 投诉通知请求实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +public class ComplaintNotifyUrlRequest implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + *
+ * 字段名:通知地址 + * 是否必填:是 + * 描述:通知地址,仅支持https。 + *+ */ + @SerializedName("url") + private String url; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintNotifyUrlResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintNotifyUrlResult.java new file mode 100644 index 0000000000000000000000000000000000000000..5254201e6953d5dfd8a7b1cb7d42b75f6f5f71e1 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintNotifyUrlResult.java @@ -0,0 +1,44 @@ +package com.github.binarywang.wxpay.bean.complaint; + + +import com.github.binarywang.wxpay.bean.media.MarketingImageUploadResult; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 微信消费者投诉2.0 + * 投诉通知地址返回的实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +public class ComplaintNotifyUrlResult implements Serializable { + + private static final long serialVersionUID = -6201692411535927502L; + + /** + *
+ * 字段名:商户号 + * 是否必填:是 + * 描述:返回创建回调地址的商户号,由微信支付生成并下发。 + *+ */ + @SerializedName("mchid") + private String mchid; + + /** + *
+ * 字段名:通知地址 + * 是否必填:是 + * 描述:通知地址,仅支持https。 + *+ */ + @SerializedName("url") + private String url; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..b53a1b590a488b75ac1f0442e6c361b5a9be0360 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintRequest.java @@ -0,0 +1,77 @@ +package com.github.binarywang.wxpay.bean.complaint; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 微信消费者投诉2.0 + * 查询投诉单列表请求实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +public class ComplaintRequest implements Serializable { + + private static final long serialVersionUID = 3244929701614280800L; + + /** + *
+ * 字段名:分页大小 + * 是否必填:否 + * 描述:设置该次请求返回的最大投诉条数,范围【1,50】,商户自定义字段,不传默认为10。 + * 注:如遇到提示“当前查询结果数据量过大”,是回包触发微信支付下行数据包大小限制,请缩小入参limit并重试。 + *+ */ + @SerializedName("limit") + private Integer limit = 10; + + /** + *
+ * 字段名:分页开始位置 + * 是否必填:否 + * 描述:该次请求的分页开始位置,从0开始计数,例如offset=10,表示从第11条记录开始返回,不传默认为0 。 + *+ */ + @SerializedName("offset") + private Integer offset = 0; + + /** + *
+ * 字段名:开始日期 + * 是否必填:是 + * 描述:投诉发生的开始日期,格式为yyyy-MM-DD。注意,查询日期跨度不超过30天,当前查询为实时查询 + *+ */ + @SerializedName("begin_date") + private String beginDate; + + /** + *
+ * 字段名:结束日期 + * 是否必填:是 + * 描述:投诉发生的结束日期,格式为yyyy-MM-DD。注意,查询日期跨度不超过30天,当前查询为实时查询 + *+ */ + @SerializedName("end_date") + private String endDate; + + /** + *
+ * 字段名:被诉商户号 + * 是否必填:否 + * 描述:投诉单对应的被诉商户号。 + *+ */ + @SerializedName("complainted_mchid") + private String complaintedMchid; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintResult.java new file mode 100644 index 0000000000000000000000000000000000000000..1ee346d53ec74f900c2e986758513111cc0b43bc --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/ComplaintResult.java @@ -0,0 +1,58 @@ +package com.github.binarywang.wxpay.bean.complaint; + + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 微信消费者投诉2.0 + * 查询投诉单列表返回的实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +public class ComplaintResult implements Serializable { + + private static final long serialVersionUID = -6201692411535927502L; + + /** + *
+ * 字段名:分页大小 + * 是否必填:是 + * 描述:设置该次请求返回的最大投诉条数,范围【1,50】 + *+ */ + @SerializedName("limit") + private Integer limit; + + /** + *
+ * 字段名:分页开始位置 + * 是否必填:是 + * 描述:该次请求的分页开始位置,从0开始计数,例如offset=10,表示从第11条记录开始返回。 + *+ */ + @SerializedName("offset") + private Integer offset; + + /** + *
+ * 字段名:投诉总条数 + * 是否必填:否 + * 描述:投诉总条数,当offset=0时返回 + *+ */ + @SerializedName("total_count") + private Integer totalCount; + + /** + * 用户投诉信息详情 + */ + @SerializedName("data") + private List
+ * 字段名:投诉单号 + * 是否必填:是 + * 描述:投诉单对应的投诉单号 + *+ */ + @SerializedName("complaint_id") + @Expose + private String complaintId; + + /** + *
+ * 字段名:被诉商户号 + * 是否必填:是 + * 描述:投诉单对应的被诉商户号 + *+ */ + @SerializedName("complainted_mchid") + private String complaintedMchid; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/NegotiationHistoryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/NegotiationHistoryRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..3362e4a92fa9916d4af3d76c4d0a0de14571d4fc --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/NegotiationHistoryRequest.java @@ -0,0 +1,57 @@ +package com.github.binarywang.wxpay.bean.complaint; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 微信消费者投诉2.0 + * 查询投诉协商历史请求实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +public class NegotiationHistoryRequest implements Serializable { + + private static final long serialVersionUID = 3244929701614280806L; + + /** + *
+ * 字段名:投诉单号 + * 是否必填:是 + * 描述:投诉单对应的投诉单号 + *+ */ + @SerializedName("complaint_id") + private String complaintId; + + /** + *
+ * 字段名:分页大小 + * 是否必填:否 + * 描述:设置该次请求返回的最大投诉条数,范围【1,50】,商户自定义字段,不传默认为10。 + * 注:如遇到提示“当前查询结果数据量过大”,是回包触发微信支付下行数据包大小限制,请缩小入参limit并重试。 + *+ */ + @SerializedName("limit") + private Integer limit = 10; + + /** + *
+ * 字段名:分页开始位置 + * 是否必填:否 + * 描述:该次请求的分页开始位置,从0开始计数,例如offset=10,表示从第11条记录开始返回,不传默认为0 。 + *+ */ + @SerializedName("offset") + private Integer offset = 0; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/NegotiationHistoryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/NegotiationHistoryResult.java new file mode 100644 index 0000000000000000000000000000000000000000..4e5ab4197f4b5cf5391bbb5d90caed0c32c6646d --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/complaint/NegotiationHistoryResult.java @@ -0,0 +1,190 @@ +package com.github.binarywang.wxpay.bean.complaint; + + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 微信消费者投诉2.0 + * 查询投诉单协商历史返回的实体 + * + * @author jmdhappy + * @date 2022-3-19 + */ +@Data +public class NegotiationHistoryResult implements Serializable { + + private static final long serialVersionUID = -6201692411535927502L; + + /** + *
+ * 字段名:分页大小 + * 是否必填:是 + * 描述:设置该次请求返回的最大投诉条数,范围【1,50】 + *+ */ + @SerializedName("limit") + private Integer limit; + + /** + *
+ * 字段名:分页开始位置 + * 是否必填:是 + * 描述:该次请求的分页开始位置,从0开始计数,例如offset=10,表示从第11条记录开始返回。 + *+ */ + @SerializedName("offset") + private Integer offset; + + /** + *
+ * 字段名:投诉协商历史总条数 + * 是否必填:否 + * 描述:投诉协商历史总条数,当offset=0时返回 + *+ */ + @SerializedName("total_count") + private Integer totalCount; + + /** + * 投诉协商历史 + */ + @SerializedName("data") + private List
+ * 字段名:投诉资料列表 + * 是否必填:是 + * 用户上传的投诉相关资料,包括图片凭证等 + *+ */ + @SerializedName("complaint_media_list") + private List
+ * 字段名:媒体文件业务类型 + * 是否必填:是 + * 描述: + * 媒体文件对应的业务类型 + * USER_COMPLAINT_IMAGE:用户投诉图片,用户提交投诉时上传的图片凭证 + * OPERATION_IMAGE:操作流水图片,用户、商户、微信支付客服在协商解决投诉时,上传的图片凭证 + * 注:用户上传的图片凭证会以白名单的形式提供给商户,若希望查看用户图片,联系微信支付客服 + * 示例值:USER_COMPLAINT_IMAGE + *+ */ + @SerializedName("media_type") + private String mediaType; + + /** + *
+ * 字段名:媒体文件请求url + * 是否必填:是 + * 描述: + * 微信返回的媒体文件请求url + *+ */ + @SerializedName("media_url") + private String mediaUrl; + + } + + /** + *
+ * 字段名:操作流水号 + * 是否必填:是 + * 描述: + * 操作流水号 + *+ */ + @SerializedName("log_id") + private String logId; + + /** + *
+ * 字段名:操作人 + * 是否必填:是 + * 描述: + * 当前投诉协商记录的操作人 + *+ */ + @SerializedName("operator") + private String operator; + + /** + *
+ * 字段名:操作时间 + * 是否必填:是 + * 描述: + * 当前投诉协商记录的操作时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss.sss+TIMEZONE,yyyy-MM-DD表示年月日, + * T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。 + * 例如:2015-05-20T13:29:35.120+08:00表示北京时间2015年05月20日13点29分35秒。 + * 示例值:2015-05-20T13:29:35.120+08:00 + *+ */ + @SerializedName("operate_time") + private String operateTime; + + /** + *
+ * 字段名:操作类型 + * 是否必填:是 + * 描述: + * 当前投诉协商记录的操作类型,对应枚举: + * USER_CREATE_COMPLAINT:用户提交投诉 + * USER_CONTINUE_COMPLAINT:用户继续投诉 + * USER_RESPONSE:用户留言 + * PLATFORM_RESPONSE:平台留言 + * MERCHANT_RESPONSE:商户留言 + * MERCHANT_CONFIRM_COMPLETE:商户申请结单 + * COMPLAINT_FULL_REFUNDED:投诉单全额退款 + * USER_CREATE_COMPLAINT_SYSTEM_MESSAGE:用户提交投诉系统通知 + * COMPLAINT_FULL_REFUNDED_SYSTEM_MESSAGE:投诉单全额退款系统通知 + * USER_CONTINUE_COMPLAINT_SYSTEM_MESSAGE:用户继续投诉系统通知 + * MERCHANT_CONFIRM_COMPLETE_SYSTEM_MESSAGE:商户申请结单系统通知 + * USER_REVOKE_COMPLAINT:用户主动撤诉(只存在于历史投诉单的协商历史中) + * PLATFORM_HELP_APPLICATION:平台问询 + * USER_APPLY_PLATFORM_HELP:申请协助 + *+ */ + @SerializedName("operate_type") + private String operateType; + + /** + *
+ * 字段名:操作内容 + * 是否必填:否 + * 描述: + * 当前投诉协商记录的具体内容 + *+ */ + @SerializedName("operate_details") + private String operateDetails; + + /** + *
+ * 字段名:图片凭证 + * 是否必填:是 + * 描述: + * 当前投诉协商记录提交的图片凭证(url格式),最多返回4张图片,url有效时间为1小时。如未查询到协商历史图片凭证,则返回空数组。 + * 注:本字段包含商户、微信支付客服在协商解决投诉时上传的图片凭证,若希望查看用户图片,请使用complaint_media_list字段并联系微信支付客服 + *+ */ + @SerializedName("image_list") + private List
+ * 字段名:投诉单号 + * 是否必填:是 + * 描述:投诉单对应的投诉单号 + *+ */ + @SerializedName("complaint_id") + @Expose + private String complaintId; + + /** + *
+ * 字段名:被诉商户号 + * 是否必填:是 + * 描述:投诉单对应的被诉商户号 + *+ */ + @SerializedName("complainted_mchid") + private String complaintedMchid; + + /** + *
+ * 字段名:回复内容 + * 是否必填:是 + * 描述:具体的投诉处理方案,限制200个字符以内。 + *+ */ + @SerializedName("response_content") + private String responseContent; + + /** + *
+ * 字段名:回复图片 + * 是否必填:否 + * 描述: + * 传入调用商户上传反馈图片接口返回的media_id,最多上传4张图片凭证 + * 示例值:file23578_21798531.jpg + *+ */ + @SerializedName("response_images") + private String responseImages; + + /** + *
+ * 字段名:跳转链接 + * 是否必填:是 + * 描述: + * 商户可在回复中附加跳转链接,引导用户跳转至商户客诉处理页面,链接需满足https格式 + * 注:配置文字链属于灰度功能, 若有需要请使用超管邮箱,按照要求发送邮件申请。邮件要求详情见: + * 商户申请开通留言链接白名单指南。 + * 示例值:https://www.xxx.com/notify + *+ */ + @SerializedName("jump_url") + private String jumpUrl; + + /** + *
+ * 字段名:跳转链接文案 + * 是否必填:否 + * 描述: + * 实际展示给用户的文案,附在回复内容之后。用户点击文案,即可进行跳转。 + * 注:若传入跳转链接,则跳转链接文案为必传项,二者缺一不可。 + *+ */ + @SerializedName("jump_url_text") + private String jumpUrlText; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/ComplaintNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/ComplaintNotifyResult.java new file mode 100644 index 0000000000000000000000000000000000000000..a5d18df6df546498a9f11d3db53d25c2063a3ce2 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/ComplaintNotifyResult.java @@ -0,0 +1,64 @@ +package com.github.binarywang.wxpay.bean.notify; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 投诉通知. + * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_16.shtml + * + * @author jmdhappy + */ +@Data +@NoArgsConstructor +public class ComplaintNotifyResult implements Serializable { + private static final long serialVersionUID = -1L; + /** + * 源数据 + */ + private OriginNotifyResponse rawData; + /** + * 解密后的数据 + */ + private DecryptNotifyResult result; + + @Data + @NoArgsConstructor + public static class DecryptNotifyResult implements Serializable { + private static final long serialVersionUID = -1L; + + /** + *
+ * 字段名:投诉单号 + * 是否必填:是 + * 描述: + * 投诉单对应的投诉单号 + *+ */ + @SerializedName(value = "complaint_id") + private String complaintId; + + /** + *
+ * 字段名:动作类型 + * 是否必填:是 + * 描述: + * 触发本次投诉通知回调的具体动作类型,枚举如下: + * CREATE_COMPLAINT:用户提交投诉 + * CONTINUE_COMPLAINT:用户继续投诉 + * USER_RESPONSE:用户新留言 + * RESPONSE_BY_PLATFORM:平台新留言 + * SELLER_REFUND:收款方全额退款 + * MERCHANT_RESPONSE:商户新回复 + * MERCHANT_CONFIRM_COMPLETE:商户反馈处理完成 + *+ */ + @SerializedName(value = "action_type") + private String actionType; + + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ComplaintService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ComplaintService.java new file mode 100644 index 0000000000000000000000000000000000000000..bd6a2e34615ac7e59e1a35e3ccaa70e9cce4e4ca --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/ComplaintService.java @@ -0,0 +1,132 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.complaint.*; +import com.github.binarywang.wxpay.exception.WxPayException; + +import javax.crypto.BadPaddingException; + +/** + *
+ * 微信支付 消费者投诉2.0 API. + * Created by jmdhappy on 2022/3/19. + *+ * + * @author jmdhappy + */ +public interface ComplaintService { + + /** + *
+ * 查询投诉单列表API + * 商户可通过调用此接口,查询指定时间段的所有用户投诉信息,以分页输出查询结果。 + * 对于服务商、渠道商,可通过调用此接口,查询指定子商户号对应子商户的投诉信息,若不指定则查询所有子商户投诉信息。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_11.shtml + *+ * + * @param request {@link ComplaintRequest} 查询投诉单列表请求数据 + * @return {@link ComplaintResult} 微信返回的投诉单列表 + * @throws WxPayException the wx pay exception + */ + ComplaintResult queryComplaints(ComplaintRequest request) throws WxPayException, BadPaddingException; + + /** + *
+ * 查询投诉单详情API + * 商户可通过调用此接口,查询指定投诉单的用户投诉详情,包含投诉内容、投诉关联订单、投诉人联系方式等信息,方便商户处理投诉。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_13.shtml + *+ * + * @param request {@link ComplaintDetailRequest} 投诉单详情请求数据 + * @return {@link ComplaintDetailResult} 微信返回的投诉单详情 + * @throws WxPayException the wx pay exception + */ + ComplaintDetailResult getComplaint(ComplaintDetailRequest request) throws WxPayException, BadPaddingException; + + /** + *
+ * 查询投诉协商历史API + * 商户可通过调用此接口,查询指定投诉的用户商户协商历史,以分页输出查询结果,方便商户根据处理历史来制定后续处理方案。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_12.shtml + *+ * + * @param request {@link NegotiationHistoryRequest} 请求数据 + * @return {@link NegotiationHistoryResult} 微信返回结果 + * @throws WxPayException the wx pay exception + */ + NegotiationHistoryResult queryNegotiationHistorys(NegotiationHistoryRequest request) throws WxPayException; + + /** + *
+ * 创建投诉通知回调地址API + * 商户通过调用此接口创建投诉通知回调URL,当用户产生新投诉且投诉状态已变更时,微信支付会通过回 调URL通知商户。对于服务商、渠道商,会收到所有子商户的投诉信息推送。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_2.shtml + *+ * + * @param request {@link ComplaintDetailRequest} 请求数据 + * @return {@link ComplaintNotifyUrlResult} 微信返回结果 + * @throws WxPayException the wx pay exception + */ + ComplaintNotifyUrlResult addComplaintNotifyUrl(ComplaintNotifyUrlRequest request) throws WxPayException; + + /** + *
+ * 查询投诉通知回调地址API + * 商户通过调用此接口查询投诉通知的回调URL。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_3.shtml + *+ * + * @return {@link ComplaintNotifyUrlResult} 微信返回结果 + * @throws WxPayException the wx pay exception + */ + ComplaintNotifyUrlResult getComplaintNotifyUrl() throws WxPayException; + + /** + *
+ * 更新投诉通知回调地址API + * 商户通过调用此接口更新投诉通知的回调URL。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_4.shtml + *+ * + * @param request {@link ComplaintDetailRequest} 请求数据 + * @return {@link ComplaintNotifyUrlResult} 微信返回结果 + * @throws WxPayException the wx pay exception + */ + ComplaintNotifyUrlResult updateComplaintNotifyUrl(ComplaintNotifyUrlRequest request) throws WxPayException; + + /** + *
+ * 删除投诉通知回调地址API + * 当商户不再需要推送通知时,可通过调用此接口删除投诉通知的回调URL,取消通知回调。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_5.shtml + *+ * + * @throws WxPayException the wx pay exception + */ + void deleteComplaintNotifyUrl() throws WxPayException; + + /** + *
+ * 提交回复API + * 商户可通过调用此接口,提交回复内容。其中上传图片凭证需首先调用商户上传反馈图片接口,得到图片id,再将id填入请求。 + * 回复可配置文字链,传入跳转链接文案和跳转链接字段,用户点击即可跳转对应页面 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_14.shtml + *+ * + * @param request {@link ResponseRequest} 请求数据 + * @throws WxPayException the wx pay exception + */ + void submitResponse(ResponseRequest request) throws WxPayException; + + /** + *
+ * 反馈处理完成API + * 商户可通过调用此接口,反馈投诉单已处理完成。 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_15.shtml + *+ * + * @param request {@link CompleteRequest} 请求数据 + * @throws WxPayException the wx pay exception + */ + void complete(CompleteRequest request) throws WxPayException; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index 2a567fa1dfd402e63657f4cd9dbfa30fd2b5bb06..3f98c3d2c61a504b084a560d9444d6cbd10c3627 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -173,6 +173,25 @@ public interface WxPayService { */ InputStream downloadV3(String url) throws WxPayException; + /** + * 发送put V3请求,得到响应字符串. + * + * @param url 请求地址 + * @param url 请求数据 + * @return 返回请求结果字符串 string + * @throws WxPayException the wx pay exception + */ + String putV3(String url, String requestStr) throws WxPayException; + + /** + * 发送delete V3请求,得到响应字符串. + * + * @param url 请求地址 + * @return 返回请求结果字符串 string + * @throws WxPayException the wx pay exception + */ + String deleteV3(String url) throws WxPayException; + /** * 获取微信签约代扣服务类 * @return entrust service @@ -1296,4 +1315,22 @@ public interface WxPayService { * @throws WxPayException . */ WxPayQueryExchangeRateResult queryExchangeRate(String feeType, String date) throws WxPayException; + + /** + * 解析投诉通知 + * 详见https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_16.shtml + * + * @param notifyData 通知数据 + * @param header 通知头部数据,不传则表示不校验头 + * @return the wx pay refund notify result + * @throws WxPayException the wx pay exception + */ + ComplaintNotifyResult parseComplaintNotifyResult(String notifyData, SignatureHeader header) throws WxPayException; + + /** + * 获取消费者投诉服务类. + * + * @return the complaints service + */ + ComplaintService getComplaintsService(); } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 437b618678164bd9677a602cc06179776c0ce215..ae40210c88c975fc6c3763f86bc9cf0613920a37 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -77,6 +77,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { private final WxEntrustPapService wxEntrustPapService = new WxEntrustPapServiceImpl(this); private final PartnerTransferService partnerTransferService = new PartnerTransferServiceImpl(this); private final PayrollService payrollService = new PayrollServiceImpl(this); + private final ComplaintService complaintsService = new ComplaintServiceImpl(this); protected Map
+ * 消费者投诉2.0 实现. + * Created by jmdhappy on 2022/3/19. + *+ * + * @author jmdhappy + */ +@RequiredArgsConstructor +public class ComplaintServiceImpl implements ComplaintService { + private static final Gson GSON = new GsonBuilder().create(); + private final WxPayService payService; + + @Override + public ComplaintResult queryComplaints(ComplaintRequest request) throws WxPayException, BadPaddingException { + String url = String.format("%s/v3/merchant-service/complaints-v2?limit=%d&offset=%d&begin_date=%s&end_date=%s&complainted_mchid=%s", + this.payService.getPayBaseUrl(), request.getLimit(), request.getOffset(), request.getBeginDate(), request.getEndDate(), request.getComplaintedMchid()); + String response = this.payService.getV3(url); + ComplaintResult complaintResult = GSON.fromJson(response, ComplaintResult.class); + List
+ * 消费者投诉2.0 测试类 + *+ * + * @author jmdhappy + */ +@Test +@Guice(modules = ApiTestModule.class) +public class ComplaintServiceImplTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Inject + private WxPayService payService; + + private static final String complaintId = "200231020220320120496109901"; + + /** + * 查询投诉单列表API + * @throws WxPayException + */ + @Test + public void testQueryComplaints() throws WxPayException, BadPaddingException { + ComplaintRequest request = ComplaintRequest + .newBuilder() + .offset(0) + .limit(10) + .beginDate("2022-03-01") + .endDate("2022-03-20") + .complaintedMchid(this.payService.getConfig().getMchId()) + .build(); + this.logger.info(this.payService.getComplaintsService().queryComplaints(request).toString()); + } + + /** + * 查询投诉单详情API + * @throws WxPayException + */ + @Test + public void testGetComplaint() throws WxPayException, BadPaddingException { + ComplaintDetailRequest request = ComplaintDetailRequest + .newBuilder() + .complaintId(complaintId) + .build(); + this.logger.info(this.payService.getComplaintsService().getComplaint(request).toString()); + } + + /** + * 查询投诉协商历史API + * @throws WxPayException + */ + @Test + public void testQueryNegotiationHistorys() throws WxPayException { + NegotiationHistoryRequest request = NegotiationHistoryRequest + .newBuilder() + .complaintId(complaintId) + .offset(0) + .limit(20) + .build(); + this.logger.info(this.payService.getComplaintsService().queryNegotiationHistorys(request).toString()); + } + + /** + * 创建投诉通知回调地址API + * @throws WxPayException + */ + @Test + public void testAddComplaintNotifyUrl() throws WxPayException { + ComplaintNotifyUrlRequest request = ComplaintNotifyUrlRequest + .newBuilder() + .url("https://jeepay.natapp4.cc") + .build(); + this.logger.info(this.payService.getComplaintsService().addComplaintNotifyUrl(request).toString()); + } + + /** + * 查询投诉通知回调地址API + * @throws WxPayException + */ + @Test + public void testGetComplaintNotifyUrl() throws WxPayException { + this.logger.info(this.payService.getComplaintsService().getComplaintNotifyUrl().toString()); + } + + /** + * 更新投诉通知回调地址API + * @throws WxPayException + */ + @Test + public void testUpdateComplaintNotifyUrl() throws WxPayException { + ComplaintNotifyUrlRequest request = ComplaintNotifyUrlRequest + .newBuilder() + .url("https://jeepay1.natapp4.cc") + .build(); + this.logger.info(this.payService.getComplaintsService().updateComplaintNotifyUrl(request).toString()); + } + + /** + * 删除投诉通知回调地址API + * @throws WxPayException + */ + @Test + public void testDeleteComplaintNotifyUrl() throws WxPayException { + this.payService.getComplaintsService().deleteComplaintNotifyUrl(); + } + + /** + * 提交回复API + * @throws WxPayException + */ + @Test + public void testSubmitResponse() throws WxPayException { + ResponseRequest request = ResponseRequest + .newBuilder() + .complaintId(complaintId) + .complaintedMchid(this.payService.getConfig().getMchId()) + .responseContent("测试投诉接口1233,正在处理,不要炸鸡") + //.jumpUrl("https://www.baidu.com") + //.jumpUrlText("问题解决方案") + .build(); + this.payService.getComplaintsService().submitResponse(request); + } + + /** + * 反馈处理完成API + * @throws WxPayException + */ + @Test + public void testComplete() throws WxPayException { + CompleteRequest request = CompleteRequest + .newBuilder() + .complaintId(complaintId) + .complaintedMchid(this.payService.getConfig().getMchId()) + .build(); + this.payService.getComplaintsService().complete(request); + } + +}