🆕 #2097 【微信支付】增加微信商户平台商家券相关业务接口

This commit is contained in:
thomas2050
2021-04-27 15:50:17 +08:00
committed by GitHub
parent 51dc66194d
commit 15bd95c3cb
46 changed files with 4557 additions and 10 deletions

View File

@@ -0,0 +1,46 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 设置商家券事件通知地址请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_7.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCallbacksRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:商户号
* 变量名mchid
* 是否必填:否
* 类型string[8,15]
* 描述:
* body 微信支付商户的商户号由微信支付生成并下发不填默认查询调用方商户的通知URL。 示例值10000098
* </pre>
*/
@SerializedName(value = "mchid")
private String mchid;
/**
* <pre>* 字段名通知URL地址
* 变量名notify_url
* 是否必填:是
* 类型string[10,256]
* 描述:
* body 商户提供的用于接收商家券事件通知的url地址必须支持https。 示例值https://pay.weixin.qq.com
* </pre>
*/
@SerializedName(value = "notify_url")
private String notifyUrl;
}

View File

@@ -0,0 +1,57 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 设置商家券事件通知地址返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_7.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCallbacksResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:修改时间
* 变量名update_time
* 是否必填:否
* 类型string[1,32]
* 描述:
* 修改时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "update_time")
private String updateTime;
/**
* <pre>* 字段名通知URL地址
* 变量名notify_url
* 是否必填:是
* 类型string[10,256]
* 描述:
* 商户提供的用于接收商家券事件通知的url地址必须支持https。 示例值https://pay.weixin.qq.com
* </pre>
*/
@SerializedName(value = "notify_url")
private String notifyUrl;
/**
* <pre>* 字段名:商户号
* 变量名mchid
* 是否必填:是
* 类型string[8,15]
* 描述:
* 微信支付商户的商户号,由微信支付生成并下发。 示例值10000098
* </pre>
*/
@SerializedName(value = "mchid")
private String mchid;
}

View File

@@ -0,0 +1,58 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 上传预存code请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_6.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponCodeRequest implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* path 微信为每个商家券批次分配的唯一ID 示例值98065001
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名券code列表
* 变量名coupon_code_list
* 是否必填:否
* 类型array
* 描述:
* body 商户上传的券code列表code允许包含的字符有0-9、a-z、A-Z、-、_、\、/、=、|。 特殊规则单个券code长度为【132】条目个数限制为【1200】。 示例值ABC9588200ABC9588201
* </pre>
*/
@SerializedName(value = "coupon_code_list")
private List<String> couponCodeList;
/**
* <pre>* 字段名:请求业务单据号
* 变量名upload_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* body 商户上传code的凭据号商户侧需保持唯一性。 示例值100002322019090134234sfdf
* </pre>
*/
@SerializedName(value = "upload_request_no")
private String uploadRequestNo;
}

View File

@@ -0,0 +1,172 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 上传预存code返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_6.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponCodeResult implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* 微信为每个商家券批次分配的唯一ID。 示例值98065001
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名去重后上传code总数
* 变量名total_count
* 是否必填:是
* 类型uint64
* 描述:
* 本次上传操作去重后实际上传的code数目。 示例值500
* </pre>
*/
@SerializedName(value = "total_count")
private Integer totalCount;
/**
* <pre>* 字段名上传成功code个数
* 变量名success_count
* 是否必填:是
* 类型uint64
* 描述:
* 本次上传操作上传成功个数。 示例值20
* </pre>
*/
@SerializedName(value = "success_count")
private Integer successCount;
/**
* <pre>* 字段名上传成功的code列表
* 变量名success_codes
* 是否必填:否
* 类型array
* 描述:
* 本次新增上传成功的code信息。 特殊规则单个券code长度为【132】条目个数限制为【1200】。 示例值MMAA12345
* </pre>
*/
@SerializedName(value = "success_codes")
private List<String> successCodes;
/**
* <pre>* 字段名:上传成功时间
* 变量名success_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 上传操作完成时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "success_time")
private String successTime;
/**
* <pre>* 字段名上传失败code个数
* 变量名fail_count
* 是否必填:否
* 类型uint64
* 描述:
* 本次上传操作上传失败的code数。 示例值10
* </pre>
*/
@SerializedName(value = "fail_count")
private Integer failCount;
/**
* <pre>* 字段名:+上传失败的code及原因
* 变量名fail_codes
* 是否必填:否
* 类型array
* 描述:
* 本次导入失败的code信息请参照错误信息修改后重试。
* </pre>
*/
@SerializedName(value = "fail_codes")
private List<FailCode> failCodes;
/**
* <pre>* 字段名已存在的code列表
* 变量名exist_codes
* 是否必填:否
* 类型array
* 描述:
* 历史已存在的code列表本次不会重复导入。 特殊规则单个券code长度为【132】条目个数限制为【1200】。 示例值ABCD2345
* </pre>
*/
@SerializedName(value = "exist_codes")
private List<String> existCodes;
/**
* <pre>* 字段名本次请求中重复的code列表
* 变量名duplicate_codes
* 是否必填:否
* 类型array
* 描述:
* 本次重复导入的code会被自动过滤仅保留一个做导入如满足要求则成功如不满足要求则失败请参照报错提示修改重试。 特殊规则单个券code长度为【132】条目个数限制为【1200】。 示例值AACC2345
* </pre>
*/
@SerializedName(value = "duplicate_codes")
private List<String> duplicateCodes;
@Data
@NoArgsConstructor
public static class FailCode {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名上传失败的券code
* 变量名coupon_code
* 是否必填:是
* 类型string[1,32]
* 描述:
* 商户通过API上传的券code。 示例值ABCD23456
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:上传失败错误码
* 变量名code
* 是否必填:是
* 类型string[1,32]
* 描述:
* 对应券code上传失败的错误码。 示例值LENGTH_LIMIT
* </pre>
*/
@SerializedName(value = "code")
private String code;
/**
* <pre>* 字段名:上传失败错误信息
* 变量名message
* 是否必填:是
* 类型string[1,128]
* 描述:
* 上传失败的错误信息描述。 示例值长度超过最大值32位
* </pre>
*/
@SerializedName(value = "message")
private String message;
}
}

View File

@@ -0,0 +1,69 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 关联订单信息请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_9.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsAssociateRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* body 微信为每个商家券批次分配的唯一ID对于商户自定义code的批次关联请求必须填写批次号 示例值100088
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名券code
* 变量名coupon_code
* 是否必填:是
* 类型string[1,32]
* 描述:
* body 券的唯一标识 示例值sxxe34343434
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:关联的商户订单号
* 变量名out_trade_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* body 微信支付下单时的商户订单号,欲与该商家券关联的微信支付 示例值MCH_102233445
* </pre>
*/
@SerializedName(value = "out_trade_no")
private String outTradeNo;
/**
* <pre>* 字段名:商户请求单号
* 变量名out_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* body 商户创建批次凭据号格式商户id+日期+流水号商户侧需保持唯一性可包含英文字母数字_*-等内容,不允许出现其他不合法符号。 示例值1002600620019090123143254435
* </pre>
*/
@SerializedName(value = "out_request_no")
private String outRequestNo;
}

View File

@@ -0,0 +1,47 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 关联订单信息返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_9.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsAssociateResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:关联成功时间
* 变量名wechatpay_associate_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 系统关联券成功的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "wechatpay_associate_time")
private String wechatpayAssociateTime;
/**
* <pre>* 字段名:取消关联时间
* 变量名wechatpay_associate_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 系统成功取消商家券与订单信息关联关系的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "wechatpay_disassociate_time")
private String wechatpayDisassociateTime;
}

View File

@@ -0,0 +1,68 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 使券失效请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_14.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsDeactivateRequest implements Serializable {
/**
* <pre>* 字段名券code
* 变量名coupon_code
* 是否必填:是
* 类型string[1,32]
* 描述:
* body券的唯一标识 示例值sxxe34343434
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* body券的所属批次号 示例值1234567891
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名:失效请求单据号
* 变量名deactivate_request_no
* 是否必填:是
* 类型string[1, 128]
* 描述:
* body每次失效请求的唯一标识商户需保证唯一 示例值1002600620019090123143254436
* </pre>
*/
@SerializedName(value = "deactivate_request_no")
private String deactivateRequestNo;
/**
* <pre>* 字段名:失效原因
* 变量名deactivate_reason
* 是否必填:否
* 类型string[1, 64]
* 描述:
* body商户失效券的原因 示例值:此券使用时间设置错误
* </pre>
*/
@SerializedName(value = "deactivate_reason")
private String deactivateReason;
}

View File

@@ -0,0 +1,32 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 使券失效返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_14.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsDeactivateResult implements Serializable {
/**
* <pre>* 字段名:券成功失效的时间
* 变量名wechatpay_deactivate_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 系统券成功失效的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2020-05-20T13:29:35.08:00
* </pre>
*/
@SerializedName(value = "wechatpay_deactivate_time")
private String wechatpayDeactivateTime;
}

View File

@@ -0,0 +1,56 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 申请退券请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_13.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsReturnRequest implements Serializable {
/**
* <pre>* 字段名券code
* 变量名coupon_code
* 是否必填:是
* 类型string[1,20]
* 描述:
* body券的唯一标识 示例值sxxe34343434
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,32]
* 描述:
* body券的所属批次号 示例值1234567891
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名:退券请求单据号
* 变量名return_request_no
* 是否必填:是
* 类型string[1, 128]
* 描述:
* body每次退券请求的唯一标识商户需保证唯一 示例值1002600620019090123143254436
* </pre>
*/
@SerializedName(value = "return_request_no")
private String returnRequestNo;
}

View File

@@ -0,0 +1,32 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 申请退券返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_13.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsReturnResult implements Serializable {
/**
* <pre>* 字段名:微信退券成功的时间
* 变量名wechatpay_return_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 微信退券成功的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2020-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "wechatpay_return_time")
private String wechatpayReturnTime;
}

View File

@@ -0,0 +1,90 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* H5发券请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_4_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsUrlRequest {
public static final float serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次号
* 变量名stock_id
* 是否必填:否
* 类型string[1,20]
* 描述:
* 微信为每个商家券批次分配的唯一ID批次券Code模式是MERCHANT_API或者MERCHANT_UPLOAD时核销时必须填写批次号
* 示例值100088
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>
* 字段名:核销请求单据号
* 变量名out_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* 发券凭证(示例格式:商户 id+日期+流水号),可包含英文字母、数字,不允许出现其他不合法符号,商户侧需保证发放凭据号唯一性
* </pre>
*/
@SerializedName(value = "out_request_no")
private String outRequestNo;
/**
* <pre>
* 字段名:签名
* 变量名sign
* 是否必填:是
* 类型string
* 描述:
* 签名计算值。
* 签名方式HMAC-SHA256。
* 签名规则详见《V2 签名规则》 https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/jiekouguize/chapter1_1.shtml
* 参与签名字段说明
* 注意为了安全签名必须在后台服务器计算禁止在H5中计算签名 key 为微信支付 apiv2 的 signkey
* 示例值9A0A8659F005D6984697E2CA0A9CF3B79A0A8659F005D6984697E2CA0A9CF3B7
* </pre>
*/
@SerializedName(value = "sign")
private String sign;
/**
* <pre>
* 字段名:发券商户号
* 变量名send_coupon_merchant
* 是否必填:是
* 类型string[1,15]
* 描述:
* 调用发券接口的商户号
* </pre>
*/
@SerializedName(value = "send_coupon_merchant")
private String sendCouponMerchant;
/**
* <pre>
* 字段名:用户标识
* 变量名openid
* 是否必填:是
* 类型string[1,128]
* 描述:
* 目标发券的用户openid
* </pre>
*/
@SerializedName(value = "openid")
private String openid;
}

View File

@@ -0,0 +1,103 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 核销用户券请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_3.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsUseRequest {
public static final float serialVersionUID = 1L;
/**
* <pre>
* 字段名券code
* 变量名coupon_code
* 是否必填:是
* 类型string[1,32]
* 描述:
* 券的唯一标识。
* 示例值sxxe34343434
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>
* 字段名:批次号
* 变量名stock_id
* 是否必填:否
* 类型string[1,20]
* 描述:
* 微信为每个商家券批次分配的唯一ID批次券Code模式是MERCHANT_API或者MERCHANT_UPLOAD时核销时必须填写批次号
* 示例值100088
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>
* 字段名公众账号ID
* 变量名appid
* 是否必填:是
* 类型string[1,32]
* 描述:
* 支持传入与当前调用接口商户号有绑定关系的appid。支持小程序appid与公众号appid。核销接口返回的openid会在该传入appid下进行计算获得。
* 示例值wx1234567889999
* </pre>
*/
@SerializedName(value = "appid")
private String appId;
/**
* <pre>
* 字段名:请求核销时间
* 变量名use_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 商户请求核销用户券的时间。 遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "use_time")
private String useTime;
/**
* <pre>
* 字段名:核销请求单据号
* 变量名use_request_no
* 是否必填:是
* 类型string[1,32]
* 描述:
* 每次核销请求的唯一标识,商户需保证唯一。
* 示例值1002600620019090123143254435
* </pre>
*/
@SerializedName(value = "use_request_no")
private String useRequestNo;
/**
* <pre>
* 字段名:用户标识
* 变量名openid
* 是否必填:是
* 类型string[1,128]
* 描述:
* 用户的唯一标识,做安全校验使用,非必填。
* 示例值xsd3434454567676
* </pre>
*/
@SerializedName(value = "openid")
private String openid;
}

View File

@@ -0,0 +1,63 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 核销用户券返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_3.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorCouponsUseResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* 微信为每个商家券批次分配的唯一ID
* 示例值: 100088
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>
* 字段名:用户标识
* 变量名openid
* 是否必填:是
* 类型string[1,128]
* 描述:
* 用户在公众号内的唯一身份标识。
* 示例值dsadas34345454545
* </pre>
*/
@SerializedName(value = "openid")
private String openid;
/**
* <pre>
* 字段名:系统核销券成功的时间
* 变量名wechatpay_use_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 系统成功核销券的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "wechatpay_use_time")
private String wechatpayUseTime;
}

View File

@@ -0,0 +1,158 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 领券事件回调通知API请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_15.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorNotifyRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名通知ID
* 变量名id
* 是否必填:是
* 类型string[1,36]
* 描述:
* 通知的唯一id。 示例值8b33f79f-8869-5ae5-b41b-3c0b59f957d0
* </pre>
*/
@SerializedName(value = "id")
private String id;
/**
* <pre>* 字段名:通知创建时间
* 变量名create_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 通知创建的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日13点29分35秒。 示例值2019-12-12T16:54:38+08:00
* </pre>
*/
@SerializedName(value = "create_time")
private String createTime;
/**
* <pre>* 字段名:通知类型
* 变量名event_type
* 是否必填:是
* 类型string[1,32]
* 描述:
* 券的回调通知类型,枚举值: COUPON.SEND领券 示例值COUPON.SEND
* </pre>
*/
@SerializedName(value = "event_type")
private String eventType;
/**
* <pre>* 字段名:通知数据类型
* 变量名resource_type
* 是否必填:是
* 类型string[1,32]
* 描述:
* 通知的资源数据类型券的回调通知为encrypt-resource。 示例值encrypt-resource
* </pre>
*/
@SerializedName(value = "resource_type")
private String resourceType;
/**
* <pre>* 字段名:回调摘要
* 变量名summary
* 是否必填:是
* 类型string[1,64]
* 描述:
* 回调摘要 示例值:商家券领券通知
* </pre>
*/
@SerializedName(value = "summary")
private String summary;
/**
* <pre>* 字段名:+通知数据
* 变量名resource
* 是否必填:是
* 类型object
* 描述:
* 通知资源数据。 json格式见示例
* </pre>
*/
@SerializedName(value = "resource")
private Resource resource;
@Data
@NoArgsConstructor
public static class Resource {
/**
* <pre>* 字段名:加密算法类型
* 变量名algorithm
* 是否必填:是
* 类型string[1,32]
* 描述:
* 对开启结果数据进行加密的加密算法目前只支持AEAD_AES_256_GCM。 示例值AEAD_AES_256_GCM
* </pre>
*/
@SerializedName(value = "algorithm")
private String algorithm;
/**
* <pre>* 字段名:数据密文
* 变量名ciphertext
* 是否必填:是
* 类型string[1,1048576]
* 描述:
* Base64编码后的开启/停用结果数据密文。
* </pre>
*/
@SerializedName(value = "ciphertext")
private String ciphertext;
/**
* <pre>* 字段名:附加数据
* 变量名associated_data
* 是否必填:否
* 类型string[1,16]
* 描述:
* 附加数据 示例值coupon
* </pre>
*/
@SerializedName(value = "associated_data")
private String associatedData;
/**
* <pre>* 字段名:随机串
* 变量名nonce
* 是否必填:是
* 类型string[1,16]
* 描述:
* 加密使用的随机串。 示例值j9g1wAzF9Xn1
* </pre>
*/
@SerializedName(value = "nonce")
private String nonce;
/**
* <pre>* 字段名:原始回调类型
* 变量名original_type
* 是否必填:是
* 类型string[1,64]
* 描述:
* 原始回调类型券的原始回调类型为coupon 示例值coupon
* </pre>
*/
@SerializedName(value = "original_type")
private String originalType;
}
}

View File

@@ -0,0 +1,46 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 领券事件回调通知API返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_15.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorNotifyResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:返回状态码
* 变量名code
* 是否必填:是
* 类型string[1,32]
* 描述:
* 错误码SUCCESS为清算机构接收成功其他错误码为失败。 示例值SUCCESS
* </pre>
*/
@SerializedName(value = "code")
private String code;
/**
* <pre>* 字段名:返回信息
* 变量名message
* 是否必填:是
* 类型string[1,64]
* 描述:
* 返回信息,如非空,为错误原因。 示例值:系统错误
* </pre>
*/
@SerializedName(value = "message")
private String message;
}

View File

@@ -0,0 +1,57 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 查询用户单张券详情API请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_5.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorQueryOneUserCouponsRequest implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名:用户标识
* 变量名openid
* 是否必填:是
* 类型string[1,128]
* 描述:
* path Openid信息用户在appid下的唯一标识。 示例值2323dfsdf342342
* </pre>
*/
@SerializedName(value = "openid")
private String openid;
/**
* <pre>* 字段名公众账号ID
* 变量名appid
* 是否必填:是
* 类型string[1,32]
* 描述:
* query 支持传入与当前调用接口商户号有绑定关系的appid。支持小程序appid与公众号appid。 示例值wx233544546545989
* </pre>
*/
@SerializedName(value = "appid")
private String appid;
/**
* <pre>* 字段名券code
* 变量名coupon_code
* 是否必填:是
* 类型string[1,32]
* 描述:
* path 券的唯一标识。 示例值123446565767
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
}

View File

@@ -0,0 +1,252 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.github.binarywang.wxpay.bean.marketing.busifavor.CouponUseRule;
import com.github.binarywang.wxpay.bean.marketing.busifavor.CustomEntrance;
import com.github.binarywang.wxpay.bean.marketing.busifavor.DisplayPatternInfo;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 查询用户单张券详情API返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_5.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorQueryOneUserCouponsResult implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名:批次归属商户号
* 变量名belong_merchant
* 是否必填:是
* 类型string[8,15]
* 描述:
* 批次归属于哪个商户。 示例值10000022
* </pre>
*/
@SerializedName(value = "belong_merchant")
private String belongMerchant;
/**
* <pre>* 字段名:商家券批次名称
* 变量名stock_name
* 是否必填:是
* 类型string[1,21]
* 描述:
* 批次名称字数上限为21个一个中文汉字/英文字母/数字均占用一个字数。 示例值:商家券
* </pre>
*/
@SerializedName(value = "stock_name")
private String stockName;
/**
* <pre>* 字段名:批次备注
* 变量名comment
* 是否必填:否
* 类型string[1,20]
* 描述:
* 仅配置商户可见用于自定义信息。字数上限为20个一个中文汉字/英文字母/数字均占用一个字数。 示例值xxx可用
* </pre>
*/
@SerializedName(value = "comment")
private String comment;
/**
* <pre>* 字段名:适用商品范围
* 变量名goods_name
* 是否必填:是
* 类型string[1,15]
* 描述:
* 适用商品范围字数上限为15个一个中文汉字/英文字母/数字均占用一个字数。 示例值xxx商品可用
* </pre>
*/
@SerializedName(value = "goods_name")
private String goodsName;
/**
* <pre>* 字段名:批次类型
* 变量名stock_type
* 是否必填:是
* 类型string[1,128]
* 描述:
* 批次类型 NORMAL固定面额满减券批次 DISCOUNT折扣券批次 EXCHANGE换购券批次 示例值NORMAL
* </pre>
*/
@SerializedName(value = "stock_type")
private String stockType;
/**
* <pre>* 字段名:是否允许转赠
* 变量名transferable
* 是否必填:否
* 类型bool
* 描述:
* 不填默认否,枚举值: true是 false否 该字段暂未开放 示例值false
* </pre>
*/
@SerializedName(value = "transferable")
private Boolean transferable;
/**
* <pre>* 字段名:是否允许分享领券链接
* 变量名shareable
* 是否必填:否
* 类型bool
* 描述:
* 不填默认否,枚举值: true是 false否 该字段暂未开放 示例值false
* </pre>
*/
@SerializedName(value = "shareable")
private Boolean shareable;
/**
* <pre>* 字段名:券状态
* 变量名coupon_state
* 是否必填:否
* 类型string[1,16]
* 描述:
* 商家券状态 枚举值: SENDED可用 USED已核销 EXPIRED已过期 示例值SENDED
* </pre>
*/
@SerializedName(value = "coupon_state")
private String couponState;
/**
* <pre>* 字段名:+样式信息
* 变量名display_pattern_info
* 是否必填:否
* 类型object
* 描述:
* 商家券详细信息
* </pre>
*/
@SerializedName(value = "display_pattern_info")
private DisplayPatternInfo displayPatternInfo;
/**
* <pre>* 字段名:+券核销规则
* 变量名coupon_use_rule
* 是否必填:是
* 类型:券核销规则
* 描述:
* 券核销相关规则
* </pre>
*/
@SerializedName(value = "coupon_use_rule")
private CouponUseRule couponUseRule;
/**
* <pre>* 字段名:+自定义入口
* 变量名custom_entrance
* 是否必填:否
* 类型object
* 描述:
* 卡详情页面,可选择多种入口引导用户。
* </pre>
*/
@SerializedName(value = "custom_entrance")
private CustomEntrance customEntrance;
/**
* <pre>* 字段名券code
* 变量名coupon_code
* 是否必填:否
* 类型string[1,32]
* 描述:
* 券的唯一标识。 示例值123446565767
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:否
* 类型string[1,20]
* 描述:
* 微信为每个商家券批次分配的唯一ID是否指定批次号查询。 示例值1002323
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名:券可使用开始时间
* 变量名available_start_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 1、用户领取到该张券实际可使用的开始时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "available_start_time")
private String availableStartTime;
/**
* <pre>* 字段名:券过期时间
* 变量名expire_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 用户领取到该张券的过期时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "expire_time")
private String expireTime;
/**
* <pre>* 字段名:券领券时间
* 变量名receive_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 用户领取到该张券的时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "receive_time")
private String receiveTime;
/**
* <pre>* 字段名:发券请求单号
* 变量名send_request_no
* 是否必填:是
* 类型string[1,32]
* 描述:
* 发券时传入的唯一凭证 示例值: MCHSEND202003101234
* </pre>
*/
@SerializedName(value = "send_request_no")
private String sendRequestNo;
/**
* <pre>* 字段名:核销请求单号
* 变量名use_request_no
* 是否必填:否
* 类型string[1,32]
* 描述:
* 核销时传入的唯一凭证(如券已被核销,将返回此字段) 示例值: MCHUSE202003101234
* </pre>
*/
@SerializedName(value = "use_request_no")
private String useRequestNo;
/**
* <pre>* 字段名:券核销时间
* 变量名use_time
* 是否必填:否
* 类型string[1,32]
* 描述:
* 券被核销的时间如券已被核销将返回此字段遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "use_time")
private String useTime;
}

View File

@@ -0,0 +1,129 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 根据过滤条件查询用户券请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_4.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorQueryUserCouponsRequest implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名:用户标识
* 变量名openid
* 是否必填:是
* 类型string[1,128]
* 描述:
* path Openid信息用户在appid下的唯一标识。 示例值2323dfsdf342342
* </pre>
*/
@SerializedName(value = "openid")
private String openid;
/**
* <pre>* 字段名公众账号ID
* 变量名appid
* 是否必填:是
* 类型string[1,32]
* 描述:
* query 支持传入与当前调用接口商户号有绑定关系的appid。支持小程序appid与公众号appid。 示例值wx233544546545989
* </pre>
*/
@SerializedName(value = "appid")
private String appid;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:否
* 类型string[1,20]
* 描述:
* query 微信为每个商家券批次分配的唯一ID是否指定批次号查询。 示例值9865000
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名:券状态
* 变量名coupon_state
* 是否必填:否
* 类型string[1,16]
* 描述:
* query 券状态 枚举值: SENDED可用 USED已核销 EXPIRED已过期 示例值SENDED
* </pre>
*/
@SerializedName(value = "coupon_state")
private String couponState;
/**
* <pre>* 字段名:创建批次的商户号
* 变量名creator_merchant
* 是否必填:否
* 类型string[1,32]
* 描述:
* query 批次创建方商户号 示例值1000000001
* </pre>
*/
@SerializedName(value = "creator_merchant")
private String creatorMerchant;
/**
* <pre>* 字段名:批次归属商户号
* 变量名belong_merchant
* 是否必填:否
* 类型string[8,15]
* 描述:
* query 批次归属商户号 示例值1000000002
* </pre>
*/
@SerializedName(value = "belong_merchant")
private String belongMerchant;
/**
* <pre>* 字段名:批次发放商户号
* 变量名sender_merchant
* 是否必填:否
* 类型string[1,32]
* 描述:
* query 批次发放商户号 示例值1000000003
* </pre>
*/
@SerializedName(value = "sender_merchant")
private String senderMerchant;
/**
* <pre>* 字段名:分页页码
* 变量名offset
* 是否必填:否
* 类型int
* 描述:
* query 分页页码 示例值0
* </pre>
*/
@SerializedName(value = "offset")
private Integer offset;
/**
* <pre>* 字段名:分页大小
* 变量名limit
* 是否必填:否
* 类型int
* 描述:
* query 分页大小 示例值20
* </pre>
*/
@SerializedName(value = "limit")
private Integer limit;
}

View File

@@ -0,0 +1,71 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 根据过滤条件查询用户券返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_4.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorQueryUserCouponsResult implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>* 字段名:+结果集
* 变量名data
* 是否必填:是
* 类型array
* 描述:
* 结果集
* </pre>
*/
@SerializedName(value = "data")
private List<BusiFavorQueryOneUserCouponsResult> data;
/**
* <pre>* 字段名:总数量
* 变量名total_count
* 是否必填:是
* 类型int
* 描述:
* 总数量 示例值 100
* </pre>
*/
@SerializedName(value = "total_count")
private Integer totalCount;
/**
* <pre>* 字段名:分页页码
* 变量名offset
* 是否必填:是
* 类型int
* 描述:
* 分页页码 示例值1
* </pre>
*/
@SerializedName(value = "offset")
private Integer offset;
/**
* <pre>* 字段名:分页大小
* 变量名limit
* 是否必填:是
* 类型int
* 描述:
* 分页大小 示例值10
* </pre>
*/
@SerializedName(value = "limit")
private Integer limit;
}

View File

@@ -0,0 +1,92 @@
package com.github.binarywang.wxpay.bean.marketing;
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/chapter9_2_11.shtml
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorStocksBudgetRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* path批次号 示例值98065001
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名:目标批次最大发放个数
* 变量名target_max_coupons
* 是否必填:二选一
* 类型int
* 描述:
* body批次最大发放个数 示例值3000
* </pre>
*/
@SerializedName(value = "target_max_coupons")
private Integer targetMaxCoupons;
/**
* <pre>* 字段名:目标单天发放上限个数
* 变量名target_max_coupons
* 是否必填:二选一
* 类型int
* 描述:
* body 目标单天发放上限个数 示例值3000
* </pre>
*/
@SerializedName(value = "target_max_coupons_by_day")
private Integer targetMaxCouponsByDay;
/**
* <pre>* 字段名:当前批次最大发放个数
* 变量名current_max_coupons
* 是否必填:否
* 类型int
* 描述:
* body当前批次最大发放个数当传入target_max_coupons大于0时current_max_coupons必传 示例值500
* </pre>
*/
@SerializedName(value = "current_max_coupons")
private Integer currentMaxCoupons;
/**
* <pre>* 字段名:当前单天发放上限个数
* 变量名current_max_coupons_by_day
* 是否必填:否
* 类型int
* 描述:
* body当前单天发放上限个数 当传入target_max_coupons_by_day大于0时current_max_coupons_by_day必填 示例值300
* </pre>
*/
@SerializedName(value = "current_max_coupons_by_day")
private Integer currentMaxCouponsByDay;
/**
* <pre>* 字段名:修改预算请求单据号
* 变量名modify_budget_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* body修改预算请求单据号 示例值1002600620019090123143254436
* </pre>
*/
@SerializedName(value = "modify_budget_request_no")
private String modifyBudgetRequestNo;
}

View File

@@ -0,0 +1,43 @@
package com.github.binarywang.wxpay.bean.marketing;
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/chapter9_2_11.shtml
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorStocksBudgetResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:批次当前最大发放个数
* 变量名max_coupons
* 是否必填:是
* 类型int
* 描述:
* 批次最大发放个数 示例值300
* </pre>
*/
@SerializedName(value = "max_coupons")
private Integer maxCoupons;
/**
* <pre>* 字段名:当前单天发放上限个数
* 变量名max_coupons_by_day
* 是否必填:否
* 类型int
* 描述:
* 当前单天发放上限个数 示例值100
* </pre>
*/
@SerializedName(value = "max_coupons_by_day")
private Integer maxCouponsByDay;
}

View File

@@ -0,0 +1,196 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.github.binarywang.wxpay.bean.marketing.busifavor.*;
import com.github.binarywang.wxpay.bean.marketing.enums.StockTypeEnum;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 创建商家券批次
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BusiFavorStocksCreateRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次名称
* 变量名stock_name
* 是否必填:是
* 类型string[1,21]
* 描述:
* 批次名称
* 校验规则:
* 1、批次名称最多9个中文汉字
* 2、批次名称最多20个字母
* 3、批次名称中不能包含不当内容和特殊字符 _ , ; |
* 示例值:微信支付代金券批次
* </pre>
*/
@SerializedName(value = "stock_name")
private String stockName;
/**
* <pre>
* 字段名:归属商户号
* 变量名belong_merchant
* 是否必填:是
* 类型string[8,15]
* 描述:
* 批次归属商户号
* 该字段暂未开放
* 示例值98568865
* </pre>
*/
@SerializedName(value = "belong_merchant")
private String belongMerchant;
/**
* <pre>
* 字段名:批次备注
* 变量名comment
* 是否必填:否
* 类型string[1,20]
* 描述:
* 仅制券商户可见,用于自定义信息。
* 校验规则批次备注最多60个UTF8字符数
* 示例值:零售批次
* </pre>
*/
@SerializedName(value = "comment")
private String comment;
/**
* <pre>
* 字段名:适用商品范围
* 变量名goods_name
* 是否必填:是
* 类型string[1,15]
* 描述:
* 用来描述批次在哪些商品可用会显示在微信卡包中。字数上限为15个一个中文汉字/英文字母/数字均占用一个字数。
* 示例值xxx商品使用
* </pre>
*/
@SerializedName(value = "goods_name")
private String goodsName;
/**
* <pre>
* 字段名:批次类型
* 变量名stock_type
* 是否必填:是
* 类型string[1,32]
* 描述:
* 批次类型
* NORMAL固定面额满减券批次
* DISCOUNT折扣券批次
* EXCHANGE换购券批次
* 示例值NORMAL
* </pre>
*/
@SerializedName(value = "stock_type")
private StockTypeEnum stockType;
/**
* <pre>
* 字段名:核销规则
* 变量名coupon_use_rule
* 是否必填:是
* 类型object
* 描述:核销规则
* </pre>
*/
@SerializedName(value = "coupon_use_rule")
private CouponUseRule couponUseRule;
/**
* <pre>
* 字段名:券发放相关规则
* 变量名stock_send_rule
* 是否必填:是
* 类型object
* 描述:券发放相关规则
* </pre>
*/
@SerializedName(value = "stock_send_rule")
private StockSendRule stockSendRule;
/**
* <pre>
* 字段名:商户单据号
* 变量名out_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* 商户创建批次凭据号格式商户id+日期+流水号),可包含英文字母,数字,|_*-等内容,不允许出现其他不合法符号,商户侧需保持商户单据号全局唯一。
* </pre>
*/
@SerializedName(value = "out_request_no")
private String outRequestNo;
/**
* <pre>
* 字段名:自定义入口
* 变量名custom_entrance
* 是否必填:否
* 类型object
* 描述:卡详情页面,可选择多种入口引导用户。
* </pre>
*/
@SerializedName(value = "custom_entrance")
private CustomEntrance customEntrance;
/**
* <pre>
* 字段名:样式信息
* 变量名display_pattern_info
* 是否必填:否
* 类型object
* 描述:创建批次时的样式信息。
* </pre>
*/
@SerializedName(value = "display_pattern_info")
private DisplayPatternInfo displayPatternInfo;
/**
* <pre>
* 字段名券code模式
* 变量名coupon_code_mode
* 是否必填:是
* 类型string[1,128]
* 描述:枚举值:
* WECHATPAY_MODE系统分配券code。固定22位纯数字
* MERCHANT_API商户发放时接口指定券code。
* MERCHANT_UPLOAD商户上传自定义code发券时系统随机选取上传的券code。
* </pre>
*/
@SerializedName(value = "coupon_code_mode")
private String couponCodeMode;
/**
* <pre>
* 字段名:事件通知配置
* 变量名notify_config
* 是否必填:否
* 类型object
* 描述:事件回调通知商户的配置
* </pre>
*/
@SerializedName(value = "notify_config")
private NotifyConfig notifyConfig;
}

View File

@@ -0,0 +1,48 @@
package com.github.binarywang.wxpay.bean.marketing;
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/chapter9_2_1.shtml
*
* @author yujam
*/
@NoArgsConstructor
@Data
public class BusiFavorStocksCreateResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1,20]
* 描述:
* 微信为每个商家券批次分配的唯一ID
* 示例值: 98065001
* </pre>
*/
@SerializedName("stock_id")
private String stockId;
/**
* <pre>
* 字段名:创建时间
* 变量名create_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName("create_time")
private String createTime;
}

View File

@@ -0,0 +1,265 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.github.binarywang.wxpay.bean.marketing.busifavor.*;
import com.github.binarywang.wxpay.bean.marketing.enums.StockTypeEnum;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 商家券详情返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_2.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorStocksGetResult {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次名称
* 变量名stock_name
* 是否必填:是
* 类型string[1,21]
* 描述:
* 批次名称
* 校验规则:
* 1、批次名称最多9个中文汉字
* 2、批次名称最多20个字母
* 3、批次名称中不能包含不当内容和特殊字符 _ , ; |
* 示例值:微信支付代金券批次
* </pre>
*/
@SerializedName(value = "stock_name")
private String stockName;
/**
* <pre>
* 字段名:归属商户号
* 变量名belong_merchant
* 是否必填:是
* 类型string[8,15]
* 描述:
* 批次归属商户号
* 该字段暂未开放
* 示例值98568865
* </pre>
*/
@SerializedName(value = "belong_merchant")
private String belongMerchant;
/**
* <pre>
* 字段名:批次备注
* 变量名comment
* 是否必填:否
* 类型string[1,20]
* 描述:
* 仅制券商户可见,用于自定义信息。
* 校验规则批次备注最多60个UTF8字符数
* 示例值:零售批次
* </pre>
*/
@SerializedName(value = "comment")
private String comment;
/**
* <pre>
* 字段名:适用商品范围
* 变量名goods_name
* 是否必填:是
* 类型string[1,15]
* 描述:
* 用来描述批次在哪些商品可用会显示在微信卡包中。字数上限为15个一个中文汉字/英文字母/数字均占用一个字数。
* 示例值xxx商品使用
* </pre>
*/
@SerializedName(value = "goods_name")
private String goodsName;
/**
* <pre>
* 字段名:批次类型
* 变量名stock_type
* 是否必填:是
* 类型string[1,32]
* 描述:
* 批次类型
* NORMAL固定面额满减券批次
* DISCOUNT折扣券批次
* EXCHANGE换购券批次
* 示例值NORMAL
* </pre>
*/
@SerializedName(value = "stock_type")
private StockTypeEnum stockType;
/**
* <pre>
* 字段名:核销规则
* 变量名coupon_use_rule
* 是否必填:是
* 类型object
* 描述:核销规则
* </pre>
*/
@SerializedName(value = "coupon_use_rule")
private CouponUseRule couponUseRule;
/**
* <pre>
* 字段名:券发放相关规则
* 变量名stock_send_rule
* 是否必填:是
* 类型object
* 描述:券发放相关规则
* </pre>
*/
@SerializedName(value = "stock_send_rule")
private StockSendRule stockSendRule;
/**
* <pre>
* 字段名:商户单据号
* 变量名out_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* 商户创建批次凭据号格式商户id+日期+流水号),可包含英文字母,数字,|_*-等内容,不允许出现其他不合法符号,商户侧需保持商户单据号全局唯一。
* </pre>
*/
@SerializedName(value = "out_request_no")
private String outRequestNo;
/**
* <pre>
* 字段名:自定义入口
* 变量名custom_entrance
* 是否必填:否
* 类型object
* 描述:卡详情页面,可选择多种入口引导用户。
* </pre>
*/
@SerializedName(value = "custom_entrance")
private CustomEntrance customEntrance;
/**
* <pre>
* 字段名:样式信息
* 变量名display_pattern_info
* 是否必填:否
* 类型object
* 描述:创建批次时的样式信息。
* </pre>
*/
@SerializedName(value = "display_pattern_info")
private DisplayPatternInfo displayPatternInfo;
/**
* <pre>
* 字段名券code模式
* 变量名coupon_code_mode
* 是否必填:是
* 类型string[1,128]
* 描述:枚举值:
* WECHATPAY_MODE系统分配券code。固定22位纯数字
* MERCHANT_API商户发放时接口指定券code。
* MERCHANT_UPLOAD商户上传自定义code发券时系统随机选取上传的券code。
* </pre>
*/
@SerializedName(value = "coupon_code_mode")
private String couponCodeMode;
/**
* <pre>
* 字段名:事件通知配置
* 变量名notify_config
* 是否必填:否
* 类型object
* 描述:事件回调通知商户的配置
* </pre>
*/
@SerializedName(value = "notify_config")
private NotifyConfig notifyConfig;
/**
* <pre>
* 字段名:批次发放情况
* 变量名send_count_information
* 是否必填:否
* 类型object
* 描述:批次发放情况
* </pre>
*/
@SerializedName(value = "send_count_information")
private SendCountInformation sendCountInformation;
@Data
@NoArgsConstructor
public static class SendCountInformation implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:已发放券张数
* 变量名total_send_num
* 是否必填:否
* 类型uint64
* 描述:
* 批次已发放的券数量,满减、折扣、换购类型会返回该字段
* 示例值1
* </pre>
*/
@SerializedName(value = "total_send_num")
private Integer totalSendNum;
/**
* <pre>
* 字段名:已发放券金额
* 变量名total_send_amount
* 是否必填:否
* 类型uint64
* 描述:
* 批次已发放的预算金额,满减券类型会返回该字段
* 示例值34
* </pre>
*/
@SerializedName(value = "total_send_amount")
private Integer totalSendAmount;
/**
* <pre>
* 字段名:单天已发放券张数
* 变量名today_send_num
* 是否必填:否
* 类型uint64
* 描述:
* 批次当天已发放的券数量,设置了单天发放上限的满减、折扣、换购类型返回该字段
* 示例值1
* </pre>
*/
@SerializedName(value = "today_send_num")
private String todaySendNum;
/**
* <pre>
* 字段名:单天已发放券金额
* 变量名today_send_amount
* 是否必填:否
* 类型uint64
* 描述:
* 批次当天已发放的预算金额,设置了当天发放上限的满减券类型返回该字段
* 示例值34
* </pre>
*/
@SerializedName(value = "today_send_amount")
private String todaySendAmount;
}
}

View File

@@ -0,0 +1,266 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.github.binarywang.wxpay.bean.marketing.busifavor.*;
import com.github.binarywang.wxpay.bean.marketing.enums.StockTypeEnum;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 用户单张券详情返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_5.shtml
* </pre>
* TODO:
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorStocksUserGetResult {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次名称
* 变量名stock_name
* 是否必填:是
* 类型string[1,21]
* 描述:
* 批次名称
* 校验规则:
* 1、批次名称最多9个中文汉字
* 2、批次名称最多20个字母
* 3、批次名称中不能包含不当内容和特殊字符 _ , ; |
* 示例值:微信支付代金券批次
* </pre>
*/
@SerializedName(value = "stock_name")
private String stockName;
/**
* <pre>
* 字段名:归属商户号
* 变量名belong_merchant
* 是否必填:是
* 类型string[8,15]
* 描述:
* 批次归属商户号
* 该字段暂未开放
* 示例值98568865
* </pre>
*/
@SerializedName(value = "belong_merchant")
private String belongMerchant;
/**
* <pre>
* 字段名:批次备注
* 变量名comment
* 是否必填:否
* 类型string[1,20]
* 描述:
* 仅制券商户可见,用于自定义信息。
* 校验规则批次备注最多60个UTF8字符数
* 示例值:零售批次
* </pre>
*/
@SerializedName(value = "comment")
private String comment;
/**
* <pre>
* 字段名:适用商品范围
* 变量名goods_name
* 是否必填:是
* 类型string[1,15]
* 描述:
* 用来描述批次在哪些商品可用会显示在微信卡包中。字数上限为15个一个中文汉字/英文字母/数字均占用一个字数。
* 示例值xxx商品使用
* </pre>
*/
@SerializedName(value = "goods_name")
private String goodsName;
/**
* <pre>
* 字段名:批次类型
* 变量名stock_type
* 是否必填:是
* 类型string[1,32]
* 描述:
* 批次类型
* NORMAL固定面额满减券批次
* DISCOUNT折扣券批次
* EXCHANGE换购券批次
* 示例值NORMAL
* </pre>
*/
@SerializedName(value = "stock_type")
private StockTypeEnum stockType;
/**
* <pre>
* 字段名:核销规则
* 变量名coupon_use_rule
* 是否必填:是
* 类型object
* 描述:核销规则
* </pre>
*/
@SerializedName(value = "coupon_use_rule")
private CouponUseRule couponUseRule;
/**
* <pre>
* 字段名:券发放相关规则
* 变量名stock_send_rule
* 是否必填:是
* 类型object
* 描述:券发放相关规则
* </pre>
*/
@SerializedName(value = "stock_send_rule")
private StockSendRule stockSendRule;
/**
* <pre>
* 字段名:商户单据号
* 变量名out_request_no
* 是否必填:是
* 类型string[1,128]
* 描述:
* 商户创建批次凭据号格式商户id+日期+流水号),可包含英文字母,数字,|_*-等内容,不允许出现其他不合法符号,商户侧需保持商户单据号全局唯一。
* </pre>
*/
@SerializedName(value = "out_request_no")
private String outRequestNo;
/**
* <pre>
* 字段名:自定义入口
* 变量名custom_entrance
* 是否必填:否
* 类型object
* 描述:卡详情页面,可选择多种入口引导用户。
* </pre>
*/
@SerializedName(value = "custom_entrance")
private CustomEntrance customEntrance;
/**
* <pre>
* 字段名:样式信息
* 变量名display_pattern_info
* 是否必填:否
* 类型object
* 描述:创建批次时的样式信息。
* </pre>
*/
@SerializedName(value = "display_pattern_info")
private DisplayPatternInfo displayPatternInfo;
/**
* <pre>
* 字段名券code模式
* 变量名coupon_code_mode
* 是否必填:是
* 类型string[1,128]
* 描述:枚举值:
* WECHATPAY_MODE系统分配券code。固定22位纯数字
* MERCHANT_API商户发放时接口指定券code。
* MERCHANT_UPLOAD商户上传自定义code发券时系统随机选取上传的券code。
* </pre>
*/
@SerializedName(value = "coupon_code_mode")
private String couponCodeMode;
/**
* <pre>
* 字段名:事件通知配置
* 变量名notify_config
* 是否必填:否
* 类型object
* 描述:事件回调通知商户的配置
* </pre>
*/
@SerializedName(value = "notify_config")
private NotifyConfig notifyConfig;
/**
* <pre>
* 字段名:批次发放情况
* 变量名send_count_information
* 是否必填:否
* 类型object
* 描述:批次发放情况
* </pre>
*/
@SerializedName(value = "send_count_information")
private SendCountInformation sendCountInformation;
@Data
@NoArgsConstructor
public static class SendCountInformation implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:已发放券张数
* 变量名total_send_num
* 是否必填:否
* 类型uint64
* 描述:
* 批次已发放的券数量,满减、折扣、换购类型会返回该字段
* 示例值1
* </pre>
*/
@SerializedName(value = "total_send_num")
private Integer totalSendNum;
/**
* <pre>
* 字段名:已发放券金额
* 变量名total_send_amount
* 是否必填:否
* 类型uint64
* 描述:
* 批次已发放的预算金额,满减券类型会返回该字段
* 示例值34
* </pre>
*/
@SerializedName(value = "total_send_amount")
private Integer totalSendAmount;
/**
* <pre>
* 字段名:单天已发放券张数
* 变量名today_send_num
* 是否必填:否
* 类型uint64
* 描述:
* 批次当天已发放的券数量,设置了单天发放上限的满减、折扣、换购类型返回该字段
* 示例值1
* </pre>
*/
@SerializedName(value = "today_send_num")
private String todaySendNum;
/**
* <pre>
* 字段名:单天已发放券金额
* 变量名today_send_amount
* 是否必填:否
* 类型uint64
* 描述:
* 批次当天已发放的预算金额,设置了当天发放上限的满减券类型返回该字段
* 示例值34
* </pre>
*/
@SerializedName(value = "today_send_amount")
private String todaySendAmount;
}
}

View File

@@ -0,0 +1,118 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 营销补差付款请求对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_16.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorSubsidyRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:商家券批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1, 20]
* 描述:
* body由微信支付生成调用创建商家券API成功时返回的唯一批次ID 仅支持“满减券”和“折扣券”的批次,“换购券”批次不支持 示例值128888000000001
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名商家券Code
* 变量名coupon_code
* 是否必填:是
* 类型string[1, 128]
* 描述:
* body券的唯一标识。 在WECHATPAY_MODE的券Code模式下商家券Code是由微信支付生成的唯一ID 在MERCHANT_UPLOAD、MERCHANT_API的券Code模式下商家券Code是由商户上传或指定在批次下保证唯一 示例值ABCD12345678
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:微信支付订单号
* 变量名transaction_id
* 是否必填:是
* 类型string[28, 32]
* 描述:
* body微信支付下单支付成功返回的订单号 示例值4200000913202101152566792388
* </pre>
*/
@SerializedName(value = "transaction_id")
private String transactionId;
/**
* <pre>* 字段名:营销补差扣款商户号
* 变量名payer_merchant
* 是否必填:是
* 类型string[1, 32]
* 描述:
* body营销补差扣款商户号 示例值1900000001
* </pre>
*/
@SerializedName(value = "payer_merchant")
private String payerMerchant;
/**
* <pre>* 字段名:营销补差入账商户号
* 变量名payee_merchant
* 是否必填:是
* 类型string[1, 32]
* 描述:
* body营销补差入账商户号 示例值1900000002
* </pre>
*/
@SerializedName(value = "payee_merchant")
private String payeeMerchant;
/**
* <pre>* 字段名:补差付款金额
* 变量名amount
* 是否必填:是
* 类型int
* 描述:
* body单位为分单笔订单补差金额不得超过券的优惠金额最高补差金额为5000元 > 券的优惠金额定义: 满减券:满减金额即为优惠金额 折扣券:优惠金额 = 微信支付订单金额 ÷ 折扣比例 × (1 - 折扣比例) 换购券:不支持 示例值100
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;
/**
* <pre>* 字段名:补差付款描述
* 变量名description
* 是否必填:是
* 类型string[1, 1024]
* 描述:
* body付款备注描述查询的时候原样带回 示例值20210115DESCRIPTION
* </pre>
*/
@SerializedName(value = "description")
private String description;
/**
* <pre>* 字段名:业务请求唯一单号
* 变量名out_subsidy_no
* 是否必填:是
* 类型string[1, 128]
* 描述:
* body商户侧需保证唯一性。可包含英文字母数字_*-等内容,不允许出现其他不合法符号 示例值subsidy-abcd-12345678
* </pre>
*/
@SerializedName(value = "out_subsidy_no")
private String outSubsidyNo;
}

View File

@@ -0,0 +1,177 @@
package com.github.binarywang.wxpay.bean.marketing;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 营销补差付款返回对象
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_16.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class BusiFavorSubsidyResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>* 字段名:补差付款单号
* 变量名subsidy_receipt_id
* 是否必填:是
* 类型string[28, 32]
* 描述:
* 补差付款唯一单号,由微信支付生成,仅在补差付款成功后有返回 示例值1120200119165100000000000001
* </pre>
*/
@SerializedName(value = "subsidy_receipt_id")
private String subsidyReceiptId;
/**
* <pre>* 字段名:商家券批次号
* 变量名stock_id
* 是否必填:是
* 类型string[1, 20]
* 描述:
* 由微信支付生成调用创建商家券API成功时返回的唯一批次ID 示例值128888000000001
* </pre>
*/
@SerializedName(value = "stock_id")
private String stockId;
/**
* <pre>* 字段名商家券Code
* 变量名coupon_code
* 是否必填:是
* 类型string[1, 128]
* 描述:
* 券的唯一标识 示例值ABCD12345678
* </pre>
*/
@SerializedName(value = "coupon_code")
private String couponCode;
/**
* <pre>* 字段名:微信支付订单号
* 变量名transaction_id
* 是否必填:是
* 类型string[28, 32]
* 描述:
* 微信支付下单支付成功返回的订单号 示例值4200000913202101152566792388
* </pre>
*/
@SerializedName(value = "transaction_id")
private String transactionId;
/**
* <pre>* 字段名:营销补差扣款商户号
* 变量名payer_merchant
* 是否必填:是
* 类型string[1, 32]
* 描述:
* 营销补差扣款商户号 示例值1900000001
* </pre>
*/
@SerializedName(value = "payer_merchant")
private String payerMerchant;
/**
* <pre>* 字段名:营销补差入账商户号
* 变量名payee_merchant
* 是否必填:是
* 类型string[1, 32]
* 描述:
* 营销补差入账商户号 示例值1900000002
* </pre>
*/
@SerializedName(value = "payee_merchant")
private String payeeMerchant;
/**
* <pre>* 字段名:补差付款金额
* 变量名amount
* 是否必填:是
* 类型int
* 描述:
* 单位为分单笔订单补差金额不得超过券的优惠金额最高补差金额为5000元 > 券的优惠金额定义: 满减券:满减金额即为优惠金额 折扣券:优惠金额 = 微信支付订单金额 ÷ 折扣比例 × (1 - 折扣比例) 换购券:不支持 示例值100
* </pre>
*/
@SerializedName(value = "amount")
private Integer amount;
/**
* <pre>* 字段名:补差付款描述
* 变量名description
* 是否必填:是
* 类型string[1, 1024]
* 描述:
* 付款备注描述,查询的时候原样带回 示例值20210115DESCRIPTION
* </pre>
*/
@SerializedName(value = "description")
private String description;
/**
* <pre>* 字段名:补差付款单据状态
* 变量名status
* 是否必填:是
* 类型string[1, 32]
* 描述:
* 补差付款单据状态 ACCEPTED受理成功 SUCCESS补差补款成功 FAIL补差付款失败 RETURNING补差回退中 PARTIAL_RETURN补差部分回退 FULL_RETURN补差全额回退 示例值SUCCESS
* </pre>
*/
@SerializedName(value = "status")
private String status;
/**
* <pre>* 字段名:补差付款失败原因
* 变量名fail_reason
* 是否必填:否
* 类型string[1, 1024]
* 描述:
* 仅在补差付款失败时,返回告知对应失败的原因 INSUFFICIENT_BALANCE扣款商户余额不足 NOT_INCOMESPLIT_ORDER非分账订单 EXCEED_SUBSIDY_AMOUNT_QUOTA超出订单补差总额限制 EXCEED_SUBSIDY_COUNT_QUOTA超出订单补差总数限制 OTHER其他原因 示例值INSUFFICIENT_BALANCE
* </pre>
*/
@SerializedName(value = "fail_reason")
private String failReason;
/**
* <pre>* 字段名:补差付款完成时间
* 变量名success_time
* 是否必填:否
* 类型string[28, 32]
* 描述:
* 仅在补差付款成功时返回完成时间。遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2021-01-20T10:29:35+08:00
* </pre>
*/
@SerializedName(value = "success_time")
private String successTime;
/**
* <pre>* 字段名:业务请求唯一单号
* 变量名out_subsidy_no
* 是否必填:是
* 类型string[1, 128]
* 描述:
* 商户侧需保证唯一性。可包含英文字母数字_*-等内容,不允许出现其他不合法符号 示例值subsidy-abcd-12345678
* </pre>
*/
@SerializedName(value = "out_subsidy_no")
private String outSubsidyNo;
/**
* <pre>* 字段名:补差付款发起时间
* 变量名create_time
* 是否必填:否
* 类型string[28, 32]
* 描述:
* 补差付款单据创建时间。遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35.+08:00表示北京时间2015年5月20日 13点29分35秒。 示例值2021-01-20T10:29:35+08:00
* </pre>
*/
@SerializedName(value = "create_time")
private String createTime;
}

View File

@@ -0,0 +1,84 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 固定周期有效时间段
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class AvailableWeek implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>
* 字段名:可用星期数
* 变量名week_day
* 是否必填:否
* 类型array[int]
* 描述:
* 0代表周日1代表周一以此类推
* 当填写available_day_time时week_day必填
* 示例值1, 2
* </pre>
*/
@SerializedName(value = "week_day")
private Integer[] weekDay;
/**
* <pre>
* 字段名:当天可用时间段
* 变量名available_day_time
* 是否必填:否
* 类型array
* 描述:
* 可以填写多个时间段最多不超过2个。
* </pre>
*/
@SerializedName(value = "available_day_time")
private AvailableDayTime availableDayTime;
@Data
@NoArgsConstructor
public static class AvailableDayTime implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>
* 字段名:当天可用开始时间
* 变量名begin_time
* 是否必填:否
* 类型int
* 描述:
* 当天可用开始时间单位1代表当天0点0分1秒。
* 示例值3600
* </pre>
*/
@SerializedName(value = "begin_time")
private Integer beginTime;
/**
* <pre>
* 字段名:当天可用结束时间
* 变量名available_day_time
* 是否必填:否
* 类型int
* 描述:
* 当天可用结束时间单位86399代表当天23点59分59秒。
* 示例值86399
* </pre>
*/
@SerializedName(value = "end_time")
private Integer endTime;
}
}

View File

@@ -0,0 +1,108 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 券生效时间
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class CouponAvailableTime implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>
* 字段名:开始时间
* 变量名available_begin_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 批次开始时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。
* 注意开始时间设置有效期最长为1年。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "available_begin_time")
private String availableBeginTime;
/**
* <pre>
* 字段名:结束时间
* 变量名available_end_time
* 是否必填:是
* 类型string[1,32]
* 描述:
* 批次结束时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。
* 注意结束时间设置有效期最长为1年。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "available_end_time")
private String availableEndTime;
/**
* <pre>
* 字段名生效后N天内有效
* 变量名available_day_after_receive
* 是否必填:否
* 类型int
* 描述:
* 日期区间内券生效后x天内有效。例如生效当天内有效填1生效后2天内有效填2以此类推……注意用户在有效期开始前领取商家券则从有效期第1天开始计算天数用户在有效期内领取商家券则从领取当天开始计算天数无论用户何时领取商家券商家券在活动有效期结束后均不可用。可配合wait_days_after_receive一同填写也可单独填写。单独填写时有效期内领券后立即生效生效后x天内有效。
* 示例值3
* </pre>
*/
@SerializedName(value = "available_day_after_receive")
private Integer availableDayAfterReceive;
/**
* <pre>
* 字段名:固定周期有效时间段
* 变量名available_week
* 是否必填:否
* 类型object
* 描述:
* 可以设置多个星期下的多个可用时间段比如每周二10点到18点用户自定义字段。
* </pre>
*/
@SerializedName(value = "available_week")
private AvailableWeek availableWeek;
/**
* <pre>
* 字段名:无规律的有效时间段
* 变量名irregulary_avaliable_time
* 是否必填:否
* 类型array
* 描述:
* 无规律的有效时间,多个无规律时间段,用户自定义字段。
* </pre>
*/
@SerializedName(value = "irregulary_avaliable_time")
private List<IrregularyAvaliableTime> irregularyAvaliableTime;
/**
* <pre>
* 字段名领取后N天开始生效
* 变量名wait_days_after_receive
* 是否必填:否
* 类型int
* 描述:
* 日期区间内用户领券后需等待x天开始生效。例如领券后当天开始生效则无需填写领券后第2天开始生效填1以此类推……用户在有效期开始前领取商家券则从有效期第1天开始计算天数用户在有效期内领取商家券则从领取当天开始计算天数。无论用户何时领取商家券商家券在活动有效期结束后均不可用。需配合available_day_after_receive一同填写不可单独填写。
* 示例值7
* </pre>
*/
@SerializedName(value = "wait_days_after_receive")
private Integer waitDaysAfterReceive;
}

View File

@@ -0,0 +1,121 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 核销规则
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class CouponUseRule implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:券生效时间
* 变量名coupon_available_time
* 是否必填:是
* 类型object
* 描述:
* 允许指定券的特殊生效时间规则。
* 该字段暂未开放
* </pre>
*/
@SerializedName(value = "coupon_available_time")
private CouponAvailableTime couponAvailableTime;
/**
* <pre>
* 字段名:固定面额满减券使用规则
* 变量名fixed_normal_coupon
* 是否必填:否
* 类型object
* 描述:
* stock_type为NORMAL时必填。
* </pre>
*/
@SerializedName(value = "fixed_normal_coupon")
private FixedNormalCoupon fixedNormalCoupon;
/**
* <pre>
* 字段名:折扣券使用规则
* 变量名discount_coupon
* 是否必填:否
* 类型object
* 描述:
* stock_type为DISCOUNT时必填。
* </pre>
*/
@SerializedName(value = "discount_coupon")
private DiscountCoupon discountCoupon;
/**
* <pre>
* 字段名:换购券使用规则
* 变量名exchange_coupon
* 是否必填:否
* 类型object
* 描述:
* stock_type为EXCHANG时必填。
* </pre>
*/
@SerializedName(value = "exchange_coupon")
private ExchangeCoupon exchangeCoupon;
/**
* <pre>
* 字段名:核销方式
* 变量名use_method
* 是否必填:是
* 类型string[1,128]
* 描述:
* 枚举值:
* OFF_LINE线下滴码核销点击券“立即使用”跳转展示券二维码详情。
* MINI_PROGRAMS线上小程序核销点击券“立即使用”跳转至配置的商家小程序需要添加小程序appid和path
* PAYMENT_CODE微信支付付款码核销点击券“立即使用”跳转至微信支付钱包付款码。
* SELF_CONSUME用户自助核销点击券“立即使用”跳转至用户自助操作核销界面当前暂不支持用户自助核销
* 示例值OFF_LINE
* </pre>
*/
@SerializedName(value = "use_method")
private String useMethod;
/**
* <pre>
* 字段名小程序appid
* 变量名mini_programs_appid
* 是否必填:否
* 类型string[1,32]
* 描述:
* 核销方式为线上小程序核销才有效。
* 示例值wx23232232323
* </pre>
*/
@SerializedName(value = "mini_programs_appid")
private String miniProgramsAppid;
/**
* <pre>
* 字段名小程序path
* 变量名mini_programs_path
* 是否必填:否
* 类型string[1,128]
* 描述:
* 核销方式为线上小程序核销才有效。
* 示例值:/path/index/index
* </pre>
*/
@SerializedName(value = "mini_programs_path")
private String miniProgramsPath;
}

View File

@@ -0,0 +1,156 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 自定义入口
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class CustomEntrance implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:小程序入口
* 变量名mini_programs_info
* 是否必填:否
* 类型object
* 描述:
* 需要小程序APPID、path、入口文案、引导文案。如果需要跳转小程序APPID、path、入口文案为必填引导文案非必填。
* appid要与归属商户号有M-A or M-m-suba关系
* </pre>
*/
@SerializedName(value = "mini_programs_info")
private MiniProgramsInfo miniProgramsInfo;
/**
* <pre>
* 字段名商户公众号appid
* 变量名appid
* 是否必填:否
* 类型string[1,32]
* 描述:
* 可配置商户公众号,从券详情可跳转至公众号,用户自定义字段。
* 示例值wx324345hgfhfghfg
* </pre>
*/
@SerializedName(value = "appid")
private String appId;
/**
* <pre>
* 字段名营销馆id
* 变量名hall_id
* 是否必填:否
* 类型string[1,64]
* 描述:
* 填写微信支付营销馆的馆id用户自定义字段。 营销馆需在商户平台 创建。
* 示例值233455656
* </pre>
*/
@SerializedName(value = "hall_id")
private String hallId;
/**
* <pre>
* 字段名可用门店id
* 变量名store_id
* 是否必填:否
* 类型string[1,64]
* 描述:
* 填写代金券可用门店id用户自定义字段。
* 示例值233554655
* </pre>
*/
@SerializedName(value = "store_id")
private String storeId;
/**
* <pre>
* 字段名code展示模式
* 变量名code_display_mode
* 是否必填:否
* 类型string[1,8]
* 描述:
* 枚举值:
* NOT_SHOW不展示code
* BARCODE一维码
* QRCODE二维码
* 示例值BARCODE
* </pre>
*/
@SerializedName(value = "code_display_mode")
private String codeDisplayMode;
@Data
@NoArgsConstructor
public static class MiniProgramsInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名商家小程序appid
* 变量名mini_programs_appid
* 是否必填:是
* 类型string[1,32]
* 描述:
* 商家小程序appid要与归属商户号有M-A or M-m-suba关系。
* 示例值wx234545656765876
* </pre>
*/
@SerializedName(value = "mini_programs_appid")
private String miniProgramsAppid;
/**
* <pre>
* 字段名商家小程序path
* 变量名mini_programs_path
* 是否必填:是
* 类型string[1,128]
* 描述:
* 商家小程序path
* 示例值:/path/index/index
* </pre>
*/
@SerializedName(value = "mini_programs_path")
private String miniProgramsPath;
/**
* <pre>
* 字段名:入口文案
* 变量名entrance_words
* 是否必填:是
* 类型string[1,5]
* 描述:
* 入口文案字数上限为5个一个中文汉字/英文字母/数字均占用一个字数。
* 示例值:欢迎选购
* </pre>
*/
@SerializedName(value = "entrance_words")
private String entranceWords;
/**
* <pre>
* 字段名:引导文案
* 变量名guiding_words
* 是否必填:否
* 类型string[1,6]
* 描述:
* 小程序入口引导文案用户自定义字段。字数上限为6个一个中文汉字/英文字母/数字均占用一个字数。
* 示例值:获取更多优惠
* </pre>
*/
@SerializedName(value = "guiding_words")
private String guidingWords;
}
}

View File

@@ -0,0 +1,50 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 折扣券
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class DiscountCoupon implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:折扣比例
* 变量名discount_percent
* 是否必填:是
* 类型int
* 描述:
* 折扣百分比例如88为八八折。
* 示例值88
* </pre>
*/
@SerializedName(value = "discount_percent")
private Integer discountPercent;
/**
* <pre>
* 字段名:消费门槛
* 变量名transaction_minimum
* 是否必填:是
* 类型int
* 描述:
* 消费门槛,单位:分。
* 特殊规则:取值范围 1 ≤ value ≤ 10000000
* 示例值100
* </pre>
*/
@SerializedName(value = "transaction_minimum")
private Integer transactionMinimum;
}

View File

@@ -0,0 +1,92 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 样式信息
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class DisplayPatternInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:使用须知
* 变量名description
* 是否必填:否
* 类型string[1,1000]
* 描述:
* 用于说明详细的活动规则,会展示在代金券详情页。
* 示例值xxx门店可用
* </pre>
*/
@SerializedName(value = "description")
private String description;
/**
* <pre>
* 字段名商户logo
* 变量名merchant_logo_url
* 是否必填:否
* 类型string[1,128]
* 描述:
* 商户logo的URL地址仅支持通过《图片上传API》接口获取的图片URL地址。
* 1、商户logo大小需为120像素*120像素。
* 2、支持JPG/JPEG/PNG格式且图片小于1M。
* 示例值https://qpic.cn/xxx
* </pre>
*/
@SerializedName(value = "merchant_logo_url")
private String merchantLogoUrl;
/**
* <pre>
* 字段名:商户名称
* 变量名merchant_name
* 是否必填:否
* 类型string[1,16]
* 描述:
* 商户名称字数上限为16个一个中文汉字/英文字母/数字均占用一个字数。
* 示例值:微信支付
* </pre>
*/
@SerializedName(value = "merchant_name")
private String merchantName;
/**
* <pre>
* 字段名:背景颜色
* 变量名background_color
* 是否必填:否
* 类型string[1,16]
* 描述:
* 券的背景颜色可设置10种颜色色值请参考卡券背景颜色图。颜色取值为颜色图中的颜色名称。
* 示例值Color020
* </pre>
*/
@SerializedName(value = "background_color")
private String backgroundColor;
/**
* <pre>
* 字段名:券详情图片
* 变量名coupon_image_url
* 是否必填:否
* 类型string[1,128]
* 描述:
* 券详情图片850像素*350像素且图片大小不超过2M支持JPG/PNG格式仅支持通过《图片上传API》接口获取的图片URL地址。
* 示例值https://qpic.cn/xxx
* </pre>
*/
@SerializedName(value = "coupon_image_url")
private String couponImageUrl;
}

View File

@@ -0,0 +1,51 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 换购券
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class ExchangeCoupon implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:单品换购价
* 变量名exchange_price
* 是否必填:是
* 类型int
* 描述:
* 单品换购价,单位:分。
* 特殊规则:取值范围 1 ≤ value ≤ 10000000
* 示例值100
* </pre>
*/
@SerializedName(value = "exchange_price")
private Integer exchangePrice;
/**
* <pre>
* 字段名:消费门槛
* 变量名transaction_minimum
* 是否必填:是
* 类型int
* 描述:
* 消费门槛,单位:分。
* 特殊规则:取值范围 1 ≤ value ≤ 10000000
* 示例值100
* </pre>
*/
@SerializedName(value = "transaction_minimum")
private Integer transactionMinimum;
}

View File

@@ -0,0 +1,51 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 满减券
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class FixedNormalCoupon implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:优惠金额
* 变量名discount_amount
* 是否必填:是
* 类型int
* 描述:
* 优惠金额,单位:分。
* 特殊规则:取值范围 1 ≤ value ≤ 10000000
* 示例值5
* </pre>
*/
@SerializedName(value = "discount_amount")
private Integer discountAmount;
/**
* <pre>
* 字段名:消费门槛
* 变量名transaction_minimum
* 是否必填:是
* 类型int
* 描述:
* 消费门槛,单位:分。
* 特殊规则:取值范围 1 ≤ value ≤ 10000000
* 示例值100
* </pre>
*/
@SerializedName(value = "transaction_minimum")
private Integer transactionMinimum;
}

View File

@@ -0,0 +1,50 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 无规律的有效时间段
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class IrregularyAvaliableTime implements Serializable {
public static final float serialVersionUID = 1L;
/**
* <pre>
* 字段名:开始时间
* 变量名begin_time
* 是否必填:否
* 类型string[1,32]
* 描述:
* 开始时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "begin_time")
private String beginTime;
/**
* <pre>
* 字段名:结束时间
* 变量名end_time
* 是否必填:否
* 类型string[1,32]
* 描述:
* 结束时间遵循rfc3339标准格式格式为YYYY-MM-DDTHH:mm:ss+TIMEZONEYYYY-MM-DD表示年月日T出现在字符串中表示time元素的开头HH:mm:ss表示时分秒TIMEZONE表示时区+08:00表示东八区时间领先UTC 8小时即北京时间。例如2015-05-20T13:29:35+08:00表示北京时间2015年5月20日 13点29分35秒。
* 示例值2015-05-20T13:29:35+08:00
* </pre>
*/
@SerializedName(value = "end_time")
private String endTime;
}

View File

@@ -0,0 +1,36 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 事件通知配置
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class NotifyConfig implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名事件通知appid
* 变量名coupon_image_url
* 是否必填:否
* 类型string[1,64]
* 描述:
* 用于回调通知时计算返回操作用户的openid诸如领券用户支持小程序or公众号的APPID如该字段不填写则回调通知中涉及到用户身份信息的openid与unionid都将为空。
* 示例值wx23232232323
* </pre>
*/
@SerializedName(value = "notify_appid")
private String notifyAppId;
}

View File

@@ -0,0 +1,131 @@
package com.github.binarywang.wxpay.bean.marketing.busifavor;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 券发放相关规则
* <pre>
* 文档地址https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* </pre>
*
* @author yujam
*/
@Data
@NoArgsConstructor
public class StockSendRule implements Serializable {
private static final long serialVersionUID = 1L;
/**
* <pre>
* 字段名:批次最大发放个数
* 变量名max_coupons
* 是否必填:是
* 类型int
* 描述:
* 批次最大可发放个数限制
* 特殊规则:取值范围 1 ≤ value ≤ 1000000000
* 示例值100
* </pre>
*/
@SerializedName(value = "max_coupons")
private Integer maxCoupons;
/**
* <pre>
* 字段名:用户最大可领个数
* 变量名max_coupons_per_user
* 是否必填:是
* 类型int
* 描述:
* 用户可领个数每个用户最多100张券 。
* 示例值5
* </pre>
*/
@SerializedName(value = "max_coupons_per_user")
private Integer maxCouponsPerUser;
/**
* <pre>
* 字段名:单天发放上限个数
* 变量名max_coupons_by_day
* 是否必填:否
* 类型bool
* 描述:
* 单天发放上限个数stock_type为DISCOUNT或EXCHANGE时可传入此字段控制单天发放上限
* 特殊规则:取值范围 1 ≤ value ≤ 1000000000
* 示例值100
* </pre>
*/
@SerializedName(value = "max_coupons_by_day")
private Integer maxCouponsByDay;
/**
* <pre>
* 字段名:是否开启自然人限制
* 变量名natural_person_limit
* 是否必填:否
* 类型bool
* 描述:
* 不填默认否,枚举值:
* true
* false
* 示例值false
* </pre>
*/
@SerializedName(value = "natural_person_limit")
private Boolean naturalPersonLimit;
/**
* <pre>
* 字段名:可疑账号拦截
* 变量名prevent_api_abuse
* 是否必填:否
* 类型bool
* 描述:
* 不填默认否,枚举值:
* true
* false
* 示例值false
* </pre>
*/
@SerializedName(value = "prevent_api_abuse")
private Boolean preventApiAbuse;
/**
* <pre>
* 字段名:是否允许转赠
* 变量名transferable
* 是否必填:否
* 类型bool
* 描述:
* 不填默认否,枚举值:
* true
* false
* 该字段暂未开放
* 示例值false
* </pre>
*/
@SerializedName(value = "transferable")
private Boolean transferable;
/**
* <pre>
* 字段名:是否允许分享链接
* 变量名shareable
* 是否必填:否
* 类型bool
* 描述:
* 不填默认否,枚举值:
* true
* false
* 该字段暂未开放
* 示例值false
* </pre>
*/
@SerializedName(value = "shareable")
private Boolean shareable;
}

View File

@@ -6,7 +6,7 @@ import lombok.Getter;
/**
* 批次类型
*
* @author thinsstar
* @author yujam
*/
@Getter
@AllArgsConstructor
@@ -16,7 +16,16 @@ public enum StockTypeEnum {
* NORMAL固定面额满减券批次
*/
NORMAL("NORMAL"),
;
/**
* DISCOUNT折扣券批次
*/
DISCOUNT("DISCOUNT"),
/**
* EXCHANGE换购券批次
*/
EXCHANGE("EXCHANGE");
/**
* 批次类型

View File

@@ -0,0 +1,250 @@
package com.github.binarywang.wxpay.service;
import com.github.binarywang.wxpay.bean.marketing.*;
import com.github.binarywang.wxpay.exception.WxPayException;
/**
* <pre>
* 微信支付营销商家券接口
* </pre>
*
* @author yujam
*/
public interface MarketingBusiFavorService {
/**
* <pre>
* 商家券接口-创建商家券API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_1.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/stocks
* </pre>
*
* @param request 请求对象 {@link BusiFavorStocksCreateRequest}
* @return FavorStocksResult 微信返回的批次号信息。
* @throws WxPayException the wx pay exception
*/
BusiFavorStocksCreateResult createBusiFavorStocksV3(BusiFavorStocksCreateRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-查询商家券详情API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_2.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/stocks/{stock_id}
* </pre>
*
* @param stockId 微信为每个商家券批次分配的唯一ID
* @return BusiFavorStocksGetResult 微信返回的批次号信息。 {@link BusiFavorStocksGetResult}
* @throws WxPayException the wx pay exception
*/
BusiFavorStocksGetResult getBusiFavorStocksV3(String stockId) throws WxPayException;
/**
* <pre>
* 商家券接口-核销用户券API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_3.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/coupons/use
* </pre>
*
* @param request 请求对象 {@link BusiFavorCouponsUseRequest}
* @return BusiFavorCouponsUseResult 微信返回的信息。
* @throws WxPayException the wx pay exception
*/
BusiFavorCouponsUseResult verifyBusiFavorCouponsUseV3(BusiFavorCouponsUseRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-H5发券API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_4_1.shtml
* 接口链接https://action.weixin.qq.com/busifavor/getcouponinfo
* </pre>
*
* @param request 请求对象 {@link BusiFavorCouponsUrlRequest}
* @return String H5领券地址
* @throws WxPayException the wx pay exception
*/
String buildBusiFavorCouponinfoUrl(BusiFavorCouponsUrlRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-根据过滤条件查询用户券API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_4.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/users/{openid}/coupons
* </pre>
*
* @param request 请求对象 {@link BusiFavorQueryUserCouponsRequest}
* @return BusiFavorQueryUserCouponsResult
* @throws WxPayException the wx pay exception
*/
BusiFavorQueryUserCouponsResult queryBusiFavorUsersCoupons(BusiFavorQueryUserCouponsRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-查询用户单张券详情API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_5.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/users/{openid}/coupons/{coupon_code}/appids/{appid}
* </pre>
*
* @param request 请求对象 {@link BusiFavorQueryOneUserCouponsResult}
* @return BusiFavorQueryOneUserCouponsRequest
* @throws WxPayException the wx pay exception
*/
BusiFavorQueryOneUserCouponsResult queryOneBusiFavorUsersCoupons(BusiFavorQueryOneUserCouponsRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-上传预存code API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_6.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/stocks/{stock_id}/couponcodes
* </pre>
*
* @param stockId 批次号
* @param request 请求对象 {@link BusiFavorCouponCodeRequest}
* @return BusiFavorCouponCodeResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCouponCodeResult uploadBusiFavorCouponCodes(String stockId, BusiFavorCouponCodeRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-设置商家券事件通知地址 API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_7.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/callbacks
* </pre>
*
* @param request 请求对象 {@link BusiFavorCallbacksRequest}
* @return BusiFavorCallbacksResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCallbacksResult createBusiFavorCallbacks(BusiFavorCallbacksRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-查询商家券事件通知地址 API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_8.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/callbacks
* </pre>
*
* @param request 请求对象 {@link BusiFavorCallbacksRequest}
* @return BusiFavorCallbacksResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCallbacksResult queryBusiFavorCallbacks(BusiFavorCallbacksRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-关联订单信息 API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_9.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/coupons/associate
* </pre>
*
* @param request 请求对象 {@link BusiFavorCouponsAssociateRequest}
* @return BusiFavorCouponsAssociateResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCouponsAssociateResult queryBusiFavorCouponsAssociate(BusiFavorCouponsAssociateRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-取消关联订单信息 API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_10.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/coupons/disassociate
* </pre>
*
* @param request 请求对象 {@link BusiFavorCouponsAssociateRequest}
* @return BusiFavorCouponsAssociateResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCouponsAssociateResult queryBusiFavorCouponsDisAssociate(BusiFavorCouponsAssociateRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-修改批次预算 API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_11.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/stocks/{stock_id}/budget
* </pre>
*
* @param stockId 批次号
* @param request 请求对象 {@link BusiFavorStocksBudgetRequest}
* @return BusiFavorStocksBudgetResult
* @throws WxPayException the wx pay exception
*/
BusiFavorStocksBudgetResult updateBusiFavorStocksBudget(String stockId, BusiFavorStocksBudgetRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-创建商家券API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_12.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/stocks/{stock_id}
* </pre>
*
* @param stockId 批次号
* @param request 请求对象 {@link BusiFavorStocksCreateRequest}
* @return String 处理成功 应答无内容。
* @throws WxPayException the wx pay exception
*/
String updateBusiFavorStocksV3(String stockId, BusiFavorStocksCreateRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-申请退款API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_13.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/coupons/return
* </pre>
*
* @param request 请求对象 {@link BusiFavorCouponsReturnRequest}
* @return BusiFavorCouponsReturnResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCouponsReturnResult returnBusiFavorCoupons(BusiFavorCouponsReturnRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-使券失效API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_15.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/coupons/deactivate
* </pre>
*
* @param request 请求对象 {@link BusiFavorCouponsDeactivateRequest}
* @return BusiFavorCouponsDeactivateResult
* @throws WxPayException the wx pay exception
*/
BusiFavorCouponsDeactivateResult deactiveBusiFavorCoupons(BusiFavorCouponsDeactivateRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-营销补差付款API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_16.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/subsidy/pay-receipts
* </pre>
*
* @param request 请求对象 {@link BusiFavorSubsidyResult}
* @return BusiFavorSubsidyRequest
* @throws WxPayException the wx pay exception
*/
BusiFavorSubsidyResult subsidyBusiFavorPayReceipts(BusiFavorSubsidyRequest request) throws WxPayException;
/**
* <pre>
* 商家券接口-查询营销补差付款单详情API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_17.shtml
* 接口链接https://api.mch.weixin.qq.com/v3/marketing/busifavor/subsidy/pay-receipts/{subsidy_receipt_id}
* </pre>
*
* @param subsidyReceiptId 补差付款唯一单号
* @return BusiFavorSubsidyRequest
* @throws WxPayException the wx pay exception
*/
BusiFavorSubsidyResult queryBusiFavorSubsidyPayReceipts(String subsidyReceiptId) throws WxPayException;
/**
* <pre>
* 商家券接口-领券事件回调通知API
* 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_2_15.shtml
* </pre>
*
* @param url 回调地址
* @param request 领券事件回调通知请求对象
* @return BusiFavorNotifyResult
* @throws WxPayException the wx pay exception
*/
BusiFavorNotifyResult notifyBusiFavor(String url, BusiFavorNotifyRequest request) throws WxPayException;
}

View File

@@ -38,7 +38,7 @@ public interface WxPayService {
/**
* Map里 加入新的 {@link WxPayConfig},适用于动态添加新的微信公众号配置.
*
* @param mchId 商户号id
* @param mchId 商户号id
* @param wxPayConfig 新的微信配置
*/
void addConfig(String mchId, WxPayConfig wxPayConfig);
@@ -62,7 +62,7 @@ public interface WxPayService {
* 注入多个 {@link WxPayConfig} 的实现. 并为每个 {@link WxPayConfig} 赋予不同的 {@link String label} 值
*
* @param wxPayConfigs WxPayConfig map
* @param defaultMchId 设置一个{@link WxPayConfig} 所对应的{@link String mchId}进行Http初始化
* @param defaultMchId 设置一个{@link WxPayConfig} 所对应的{@link String mchId}进行Http初始化
*/
void setMultiConfig(Map<String, WxPayConfig> wxPayConfigs, String defaultMchId);
@@ -114,6 +114,16 @@ public interface WxPayService {
*/
String postV3(String url, String requestStr) throws WxPayException;
/**
* 发送patch请求得到响应字符串.
*
* @param url 请求地址
* @param requestStr 请求信息
* @return 返回请求结果字符串 string
* @throws WxPayException the wx pay exception
*/
String patchV3(String url, String requestStr) throws WxPayException;
/**
* 发送post请求得到响应字符串.
* <p>
@@ -139,7 +149,7 @@ public interface WxPayService {
/**
* 发送http请求得到响应字符串.
*
* @param url 请求地址
* @param url 请求地址
* @param httpRequest 请求信息可以是putpostgetdelete等请求
* @return 返回请求结果字符串 string
* @throws WxPayException the wx pay exception
@@ -228,6 +238,13 @@ public interface WxPayService {
*/
MarketingFavorService getMarketingFavorService();
/**
* 获取微信支付营销商家券服务类
*
* @return the marketing favor service
*/
MarketingBusiFavorService getMarketingBusiFavorService();
/**
* 设置企业付款服务类,允许开发者自定义实现类.
*
@@ -350,7 +367,7 @@ public interface WxPayService {
* @param request 请求对象注意一些参数如appid、mchid等不用设置方法内会自动从配置对象中获取到前提是对应配置中已经设置
* @return the pay info
* @throws WxPayException the wx pay exception
* @deprecated 建议使用 {@link com.github.binarywang.wxpay.service.WxPayService#createOrder(WxPayUnifiedOrderRequest)}
* @deprecated 建议使用 {@link WxPayService#createOrder(WxPayUnifiedOrderRequest)}
*/
@Deprecated
Map<String, String> getPayInfo(WxPayUnifiedOrderRequest request) throws WxPayException;

View File

@@ -66,6 +66,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
private final MerchantMediaService merchantMediaService = new MerchantMediaServiceImpl(this);
private final MarketingMediaService marketingMediaService = new MarketingMediaServiceImpl(this);
private final MarketingFavorService marketingFavorService = new MarketingFavorServiceImpl(this);
private final MarketingBusiFavorService marketingBusiFavorService = new MarketingBusiFavorServiceImpl(this);
protected Map<String, WxPayConfig> configMap;
@@ -114,6 +115,11 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
return this.marketingFavorService;
}
@Override
public MarketingBusiFavorService getMarketingBusiFavorService() {
return this.marketingBusiFavorService;
}
@Override
public void setEntPayService(EntPayService entPayService) {
this.entPayService = entPayService;

View File

@@ -0,0 +1,190 @@
package com.github.binarywang.wxpay.service.impl;
import com.github.binarywang.wxpay.bean.marketing.*;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.MarketingBusiFavorService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.util.SignUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 微信支付-营销商家券接口
*
* @author yujam
*/
@Slf4j
@RequiredArgsConstructor
public class MarketingBusiFavorServiceImpl implements MarketingBusiFavorService {
private static final Gson GSON = new GsonBuilder().create();
private final WxPayService payService;
@Override
public BusiFavorStocksCreateResult createBusiFavorStocksV3(BusiFavorStocksCreateRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/stocks", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorStocksCreateResult.class);
}
@Override
public BusiFavorStocksGetResult getBusiFavorStocksV3(String stockId) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/stocks/%s", this.payService.getPayBaseUrl(), stockId);
String result = this.payService.getV3(url);
return GSON.fromJson(result, BusiFavorStocksGetResult.class);
}
@Override
public BusiFavorCouponsUseResult verifyBusiFavorCouponsUseV3(BusiFavorCouponsUseRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/coupons/use", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCouponsUseResult.class);
}
@Override
public String buildBusiFavorCouponinfoUrl(BusiFavorCouponsUrlRequest request) throws WxPayException {
Map<String, String> signMap = new HashMap<>(8);
signMap.put("out_request_no", request.getOutRequestNo());
signMap.put("stock_id", request.getStockId());
signMap.put("send_coupon_merchant", request.getSendCouponMerchant());
signMap.put("open_id", request.getOpenid());
String sign = SignUtils.createSign(signMap, WxPayConstants.SignType.HMAC_SHA256, this.payService.getConfig().getMchKey(), null);
String actionBaseUrl = "https://action.weixin.qq.com";
return String.format("%s/busifavor/getcouponinfo?stock_id=%s&out_request_no=%s&sign=%s&send_coupon_merchant=%s&open_id=%s#wechat_redirect",
actionBaseUrl, request.getStockId(), request.getOutRequestNo(), sign, request.getSendCouponMerchant(), request.getOpenid());
}
@Override
public BusiFavorQueryUserCouponsResult queryBusiFavorUsersCoupons(BusiFavorQueryUserCouponsRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/users/%s/coupons", this.payService.getPayBaseUrl(), request.getOpenid());
if (request.getOffset() == null) {
request.setOffset(0);
}
if (request.getLimit() == null || request.getLimit() <= 0) {
request.setLimit(20);
}
String query = String.format("?appid=%s&offset=%s&limit=%s", request.getAppid(), request.getOffset(), request.getLimit());
if (StringUtils.isNotBlank(request.getStockId())) {
query += "&stock_id=" + request.getStockId();
}
if (StringUtils.isNotBlank(request.getCouponState())) {
query += "&coupon_state=" + request.getCouponState();
}
if (StringUtils.isNotBlank(request.getCreatorMerchant())) {
query += "&creator_merchant=" + request.getCreatorMerchant();
}
if (StringUtils.isNotBlank(request.getBelongMerchant())) {
query += "&belong_merchant=" + request.getBelongMerchant();
}
if (StringUtils.isNotBlank(request.getSenderMerchant())) {
query += "&sender_merchant=" + request.getSenderMerchant();
}
String result = this.payService.getV3(url + query);
return GSON.fromJson(result, BusiFavorQueryUserCouponsResult.class);
}
@Override
public BusiFavorQueryOneUserCouponsResult queryOneBusiFavorUsersCoupons(BusiFavorQueryOneUserCouponsRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/users/%s/coupons/%s/appids/%s", this.payService.getPayBaseUrl(), request.getOpenid(), request.getCouponCode(), request.getAppid());
String result = this.payService.getV3(url);
return GSON.fromJson(result, BusiFavorQueryOneUserCouponsResult.class);
}
@Override
public BusiFavorCouponCodeResult uploadBusiFavorCouponCodes(String stockId, BusiFavorCouponCodeRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/stocks/%s/couponcodes", this.payService.getPayBaseUrl(), stockId);
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCouponCodeResult.class);
}
@Override
public BusiFavorCallbacksResult createBusiFavorCallbacks(BusiFavorCallbacksRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/callbacks", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCallbacksResult.class);
}
@Override
public BusiFavorCallbacksResult queryBusiFavorCallbacks(BusiFavorCallbacksRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/callbacks", this.payService.getPayBaseUrl());
if (StringUtils.isNotBlank(request.getMchid())) {
url += "?mchid=" + request.getMchid();
}
String result = this.payService.getV3(url);
return GSON.fromJson(result, BusiFavorCallbacksResult.class);
}
@Override
public BusiFavorCouponsAssociateResult queryBusiFavorCouponsAssociate(BusiFavorCouponsAssociateRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/coupons/associate", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCouponsAssociateResult.class);
}
@Override
public BusiFavorCouponsAssociateResult queryBusiFavorCouponsDisAssociate(BusiFavorCouponsAssociateRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/coupons/disassociate", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCouponsAssociateResult.class);
}
@Override
public BusiFavorStocksBudgetResult updateBusiFavorStocksBudget(String stockId, BusiFavorStocksBudgetRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/stocks/%s/budget", this.payService.getPayBaseUrl(), stockId);
String result = payService.patchV3(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorStocksBudgetResult.class);
}
@Override
public String updateBusiFavorStocksV3(String stockId, BusiFavorStocksCreateRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/stocks/%s", this.payService.getPayBaseUrl(), stockId);
return this.payService.patchV3(url, GSON.toJson(request));
}
@Override
public BusiFavorCouponsReturnResult returnBusiFavorCoupons(BusiFavorCouponsReturnRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/coupons/return", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCouponsReturnResult.class);
}
@Override
public BusiFavorCouponsDeactivateResult deactiveBusiFavorCoupons(BusiFavorCouponsDeactivateRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/coupons/deactivate", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorCouponsDeactivateResult.class);
}
@Override
public BusiFavorSubsidyResult subsidyBusiFavorPayReceipts(BusiFavorSubsidyRequest request) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/subsidy/pay-receipts", this.payService.getPayBaseUrl());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorSubsidyResult.class);
}
@Override
public BusiFavorSubsidyResult queryBusiFavorSubsidyPayReceipts(String subsidyReceiptId) throws WxPayException {
String url = String.format("%s/v3/marketing/busifavor/subsidy/pay-receipts/%s", this.payService.getPayBaseUrl(), subsidyReceiptId);
String result = this.payService.getV3(url);
return GSON.fromJson(result, BusiFavorSubsidyResult.class);
}
@Override
public BusiFavorNotifyResult notifyBusiFavor(String url, BusiFavorNotifyRequest request) throws WxPayException {
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, BusiFavorNotifyResult.class);
}
}

View File

@@ -13,10 +13,7 @@ import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.*;
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
@@ -125,6 +122,46 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
}
@Override
public String patchV3(String url, String requestStr) throws WxPayException {
CloseableHttpClient httpClient = this.createApiV3HttpClient();
HttpPatch httpPatch = new HttpPatch(url);
httpPatch.setEntity(this.createEntry(requestStr));
httpPatch.setConfig(RequestConfig.custom()
.setConnectionRequestTimeout(this.getConfig().getHttpConnectionTimeout())
.setConnectTimeout(this.getConfig().getHttpConnectionTimeout())
.setSocketTimeout(this.getConfig().getHttpTimeout())
.build());
httpPatch.addHeader("Accept", "application/json");
httpPatch.addHeader("Content-Type", "application/json");
try (CloseableHttpResponse response = httpClient.execute(httpPatch)) {
//v3已经改为通过状态码判断200 204 成功
int statusCode = response.getStatusLine().getStatusCode();
//post方法有可能会没有返回值的情况
String responseString;
if (response.getEntity() == null) {
responseString = null;
} else {
responseString = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
}
if (HttpStatus.SC_OK == statusCode || HttpStatus.SC_NO_CONTENT == statusCode) {
this.log.info("\n【请求地址】{}\n【请求数据】{}\n【响应数据】{}", url, requestStr, responseString);
return responseString;
} else {
//有错误提示信息返回
JsonObject jsonObject = GsonParser.parse(responseString);
throw convertException(jsonObject);
}
} catch (Exception e) {
this.log.error("\n【请求地址】{}\n【请求数据】{}\n【异常信息】{}", url, requestStr, e.getMessage());
throw (e instanceof WxPayException) ? (WxPayException) e : new WxPayException(e.getMessage(), e);
} finally {
httpPatch.releaseConnection();
}
}
@Override
public String postV3WithWechatpaySerial(String url, String requestStr) throws WxPayException {
CloseableHttpClient httpClient = this.createApiV3HttpClient();

View File

@@ -66,6 +66,11 @@ public class WxPayServiceJoddHttpImpl extends BaseWxPayServiceImpl {
return null;
}
@Override
public String patchV3(String url, String requestStr) throws WxPayException {
return null;
}
@Override
public String postV3WithWechatpaySerial(String url, String requestStr) throws WxPayException {
return null;

View File

@@ -0,0 +1,292 @@
package com.github.binarywang.wxpay.service.impl;
import com.github.binarywang.wxpay.bean.marketing.*;
import com.github.binarywang.wxpay.bean.marketing.busifavor.CouponAvailableTime;
import com.github.binarywang.wxpay.bean.marketing.busifavor.CouponUseRule;
import com.github.binarywang.wxpay.bean.marketing.busifavor.FixedNormalCoupon;
import com.github.binarywang.wxpay.bean.marketing.busifavor.StockSendRule;
import com.github.binarywang.wxpay.bean.marketing.enums.StockTypeEnum;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.testbase.ApiTestModule;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
/**
* <pre>
* 营销工具代金券测试类
* </pre>
*
* @author thinsstar
*/
@Slf4j
@Test
@Guice(modules = ApiTestModule.class)
public class MarketingBusiFavorServiceImplTest {
@Inject
private WxPayService wxPayService;
private static final Gson GSON = new GsonBuilder().create();
private final String stockId = "1252430000000013";
private final String appId = "wxb3d189e6a9160863";
private final String openId = "o3zqj1XFQBg4ju-cMs0AOqVYG0ow";
@Test
public void testCreateFavorStocksV3() throws WxPayException {
BusiFavorStocksCreateRequest request = new BusiFavorStocksCreateRequest();
request.setStockName("买价值984元3大罐送价值316元2小罐");
request.setBelongMerchant(wxPayService.getConfig().getMchId());
request.setComment("买价值984元3大罐送价值316元2小罐");
request.setGoodsName("仅供安满品牌商品使用");
request.setCouponCodeMode("WECHATPAY_MODE");
request.setOutRequestNo(wxPayService.getConfig().getMchId() + "20210204" + "1234567891");
//核销规则
CouponUseRule couponUseRule = new CouponUseRule();
//线下核销
couponUseRule.setUseMethod("OFF_LINE");
//券可核销时间
CouponAvailableTime couponAvailableTime = new CouponAvailableTime();
couponAvailableTime.setAvailableBeginTime("2021-05-20T13:29:35+08:00");
couponAvailableTime.setAvailableEndTime("2021-05-21T13:29:35+08:00");
couponUseRule.setCouponAvailableTime(couponAvailableTime);
//固定面额满减券
request.setStockType(StockTypeEnum.NORMAL);
FixedNormalCoupon fixedNormalCoupon = new FixedNormalCoupon();
fixedNormalCoupon.setDiscountAmount(31600);
fixedNormalCoupon.setTransactionMinimum(98400);
couponUseRule.setFixedNormalCoupon(fixedNormalCoupon);
request.setCouponUseRule(couponUseRule);
//发放规则
StockSendRule stockSendRule = new StockSendRule();
stockSendRule.setMaxCoupons(100);
stockSendRule.setMaxCouponsPerUser(5);
request.setStockSendRule(stockSendRule);
BusiFavorStocksCreateResult result = wxPayService.getMarketingBusiFavorService().createBusiFavorStocksV3(request);
String stockId = result.getStockId();
log.info("stockId: [{}]", stockId);
}
@Test
public void testGetBusiFavorStocksV3() throws WxPayException {
BusiFavorStocksGetResult result = wxPayService.getMarketingBusiFavorService().getBusiFavorStocksV3("1252430000000012");
log.info("result: {}", GSON.toJson(result));
}
@Test
public void testVerifyBusiFavorCouponsUseV3() throws WxPayException {
BusiFavorCouponsUseRequest request = new BusiFavorCouponsUseRequest();
request.setCouponCode("sxxe34343434");
request.setAppId("wx1234567889999");
request.setUseTime("2015-05-20T13:29:35+08:00");
request.setUseRequestNo("1002600620019090123143254435");
BusiFavorCouponsUseResult result = wxPayService.getMarketingBusiFavorService().verifyBusiFavorCouponsUseV3(request);
log.info("result: {}", GSON.toJson(result));
}
@Test
public void testBuildBusiFavorCouponinfoUrl() throws WxPayException {
BusiFavorCouponsUrlRequest request = new BusiFavorCouponsUrlRequest();
request.setOpenid(openId);
request.setOutRequestNo("100002322019090134242");
request.setSendCouponMerchant("1466573302");
request.setStockId(stockId);
String result = wxPayService.getMarketingBusiFavorService().buildBusiFavorCouponinfoUrl(request);
log.info("result: {}", result);
}
@Test
public void testQueryBusiFavorUsersCoupons() throws WxPayException {
BusiFavorQueryUserCouponsRequest request = new BusiFavorQueryUserCouponsRequest();
request.setOpenid(openId);
request.setAppid(appId);
request.setStockId("9865000");
request.setCouponState("USED");
request.setCreatorMerchant("1466573302");
BusiFavorQueryUserCouponsResult result = wxPayService.getMarketingBusiFavorService().queryBusiFavorUsersCoupons(request);
log.info("result: {}", result);
}
@Test
public void testQueryOneBusiFavorUsersCoupons() throws WxPayException {
BusiFavorQueryOneUserCouponsRequest request = new BusiFavorQueryOneUserCouponsRequest();
request.setOpenid(openId);
request.setAppid(appId);
request.setCouponCode("123446565767");
BusiFavorQueryOneUserCouponsResult result = wxPayService.getMarketingBusiFavorService().queryOneBusiFavorUsersCoupons(request);
log.info("result: {}", result);
}
@Test
public void testUploadBusiFavorCouponCodes() throws WxPayException {
BusiFavorCouponCodeRequest request = new BusiFavorCouponCodeRequest();
request.setCouponCodeList(Lists.newArrayList("123"));
request.setUploadRequestNo("upload_request_no");
BusiFavorCouponCodeResult result = wxPayService.getMarketingBusiFavorService().uploadBusiFavorCouponCodes("98065001", request);
log.info("result: {}", result);
}
@Test
public void testCreateBusiFavorCallbacks() throws WxPayException {
BusiFavorCallbacksRequest request = new BusiFavorCallbacksRequest();
request.setMchid(wxPayService.getConfig().getMchId());
request.setNotifyUrl("https://ww.sd");
BusiFavorCallbacksResult result = wxPayService.getMarketingBusiFavorService().createBusiFavorCallbacks(request);
log.info("result: {}", result);
}
@Test
public void testQueryBusiFavorCallbacks() throws WxPayException {
BusiFavorCallbacksRequest request = new BusiFavorCallbacksRequest();
request.setMchid(wxPayService.getConfig().getMchId());
BusiFavorCallbacksResult result = wxPayService.getMarketingBusiFavorService().queryBusiFavorCallbacks(request);
log.info("result: {}", result);
}
@Test
public void testQueryBusiFavorCouponsAssociate() throws WxPayException {
BusiFavorCouponsAssociateRequest request = new BusiFavorCouponsAssociateRequest();
request.setStockId("100088");
request.setCouponCode("sxxe34343434");
request.setOutTradeNo("MCH_102233445");
request.setOutRequestNo("1002600620019090123143254435");
BusiFavorCouponsAssociateResult result = wxPayService.getMarketingBusiFavorService().queryBusiFavorCouponsAssociate(request);
log.info("result: {}", result);
}
@Test
public void testQueryBusiFavorCouponsDisassociate() throws WxPayException {
BusiFavorCouponsAssociateRequest request = new BusiFavorCouponsAssociateRequest();
request.setStockId("100088");
request.setCouponCode("sxxe34343434");
request.setOutTradeNo("MCH_102233445");
request.setOutRequestNo("1002600620019090123143254435");
BusiFavorCouponsAssociateResult result = wxPayService.getMarketingBusiFavorService().queryBusiFavorCouponsDisAssociate(request);
log.info("result: {}", result);
}
@Test
public void testUpdateBusiFavorStocksBudget() throws WxPayException {
BusiFavorStocksBudgetRequest request = new BusiFavorStocksBudgetRequest();
request.setTargetMaxCoupons(10);
request.setCurrentMaxCoupons(4);
request.setModifyBudgetRequestNo("1002600620019090123143254436");
BusiFavorStocksBudgetResult result = wxPayService.getMarketingBusiFavorService().updateBusiFavorStocksBudget("98065001", request);
log.info("result: {}", result);
}
@Test
public void testUpdateFavorStocksV3() throws WxPayException {
BusiFavorStocksCreateRequest request = new BusiFavorStocksCreateRequest();
request.setStockName("买价值984元3大罐送价值316元2小罐1");
request.setComment("买价值984元3大罐送价值316元2小罐");
request.setGoodsName("仅供安满品牌商品使用");
request.setOutRequestNo(wxPayService.getConfig().getMchId() + "20210204" + "1234567890");
// //核销规则
// CouponUseRule couponUseRule = new CouponUseRule();
// //线下核销
// couponUseRule.setUseMethod("OFF_LINE");
//
// //券可核销时间
// CouponAvailableTime couponAvailableTime = new CouponAvailableTime();
// couponAvailableTime.setAvailableBeginTime("2021-05-20T13:29:35+08:00");
// couponAvailableTime.setAvailableEndTime("2021-05-21T13:29:35+08:00");
// couponUseRule.setCouponAvailableTime(couponAvailableTime);
//
// //固定面额满减券
// request.setStockType(StockTypeEnum.NORMAL);
// FixedNormalCoupon fixedNormalCoupon = new FixedNormalCoupon();
// fixedNormalCoupon.setDiscountAmount(31600);
// fixedNormalCoupon.setTransactionMinimum(98400);
// couponUseRule.setFixedNormalCoupon(fixedNormalCoupon);
// request.setCouponUseRule(couponUseRule);
//
// //发放规则
// StockSendRule stockSendRule = new StockSendRule();
// stockSendRule.setMaxCoupons(100);
// stockSendRule.setMaxCouponsPerUser(5);
// request.setStockSendRule(stockSendRule);
String result = wxPayService.getMarketingBusiFavorService().updateBusiFavorStocksV3("1252430000000012", request);
log.info("result: [{}]", result);
}
@Test
public void testReturnBusiFavorCoupons() throws WxPayException {
BusiFavorCouponsReturnRequest request = new BusiFavorCouponsReturnRequest();
request.setReturnRequestNo("1002600620019090123143254436");
request.setStockId("1234567891");
request.setCouponCode("sxxe34343434");
BusiFavorCouponsReturnResult result = wxPayService.getMarketingBusiFavorService().returnBusiFavorCoupons(request);
log.info("result: {}", result);
}
@Test
public void testDeactivateBusiFavorCoupons() throws WxPayException {
BusiFavorCouponsDeactivateRequest request = new BusiFavorCouponsDeactivateRequest();
request.setDeactivateRequestNo("1002600620019090123143254436");
request.setDeactivateReason("此券使用时间设置错误");
request.setStockId("1234567891");
request.setCouponCode("sxxe34343434");
BusiFavorCouponsDeactivateResult result = wxPayService.getMarketingBusiFavorService().deactiveBusiFavorCoupons(request);
log.info("result: {}", result);
}
@Test
public void testSubsidyBusiFavorPayReceipts() throws WxPayException {
BusiFavorSubsidyRequest request = new BusiFavorSubsidyRequest();
request.setStockId("128888000000001");
request.setCouponCode("ABCD12345678");
request.setTransactionId("4200000913202101152566792388");
request.setPayeeMerchant("1466573302");
request.setPayerMerchant("1466573302");
request.setAmount(100);
request.setDescription("20210115DESCRIPTION");
request.setOutSubsidyNo("subsidy-abcd-12345678");
BusiFavorSubsidyResult result = wxPayService.getMarketingBusiFavorService().subsidyBusiFavorPayReceipts(request);
log.info("result: {}", result);
}
@Test
public void testQueryBusiFavorSubsidyPayReceipts() throws WxPayException {
BusiFavorSubsidyResult result = wxPayService.getMarketingBusiFavorService().queryBusiFavorSubsidyPayReceipts("1120200119165100000000000001");
log.info("result: {}", result);
}
@Test
public void testNotifyBusiFavor() throws WxPayException {
BusiFavorNotifyRequest request = new BusiFavorNotifyRequest();
request.setId("8b33f79f-8869-5ae5-b41b-3c0b59f957d0");
request.setCreateTime("2019-12-12T16:54:38+08:00");
request.setEventType("COUPON.SEND");
request.setResourceType("encrypt-resource");
BusiFavorNotifyResult result = wxPayService.getMarketingBusiFavorService().notifyBusiFavor("https://www.yujam.com", request);
log.info("result: {}", result);
}
}