🆕 #2257【微信支付】增加微信签约代扣相关接口

This commit is contained in:
po
2021-08-13 17:53:01 +08:00
committed by GitHub
parent ed6bd016f5
commit 3f42a162c2
22 changed files with 3014 additions and 0 deletions

View File

@@ -0,0 +1,193 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:12 下午
*
* <pre>
* 微信h5纯签约入参
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxH5EntrustRequest extends BaseWxPayRequest {
/**
* <pre>
* 协议模板ID
* plan_id
* 是
* String(28)
* 12535
* 协议模板ID分为首次签约支付中签约重新签约
* </pre>
*/
@Required
@XStreamAlias("plan_id")
private String planId;
/**
* <pre>
* 签约协议号
* contract_code
* 是
* String(32)
* 100000
* 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
* </pre>
*/
@Required
@XStreamAlias("contract_code")
private String contractCode;
/**
* <pre>
* 请求序列号
* request_serial
* 是
* int(64)
* 1000
* 商户请求签约时的序列号要求唯一性禁止使用0开头的用户排序纯数字
* </pre>
*/
@Required
@XStreamAlias("request_serial")
private Long requestSerial;
/**
* <pre>
* 用户账户展示名称
* contract_display_account
* 是
* string(32)
* 微信代扣
* 签约用户的名称,用户页面展示,不支持符号表情
* </pre>
*/
@Required
@XStreamAlias("contract_display_account")
private String contractDisplayAccount;
/**
* <pre>
* 回调通知URL
* notify_url
* 是
* string(256)
* https://weixin.qq.com
* 用于接收签约成功消息的回调通知地址
* </pre>
*/
@Required
@XStreamAlias("notify_url")
private String notifyUrl;
/**
* <pre>
* 版本号
* sign
* 是
* string(8)
* 1.0
* 固定值1.0
* </pre>
*/
@Required
@XStreamAlias("version")
private String version;
/**
* <pre>
* 时间戳
* timestamp
* 是
* string(10)
* 1414488825
* 系统当前时间10位
* </pre>
*/
@Required
@XStreamAlias("timestamp")
private String timestamp;
/**
* <pre>
* 客户端IP
* clientip
* 是
* string(32)
* 127.0.0.1
* 用户客户端的IP地址
* </pre>
*/
@Required
@XStreamAlias("clientip")
private String clientIp;
/**
* <pre>
* 回调应用appid
* return_appid
* 否
* string(32)
* wxcbda96de0b16
* 用来控制签约页面结束后的返回路径,
* 当指定该字段是签约成功将返回return_appid指定的APP应用如果不填且签约发起的浏览器ua可被微信识别
* 则挑战到浏览器,否则留在微信
* </pre>
*/
@XStreamAlias("return_appid")
private String returnAppid;
/**
* <pre>
* 商户测用户标识
* outerid
* 否
* string(32)
* 陈*(10000001)
* 用于多账号签约值与contract_display_account一样就行
* </pre>
*/
@XStreamAlias("outerid")
private String outerId;
/**
* 是否需要nonce_str
*/
@Override
protected boolean needNonceStr() {
return false;
}
@Override
protected void checkConstraints() throws WxPayException {
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("plan_id", planId);
map.put("contract_code", contractCode);
map.put("request_serial", String.valueOf(requestSerial));
map.put("contract_display_account", contractDisplayAccount);
map.put("notify_url", notifyUrl);
map.put("version", version);
map.put("timestamp", timestamp);
map.put("clientip", clientIp);
map.put("return_appid", returnAppid);
map.put("outerid", outerId);
}
}

View File

@@ -0,0 +1,179 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:13 下午
* <pre>
* 小程序纯签约入参
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxMaEntrustRequest extends BaseWxPayRequest {
/**
* <pre>
* 协议模板ID
* plan_id
* 是
* String(28)
* 12535
* 协议模板ID分为首次签约支付中签约重新签约
* </pre>
*/
@Required
@SerializedName(value = "plan_id")
@XStreamAlias("plan_id")
private String planId;
/**
* <pre>
* 签约协议号
* contract_code
* 是
* String(32)
* 100000
* 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
* </pre>
*/
@Required
@SerializedName(value = "contract_code")
@XStreamAlias("contract_code")
private String contractCode;
/**
* <pre>
* 请求序列号
* request_serial
* 是
* int(64)
* 1000
* 商户请求签约时的序列号要求唯一性禁止使用0开头的用户排序纯数字
* </pre>
*/
@Required
@SerializedName(value = "request_serial")
@XStreamAlias("request_serial")
private Long requestSerial;
/**
* <pre>
* 用户账户展示名称
* contract_display_account
* 是
* string(32)
* 微信代扣
* 签约用户的名称,用户页面展示,不支持符号表情
* </pre>
*/
@Required
@SerializedName(value = "contract_display_account")
@XStreamAlias("contract_display_account")
private String contractDisplayAccount;
/**
* <pre>
* 回调通知URL
* notify_url
* 是
* string(256)
* https://weixin.qq.com
* 用于接收签约成功消息的回调通知地址
* </pre>
*/
@Required
@SerializedName(value = "notify_url")
@XStreamAlias("notify_url")
private String notifyUrl;
/**
* <pre>
* 版本号
* sign
* 是
* string(8)
* 1.0
* 固定值1.0
* </pre>
*/
@Required
@XStreamAlias("version")
private String version;
/**
* <pre>
* 时间戳
* timestamp
* 是
* string(10)
* 1414488825
* 系统当前时间10位
* </pre>
*/
@Required
@XStreamAlias("timestamp")
private String timestamp;
/**
* <pre>
* 商户侧用户标识
* outerId
* 否
* String
* 陈*(141448825)
* 用户在商户侧的标识
* </pre>
*/
@XStreamAlias("outerid")
private String outerId;
@Override
protected void checkConstraints() throws WxPayException {
}
/**
* 是否需要nonce_str
*/
@Override
protected boolean needNonceStr() {
return false;
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("plan_id", planId);
map.put("contract_code", contractCode);
map.put("request_serial", String.valueOf(requestSerial));
map.put("contract_display_account", contractDisplayAccount);
map.put("notify_url", notifyUrl);
map.put("timestamp", timestamp);
map.put("outerid", outerId);
}
@Override
public String toString() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = gsonBuilder.create();
return gson.toJson(this);
}
}

View File

@@ -0,0 +1,179 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import java.util.Map;
import java.util.Objects;
/**
* @author chenliang
* @date 2021-08-02 5:17 下午
*
* <pre>
* 公众号纯签约入参
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxMpEntrustRequest extends BaseWxPayRequest {
/**
* <pre>
* 协议模板ID
* plan_id
* 是
* String(28)
* 12535
* 协议模板ID分为首次签约支付中签约重新签约
* </pre>
*/
@Required
@XStreamAlias("plan_id")
private String planId;
/**
* <pre>
* 签约协议号
* contract_code
* 是
* String(32)
* 100000
* 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
* </pre>
*/
@Required
@XStreamAlias("contract_code")
private String contractCode;
/**
* <pre>
* 请求序列号
* request_serial
* 是
* int(64)
* 1000
* 商户请求签约时的序列号要求唯一性禁止使用0开头的用户排序纯数字
* </pre>
*/
@Required
@XStreamAlias("request_serial")
private Long requestSerial;
/**
* <pre>
* 用户账户展示名称
* contract_display_account
* 是
* string(32)
* 微信代扣
* 签约用户的名称,用户页面展示,不支持符号表情
* </pre>
*/
@Required
@XStreamAlias("contract_display_account")
private String contractDisplayAccount;
/**
* <pre>
* 回调通知URL
* notify_url
* 是
* string(256)
* https://weixin.qq.com
* 用于接收签约成功消息的回调通知地址
* </pre>
*/
@Required
@XStreamAlias("notify_url")
private String notifyUrl;
/**
* <pre>
* 版本号
* sign
* 是
* string(8)
* 1.0
* 固定值1.0
* </pre>
*/
@Required
@XStreamAlias("version")
private String version;
/**
* <pre>
* 时间戳
* timestamp
* 是
* string(10)
* 1414488825
* 系统当前时间10位
* </pre>
*/
@Required
@XStreamAlias("timestamp")
private String timestamp;
/**
* <pre>
* 返回web
* return_web
* 否
* int
* 1
* 用来控制签约页面结束后的返回路径不传签约后留在微信内1 表示返回签约页面的referrer url,
* 不填或获取不到referrer则不返回跳转referrer url 时会自动带上from_wxpay=1
* </pre>
*/
@XStreamAlias("return_web")
private Integer returnWeb;
/**
* <pre>
* 商户测的用户标识
* outerid
* 否
* String()
* 陈*(101000203)
* 用于多账户签约同一个模板下要保持一致取值和contractDisplayAccount取一样就行
* </pre>
*/
@XStreamAlias("outerid")
private String outerId;
@Override
protected void checkConstraints() throws WxPayException {
}
/**
* 是否需要nonce_str
*/
@Override
protected boolean needNonceStr() {
return false;
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("plan_id", planId);
map.put("contract_code", contractCode);
map.put("request_serial", String.valueOf(requestSerial));
map.put("contract_display_account", contractDisplayAccount);
map.put("notify_url", notifyUrl);
map.put("version", version);
map.put("timestamp", timestamp);
if (Objects.nonNull(returnWeb)) {
map.put("return_web", String.valueOf(returnWeb));
}
map.put("outerid", outerId);
}
}

View File

@@ -0,0 +1,368 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:18 下午
* <pre>
* 支付中签约入参
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxPayEntrustRequest extends BaseWxPayRequest {
/**
* <pre>
* 签约商户号
* contract_mchid
* 是
* String(32)
* 1200009811
* 签约商户号必须与mch_id一致
* </pre>
*/
@Required
@XStreamAlias("contract_mchid")
private String contractMchId;
/**
* <pre>
* 签约APPID
* contract_appid
* 是
* String(32)
* wxcbda96de0b165486
* 签约公众号必须与APPID一致
* </pre>
*/
@Required
@XStreamAlias("contract_appid")
private String contractAppId;
/**
* <pre>
* 商户订单号
* out_trade_no
* 是
* String(32)
* 123456
* 商户系统内部的订单号32字符内可包含字母
* </pre>
*/
@Required
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
* <pre>
* 设备号
* device_info
* 否
* String(32)
* 013467007045764
* 终端设备号若为PC网页或公众号内则传WEB
* </pre>
*/
@XStreamAlias("device_info")
private String deviceInfo;
/**
* <pre>
* 商品描述
* body
* 是
* String(128)
* ipad mini 16G 白色
* 商品支付单简要描述
* </pre>
*/
@Required
@XStreamAlias("body")
private String body;
/**
* <pre>
* 商品详情
* detail
* 否
* String(8192)
* ipad mini 16G 白色
* 商品名称明细列表
* </pre>
*/
@XStreamAlias("detail")
private String detail;
/**
* <pre>
* 附加数据
* attach
* 否
* String(127)
* online/dev/dev1
* 商家数据包
* </pre>
*/
@XStreamAlias("attach")
private String attach;
/**
* <pre>
* 回调通知url
* notify_url
* 是
* String(256)
* https://weixin.qq.com
* 回调通知地址
* </pre>
*/
@Required
@XStreamAlias("notify_url")
private String notifyUrl;
/**
* <pre>
* 总金额
* total_fee
* 是
* int
* 888
* 订单总金额,单位分
* </pre>
*/
@Required
@XStreamAlias("total_fee")
private Integer totalFee;
/**
* <pre>
* 终端ip
* spbill_create_ip
* 是
* String(16)
* 127.0.0.1
* 用户的客户端IP
* </pre>
*/
@Required
@XStreamAlias("spbill_create_ip")
private String spbillCreateIp;
/**
* <pre>
* 交易起始时间
* time_start
* 否
* String(14)
* 20201025171529
* 订单生成时间格式yyyyMMddHHmmss
* </pre>
*/
@XStreamAlias("time_start")
private String timeStart;
/**
* <pre>
* 交易结束时间
* time_expire
* 否
* String(14)
* 20201025171529
* 订单失效时间格式yyyyMMddHHmmss
* </pre>
*/
@XStreamAlias("time_expire")
private String timeExpire;
/**
* <pre>
* 商品标记
* goods_tag
* 否
* String(32)
* wxg
* 商品标记,代金券或立减优惠功能参数
* </pre>
*/
@XStreamAlias("goods_tag")
private String goodsTag;
/**
* <pre>
* 交易类型
* trade_type
* 是
* String(16)
* JSAPI
* JSAPI,MWEB
* </pre>
*/
@Required
@XStreamAlias("trade_type")
private String tradeType;
/**
* <pre>
* 商品ID
* product_id
* 否
* String(32)
* 12234355463434643
* 二维码支付必传二维码中包含商品ID
* </pre>
*/
@XStreamAlias("product_id")
private String productId;
/**
* <pre>
* 指定支付方式
* limit_pay
* 否
* String(32)
* no_credit
* no_credit--指定不能使用信用卡支付
* </pre>
*/
@XStreamAlias("limit_pay")
private String limitPay;
/**
* <pre>
* 用户表示
* openid
* 否
* String(128)
* oUpF4sdsidj3Jds89
* tradetype=JSAPI 则必传
* </pre>
*/
@XStreamAlias("openid")
private String openId;
/**
* <pre>
* 协议模板ID
* plan_id
* 是
* String(28)
* 12535
* 协议模板ID分为首次签约支付中签约重新签约
* </pre>
*/
@Required
@XStreamAlias("plan_id")
private String planId;
/**
* <pre>
* 签约协议号
* contract_code
* 是
* String(32)
* 100000
* 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成
* </pre>
*/
@Required
@XStreamAlias("contract_code")
private String contractCode;
/**
* <pre>
* 请求序列号
* request_serial
* 是
* int(64)
* 1000
* 商户请求签约时的序列号要求唯一性禁止使用0开头的用户排序纯数字
* </pre>
*/
@Required
@XStreamAlias("request_serial")
private Long requestSerial;
/**
* <pre>
* 用户账户展示名称
* contract_display_account
* 是
* string(32)
* 微信代扣
* 签约用户的名称,用户页面展示,不支持符号表情
* </pre>
*/
@Required
@XStreamAlias("contract_display_account")
private String contractDisplayAccount;
/**
* <pre>
* 签约信息通知URL
* contract_notify_url
* 是
* string(32)
* https://yoursite.com
* 签约信息回调通知URL
* </pre>
*/
@Required
@XStreamAlias("contract_notify_url")
private String contractNotifyUrl;
/**
* <pre>
* 商户测的用户标识
* contract_outerid
* 否
* string(32)
* 陈*(12000002)
* 用于多账户签约值与contract_display_account相同即可同一模板下唯一
* </pre>
*/
@XStreamAlias("contract_outerid")
private String contractOuterId;
@Override
protected void checkConstraints() throws WxPayException {
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("contract_mchid", contractMchId);
map.put("contract_appid", contractAppId);
map.put("out_trade_no", outTradeNo);
map.put("device_info", deviceInfo);
map.put("body", body);
map.put("detail", detail);
map.put("attach", attach);
map.put("notify_url", notifyUrl);
map.put("total_fee", totalFee.toString());
map.put("spbill_create_ip", spbillCreateIp);
map.put("time_start", timeStart);
map.put("time_expire", timeExpire);
map.put("goods_tag", goodsTag);
map.put("trade_type", tradeType);
map.put("product_id", productId);
map.put("limit_pay", limitPay);
map.put("openid", openId);
map.put("plan_id", planId);
map.put("contract_code", contractCode);
map.put("request_serial", requestSerial.toString());
map.put("contract_display_account", contractDisplayAccount);
map.put("contract_notify_url", contractNotifyUrl);
map.put("contract_outerid", contractOuterId);
}
}

View File

@@ -0,0 +1,65 @@
package com.github.binarywang.wxpay.bean.request;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author chenliang
* @date 2021-08-02 5:20 下午
*
* <pre>
* 微信预扣款请求参数
* </pre>
*/
@Data
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
public class WxPreWithholdRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 委托代扣协议ID
*/
@SerializedName(value = "contract_id")
private String contractId;
/**
* 直连商户号
*/
@SerializedName(value = "mchid")
private String mchId;
/**
* 公众号ID
*/
@SerializedName(value = "appid")
private String appId;
/**
* 预计扣款的金额信息
*/
@SerializedName(value = "estimated_amount")
private EstimateAmount estimateAmount;
@Data
public static class EstimateAmount implements Serializable {
/**
* 预计扣费金额
*/
private Integer amount;
/**
* 人民币CNY
* 非必填
*/
private String currency;
}
}

View File

@@ -0,0 +1,105 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
import java.util.Objects;
/**
* @author chenliang
* @date 2021-08-02 5:23 下午
* <pre>
* 微信签约状态查询入参
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxSignQueryRequest extends BaseWxPayRequest {
//方式1. 使用contract_id查
/**
* <pre>
* 字段名委托代扣协议ID.
* 变量名contract_id
* 是否必填:二选一
* 类型String(32)
* 示例值1000005698
* 签约成功后由微信返回
* </pre>
*/
@XStreamAlias("contract_id")
private String contractId;
/**
* <pre>
* 字段名:接口版本号.
* 变量名version
* 是否必填:是
* 类型String(8)
* 示例值1.0
* 固定填写1.0
* </pre>
*/
@Required
@XStreamAlias("version")
private String version;
//方式2. 使用plan_id和contract_code查
/**
* <pre>
* 字段名模板ID.
* 变量名plan_id
* 是否必填:二选一
* 类型int
* 示例值123
* 代扣模板ID
* </pre>
*/
@XStreamAlias("plan_id")
private Integer planId;
/**
* <pre>
* 字段名:签约协议号.
* 变量名contract_code
* 是否必填:二选一
* 类型String(32)
* 示例值12332343
* 商户侧唯一
* </pre>
*/
@XStreamAlias("contract_code")
private String contractCode;
@Override
protected boolean needNonceStr() {
return false;
}
@Override
protected void checkConstraints() throws WxPayException {
if (StringUtils.isNotBlank(contractId) &&
(Objects.nonNull(planId) || StringUtils.isNotBlank(contractCode))) {
throw new WxPayException("contractId 和 planId&contractCode 不能同时存在或同时为空,必须二选一");
}
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("contract_id", contractId);
map.put("version", version);
if (Objects.nonNull(planId)) {
map.put("plan_id", planId.toString());
}
map.put("contract_code", contractCode);
}
}

View File

@@ -0,0 +1,122 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
import java.util.Objects;
/**
* @author chenliang
* @date 2021-08-02 5:24 下午
*
* <pre>
* 微信api申请解约
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxTerminatedContractRequest extends BaseWxPayRequest {
//方式1. 使用contract_id查
/**
* <pre>
* 字段名委托代扣协议ID.
* 变量名contract_id
* 是否必填:二选一
* 类型String(32)
* 示例值1000005698
* 签约成功后由微信返回
* </pre>
*/
@XStreamAlias("contract_id")
private String contractId;
/**
* <pre>
* 字段名:解约备注.
* 变量名contract_termination_remark
* 是否必填:是
* 类型String(256)
* 示例值:解约原因
* 例如:签约信息有误,须重新签约
* </pre>
*/
@Required
@XStreamAlias("contract_termination_remark")
private String contractTerminationRemark;
/**
* <pre>
* 字段名:接口版本号.
* 变量名version
* 是否必填:是
* 类型String(8)
* 示例值1.0
* 固定填写1.0
* </pre>
*/
@Required
@XStreamAlias("version")
private String version;
//方式2. 使用plan_id和contract_code查
/**
* <pre>
* 字段名模板ID.
* 变量名plan_id
* 是否必填:二选一
* 类型int
* 示例值123
* 代扣模板ID
* </pre>
*/
@XStreamAlias("plan_id")
private Integer planId;
/**
* <pre>
* 字段名:签约协议号.
* 变量名contract_code
* 是否必填:二选一
* 类型String(32)
* 示例值12332343
* 商户侧唯一
* </pre>
*/
@XStreamAlias("contract_code")
private String contractCode;
@Override
protected void checkConstraints() throws WxPayException {
if (StringUtils.isNotBlank(contractId) &&
(Objects.nonNull(planId) || StringUtils.isNotBlank(contractCode))) {
throw new WxPayException("contractId 和 planId&contractCode 不能同时存在或同时为空,必须二选一");
}
}
@Override
protected boolean needNonceStr() {
return false;
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("contract_id", contractId);
map.put("contract_termination_remark", contractTerminationRemark);
map.put("version", version);
if (Objects.nonNull(planId)) {
map.put("plan_id", planId.toString());
}
map.put("contract_code", contractCode);
}
}

View File

@@ -0,0 +1,64 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:25 下午
*
* <pre>代扣订单查询参数</pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxWithholdOrderQueryRequest extends BaseWxPayRequest {
/**
* <pre>
* 字段名:微信订单号.
* 变量名transaction_id
* 是否必填:二选一
* 类型String(32)
* 示例值1000005698
* 微信生成的单号,支付通知中返回
* </pre>
*/
@XStreamAlias("transaction_id")
private String transactionId;
/**
* <pre>
* 字段名:商户订单号.
* 变量名out_trade_no
* 是否必填:二选一
* 类型String(32)
* 示例值1000005698
* 商户系统内部订单号
* </pre>
*/
@XStreamAlias("out_trade_no")
private String outTradeNo;
@Override
protected void checkConstraints() throws WxPayException {
if (StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo)) {
throw new WxPayException("transactionId 和 outTradeNo 不能同时存在或同时为空,必须二选一");
}
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("transaction_id", transactionId);
map.put("out_trade_no", outTradeNo);
}
}

View File

@@ -0,0 +1,194 @@
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.*;
import me.chanjar.weixin.common.annotation.Required;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:26 下午
*
* <pre>
* 发起微信委托代扣参数
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
public class WxWithholdRequest extends BaseWxPayRequest {
/**
* <pre>
* 商品描述
* body
* 是
* String(128)
* ipad mini 16G 白色
* 商品支付单简要描述
* </pre>
*/
@Required
@XStreamAlias("body")
private String body;
/**
* <pre>
* 商品详情
* detail
* 否
* String(8192)
* ipad mini 16G 白色
* 商品名称明细列表
* </pre>
*/
@XStreamAlias("detail")
private String detail;
/**
* <pre>
* 附加数据
* attach
* 否
* String(127)
* online/dev/dev1
* 商家数据包
* </pre>
*/
@XStreamAlias("attach")
private String attach;
/**
* <pre>
* 商户订单号
* out_trade_no
* 是
* String(32)
* 123456
* 商户系统内部的订单号32字符内可包含字母
* </pre>
*/
@Required
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
* <pre>
* 总金额
* total_fee
* 是
* int
* 888
* 订单总金额,单位分
* </pre>
*/
@Required
@XStreamAlias("total_fee")
private Integer totalFee;
/**
* <pre>
* 货币类型
* fee_type
* 否
* String(16)
* CNY
* 默认人民币CNY
* </pre>
*/
@XStreamAlias("fee_type")
private String feeType;
/**
* <pre>
* 终端ip
* spbill_create_ip
* 否
* String(16)
* 127.0.0.1
* 用户的客户端IP
* </pre>
*/
@XStreamAlias("spbill_create_ip")
private String spbillCreateIp;
/**
* <pre>
* 商品标记
* goods_tag
* 否
* String(32)
* wxg
* 商品标记,代金券或立减优惠功能参数
* </pre>
*/
@XStreamAlias("goods_tag")
private String goodsTag;
/**
* <pre>
* 回调通知url
* notify_url
* 是
* String(256)
* https://weixin.qq.com
* 回调通知地址
* </pre>
*/
@Required
@XStreamAlias("notify_url")
private String notifyUrl;
/**
* <pre>
* 交易类型
* trade_type
* 是
* String(16)
* JSAPI
* JSAPI,MWEB
* </pre>
*/
@Required
@XStreamAlias("trade_type")
private String tradeType;
/**
* <pre>
* 委托代扣协议ID
* contract_id
* 是
* String(32)
* Wx234324808503234483920
* 签约成功后微信返回的委托代扣协议ID
* </pre>
*/
@Required
@XStreamAlias("contract_id")
private String contractId;
@Override
protected void checkConstraints() throws WxPayException {
}
@Override
protected void storeMap(Map<String, String> map) {
map.put("body", body);
map.put("detail", detail);
map.put("attach", attach);
map.put("out_trade_no", outTradeNo);
map.put("total_fee", totalFee.toString());
map.put("fee_type", feeType);
map.put("spbill_create_ip", spbillCreateIp);
map.put("goods_tag", goodsTag);
map.put("notify_url", notifyUrl);
map.put("trade_type", tradeType);
map.put("contract_id", contractId);
}
}

View File

@@ -0,0 +1,43 @@
package com.github.binarywang.wxpay.bean.result;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.w3c.dom.Document;
import java.io.Serializable;
/**
* @author chenliang
* @date 2021-08-02 5:37 下午
*
* <pre>
* h5纯签约后结果
* </pre>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxH5EntrustResult extends BaseWxPayResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 业务结果描述
*/
@XStreamAlias("result_msg")
private String resultMsg;
/**
* 跳转url
*/
@XStreamAlias("redirect_url")
private String redirectUrl;
@Override
protected void loadXml(Document d) {
resultMsg = readXmlString(d, "result_msg");
redirectUrl = readXmlString(d, "redirect_url");
}
}

View File

@@ -0,0 +1,190 @@
package com.github.binarywang.wxpay.bean.result;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.util.SignUtils;
import com.google.common.collect.Lists;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.Document;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:38 下午
*
* <pre>
* 支付中签约返回结果
* </pre>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxPayEntrustResult extends BaseWxPayResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 预签约结果
*/
@XStreamAlias("contract_result_code")
private String contractResultCode;
/**
* 预约签约错误码
*/
@XStreamAlias("contract_err_code")
private String contractErrCode;
/**
* 预签约错误描述
*/
@XStreamAlias("contract_err_code_des")
private String contractErrCodeDes;
/**
* 预支付ID
*/
@XStreamAlias("prepay_id")
private String prepayId;
/**
* 交易类型
*/
@XStreamAlias("trade_type")
private String tradeType;
/**
* 二维码链接
* 非必传
*/
@XStreamAlias("code_url")
private String codeUrl;
/**
* 模板ID
* 非必传
*/
@XStreamAlias("plan_id")
private Integer planId;
/**
* 请求序列号
* 非必传
*/
@XStreamAlias("request_serial")
private Integer requestSerial;
/**
* 签约协议号
* 非必传
*/
@XStreamAlias("contract_code")
private String contractCode;
/**
* 用户账户展示名称
* 非必传
*/
@XStreamAlias("contract_display_account")
private String contractDisplayAccount;
/**
* 支付跳转链接
* 非必传
*/
@XStreamAlias("mweb_url")
private String mwebUrl;
/**
* 商户订单号
*/
@XStreamAlias("out_trade_no")
private String outTradeNo;
@Override
protected void loadXml(Document d) {
contractResultCode = readXmlString(d, "contract_result_code");
contractErrCode = readXmlString(d, "contract_err_code");
contractErrCodeDes = readXmlString(d, "contract_err_code_des");
prepayId = readXmlString(d, "prepay_id");
tradeType = readXmlString(d, "trade_type");
codeUrl = readXmlString(d, "code_url");
planId = readXmlInteger(d, "plan_id");
requestSerial = readXmlInteger(d, "request_serial");
contractCode = readXmlString(d, "contract_code");
contractDisplayAccount = readXmlString(d, "contract_display_account");
mwebUrl = readXmlString(d, "mweb_url");
outTradeNo = readXmlString(d, "out_trade_no");
}
/**
* 校验返回结果签名.
*
* @param wxPayService the wx pay service
* @param signType 签名类型
* @param checkSuccess 是否同时检查结果是否成功
* @throws WxPayException the wx pay exception
*/
@Override
public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
//校验返回结果签名
Map<String, String> map = toMap();
if (getSign() != null && !SignUtils.checkSign(map, signType, wxPayService.getConfig().getMchKey())) {
this.getLogger().debug("校验结果签名失败,参数:{}", map);
throw new WxPayException("参数格式校验错误!");
}
//校验结果是否成功
if (checkSuccess) {
List<String> successStrings = Lists.newArrayList(WxPayConstants.ResultCode.SUCCESS, "");
if (!successStrings.contains(StringUtils.trimToEmpty(getReturnCode()).toUpperCase())
|| !successStrings.contains(StringUtils.trimToEmpty(getResultCode()).toUpperCase())) {
StringBuilder errorMsg = new StringBuilder();
if (getReturnCode() != null) {
errorMsg.append("返回代码:").append(getReturnCode());
}
if (getReturnMsg() != null) {
errorMsg.append(",返回信息:").append(getReturnMsg());
}
if (getResultCode() != null) {
errorMsg.append(",结果代码:").append(getResultCode());
}
if (getErrCode() != null) {
errorMsg.append(",错误代码:").append(getErrCode());
}
if (getErrCodeDes() != null) {
errorMsg.append(",错误详情:").append(getErrCodeDes());
}
if (getContractErrCode() != null) {
errorMsg.append(",预签约错误代码:").append(getContractErrCode());
}
if (getContractErrCodeDes() != null) {
errorMsg.append(",预签约错误描述:").append(getContractErrCodeDes());
}
if (getContractResultCode() != null) {
errorMsg.append(",预签约结果:").append(getContractResultCode());
}
this.getLogger().warn("\n结果业务代码异常返回结果{},\n{}", map, errorMsg.toString());
throw WxPayException.from(this);
}
}
}
@Override
public String toString() {
return WxGsonBuilder.create().toJson(this);
}
}

View File

@@ -0,0 +1,123 @@
package com.github.binarywang.wxpay.bean.result;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import org.w3c.dom.Document;
import java.io.Serializable;
/**
* @author chenliang
* @date 2021-08-02 5:40 下午
*
* <pre>
* 微信签约查询返回结果
* </pre>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxSignQueryResult extends BaseWxPayResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 委托代扣协议ID
*/
@XStreamAlias("contractId")
private String contractId;
/**
* 模板ID
*/
@XStreamAlias("plan_id")
private String planId;
/**
* 请求序列号
*/
@XStreamAlias("request_serial")
private Integer requestSerial;
/**
* 签约协议号
*/
@XStreamAlias("contract_code")
private String contractCode;
/**
* 用户账户展示名称
*/
@XStreamAlias("contract_display_account")
private String contractDisplayAccount;
/**
* 协议状态
*/
@XStreamAlias("contract_state")
private Integer contractState;
/**
* 协议签署时间
*/
@XStreamAlias("contract_signed_time")
private String contractSignedTime;
/**
* 协议到期时间
*/
@XStreamAlias("contract_expired_time")
private String contractExpiredTime;
/**
* 协议解约时间
* 非必传
*/
@XStreamAlias("contract_terminated_time")
private String contractTerminatedTime;
/**
* 协议解约方式
* 非必传
*/
@XStreamAlias("contract_terminated_mode")
private Integer contractTerminatedMode;
/**
* 解约备注
* 非必传
*/
@XStreamAlias("contract_termination_remark")
private String contractTerminationRemark;
/**
* 用户表示
*/
@XStreamAlias("openid")
private String openId;
@Override
protected void loadXml(Document d) {
contractId = readXmlString(d, "contract_id");
planId = readXmlString(d, "plan_id");
requestSerial = readXmlInteger(d, "request_serial");
contractCode = readXmlString(d, "contract_code");
contractDisplayAccount = readXmlString(d, "contract_display_account");
contractState = readXmlInteger(d, "contract_state");
contractSignedTime = readXmlString(d, "contract_signed_time");
contractExpiredTime = readXmlString(d, "contrace_Expired_time");
contractTerminatedTime = readXmlString(d, "contract_terminated_time");
contractTerminatedMode = readXmlInteger(d, "contract_terminate_mode");
contractTerminationRemark = readXmlString(d, "contract_termination_remark");
openId = readXmlString(d, "openid");
}
@Override
public String toString() {
return WxGsonBuilder.create().toJson(this);
}
}

View File

@@ -0,0 +1,127 @@
package com.github.binarywang.wxpay.bean.result;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
import org.w3c.dom.Document;
/**
* @author chenliang
* @date 2021-08-02 4:59 下午
* <pre>
* 微信签约/解约 回调结果
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@XStreamAlias("xml")
public class WxSignStatusNotifyResult extends BaseWxPayResult {
private static final long serialVersionUID = 1L;
/**
* 签约协议号
*/
@XStreamAlias("contract_code")
private String contractCode;
/**
* 模板ID
*/
@XStreamAlias("plan_id")
private String planId;
/**
* 用户表示
*/
@XStreamAlias("openid")
private String openId;
/**
* 变更类型, ADD签约DELETE解约
*/
@XStreamAlias("change_type")
private String changeType;
/**
* 操作时间
*/
@XStreamAlias("operate_time")
private String operateTime;
/**
* 委托代扣协议ID
*/
@XStreamAlias("contract_id")
private String contractId;
/**
* 协议到期时间ADD会有长期有效忽略
* 非必传
*/
@XStreamAlias("contract_expired_time")
private String contractExpiredTime;
/**
* DELETE时返回0: 未解约1有效期过期自动解约2用户主动解约3商户api解约4商户平台解约5用户账号注销
* 非必传
*/
@XStreamAlias("contract_termination_mode")
private Integer contractTerminationMode;
/**
* 请求序列号
*/
@XStreamAlias("request_serial")
private Integer requestSerial;
@Override
public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
//防止伪造成功通知
if (WxPayConstants.ResultCode.SUCCESS.equals(getReturnCode()) && getSign() == null) {
throw new WxPayException("伪造的通知!");
}
super.checkResult(wxPayService, signType, checkSuccess);
}
/**
* From xml wx sign notify result.
*
* @param xmlString the xml string
* @return the wx sign result
*/
public static WxSignStatusNotifyResult fromXML(String xmlString) {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxSignStatusNotifyResult.class);
WxSignStatusNotifyResult result = (WxSignStatusNotifyResult) xstream.fromXML(xmlString);
result.setXmlString(xmlString);
return result;
}
@Override
protected void loadXml(Document d) {
contractCode = readXmlString(d, "contract_code");
planId = readXmlString(d, "plan_id");
openId = readXmlString(d, "openid");
changeType = readXmlString(d, "change_type");
operateTime = readXmlString(d, "operate_time");
contractId = readXmlString(d, "contract_id");
contractExpiredTime = readXmlString(d, "contract_expired_time");
contractTerminationMode = readXmlInteger(d, "contract_termination_mode");
requestSerial = readXmlInteger(d, "request_serial");
}
@Override
public String toString() {
return WxGsonBuilder.create().toJson(this);
}
}

View File

@@ -0,0 +1,57 @@
package com.github.binarywang.wxpay.bean.result;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import org.w3c.dom.Document;
import java.io.Serializable;
/**
* @author chenliang
* @date 2021-08-02 5:41 下午
*
* <pre>
* 主动解约返回值
* </pre>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxTerminationContractResult extends BaseWxPayResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 委托代扣协议ID
*/
@XStreamAlias("contractId")
private String contractId;
/**
* 模板ID
*/
@XStreamAlias("plan_id")
private String planId;
/**
* 签约协议号
*/
@XStreamAlias("contract_code")
private String contractCode;
@Override
protected void loadXml(Document d) {
contractId = readXmlString(d, "contract_id");
planId = readXmlString(d, "plan_id");
contractCode = readXmlString(d, "contract_code");
}
@Override
public String toString() {
return WxGsonBuilder.create().toJson(this);
}
}

View File

@@ -0,0 +1,234 @@
package com.github.binarywang.wxpay.bean.result;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyCoupon;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.converter.WxPayOrderNotifyResultConverter;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.util.SignUtils;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
import org.w3c.dom.Document;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author chenliang
* @date 2021-08-02 5:09 下午
*
* <pre>
* 微信代扣扣款回调结果
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@XStreamAlias("xml")
public class WxWithholdNotifyResult extends BaseWxPayResult {
private static final long serialVersionUID = 1L;
/**
* 设备号
* 非必传
*/
@XStreamAlias("device_info")
private String deviceInfo;
/**
* 用户标识
*/
@XStreamAlias("openid")
private String openId;
/**
* 用户子标识
* 非必传
*/
@XStreamAlias("sub_openid")
private String subOpenId;
/**
* 是否关注公众号
* 非必传
*/
@XStreamAlias("is_subscribe")
private String isSubscribe;
/**
* 付款银行
*/
@XStreamAlias("bank_type")
private String bankType;
/**
* 总金额
*/
@XStreamAlias("total_fee")
private Integer totalFee;
/**
* 货币类型
* 非必传
*/
@XStreamAlias("fee_type")
private String feeType;
/**
* 现金支付金额
*/
@XStreamAlias("cash_fee")
private Integer cashFee;
/**
* 现金支付货币类型
* 非必传
*/
@XStreamAlias("cash_fee_type")
private String cashFeeType;
/**
* 交易状态
* SUCCESS 支付成功REFUND转入退款NOTPAY未支付CLOSED已关闭ACCEPT已接收PAY_FAIL:支付失败
*/
@XStreamAlias("trade_state")
private String tradeState;
/**
* 代金券或立减优惠金额
* 非必传
*/
@XStreamAlias("coupon_fee")
private Integer couponFee;
/**
* 代金券或立减优惠使用数量
*/
@XStreamAlias("coupon_count")
private Integer couponCount;
private List<WxPayOrderNotifyCoupon> couponList;
/**
* 微信支付单号
*/
@XStreamAlias("transaction_id")
private String transactionId;
/**
* 商户订单号
*/
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
* 商家数据包
*/
@XStreamAlias("attach")
private String attach;
/**
* 支付完成时间
*/
@XStreamAlias("time_end")
private String timeEnd;
/**
* 委托代扣协议ID
*/
@XStreamAlias("contract_id")
private String contractId;
@Override
public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException {
//防止伪造成功通知
if (WxPayConstants.ResultCode.SUCCESS.equals(getReturnCode()) && getSign() == null) {
throw new WxPayException("伪造的通知!");
}
super.checkResult(wxPayService, signType, checkSuccess);
}
/**
* From xml wx withhold notify result.
*
* @param xmlString the xml string
* @return the wx withhold result
*/
public static WxWithholdNotifyResult fromXML(String xmlString) {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxWithholdNotifyResult.class);
xstream.registerConverter(new WxPayOrderNotifyResultConverter(xstream.getMapper(), xstream.getReflectionProvider()));
WxWithholdNotifyResult result = (WxWithholdNotifyResult) xstream.fromXML(xmlString);
result.setXmlString(xmlString);
return result;
}
@Override
public Map<String, String> toMap() {
Map<String, String> resultMap = SignUtils.xmlBean2Map(this);
if (this.getCouponCount() != null && this.getCouponCount() > 0) {
for (int i = 0; i < this.getCouponCount(); i++) {
WxPayOrderNotifyCoupon coupon = couponList.get(i);
resultMap.putAll(coupon.toMap(i));
}
}
return resultMap;
}
@Override
protected void loadXml(Document d) {
deviceInfo = readXmlString(d, "device_info");
openId = readXmlString(d, "openid");
isSubscribe = readXmlString(d, "is_subscribe");
subOpenId = readXmlString(d, "sub_openid");
bankType = readXmlString(d, "bank_type");
totalFee = readXmlInteger(d, "total_fee");
feeType = readXmlString(d, "fee_type");
cashFee = readXmlInteger(d, "cash_fee");
cashFeeType = readXmlString(d, "cash_fee_type");
couponFee = readXmlInteger(d, "coupon_fee");
couponCount = readXmlInteger(d, "coupon_count");
transactionId = readXmlString(d, "transaction_id");
outTradeNo = readXmlString(d, "out_trade_no");
attach = readXmlString(d, "attach");
timeEnd = readXmlString(d, "time_end");
tradeState = readXmlString(d, "trade_state");
contractId = readXmlString(d, "contract_id");
composeCoupons();
}
/**
* 通过xml组装couponList属性内容.
*/
protected void composeCoupons() {
if (this.couponCount == null || this.couponCount == 0) {
return;
}
this.couponList = new ArrayList(couponCount);
for (int i = 0; i < this.couponCount; i++) {
WxPayOrderNotifyCoupon coupon = new WxPayOrderNotifyCoupon();
coupon.setCouponId(this.getXmlValue("xml/coupon_id_" + i));
coupon.setCouponType(this.getXmlValue("xml/coupon_type_" + i));
coupon.setCouponFee(this.getXmlValueAsInt("xml/coupon_fee_" + i));
couponList.add(coupon);
}
}
@Override
public String toString() {
return WxGsonBuilder.create().toJson(this);
}
}

View File

@@ -0,0 +1,182 @@
package com.github.binarywang.wxpay.bean.result;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyCoupon;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.w3c.dom.Document;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @author chenliang
* @date 2021-08-02 5:42 下午
*
* <pre>
* 代扣订单查询结果
* </pre>
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@XStreamAlias("xml")
public class WxWithholdOrderQueryResult extends BaseWxPayResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 设备号
* 非必传
*/
@XStreamAlias("device_info")
private String deviceInfo;
/**
* 用户标识
*/
@XStreamAlias("openid")
private String openId;
/**
* 是否关注公众号
* 非必传
*/
@XStreamAlias("is_subscribe")
private String isSubscribe;
/**
* 交易类型
*/
@XStreamAlias("trade_type")
private String tradeType;
/**
* 交易状态
* SUCCESS 支付成功REFUND转入退款NOTPAY未支付CLOSED已关闭ACCEPT已接收PAY_FAIL:支付失败
*/
@XStreamAlias("trade_state")
private String tradeState;
/**
* 付款银行
*/
@XStreamAlias("bank_type")
private String bankType;
/**
* 总金额
*/
@XStreamAlias("total_fee")
private Integer totalFee;
/**
* 货币类型
* 非必传
*/
@XStreamAlias("fee_type")
private String feeType;
/**
* 现金支付金额
*/
@XStreamAlias("cash_fee")
private Integer cashFee;
/**
* 现金支付货币类型
* 非必传
*/
@XStreamAlias("cash_fee_type")
private String cashFeeType;
/**
* 代金券或立减优惠金额
* 非必传
*/
@XStreamAlias("coupon_fee")
private Integer couponFee;
/**
* 代金券或立减优惠使用数量
*/
@XStreamAlias("coupon_count")
private Integer couponCount;
private List<WxPayOrderNotifyCoupon> couponList;
/**
* 微信支付单号
*/
@XStreamAlias("transaction_id")
private String transactionId;
/**
* 商户订单号
*/
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
* 商家数据包
*/
@XStreamAlias("attach")
private String attach;
/**
* 支付完成时间
*/
@XStreamAlias("time_end")
private String timeEnd;
/**
* 交易状态描述
* 例如:支付失败,请重新下单
*/
@XStreamAlias("trade_state_desc")
private String tradeStateDesc;
/**
* 通过xml组装couponList属性内容.
*/
protected void composeCoupons() {
if (this.couponCount == null || this.couponCount == 0) {
return;
}
this.couponList = new ArrayList(couponCount);
for (int i = 0; i < this.couponCount; i++) {
WxPayOrderNotifyCoupon coupon = new WxPayOrderNotifyCoupon();
coupon.setCouponId(this.getXmlValue("xml/coupon_id_" + i));
coupon.setCouponType(this.getXmlValue("xml/coupon_type_" + i));
coupon.setCouponFee(this.getXmlValueAsInt("xml/coupon_fee_" + i));
couponList.add(coupon);
}
}
@Override
protected void loadXml(Document d) {
deviceInfo = readXmlString(d, "device_info");
openId = readXmlString(d, "openid");
isSubscribe = readXmlString(d, "is_subscribe");
bankType = readXmlString(d, "bank_type");
totalFee = readXmlInteger(d, "total_fee");
feeType = readXmlString(d, "fee_type");
cashFee = readXmlInteger(d, "cash_fee");
tradeType = readXmlString(d, "trade_type");
cashFeeType = readXmlString(d, "cash_fee_type");
couponFee = readXmlInteger(d, "coupon_fee");
couponCount = readXmlInteger(d, "coupon_count");
transactionId = readXmlString(d, "transaction_id");
outTradeNo = readXmlString(d, "out_trade_no");
attach = readXmlString(d, "attach");
timeEnd = readXmlString(d, "time_end");
tradeState = readXmlString(d, "trade_state");
tradeStateDesc = readXmlString(d, "trade_state_desc");
composeCoupons();
}
}

View File

@@ -0,0 +1,44 @@
package com.github.binarywang.wxpay.bean.result;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import org.w3c.dom.Document;
import java.io.Serializable;
/**
* @author chenliang
* @date 2021-08-02 5:39 下午
*
* <pre>
* 委托扣款返回值
* </pre>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxWithholdResult extends BaseWxPayResult implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 临时字段
*/
@XStreamAlias("temp")
private String temp;
@Override
protected void loadXml(Document d) {
temp = readXmlString(d, "temp");
}
@Override
public String toString() {
return WxGsonBuilder.create().toJson(this);
}
}