Skip to content

Commit 9cf7e23

Browse files
authored
🆕 #3996 【微信支付】新增合作伙伴订阅通知解析,商户被管控能力及原因查询接口
1 parent 4034834 commit 9cf7e23

6 files changed

Lines changed: 330 additions & 0 deletions

File tree

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
package com.github.binarywang.wxpay.bean.merchantlimitation;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.io.Serializable;
8+
import java.util.List;
9+
10+
/**
11+
* 子商户管控情况
12+
*
13+
* @author zhangyl
14+
*/
15+
@Data
16+
public class MerchantLimitationResult implements Serializable {
17+
private static final long serialVersionUID = 1L;
18+
19+
/**
20+
* 商户ID
21+
*/
22+
@SerializedName("mchid")
23+
private String mchId;
24+
/**
25+
* 商户被管控能力列表
26+
*/
27+
@SerializedName("limited_functions")
28+
private List<String> limitedFunctions;
29+
/**
30+
* 商户其他被管控能力描述
31+
*/
32+
@SerializedName("other_limited_functions")
33+
private String otherLimitedFunctions;
34+
/**
35+
* 被管控原因及解脱路径列表
36+
*/
37+
@SerializedName("recovery_specifications")
38+
private List<RecoverySpecification> recoverySpecifications;
39+
40+
@Data
41+
@NoArgsConstructor
42+
public static class RecoverySpecification implements Serializable {
43+
private static final long serialVersionUID = 1L;
44+
45+
/**
46+
* 商户被该原因管控的单据号
47+
* <p>
48+
* 唯一标记本次管控动作的ID,可用来和“管控流水订阅通知”中的“业务单号”做关联
49+
* </p>
50+
*/
51+
@SerializedName("limitation_case_id")
52+
private String limitationCaseId;
53+
/**
54+
* 商户被管控原因类型
55+
* <p>
56+
* 若商户被管控时会返回
57+
* <li> LICENSE_ABNORMAL:经营证照异常</li>
58+
* <li> NO_TRADE:无交易</li>
59+
* <li> SETTLE_ACCOUNT_ABNORMAL:结算信息异常</li>
60+
* <li> RISK_ABNORMAL:风险异常</li>
61+
* <li> OTHER:其他</li>
62+
* <li> INSPECT_ABNORMAL:巡检异常</li>
63+
* <li> INVALID_REPRESENTATIVE_INFORMATION:法定代表人/负责人资料异常</li>
64+
* <li> INVALID_BUSINESS_STATUS:经营状态异常</li>
65+
* <li> INVALID_BUSINESS_LICENSE:经营证照资料异常</li>
66+
* <li> INVALID_BENEFICIARY_INFORMATION:受益所有人资料异常</li>
67+
* </p>
68+
*/
69+
@SerializedName("limitation_reason_type")
70+
private String limitationReasonType;
71+
/**
72+
* 商户被管控原因
73+
* <p>
74+
* 被管控的原因,若商户被管控时会返回
75+
* </p>
76+
*/
77+
@SerializedName("limitation_reason")
78+
private String limitationReason;
79+
/**
80+
* 商户被管控原因描述
81+
* <p>
82+
* 在该原因下,被管控的原因描述,若商户被管控时会返回
83+
* </p>
84+
*/
85+
@SerializedName("limitation_reason_describe")
86+
private String limitationReasonDescribe;
87+
/**
88+
* 商户被该原因管控的能力列表
89+
* <p>
90+
* 在该原因下,若商户以下能力被管控时会返回
91+
* <li> NO_TRANSACTION_AND_RECHARGE:关闭收单和充值</li>
92+
* <li> NO_PAYMENT:关闭付款</li>
93+
* <li> NO_WITHDRAWAL:关闭提现</li>
94+
* <li> NO_REFUND:关闭退款</li>
95+
* <li> NO_TRANSACTION:关闭收单</li>
96+
* <li> NO_PROFIT_SHARING:关闭分账分出</li>
97+
* <li> NO_PAYMENT_POINT_COMPLETE_ORDER:关闭支付分服务结单</li>
98+
* </p>
99+
*/
100+
@SerializedName("relate_limitations")
101+
private List<String> relateLimitations;
102+
103+
/**
104+
* 商户被该原因管控的其他能力描述
105+
* <p>
106+
* 在该原因下,若商户除了relate_limitations所罗列的被管控能力,还有其他被管控的能力时会返回(如有多项以英文逗号分隔)
107+
* </p>
108+
*/
109+
@SerializedName("other_relate_limitations")
110+
private String otherRelateLimitations;
111+
112+
/**
113+
* 商户被该原因管控的解脱路径
114+
* <p>
115+
* 在该原因下,若存在解脱路径时会返回
116+
* <li> IRRECOVERABLE:不可恢复</li>
117+
* <li> MODIFY_SUBJECT_INFORMATION:修改主体资料</li>
118+
* <li> MODIFY_SETTLE_ACCOUNT_INFORMATION:修改结算银行账户</li>
119+
* <li> VERIFY_INACTIVE_MERCHANT_IDENTITY:核实商户身份</li>
120+
* <li> SUBMIT_OFFLINE_BUSINESS_SCENARIO_INFORMATION:提交线下经营场景信息</li>
121+
* <li> SUBMIT_INFORMATION_FOR_APPEAL:提交相关信息申诉</li>
122+
* <li> RESOLVE_TRANSACTION_DISPUTES:解决交易纠纷</li>
123+
* <li> MODIFY_ADMINISTRATOR_INFORMATION:修改超级管理员</li>
124+
* <li> CALL_CUSTOMER_SERVICE_AT_95017:拨打微信支付客服电话95017</li>
125+
* <li> UPDATE_BUSINESS_SCENARIO_INFORMATION:更新经营场景信息</li>
126+
* <li> SUBMIT_CDD_INFORMATION:填写尽调信息</li>
127+
* <li> WAITING_FOR_PLATFORM_REVIEW:等待平台审核</li>
128+
* <li> SUBMIT_UBO_INFORMATION:补充受益所有人信息</li>
129+
* <li> SIGN_ANTI_FRAUD_PLEDGE_AND_VERIFY_FACE:签署反诈承诺书并刷脸核实身份</li>
130+
* <li> CONTACT_APPROPRIATE_AUTHORITY_FOR_CONSULTATION:联系有权机关咨询</li>
131+
* <li> MODIFY_ABBREVIATION_INFORMATION:修改商户简称</li>
132+
* </p>
133+
*/
134+
@SerializedName("recover_way")
135+
private String recoverWay;
136+
137+
/**
138+
* 商户被该原因管控的解脱路径参数
139+
* <p>
140+
* 若解脱路径recover_way为“填写尽调信息”、“补充受益所有人信息”,需通过提交尽调来解脱,此处会返回“尽调单号”;若解脱路径recover_way
141+
* 为“提交相关信息申诉”,需通过提交资料来解脱,此处会返回“商户管理记录单号”;若解脱路径recover_way为“联系有权机关咨询”,此处会返回有权机关信息
142+
* </p>
143+
*/
144+
@SerializedName("recover_way_param")
145+
private String recoverWayParam;
146+
147+
/**
148+
* 商户被该原因管控的解脱帮助链接
149+
* <p>
150+
* 在该原因下,若存在解脱帮助说明时会返回
151+
* </p>
152+
*/
153+
@SerializedName("recover_help_url")
154+
private String recoverHelpUrl;
155+
156+
/**
157+
* 处置方式
158+
* <p>
159+
* 管控处置方式类型,默认是立即管控
160+
* <li>LIMIT_ACTION_TYPE_IMMEDIATE_CONTROL:立即管控</li>
161+
* <li>LIMIT_ACTION_TYPE_DELAY_CONTROL:延迟管控</li>
162+
* </p>
163+
*/
164+
@SerializedName("limitation_action_type")
165+
private String limitationActionType;
166+
167+
/**
168+
* 预计管控开始时间
169+
*/
170+
@SerializedName("limitation_start_date")
171+
private String limitationStartDate;
172+
173+
/**
174+
* 商户被该原因管控的时间
175+
* <p>
176+
* 若商户被管控时会返回,延迟管控但是未到管控时间时不会返回
177+
* </p>
178+
*/
179+
@SerializedName("limitation_date")
180+
private String limitationDate;
181+
182+
}
183+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.github.binarywang.wxpay.bean.notify;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import java.io.Serializable;
8+
9+
/**
10+
* 合作伙伴订阅通知 <a href="https://pay.weixin.qq.com/doc/v3/partner/4016022264">产品介绍</a>
11+
* <p>
12+
* 该类是订阅通知的通用结构,每个字段代表的含义和订阅类型有关。请依据文档自行判断使用。
13+
* </p>
14+
*
15+
* @author zhangyl
16+
*/
17+
@Data
18+
@NoArgsConstructor
19+
public class PartnerSubscribeNotifyResult implements Serializable,
20+
WxPayBaseNotifyV3Result<PartnerSubscribeNotifyResult.DecryptNotifyResult> {
21+
private static final long serialVersionUID = 1L;
22+
/**
23+
* 源数据
24+
*/
25+
private OriginNotifyResponse rawData;
26+
/**
27+
* 解密后的数据
28+
*/
29+
private DecryptNotifyResult result;
30+
31+
@Data
32+
@NoArgsConstructor
33+
public static class DecryptNotifyResult implements Serializable {
34+
private static final long serialVersionUID = 1L;
35+
/**
36+
* 商户号
37+
*/
38+
@SerializedName("merchant_code")
39+
private String merchantCode;
40+
/**
41+
* 商户全称
42+
*/
43+
@SerializedName("merchant_company_name")
44+
private String merchantCompanyName;
45+
/**
46+
* 业务发生时间
47+
*/
48+
@SerializedName("business_time")
49+
private String businessTime;
50+
/**
51+
* 业务单据
52+
*/
53+
@SerializedName("business_code")
54+
private String businessCode;
55+
/**
56+
* 业务状态
57+
*/
58+
@SerializedName("business_state")
59+
private String businessState;
60+
/**
61+
* 备注
62+
*/
63+
@SerializedName("remark")
64+
private String remark;
65+
}
66+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.github.binarywang.wxpay.service;
2+
3+
import com.github.binarywang.wxpay.bean.merchantlimitation.MerchantLimitationResult;
4+
import com.github.binarywang.wxpay.exception.WxPayException;
5+
6+
/**
7+
* 商户被管控能力及原因查询 接口
8+
* <p>
9+
* <a href="https://pay.weixin.qq.com/doc/v3/partner/4012165270">产品介绍</a>
10+
* </p>
11+
*
12+
* @author zhangyl
13+
*/
14+
public interface MerchantLimitationService {
15+
16+
/**
17+
* 查询子商户管控情况
18+
* <p>
19+
* <a href="https://pay.weixin.qq.com/doc/v3/partner/4012803072">接口文档</a>
20+
* </p>
21+
*
22+
* @param subMchId 子商户号
23+
* @return 子商户管控情况
24+
* @throws WxPayException the wx pay exception
25+
*/
26+
MerchantLimitationResult fetchLimitations(String subMchId) throws WxPayException;
27+
28+
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,13 @@ default WxPayService switchoverTo(String mchIdOrConfigKey) {
400400
*/
401401
void setEntPayService(EntPayService entPayService);
402402

403+
/**
404+
* 获取商户被管控能力及原因查询接口
405+
*
406+
* @return MerchantLimitationService
407+
*/
408+
MerchantLimitationService getMerchantLimitationService();
409+
403410
/**
404411
* <pre>
405412
* 查询订单.
@@ -1164,6 +1171,16 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
11641171
*/
11651172
WxPayPartnerRefundNotifyV3Result parsePartnerRefundNotifyV3Result(String notifyData, SignatureHeader header) throws WxPayException;
11661173

1174+
/**
1175+
* 解析合作伙伴订阅通知
1176+
*
1177+
* @param notifyData 通知数据
1178+
* @param header 通知头部数据
1179+
* @return 合作伙伴订阅通知
1180+
* @throws WxPayException the wx pay exception
1181+
*/
1182+
PartnerSubscribeNotifyResult parsePartnerSubscribeNotify(String notifyData, SignatureHeader header) throws WxPayException;
1183+
11671184
/**
11681185
* 解析扫码支付回调通知
11691186
* 详见https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
143143
@Getter
144144
private final MiPayService miPayService = new MiPayServiceImpl(this);
145145

146+
@Getter
147+
private final MerchantLimitationService merchantLimitationService = new MerchantLimitationServiceImpl(this);
148+
146149
protected Map<String, WxPayConfig> configMap = new ConcurrentHashMap<>();
147150

148151
@Override
@@ -631,6 +634,11 @@ public WxPayPartnerRefundNotifyV3Result parsePartnerRefundNotifyV3Result(String
631634
return this.baseParseOrderNotifyV3Result(notifyData, header, WxPayPartnerRefundNotifyV3Result.class, WxPayPartnerRefundNotifyV3Result.DecryptNotifyResult.class);
632635
}
633636

637+
@Override
638+
public PartnerSubscribeNotifyResult parsePartnerSubscribeNotify(String notifyData, SignatureHeader header) throws WxPayException {
639+
return this.baseParseOrderNotifyV3Result(notifyData, header, PartnerSubscribeNotifyResult.class, PartnerSubscribeNotifyResult.DecryptNotifyResult.class);
640+
}
641+
634642
@Override
635643
public WxScanPayNotifyResult parseScanPayNotifyResult(String xmlData, @Deprecated String signType) throws WxPayException {
636644
try {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.github.binarywang.wxpay.service.impl;
2+
3+
import com.github.binarywang.wxpay.bean.merchantlimitation.MerchantLimitationResult;
4+
import com.github.binarywang.wxpay.exception.WxPayException;
5+
import com.github.binarywang.wxpay.service.MerchantLimitationService;
6+
import com.github.binarywang.wxpay.service.WxPayService;
7+
import com.google.gson.Gson;
8+
import com.google.gson.GsonBuilder;
9+
import lombok.RequiredArgsConstructor;
10+
11+
/**
12+
* 商户被管控能力及原因查询 接口实现
13+
*
14+
* @author zhangyl
15+
*/
16+
@RequiredArgsConstructor
17+
public class MerchantLimitationServiceImpl implements MerchantLimitationService {
18+
private final WxPayService payService;
19+
private static final Gson GSON = new GsonBuilder().create();
20+
21+
@Override
22+
public MerchantLimitationResult fetchLimitations(String subMchId) throws WxPayException {
23+
String url = String.format("%s/v3/mch-operation-manage/merchant-limitations/sub-mchid/%s",
24+
this.payService.getPayBaseUrl(), subMchId);
25+
String result = this.payService.getV3(url);
26+
return GSON.fromJson(result, MerchantLimitationResult.class);
27+
}
28+
}

0 commit comments

Comments
 (0)