🎨 【开放平台】重构小程序认证及备案相关接口

This commit is contained in:
痴货 2025-07-16 11:47:11 +00:00 committed by Binary Wang
parent d85e04a72a
commit 990dbba06b
18 changed files with 1292 additions and 76 deletions

View File

@ -108,6 +108,21 @@ public class WxOpenProperties {
*/
private int maxRetryTimes = 5;
/**
* 连接超时时间单位毫秒
*/
private int connectionTimeout = 5000;
/**
* 读数据超时时间即socketTimeout单位毫秒
*/
private int soTimeout = 1;
/**
* 从连接池获取链接的超时时间单位毫秒
*/
private int connectionRequestTimeout = 5000;
}
public enum StorageType {

View File

@ -0,0 +1,32 @@
package me.chanjar.weixin.open.api;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.open.bean.authandicp.WxOpenQueryAuthAndIcpResult;
import me.chanjar.weixin.open.bean.authandicp.WxOpenSubmitAuthAndIcpParam;
import me.chanjar.weixin.open.bean.authandicp.WxOpenSubmitAuthAndIcpResult;
/**
* 微信第三方平台 小程序认证及备案
* @author 痴货
* @createTime 2025/06/18 23:00
*/
public interface WxOpenMaAuthAndIcpService {
String QUERY_AUTH_AND_ICP = "https://api.weixin.qq.com/wxa/sec/query_auth_and_icp";
String SUBMIT_AUTH_AND_ICP = "https://api.weixin.qq.com/wxa/sec/submit_auth_and_icp";
/**
* 查询小程序认证及备案进度
* @param procedureId 小程序认证及备案任务流程id
* @return 小程序认证及备案进度
*/
WxOpenQueryAuthAndIcpResult queryAuthAndIcp(String procedureId) throws WxErrorException;
/**
* 提交小程序认证及备案信息
* @param param 提交小程序认证及备案信息参数
* @return 提交结果
*/
WxOpenSubmitAuthAndIcpResult submitAuthAndIcp(WxOpenSubmitAuthAndIcpParam param) throws WxErrorException;
}

View File

@ -53,19 +53,23 @@ public interface WxOpenMaBasicService {
*/
String OPEN_GET_ALL_CATEGORIES = "https://api.weixin.qq.com/cgi-bin/wxopen/getallcategories";
/**
* 8.2 添加类目
* 8.2 获取不同类型主体可设置的类目
*/
String OPEN_GET_ALL_CATEGORIES_BY_TYPE = "https://api.weixin.qq.com/cgi-bin/wxopen/getcategoriesbytype";
/**
* 8.3 添加类目
*/
String OPEN_ADD_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/addcategory";
/**
* 8.3 删除类目
* 8.4 删除类目
*/
String OPEN_DELETE_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/deletecategory";
/**
* 8.4 获取账号已经设置的所有类目
* 8.5 获取账号已经设置的所有类目
*/
String OPEN_GET_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/getcategory";
/**
* 8.5 修改类目
* 8.6 修改类目
*/
String OPEN_MODIFY_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/modifycategory";
@ -167,7 +171,12 @@ public interface WxOpenMaBasicService {
String getAllCategories() throws WxErrorException;
/**
* 8.2添加类目
* 8.2获取不同类型主体可设置的类目
*/
WxOpenGetAllCategoriesByTypeResult getAllCategoriesByType(String verifyType) throws WxErrorException;
/**
* 8.3添加类目
*
* @param categoryList 类目列表
* @return .
@ -176,7 +185,7 @@ public interface WxOpenMaBasicService {
WxOpenResult addCategory(List<WxFastMaCategory> categoryList) throws WxErrorException;
/**
* 8.3删除类目
* 8.4删除类目
*
* @param first 一级类目ID
* @param second 二级类目ID
@ -186,7 +195,7 @@ public interface WxOpenMaBasicService {
WxOpenResult deleteCategory(int first, int second) throws WxErrorException;
/**
* 8.4获取账号已经设置的所有类目
* 8.5获取账号已经设置的所有类目
*
* @return .
* @throws WxErrorException .
@ -194,7 +203,7 @@ public interface WxOpenMaBasicService {
WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException;
/**
* 8.5修改类目
* 8.6修改类目
*
* @param category 实体
* @return .

View File

@ -119,14 +119,6 @@ public interface WxOpenMaIcpService {
*/
WxOpenIcpVerifyTaskResult queryIcpVerifyTask(String taskId) throws WxErrorException;
/**
* 发起小程序管理员人脸核身
*
* @return 人脸核验任务结果
* @throws WxErrorException e
*/
WxOpenIcpCreateIcpVerifyTaskResult createIcpVerifyTask() throws WxErrorException;
/**
* 发起小程序管理员人脸核身
*
@ -227,21 +219,4 @@ public interface WxOpenMaIcpService {
*/
File getIcpMedia(String mediaId) throws WxErrorException;
/**
* 申请小程序认证及备案
*
* @param param 参数
* @return r
* @throws WxErrorException e
*/
WxOpenSubmitAuthAndIcpResult submitAuthAndIcp(WxOpenSubmitAuthAndIcpParam param) throws WxErrorException;
/**
* 查询小程序认证及备案进度
* @param procedureId 小程序认证及备案任务流程id
* @return r
* @throws WxErrorException e
*/
WxOpenQueryAuthAndIcpResult queryAuthAndIcp(String procedureId) throws WxErrorException;
}

View File

@ -731,6 +731,13 @@ public interface WxOpenMaService extends WxMaService {
*/
WxOpenMaIcpService getIcpService();
/**
* 小程序认证及备案服务
*
* @return 小程序认证及备案服务
*/
WxOpenMaAuthAndIcpService getAuthAndIcpService();
/**
* 小程序用户隐私保护指引服务
*

View File

@ -112,6 +112,11 @@ public class WxOpenFastMaServiceImpl extends WxMaServiceImpl implements WxOpenFa
return get(OPEN_GET_ALL_CATEGORIES, "");
}
@Override
public WxOpenGetAllCategoriesByTypeResult getAllCategoriesByType(String verifyType) {
return null;
}
@Override
public WxOpenResult addCategory(List<WxFastMaCategory> categoryList) throws WxErrorException {
Map<String, Object> map = new HashMap<>();

View File

@ -0,0 +1,40 @@
package me.chanjar.weixin.open.api.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
import com.google.gson.JsonObject;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.open.api.WxOpenMaAuthAndIcpService;
import me.chanjar.weixin.open.bean.authandicp.WxOpenQueryAuthAndIcpResult;
import me.chanjar.weixin.open.bean.authandicp.WxOpenSubmitAuthAndIcpParam;
import me.chanjar.weixin.open.bean.authandicp.WxOpenSubmitAuthAndIcpResult;
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
/**
* 微信第三方平台 小程序认证及备案
*
* @author 痴货
* @createTime 2025/06/18 23:00
*/
public class WxOpenMaAuthAndIcpServiceImpl implements WxOpenMaAuthAndIcpService {
private final WxMaService wxMaService;
public WxOpenMaAuthAndIcpServiceImpl(WxMaService wxMaService) {
this.wxMaService = wxMaService;
}
@Override
public WxOpenQueryAuthAndIcpResult queryAuthAndIcp(String procedureId) throws WxErrorException {
JsonObject params = new JsonObject();
params.addProperty("procedure_id", procedureId);
String response = wxMaService.post(QUERY_AUTH_AND_ICP, params);
return WxOpenGsonBuilder.create().fromJson(response, WxOpenQueryAuthAndIcpResult.class);
}
@Override
public WxOpenSubmitAuthAndIcpResult submitAuthAndIcp(WxOpenSubmitAuthAndIcpParam param) throws WxErrorException {
String response = wxMaService.post(SUBMIT_AUTH_AND_ICP, param);
return WxMaGsonBuilder.create().fromJson(response, WxOpenSubmitAuthAndIcpResult.class);
}
}

View File

@ -94,6 +94,14 @@ public class WxOpenMaBasicServiceImpl implements WxOpenMaBasicService {
return wxMaService.get(OPEN_GET_ALL_CATEGORIES, "");
}
@Override
public WxOpenGetAllCategoriesByTypeResult getAllCategoriesByType(String verifyType) throws WxErrorException {
JsonObject params = new JsonObject();
params.addProperty("verify_type", verifyType);
String response = wxMaService.post(OPEN_GET_ALL_CATEGORIES_BY_TYPE, params);
return WxOpenGsonBuilder.create().fromJson(response, WxOpenGetAllCategoriesByTypeResult.class);
}
@Override
public WxOpenResult addCategory(List<WxFastMaCategory> categoryList) throws WxErrorException {
Map<String, Object> map = new HashMap<>();

View File

@ -46,17 +46,6 @@ public class WxOpenMaIcpServiceImpl implements WxOpenMaIcpService {
return WxOpenGsonBuilder.create().fromJson(response, WxOpenIcpVerifyTaskResult.class);
}
/**
* 发起小程序管理员人脸核身
*
* @return 人脸核验任务结果
* @throws WxErrorException e
*/
@Override
public WxOpenIcpCreateIcpVerifyTaskResult createIcpVerifyTask() throws WxErrorException {
return createIcpVerifyTask(false);
}
/**
* 发起小程序管理员人脸核身
*
@ -227,31 +216,4 @@ public class WxOpenMaIcpServiceImpl implements WxOpenMaIcpService {
}
}
/**
* 申请小程序认证及备案
*
* @param param 参数
* @return r
* @throws WxErrorException e
*/
@Override
public WxOpenSubmitAuthAndIcpResult submitAuthAndIcp(WxOpenSubmitAuthAndIcpParam param) throws WxErrorException {
String response = wxMaService.post(SUBMIT_AUTH_AND_ICP, param);
return WxMaGsonBuilder.create().fromJson(response, WxOpenSubmitAuthAndIcpResult.class);
}
/**
* 查询小程序认证及备案进度
*
* @param procedureId 小程序认证及备案任务流程id
* @return r
* @throws WxErrorException e
*/
@Override
public WxOpenQueryAuthAndIcpResult queryAuthAndIcp(String procedureId) throws WxErrorException {
JsonObject params = new JsonObject();
params.addProperty("procedure_id", procedureId);
String response = wxMaService.post(QUERY_AUTH_AND_ICP, params);
return WxOpenGsonBuilder.create().fromJson(response, WxOpenQueryAuthAndIcpResult.class);
}
}

View File

@ -56,6 +56,8 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
private final WxOpenMaShoppingOrdersService shoppingOrdersService;
@Getter
private final WxOpenMaEmbeddedService embeddedService;
@Getter
private final WxOpenMaAuthAndIcpService authAndIcpService;
public WxOpenMaServiceImpl(WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
this.wxOpenComponentService = wxOpenComponentService;
@ -67,6 +69,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
this.privacyService = new WxOpenMaPrivacyServiceImpl(this);
this.shoppingOrdersService = new WxOpenMaShoppingOrdersServiceImpl(this);
this.embeddedService = new WxOpenMaEmbeddedServiceImpl(this);
this.authAndIcpService = new WxOpenMaAuthAndIcpServiceImpl(this);
initHttp();
}

View File

@ -24,6 +24,6 @@ public class MaAuthQueryIdentityTreeResult extends WxOpenResult {
* 子节点信息 非叶子节点必有
*/
@Nullable
@SerializedName("node_list")
@SerializedName("identity_tree_list")
private List<MaAuthQueryIdentityTreeResultIdentityNode> nodeList;
}

View File

@ -0,0 +1,134 @@
package me.chanjar.weixin.open.bean.authandicp;
import com.google.gson.annotations.SerializedName;
import lombok.*;
import me.chanjar.weixin.open.bean.result.WxOpenResult;
import java.io.Serializable;
import java.util.List;
/**
* @author 痴货
* @Description
* @createTime 2025/06/18 23:00
*/
@Getter
@Setter
@NoArgsConstructor
public class WxOpenQueryAuthAndIcpResult extends WxOpenResult {
private static final long serialVersionUID = -1175687030580654852L;
/**
* 当前任务流程状态见下方任务流程状态枚举
* 9 手机验证成功
* 15 等待支付认证审核费用
* 16 认证审核费用支付成功
* 17 认证审核中
* 18 认证审核驳回
* 19 认证审核通过
* 20 认证审核最终失败不能再修改
* 21 创建备案审核单失败
* 22 备案平台审核中
* 23 备案平台审核驳回
* 24 备案管局审核中
* 25 管局审核驳回
* 26 认证及备案完成
* 27 流程已过期
* 28 流程已终止
* 29 备案已撤回
*/
@SerializedName("procedure_status")
private Integer procedureStatus;
/**
* 小程序后台展示的认证订单号
*/
@SerializedName("orderid")
private Integer orderId;
/**
* 小程序认证审核单被驳回procedure_status 18时有效
*/
@SerializedName("refill_reason")
private String refillReason;
/**
* 小程序认证审核最终失败的原因procedure_status 20时有效
*/
@SerializedName("fail_reason")
private String failReason;
/**
* 小程序备案相关信息
*/
@SerializedName("icp_audit")
private IcpAudit icpAudit;
@Getter
@Setter
@NoArgsConstructor
public static class IcpAudit implements Serializable {
private static final long serialVersionUID = 879913578852421216L;
/**
* 错误提示创建备案审核单失败时返回procedure_status 21
*/
@SerializedName("hints")
private List<Hint> hints;
/**
* 驳回原因备案不通过时返回procedure_status 2325
*/
@SerializedName("audit_data")
private AuditData auditData;
/**
* 管局短信核验状态仅当任务流程状态为 24备案管局审核中的时候才有效1等待核验中2核验完成3核验超时
*/
@SerializedName("sms_verify_status")
private Integer smsVerifyStatus;
}
@Getter
@Setter
@NoArgsConstructor
public static class AuditData implements Serializable {
private static final long serialVersionUID = 2217833539540191890L;
/**
* 审核不通过的字段中文名
*/
@SerializedName("key_name")
private String keyName;
/**
* 字段不通过的原因
*/
@SerializedName("error")
private String error;
/**
* 修改建议
*/
@SerializedName("suggest")
private String suggest;
}
@Data
@EqualsAndHashCode(callSuper = true)
public static class Hint extends WxOpenResult {
private static final long serialVersionUID = 6585787444231265854L;
/**
* 校验失败的字段
*/
@SerializedName("err_field")
private String errField;
}
}

View File

@ -0,0 +1,767 @@
package me.chanjar.weixin.open.bean.authandicp;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.open.api.WxOpenMaIcpService;
import java.io.Serializable;
import java.util.List;
/**
* @author 痴货
* @Description
* @createTime 2025/06/18 23:00
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WxOpenSubmitAuthAndIcpParam implements Serializable {
private static final long serialVersionUID = 5545621231231213158L;
/**
* 认证数据
*/
@SerializedName("auth_data")
private AuthData authData;
/**
* 备案主体信息
*/
@SerializedName("icp_subject")
private IcpSubject icpSubject;
/**
* 微信小程序信息
*/
@SerializedName("icp_applets")
private IcpApplets icpApplets;
/**
* 其他备案媒体材料
*/
@SerializedName("icp_materials")
private IcpMaterials icpMaterials;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class AuthData implements Serializable {
private static final long serialVersionUID = 5545289494161613158L;
/**
* 联系人信息
*/
@SerializedName("contact_info")
private ContactInfo contactInfo;
/**
* 发票信息如果是服务商代缴模式不需要填写
*/
@SerializedName("invoice_info")
private InvoiceInfo invoiceInfo;
/**
* 认证主体类型1.企业12.个体工商户15.个人
*/
@SerializedName("customer_type")
private Integer customerType;
/**
* 支付方式 1消耗服务商预购包 2小程序开发者自行支付
*/
@SerializedName("pay_type")
private Integer payType;
/**
* 主体资质其他证明材料最多上传10张图片
*/
@SerializedName("qualification_other")
private List<String> qualificationOther;
/**
* 小程序账号名称
*/
@SerializedName("account_name")
private String accountName;
/**
* 小程序账号名称命名类型 1基于自选词汇命名 2基于商标命名
*/
@SerializedName("account_name_type")
private String accountNameType;
/**
* 名称命中关键词-补充材料支持上传多张图片
*/
@SerializedName("account_supplemental")
private List<String> accountSupplemental;
/**
* 认证类型为个人类型时可以选择要认证的身份 查询个人认证身份选项列表 里获取填叶节点的name
*/
@SerializedName("auth_identification")
private String authIdentification;
/**
* 填了 auth_identification 则必填身份证明材料 1基于不同认证身份上传不同的材料2认证类型=1时选填支持上传10张图片
*/
@SerializedName("auth_ident_material")
private List<String> authIdentMaterial;
/**
* 第三方联系电话
*/
@SerializedName("third_party_phone")
private String thirdPartyPhone;
/**
* 选择服务商代缴模式时必填服务市场 appid该服务市场账号主体必须与服务商账号主体一致
*/
@SerializedName("service_appid")
private String serviceAppid;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ContactInfo implements Serializable {
private static final long serialVersionUID = -2962862643438222305L;
/**
* 认证联系人姓名
*/
@SerializedName("name")
private String name;
/**
* 认证联系人邮箱
*/
@SerializedName("email")
private String email;
/**
* 认证联系人手机号
*/
@SerializedName("mobile")
private String mobile;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class InvoiceInfo implements Serializable {
private static final long serialVersionUID = 4564894651613131322L;
/**
* 发票类型 1: 不开发票 2: 电子发票 4: 增值税专票数电类型
*/
@SerializedName("invoice_type")
private String invoiceType;
/**
* 发票类型=2时必填 电子发票开票信息
*/
@SerializedName("electronic")
private Electronic electronic;
/**
* 发票类型=4时必填 增值税专票数电类型开票信息
*/
@SerializedName("vat")
private Vat vat;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Electronic implements Serializable {
private static final long serialVersionUID = 189498465135131444L;
/**
* 纳税识别号15位1718或20位
*/
@SerializedName("id")
private String id;
/**
* 发票备注选填
*/
@SerializedName("desc")
private String desc;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Vat implements Serializable {
private static final long serialVersionUID = 829892829816551512L;
/**
* 企业电话
*/
@SerializedName("enterprise_phone")
private String enterprisePhone;
/**
* 纳税识别号15位1718或20位
*/
@SerializedName("id")
private String id;
/**
* 企业注册地址
*/
@SerializedName("enterprise_address")
private String enterpriseAddress;
/**
* 企业开户银行选填
*/
@SerializedName("bank_name")
private String bankName;
/**
* 企业银行账号选填
*/
@SerializedName("bank_account")
private String bankAccount;
/**
* 发票备注选填
*/
@SerializedName("desc")
private String desc;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class IcpSubject implements Serializable {
private static final long serialVersionUID = -1256165165165165165L;
/**
* 主体基本信息
*/
@SerializedName("base_info")
private SubjectBaseInfo baseInfo;
/**
* 个人主体额外信息
*/
@SerializedName("personal_info")
private SubjectPersonalInfo personalInfo;
/**
* 主体额外信息个人备案时如果存在与主体负责人信息相同的字段则填入相同的值
*/
@SerializedName("organize_info")
private SubjectOrganizeInfo organizeInfo;
/**
* 主体负责人信息
*/
@SerializedName("principal_info")
private SubjectPrincipalInfo principalInfo;
/**
* 法人信息非个人备案且主体负责人不是法人时必填
*/
@SerializedName("legal_person_info")
private SubjectLegalPersonInfo legalPersonInfo;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SubjectBaseInfo implements Serializable {
private static final long serialVersionUID = -1561561613212313445L;
/**
* 主体性质选项参考 获取单位性质**仅支持企业个体工商户个人**
* {@link WxOpenMaIcpService#queryIcpSubjectTypes }
*/
@SerializedName("type")
private Integer type;
/**
* 主办单位名称
*/
@SerializedName("name")
private String name;
/**
* 备案省份使用省份代码
*/
@SerializedName("province")
private String province;
/**
* 备案城市使用城市代码
*/
@SerializedName("city")
private String city;
/**
* 备案县区使用县区代码
*/
@SerializedName("district")
private String district;
/**
* 通讯地址必须属于备案省市区地址开头的省市区不用填入
*/
@SerializedName("address")
private String address;
/**
* 主体信息备注根据需要如实填写
*/
@SerializedName("comment")
private String comment;
/**
* 主体备案号
*/
@SerializedName("record_number")
private String recordNumber;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SubjectPersonalInfo implements Serializable {
private static final long serialVersionUID = -2151981561916519288L;
/**
* 临时居住证明照片 media_id个人备案且非本省人员需要提供居住证暂住证社保证明房产证等临时居住证明
*/
@SerializedName("residence_permit")
private String residencePermit;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SubjectOrganizeInfo implements Serializable {
private static final long serialVersionUID = -1181121318132185161L;
/**
* 主体证件类型
* {@link WxOpenMaIcpService#queryIcpCertificateTypes}
*/
@SerializedName("certificate_type")
private Integer certificateType;
/**
* 主体证件号码
*/
@SerializedName("certificate_number")
private String certificateNumber;
/**
* 主体证件住所
*/
@SerializedName("certificate_address")
private String certificateAddress;
/**
* 主体证件照片 media_id如果小程序主体为非个人类型
*/
@SerializedName("certificate_photo")
private String certificatePhoto;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SubjectPrincipalInfo implements Serializable {
private static final long serialVersionUID = -2984191321918916511L;
/**
* 负责人姓名
*/
@SerializedName("name")
private String name;
/**
* 负责人联系方式
*/
@SerializedName("mobile")
private String mobile;
/**
* 负责人电子邮件
*/
@SerializedName("email")
private String email;
/**
* 负责人应急联系方式
*/
@SerializedName("emergency_contact")
private String emergencyContact;
/**
* 负责人证件类型(获取证件类型
* {@link WxOpenMaIcpService#queryIcpCertificateTypes()})
*/
@SerializedName("certificate_type")
private Integer certificateType;
/**
* 负责人证件号码
*/
@SerializedName("certificate_number")
private String certificateNumber;
/**
* 负责人证件有效期起始日期格式为 YYYYmmdd
*/
@SerializedName("certificate_validity_date_start")
private String certificateValidityDateStart;
/**
* 负责人证件有效期终止日期格式为 YYYYmmdd
*/
@SerializedName("certificate_validity_date_end")
private String certificateValidityDateEnd;
/**
* 负责人证件正面照片 media_id身份证为人像面
*/
@SerializedName("certificate_photo_front")
private String certificatePhotoFront;
/**
* 负责人证件背面照片 media_id身份证为国徽面
*/
@SerializedName("certificate_photo_back")
private String certificatePhotoBack;
/**
* 授权书 media_id当主体负责人不是法人时需要主体负责人授权书当小程序负责人不是法人时需要小程序负责人授权书
*/
@SerializedName("authorization_letter")
private String authorizationLetter;
/**
* 扫脸认证任务id(扫脸认证接口返回的task_id)仅小程序负责人需要扫脸主体负责人无需扫脸
*/
@SerializedName("verify_task_id")
private String verifyTaskId;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SubjectLegalPersonInfo implements Serializable {
private static final long serialVersionUID = -1259198165316516161L;
/**
* 法人代表姓名
*/
@SerializedName("name")
private String name;
/**
* 法人证件号码
*/
@SerializedName("certificate_number")
private String certificateNumber;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class IcpApplets implements Serializable {
private static final long serialVersionUID = -2156129841651651651L;
/**
* 微信小程序基本信息
*/
@SerializedName("base_info")
private AppletsBaseInfo AppleBaseInfo;
/**
* 小程序负责人信息
*/
@SerializedName("principal_info")
private AppletsPrincipalInfo principalInfo;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class AppletsBaseInfo implements Serializable {
private static final long serialVersionUID = 8404017028547715919L;
/**
* 小程序ID不用填写后台自动拉取
*/
@SerializedName("appid")
private String appId;
/**
* 小程序名称不用填写后台自动拉取
*/
@SerializedName("name")
private String name;
/**
* 小程序服务内容类型只能填写二级服务内容类型最多5个
* {@link WxOpenMaIcpService#queryIcpServiceContentTypes}
*/
@SerializedName("service_content_types")
private List<Integer> serviceContentTypes;
/**
* 前置审批项列表中不能存在重复的前置审批类型id如不涉及前置审批项也需要填以上都不涉及
*/
@SerializedName("nrlx_details")
private List<AppletsNrlxDetailItem> nrlxDetails;
/**
* 请具体描述小程序实际经营内容主要服务内容该信息为主管部门审核重要依据备注内容字数限制20-200字请认真填写
*/
@SerializedName("comment")
private String comment;
/**
* 小程序备案号示例值粤B2-20090059-1626X
* 申请小程序备案时不用填写查询已备案详情时会返回
*/
@SerializedName("record_number")
private String recordNumber;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class AppletsNrlxDetailItem implements Serializable {
private static final long serialVersionUID = -9144721738792167000L;
/**
* 前置审批类型
* {@link WxOpenMaIcpService#queryIcpNrlxTypes}
*/
@SerializedName("type")
private Integer type;
/**
* 前置审批号如果前置审批类型不是以上都不涉及
* 则必填示例值"粤-12345号
*/
@SerializedName("code")
private String code;
/**
* 前置审批媒体材料 media_id
*/
@SerializedName("media")
private String media;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class AppletsPrincipalInfo implements Serializable {
private static final long serialVersionUID = 5088256283066784463L;
/**
* 负责人姓名
*/
@SerializedName("name")
private String name;
/**
* 负责人联系方式
*/
@SerializedName("mobile")
private String mobile;
/**
* 负责人电子邮件
*/
@SerializedName("email")
private String email;
/**
* 负责人应急联系方式
*/
@SerializedName("emergency_contact")
private String emergencyContact;
/**
* 负责人证件类型
* {@link WxOpenMaIcpService#queryIcpCertificateTypes}
*/
@SerializedName("certificate_type")
private Integer certificateType;
/**
* 负责人证件号码
*/
@SerializedName("certificate_number")
private String certificateNumber;
/**
* 负责人证件有效期起始日期
* 格式为 YYYYmmdd示例值"20230815"
*/
@SerializedName("certificate_validity_date_start")
private String certificateValidityDateStart;
/**
* 负责人证件有效期终止日期
* 格式为 YYYYmmdd
* 如证件长期有效请填写 "长期"示例值"20330815"
*/
@SerializedName("certificate_validity_date_end")
private String certificateValidityDateEnd;
/**
* 负责人证件正面照片 media_id
* 身份证为人像面
*/
@SerializedName("certificate_photo_front")
private String certificatePhotoFront;
/**
* 负责人证件背面照片 media_id
* 身份证为国徽面
*/
@SerializedName("certificate_photo_back")
private String certificatePhotoBack;
/**
* 授权书 media_id
* 当主体负责人不是法人时需要主体负责人授权书
* 当小程序负责人不是法人时需要小程序负责人授权书
*/
@SerializedName("authorization_letter")
private String authorizationLetter;
/**
* 扫脸认证任务id(扫脸认证接口返回的task_id)
* 仅小程序负责人需要扫脸主体负责人无需扫脸
*/
@SerializedName("verify_task_id")
private String verifyTaskId;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class IcpMaterials implements Serializable {
private static final long serialVersionUID = -2651654844198165191L;
/**
* 互联网信息服务承诺书 media_id最多上传1个
*/
@SerializedName("commitment_letter")
private List<String> commitmentLetter;
/**
* 主体更名函 media_id(非个人类型且发生过更名时需要上传)最多上传1个
*/
@SerializedName("business_name_change_letter")
private List<String> businessNameChangeLetter;
/**
* 党建确认函 media_id最多上传1个
*/
@SerializedName("party_building_confirmation_letter")
private List<String> partyBuildingConfirmationLetter;
/**
* 承诺视频 media_id最多上传1个
*/
@SerializedName("promise_video")
private List<String> promiseVideo;
/**
* 网站备案信息真实性责任告知书 media_id最多上传1个
*/
@SerializedName("authenticity_responsibility_letter")
private List<String> authenticityResponsibilityLetter;
/**
* 小程序备案信息真实性承诺书 media_id最多上传1个
*/
@SerializedName("authenticity_commitment_letter")
private List<String> authenticityCommitmentLetter;
/**
* 小程序建设方案书 media_id最多上传1个
*/
@SerializedName("website_construction_proposal")
private List<String> websiteConstructionProposal;
/**
* 主体其它附件 media_id最多上传10个
*/
@SerializedName("subject_other_materials")
private List<String> subjectOtherMaterials;
/**
* 小程序其它附件 media_id最多上传10个
*/
@SerializedName("applets_other_materials")
private List<String> appletsOtherMaterials;
/**
* 手持证件照 media_id最多上传1个
*/
@SerializedName("holding_certificate_photo")
private List<String> holdingCertificatePhoto;
}
}

View File

@ -0,0 +1,52 @@
package me.chanjar.weixin.open.bean.authandicp;
import com.google.gson.annotations.SerializedName;
import lombok.*;
import me.chanjar.weixin.open.bean.result.WxOpenResult;
import java.util.List;
/**
* @author 痴货
* @Description
* @createTime 2025/06/18 23:00
*/
@Getter
@Setter
@NoArgsConstructor
public class WxOpenSubmitAuthAndIcpResult extends WxOpenResult {
private static final long serialVersionUID = -1175687058498454852L;
/**
* 错误提示
*/
@SerializedName("hints")
private List<Hint> hints;
/**
* 小程序认证及备案任务流程 id
*/
@SerializedName("procedure_id")
private String procedureId;
/**
* 小程序认证认证审核费用付费链接 pay_type 2 时返回
*/
@SerializedName("pay_url")
private String payUrl;
@Data
@EqualsAndHashCode(callSuper = true)
public static class Hint extends WxOpenResult {
private static final long serialVersionUID = 6585787444231265854L;
/**
* 校验失败的字段
*/
@SerializedName("err_field")
private String errField;
}
}

View File

@ -0,0 +1,26 @@
package me.chanjar.weixin.open.bean.icp;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 痴货
* @Description 发起小程序管理员人脸核身
* @createTime 2025/06/21 00:20
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WxOpenCreateIcpVerifyTaskParam {
/**
* 小程序认证及备案二合一场景 true否则为小程序备案场景默认值为 false
*/
@SerializedName("along_with_auth")
private Boolean alongWithAuth;
}

View File

@ -25,8 +25,9 @@ public class WxOpenIcpCreateIcpVerifyTaskResult extends WxOpenResult {
private String taskId;
/**
* 人脸核验任务urlalong_with_auth true 时返回
* 人脸核验任务url{@link WxOpenCreateIcpVerifyTaskParam#alongWithAuth } true 时返回
*/
@SerializedName("verify_url")
private String verifyUrl;
}

View File

@ -163,15 +163,40 @@ public class WxOpenXmlMessage implements Serializable {
//region 认证及备案流程的主要节点均有事件推送到第三方平台的授权事件接收接口包括支付完成派单给审核机构审核打回审核通过审核失败等消息类型固定为 notify_3rd_wxa_auth_and_icp
/**
* 小程序认证及备案任务流程 id
* 小程序认证及备案任务流程id
*/
@XStreamAlias("procedure_id")
private String procedureId;
/**
* 当前任务流程状态小程序认证及备案进度查询 API 文档中的任务流程状态枚举
* 任务流程状态
* 9 手机验证成功
* 15 等待支付认证审核费用
* 16 认证审核费用支付成功
* 17 认证审核中
* 18 认证审核驳回
* 19 认证审核通过
* 20 认证审核最终失败不能再修改
* 21 创建备案审核单失败
* 22 备案平台审核中
* 23 备案平台审核驳回
* 24 备案管局审核中
* 25 管局审核驳回
* 26 认证及备案完成
* 27 流程已过期
* 28 流程已终止
* 29 备案已撤回
*/
@XStreamAlias("procedure_status")
private Integer procedureStatus;
//endregion
/**
* 原始通知内容
*/
private String context;
//endregion
/**
@ -296,7 +321,9 @@ public class WxOpenXmlMessage implements Serializable {
WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage);
String plainText = cryptUtil.decryptXml(msgSignature, timestamp, nonce, encryptedXml);
log.debug("解密后的原始xml消息内容{}", plainText);
return fromXml(plainText);
WxOpenXmlMessage wxOpenXmlMessage = fromXml(plainText);
wxOpenXmlMessage.setContext(plainText);
return wxOpenXmlMessage;
}
public static WxMpXmlMessage fromEncryptedMpXml(String encryptedXml, WxOpenConfigStorage wxOpenConfigStorage,

View File

@ -0,0 +1,153 @@
package me.chanjar.weixin.open.bean.result;
import com.google.gson.annotations.SerializedName;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 获取所有类目
* author 痴货
*/
@Getter
@Setter
@NoArgsConstructor
public class WxOpenGetAllCategoriesByTypeResult extends WxOpenResult {
private static final long serialVersionUID = -2845321894615646115L;
/**
* 类目信息列表
*/
@SerializedName("categories_list")
private CategoriesList categorieslist;
@Getter
@Setter
@NoArgsConstructor
public static class CategoriesList implements Serializable {
private static final long serialVersionUID = -2845321894615646115L;
/**
* 类目信息
*/
@SerializedName("categories")
private List<Categories> categories;
}
@Getter
@Setter
@NoArgsConstructor
public static class Categories implements Serializable {
private static final long serialVersionUID = -284532256461546115L;
/**
* 类目 ID
*/
@SerializedName("id")
private Integer id;
/**
* 类目名称
*/
@SerializedName("name")
private String name;
/**
* 类目层级
*/
@SerializedName("level")
private Integer level;
/**
* 父类目 ID
*/
@SerializedName("father")
private Integer father;
/**
* 子类目 ID
*/
@SerializedName("children")
private List<Integer> children;
/**
* 是否敏感类目1 为敏感类目需要提供相应资质审核0 为非敏感类目无需审核
*/
@SerializedName("sensitive_type")
private Integer sensitiveType;
/**
* sensitive_type 1 的类目需要提供的资质证明
*/
@SerializedName("qualify")
private Qualify qualify;
/**
* 类目权限范围
*/
@SerializedName("scope")
private String scope;
}
@Getter
@Setter
@NoArgsConstructor
public static class Qualify implements Serializable {
private static final long serialVersionUID = -2841894318945616115L;
/**
* 资质证明列表
*/
@SerializedName("exter_list")
private List<Exter> exterList;
/**
* 备注
*/
@SerializedName("remark")
private String remark;
}
@Getter
@Setter
@NoArgsConstructor
public static class Exter implements Serializable {
private static final long serialVersionUID = -2841894318945616115L;
@SerializedName("inner_list")
private List<Inner> innerList;
}
@Getter
@Setter
@NoArgsConstructor
public static class Inner implements Serializable {
private static final long serialVersionUID = -15646131313516531L;
/**
* 资质文件名称
*/
@SerializedName("name")
private String name;
/**
* 资质文件示例
*/
@SerializedName("url")
private String url;
}
}