🆕 #1529 微信支付退款增加支持单品退款和对应查询的接口

This commit is contained in:
Binary Wang
2020-06-07 17:59:34 +08:00
parent 58b261753d
commit 92c0fd698b
10 changed files with 426 additions and 7 deletions

View File

@@ -89,9 +89,8 @@ public class WxPayRefundQueryRequest extends BaseWxPayRequest {
&& StringUtils.isBlank(outRefundNo) && StringUtils.isBlank(refundId)) ||
(StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo)
&& StringUtils.isNotBlank(outRefundNo) && StringUtils.isNotBlank(refundId))) {
throw new WxPayException("transaction_idout_trade_noout_refund_norefund_id 必须四选一");
throw new WxPayException("transactionIdoutRefundNotransactionIdrefundId 必须四选一");
}
}
@Override

View File

@@ -4,8 +4,11 @@ import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants.RefundAccountSource;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import lombok.*;
import lombok.experimental.Accessors;
import me.chanjar.weixin.common.annotation.Required;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
@@ -26,7 +29,10 @@ import java.util.Map;
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
@Accessors(chain = true)
public class WxPayRefundRequest extends BaseWxPayRequest {
private static final long serialVersionUID = 522565152886671848L;
private static final String[] REFUND_ACCOUNT = new String[]{
RefundAccountSource.RECHARGE_FUNDS, RefundAccountSource.UNSETTLED_FUNDS};
@@ -127,7 +133,6 @@ public class WxPayRefundRequest extends BaseWxPayRequest {
* 描述:操作员帐号, 默认为商户号
* </pre>
*/
//@Required
@XStreamAlias("op_user_id")
private String opUserId;
/**
@@ -172,6 +177,54 @@ public class WxPayRefundRequest extends BaseWxPayRequest {
@XStreamAlias("notify_url")
private String notifyUrl;
/**
* <pre>
* 字段名:商品详情
* 变量名detail
* 类型:否
* 示例值String(6000)
* 退款包含的商品列表信息detail字段列表说明
*
* 字段名 变量名 必填 类型 示例值 描述
* 商品列表 goods_detail 是 String 示例见下文 商品信息使用Json数组格式提交
* 商品列表goods_detail字段列表说明
*
* 字段名 变量名 必填 类型 示例值 描述
* 商品编码 goods_id 是 String(32) 商品编码 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成
* 微信侧商品编码 wxpay_goods_id 否 String(32) 1001 微信支付定义的统一商品编号(没有可不传)
* 商品名称 goods_name 否 String(256) iPhone6s 16G 商品的实际名称
* 商品退款金额 refund_amount 是 int 528800 商品退款金额
* 商品退货数量 refund_quantity 是 int 1 单品的退款数量
* 商品单价 price 是 int 528800 单位为:分。如果商户有优惠,需传输商户优惠后的单价(例如用户对一笔100元的订单使用了商场发的优惠券100-50则活动商品的单价应为原单价-50)
* detail字段值举例如下
*
* {
* "goods_detail": [
* {
* "goods_id": "商品编码",
* "wxpay_goods_id": "1001",
* "goods_name": "iPhone6s 16G",
* "refund_amount": 528800,
* "refund_quantity": 1,
* "price": 528800
* },
* {
* "goods_id": "商品编码",
* "wxpay_goods_id": "1001",
* "goods_name": "iPhone6s 16G",
* "refund_amount": 528800,
* "refund_quantity": 1,
* "price": 608800
* }
* ]
* }
* 描述退款包含的商品列表信息全额退款可不传必须按照规范上传JSON格式
* </pre>
*/
@XStreamAlias("detail")
@XStreamConverter(value = XStreamCDataConverter.class)
private String detail;
@Override
public void checkAndSign(WxPayConfig config) throws WxPayException {
if (StringUtils.isBlank(this.getOpUserId())) {

View File

@@ -0,0 +1,117 @@
package com.github.binarywang.wxpay.bean.result;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 营销详情 .
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-06-07
*/
@Data
public class WxPayRefundPromotionDetail implements Serializable {
private static final long serialVersionUID = 2197712244944584263L;
/**
* 字段名券ID
* 变量名promotion_id
* 是否必填:是
* 类型String(32)
* 示例例109519
* 描述券或者立减优惠id
*/
@SerializedName("promotion_id")
private String promotionId;
/**
* 字段名:优惠范围
* 变量名scope
* 是否必填:是
* 类型String(32)
* 示例例SINGLE
* 描述GLOBAL- 全场代金券SINGLE- 单品优惠
*/
@SerializedName("scope")
private String scope;
/**
* 字段名:优惠类型
* 变量名type
* 是否必填:是
* 类型String(32)
* 示例例DISCOUNT
* 描述COUPON- 代金券,需要走结算资金的充值型代金券,境外商户券币种与支付币种一致DISCOUNT- 优惠券,不走结算资金的免充值型优惠券,(境外商户券币种与标价币种一致
*/
@SerializedName("type")
private String type;
/**
* 字段名:代金券退款金额
* 变量名refund_amount
* 是否必填:是
* 类型Int
* 示例例100
* 描述:代金券退款金额<=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠
*/
@SerializedName("refund_amount")
private Integer refundAmount;
/**
* 字段名:商品列表
* 变量名goods_detail
* 是否必填:否
* 类型String
* 示例例:见下文
* 描述商品信息使用Json格式
*/
@SerializedName("goods_detail")
private List<GoodDetail> goodsDetails;
@Data
public static class GoodDetail {
/**
* 字段名:商品编码
* 变量名goods_id
* 是否必填:是
* 类型String(32)
* 示例值:商品编码
* 描述:由半角的大小写字母、数字、中划线、下划线中的一种或几种组成
*/
@SerializedName("goods_id")
private String goodsId;
/**
* 字段名:优惠退款金额
* 变量名refund_amount
* 是否必填:是
* 类型int
* 示例值528800
* 描述:优惠退款金额
*/
@SerializedName("refund_amount")
private Integer refundAmount;
/**
* 字段名:商品退货数量
* 变量名refund_quantity
* 是否必填:是
* 类型int
* 示例值1
* 描述:单品的退货数量
*/
@SerializedName("refund_quantity")
private Integer refundQuantity;
/**
* 字段名:商品单价
* 变量名price
* 是否必填:是
* 类型int
* 示例值528800
* 描述:单位为:分。如果商户有优惠,需传输商户优惠后的单价(例如用户对一笔100元的订单使用了商场发的优惠券100-50则活动商品的单价应为原单价-50)
*/
@SerializedName("price")
private Integer price;
}
}

View File

@@ -3,12 +3,17 @@ package com.github.binarywang.wxpay.bean.result;
import java.util.List;
import com.google.common.collect.Lists;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.Document;
/**
@@ -130,6 +135,34 @@ public class WxPayRefundQueryResult extends BaseWxPayResult {
private List<RefundRecord> refundRecords;
/**
* 营销详情.
*/
@XStreamAlias("promotion_detail")
private String promotionDetailString;
private List<WxPayRefundPromotionDetail> promotionDetails;
/**
* 组装生成营销详情信息.
*/
public void composePromotionDetails() {
if (StringUtils.isEmpty(this.promotionDetailString)) {
return;
}
JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
final List<WxPayRefundPromotionDetail> promotionDetail = WxGsonBuilder.create()
.fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
new TypeToken<List<WxPayRefundPromotionDetail>>() {
}.getType()
);
this.setPromotionDetails(promotionDetail);
}
/**
* 组装生成退款记录属性的内容.
*/

View File

@@ -1,15 +1,20 @@
package com.github.binarywang.wxpay.bean.result;
import java.io.Serializable;
import java.util.List;
import com.google.common.collect.Lists;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import lombok.EqualsAndHashCode;
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;
/**
* <pre>
* 微信支付-申请退款返回结果.
@@ -115,8 +120,35 @@ public class WxPayRefundResult extends BaseWxPayResult implements Serializable {
@XStreamAlias("coupon_refund_fee")
private Integer couponRefundFee;
/**
* 营销详情.
*/
@XStreamAlias("promotion_detail")
private String promotionDetailString;
private List<WxPayRefundPromotionDetail> promotionDetails;
private List<WxPayRefundCouponInfo> refundCoupons;
/**
* 组装生成营销详情信息.
*/
public void composePromotionDetails() {
if (StringUtils.isEmpty(this.promotionDetailString)) {
return;
}
JsonElement tmpJsonElement = new JsonParser().parse(this.promotionDetailString);
final List<WxPayRefundPromotionDetail> promotionDetail = WxGsonBuilder.create()
.fromJson(tmpJsonElement.getAsJsonObject().get("promotion_detail"),
new TypeToken<List<WxPayRefundPromotionDetail>>() {
}.getType()
);
this.setPromotionDetails(promotionDetail);
}
/**
* 组装生成退款代金券信息.
*/