1
0
mirror of synced 2025-12-16 20:28:11 +08:00

🆕 #3169 【微信支付】新增商户开户意愿确认相关接口

1.提交申请单 - 通过此接口向微信支付提交商户的联系人信息、主体信息以及联系人信息实现商户开户意愿确认。
2.撤销申请单 - 通过此接口撤销商户开户意愿确认申请单。
3.查询申请单审核结果 - 通过此接口查询申请单的审核状态。
4.获取商户开户意愿确认状态 - 通过此接口获取商户开户意愿确认状态。

Co-authored-by: longchen <longchen@ztoec.com>
This commit is contained in:
潘安
2023-11-20 15:11:56 +08:00
committed by GitHub
parent 28436e779d
commit f9306e12a2
7 changed files with 1172 additions and 0 deletions

View File

@@ -0,0 +1,819 @@
package com.github.binarywang.wxpay.bean.applyconfirm;
import com.github.binarywang.wxpay.bean.applyment.enums.*;
import com.github.binarywang.wxpay.v3.SpecEncrypt;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* 间连商户开户意愿确认 提交申请对象
*
* @author <a href="https://github.com/wslongchen">Mr.Pan</a>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ApplySubjectConfirmCreateRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 渠道商户号
* 1、微信支付分配的渠道商户唯一标识
* 2、当从业机构调用时该字段必填需填写从业机构下的渠道商户号
* 3、当渠道商户调用时该字段无需填写
* 示例值20001111
*/
@SerializedName("channel_id")
private String channelId;
/**
* 业务申请编号
* 1、只能由数字、字母或下划线组成
* 2、服务商自定义的唯一编号。每个编号对应一个申请单
* 3、建议前缀带上服务商商户号参看示例值
* 示例值1900013511_10000
*/
@SerializedName("business_code")
private String businessCode;
/**
* 联系人信息
* 联系人信息,联系人是商户的联系人,将接收开户信息及日常重要管理信息,
* 请确定联系人为商户法定代表人或经营者再进行操作。如联系人非商户法定代表人或经营者,
* 请提交经办人身份证件和业务办理授权函。
*/
@SerializedName("contact_info")
@SpecEncrypt
private ApplySubConfirmContactInfo contactInfo;
/**
* 主体资料
*/
@SerializedName("subject_info")
@SpecEncrypt
private ApplySubConfirmSubjectInfo subjectInfo;
/**
* 法人身份信息
*/
@SerializedName("identification_info")
@SpecEncrypt
private ApplySubConfirmIdentificationInfo identityInfo;
/**
* 最终受益人信息列表(UBO)
*/
@SerializedName("ubo_info_list")
@SpecEncrypt
private List<ApplySubConfirmUboInfo> uboInfoList;
/**
* 补充材料
*/
@SerializedName("addition_info")
private ApplySubConfirmAdditionInfo additionInfo;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmIdentificationInfo implements Serializable {
private static final long serialVersionUID = 1683704338370383827L;
/**
* 证件持有人类型
* 1. 主体类型为政府机关、事业单位时选传:
* 1若上传的是法人证件则不需要上传该字段。
* 2若因特殊情况无法提供法人证件时可上传经办人。 (经办人:经商户授权办理微信支付业务的人员,授权范围包括但不限于签约,入驻过程需完成账户验证)。
* 2. 主体类型为企业、个体户、社会组织时,默认为经营者/法人,不需要上传该字段。
* LEGAL经营者/法人
* SUPER经办人
* 示例值LEGAL
* @see com.github.binarywang.wxpay.bean.ecommerce.ApplymentsRequest 字段idHolderType
*/
@SerializedName("id_holder_type")
private String idHolderType;
/**
* 证件类型
* 1、当证件持有人类型为法人时填写。其他情况无需上传。
* 2、个体户/企业/事业单位/社会组织:可选择任一证件类型,政府机关、小微仅支持中国大陆居民-身份证类型。
* 枚举值:
* IDENTIFICATION_TYPE_IDCARD中国大陆居民-身份证
* IDENTIFICATION_TYPE_OVERSEA_PASSPORT其他国家或地区居民-护照
* IDENTIFICATION_TYPE_HONGKONG_PASSPORT中国香港居民-来往内地通行证
* IDENTIFICATION_TYPE_MACAO_PASSPORT中国澳门居民-来往内地通行证
* IDENTIFICATION_TYPE_TAIWAN_PASSPORT中国台湾居民-来往大陆通行证
* IDENTIFICATION_TYPE_FOREIGN_RESIDENT外国人居留证
* IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT港澳居民证
* IDENTIFICATION_TYPE_TAIWAN_RESIDENT台湾居民证
* 示例值IDENTIFICATION_TYPE_IDCARD
*/
@SerializedName("id_doc_type")
private IdTypeEnum idDocType;
/**
* 法定代表人说明函
*/
@SerializedName("authorize_letter_copy")
private String authorizeLetterCopy;
/**
* 证件姓名
* 1、当证件持有人类型为法人时请填写法人证件上的姓名。其他情况无需上传。
* 2、长度为2-100个字符
* 3、前后不能有空格、制表符、换行符
* 4、不能仅含数字、特殊字符
* 5、仅能填写数字、英文字母、汉字及特殊字符
* 6、该字段需进行加密处理加密方法详见《敏感信息加密说明》
* 示例值pVd1HJ6zyvPedzGaV+X3IdGdbDnuC4Eelw/wDa4SzfeespQO/0kjiwfqdfg==
*/
@SerializedName("identification_name")
@SpecEncrypt
private String identificationName;
/**
* 证件号码
* 1、当证件持有人类型为法人时请填写法人证件上的证件号码。其他情况无需上传。
* 2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码号码规范如下
* 身份证(限中国大陆居民)17位数字+1位数字|X
* 护照限境外人士4-15位 数字|字母|连字符
* 中国香港居民--来往内地通行证H/h开头+8或10位数字/字母
* 中国澳门居民--来往内地通行证M/m开头+8或10位数字/字母
* 中国台湾居民--来往大陆通行证8位数字或10位数字
* 外国人居留证15位 数字|字母
* 港澳居住证/台湾居住证17位数字+1位数字|X
* 3、该字段需进行加密处理加密方法详见《敏感信息加密说明》
* 示例值pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg==
*/
@SerializedName("identification_number")
@SpecEncrypt
private String identificationNumber;
/**
* 证件有效日期
* 1、日期格式应满足合法的YYYY-MM-DD格式参见示例值
* 2、若证件有效期为长期请填写fovever。
* 3、开始时间不能大于等于当前日期结束时间需大于开始时间。
* 示例值:[\"2017-10-28\",\"forever\"]
*/
@SerializedName("identification_valid_date")
private String identificationValidDate;
/**
* 证件有效日期
* 1、主体类型为企业时需要填写。其他主体类型无需上传。
* 2、请按照身份证住址填写如广东省深圳市南山区xx路xx号xx室
* 3、长度为4-128个字符
* 4、前后不能有空格、制表符、换行符
* 5、不能仅含数字、特殊字符
* 6、仅能填写数字、英文字母、汉字及特殊字符
* 7、仅支持utf-8格式
* 8、该字段需进行加密处理加密方法详见《敏感信息加密说明》。
* 示例值pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ib0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg==
*/
@SerializedName("identification_address")
@SpecEncrypt
private String identificationAddress;
/**
* 证件正面照片
*/
@SerializedName("identification_front_copy")
private String identificationFrontCopy;
/**
* 证件反面照片
*/
@SerializedName("identification_back_copy")
private String identificationBackCopy;
/**
* 经营者/法人是否为受益人
*/
@SerializedName("owner")
private Boolean owner;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmUboInfo implements Serializable {
private static final long serialVersionUID = 7918585690831975042L;
/**
* 证件类型
*/
@SerializedName("ubo_id_doc_type")
private IdTypeEnum uboIdDocType;
/**
* 证件正面照片
*/
@SerializedName("ubo_id_doc_copy")
private String uboIdDocCopy;
/**
* 证件反面照片
*/
@SerializedName("ubo_id_doc_copy_back")
private String uboIdDocCopyBack;
/**
* 证件姓名
*/
@SerializedName("ubo_id_doc_name")
@SpecEncrypt
private String uboIdDocName;
/**
* 证件号码
*/
@SerializedName("ubo_id_doc_number")
@SpecEncrypt
private String uboIdDocNumber;
/**
* 证件居住地址
*/
@SerializedName("ubo_id_doc_address")
@SpecEncrypt
private String uboIdDocAddress;
/**
* 证件有效期开始时间
*/
@SerializedName("ubo_period_begin")
private String uboPeriodBegin;
/**
* 证件有效期结束时间
*/
@SerializedName("ubo_period_end")
private String uboPeriodEnd;
}
/**
* 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmContactInfo implements Serializable {
private static final long serialVersionUID = -480297586102445959L;
/**
* 联系人类型
* 1、主体为“小微/个人卖家 ”,可选择:
* LEGAL经营者/法人。
* 2、主体为“个体工商户/企业/政府机关/事业单位/社会组织”,可选择:
* LEGAL经营者/法人、
* SUPER经办人。 (经办人:经商户授权办理微信支付业务的人员)。
* 示例值LEGAL
*/
@SerializedName("contact_type")
private String contactType;
/**
* 超级管理员姓名
*/
@SerializedName("name")
@SpecEncrypt
private String name;
/**
* 联系人证件类型
* 当联系人类型是经办人时,请上传联系人证件类型。
* 枚举值:
* IDENTIFICATION_TYPE_IDCARD中国大陆居民-身份证
* IDENTIFICATION_TYPE_OVERSEA_PASSPORT其他国家或地区居民-护照
* IDENTIFICATION_TYPE_HONGKONG_PASSPORT中国香港居民-来往内地通行证
* IDENTIFICATION_TYPE_MACAO_PASSPORT中国澳门居民-来往内地通行证
* IDENTIFICATION_TYPE_TAIWAN_PASSPORT中国台湾居民-来往大陆通行证
* IDENTIFICATION_TYPE_FOREIGN_RESIDENT外国人居留证
* IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT港澳居民证
* IDENTIFICATION_TYPE_TAIWAN_RESIDENT台湾居民证
* 示例值IDENTIFICATION_TYPE_IDCARD
*/
@SerializedName("contact_id_doc_type")
private String contactIdDocType;
/**
* 联系人证件号码
* 1、若联系人类型为法人则该身份证号码需与法人身份证号码一致。若联系人类型为经办人则可填写实际经办人的身份证号码。
* 2、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码规范如下
* 身份证(限中国大陆居民)17位数字+1位数字|X
* 护照限境外人士4-15位 数字|字母|连字符
* 中国香港居民--来往内地通行证H/h开头+8或10位数字/字母
* 中国澳门居民--来往内地通行证M/m开头+8或10位数字/字母
* 中国台湾居民--来往大陆通行证8位数字或10位数字
* 外国人居留证15位 数字|字母
* 港澳居住证/台湾居住证17位数字+1位数字|X
* 3、联系人签约时校验微信号绑定的银行卡实名信息是否与该证件号码一致。
* 4、该字段需进行加密处理加密方法详见敏感信息加密说明。(提醒必须在HTTP头中上送Wechatpay-Serial)
* 示例值pVd1HJ6zmty7/mYNxLMpRSvMRtelw/wDa4SzfeespQO/0kjiwfqdfg==
*/
@SerializedName("id_card_number")
@SpecEncrypt
private String contactIdNumber;
/**
* 联系人证件正面照片
* 1、当联系人类型是经办人时请上传联系人证件的正面照片。
* 2、若证件类型为身份证请上传人像面照片。
* 3、正面拍摄、清晰、四角完整、无反光或遮挡不得翻拍、截图、镜像、PS。
* 4、请上传彩色照片or彩色扫描件复印件需加盖公章鲜章可添加“微信支付”相关水印如微信支付认证见【指引文档】
* 5、可上传1张图片请填写通过图片上传API预先上传图片生成好的MediaID。
* 示例值jTpGmxUXqRTvDujqhThn4ReFxikqJ5YW6zFQ
*/
@SerializedName("contact_id_doc_copy")
private String contactIdDocCopy;
/**
* 1、当联系人类型是经办人时请上传联系人证件的反面照片。
* 2、若证件类型为护照无需上传反面照片。
* 3、正面拍摄、清晰、四角完整、无反光或遮挡不得翻拍、截图、镜像、PS。
* 4、请上传彩色照片or彩色扫描件复印件需加盖公章鲜章可添加“微信支付”相关水印如微信支付认证见【指引文档】
* 5、可上传1张图片请填写通过图片上传API预先上传图片生成好的MediaID。
* 示例值jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ
*/
@SerializedName("contact_id_doc_copy_back")
private String contactIdDocCopyBack;
/**
* 联系人证件有效期开始时间
* 1、当超级管理员类型是经办人时请上传证件有效期开始时间。
* 2、请按照示例值填写日期格式应满足合法的YYYY-MM-DD格式
* 3、开始时间不能小于1900-01-01开始时间不能大于等于当前日期。
* 示例值2019-06-06
*/
@SerializedName("contact_period_begin")
private String contactPeriodBegin;
/**
* 联系人证件有效期结束时间
* 1、当超级管理员类型是经办人时请上传证件有效期结束时间。
* 2、请按照示例值填写日期格式应满足合法的YYYY-MM-DD格式若证件有效期为长期请填写长期。
* 3、结束时间大于开始时间。
* 示例值2026-06-06
*/
@SerializedName("contact_period_end")
private String contactPeriodEnd;
/**
* 联系人手机号
* 1、11位数字。
* 2、用于接收微信支付的重要管理信息及日常操作验证码。
*/
@SerializedName("mobile")
@SpecEncrypt
private String mobile;
}
/**
* 主体资料
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmSubjectInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主体类型
* 主体类型需与营业执照/登记证书上一致,可参考选择主体指引。
* SUBJECT_TYPE_ENTERPRISE企业
* SUBJECT_TYPE_INSTITUTIONS_CLONED事业单位
* SUBJECT_TYPE_INDIVIDUAL个体工商户
* SUBJECT_TYPE_OTHERS社会组织
* SUBJECT_TYPE_MICRO小微商户
* SUBJECT_TYPE_GOVERNMENT政府机关
* 示例值SUBJECT_TYPE_ENTERPRISE
*/
@SerializedName("subject_type")
private SubjectTypeEnum subjectType;
/**
* 是否是金融机构
* 选填,请根据申请主体的实际情况填写,可参考选择金融机构指引:
* 1、若商户主体是金融机构则填写true。
* 2、若商户主体不是金融机构则填写false。
* 若未传入将默认填写false。
* 示例值true
*/
@SerializedName("finance_institution")
private Boolean financeInstitution;
/**
* 营业执照
*/
@SerializedName("business_license_info")
private ApplySubConfirmBusinessLicenseInfo businessLicenseInfo;
/**
* 登记证书
*/
@SerializedName("certificate_info")
private ApplySubConfirmCertificateInfo certificateInfo;
/**
* 单位证明函照片
* 1、主体类型为政府机关/事业单位时,单位证明函照片必填。
* 2、单位证明函格式参考示例
* 3、请填写通过《图片上传API》预先上传图片生成好的MediaID
* 示例值0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo
*/
@SerializedName("company_prove_copy")
private String companyProveCopy;
/**
* 辅助证明材料信息
* 主体类型为小微商户时,辅助证明材料信息必填
*/
@SerializedName("assist_prove_info")
private ApplySubConfirmAssistProveInfo assistProveInfo;
/**
* 经营许可证
*/
@SerializedName("special_operation_list")
private List<ApplySubConfirmSpecialOperationList> specialOperationList;
/**
* 金融机构许可证信息
*/
@SerializedName("finance_institution_info")
private ApplySubConfirmFinanceInstitutionInfo financeInstitutionInfo;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmBusinessLicenseInfo implements Serializable {
private static final long serialVersionUID = -1016615300418945838L;
/**
* 注册号/统一社会信用代码
* 1、主体为“个体工商户”时请填写营业执照上的注册号/统一社会信用代码,格式需满足以下任一条件:
* -15位数字
* -18位阿拉伯数字或大写英文字母不得包含英文字母I/O/Z/S/V并且以9开头
* 2、主体为“企业”时请填写营业执照上的注册号/统一社会信用代码,格式如下:
* -18位阿拉伯数字或大写英文字母不得包含英文字母I/O/Z/S/V并且以9开头
* 示例值914201123033363296
*/
@SerializedName("license_number")
private String licenseNumber;
/**
* 营业执照照片
* 1、照片应正面拍摄、清晰、四角完整、无反光或遮挡不得翻拍、截图、镜像、PS
* 2、上传彩色照片、彩色扫描件复印件需加盖公章鲜章。
* 3、水印仅限于微信支付业务相关。
* 4、指引与示例可参考【指引文档】
* 5、请填写通过《图片上传API》预先上传图片生成好的MediaID
* 示例值0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo
*/
@SerializedName("license_copy")
private String licenseCopy;
/**
* 商户名称
* 1、长度为2-128个字符
* 2、前后不能有空格、制表符、换行符
* 3、不能仅含数字、特殊字符
* 4、仅能填写数字、英文字母、汉字及特殊字符
* 5、仅支持utf-8格式
* 6、个体户证件为以下情况时按照个体户XXX命名XXX是营业执照经营人姓名营业执照登记名称为空、仅含数字、仅含特殊字符、“无”、“无字号”
* 7、个体户不能使用“企业”“公司”或“农民专业合作社”结尾
* 示例值:李四网络有限公司
*/
@SerializedName("merchant_name")
private String merchantName;
/**
* 法人姓名
* 请填写营业执照的经营者/法定代表人姓名
* 1、长度为2-100个字符
* 2、前后不能有空格、制表符、换行符
* 3、不能仅含特殊字符
* 4、仅能填写数字、英文字母、汉字及特殊字符
* 示例值:李四
*/
@SerializedName("legal_person")
private String legalPerson;
/**
* 注册地址
* 建议填写营业执照的注册地址
* 1、长度为4-128个字符
* 2、前后不能有空格、制表符、换行符
* 3、不能仅含数字、特殊字符
* 4、仅能填写数字、英文字母、汉字及特殊字符
* 5、仅支持utf-8格式
* 示例值广东省深圳市南山区xx路xx号
*/
@SerializedName("company_address")
private String companyAddress;
/**
* 营业执照有效日期
* 1、日期格式应满足合法的YYYY-MM-DD格式参见示例值
* 2、开始时间不能小于1900-01-01
* 3、若证件有效期为长期请填写fovever。
* 4、开始时间不能大于等于当前日期结束时间需大于开始时间。
* 示例值:[\"2017-10-28\",\"2037-10-28\"]
*
*/
@SerializedName("licence_valid_date")
private String periodBegin;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmCertificateInfo implements Serializable {
private static final long serialVersionUID = 5080675335337916895L;
/**
* 登记证书照片
* 1、照片应正面拍摄、清晰、四角完整、无反光或遮挡不得翻拍、截图、镜像、PS
* 2、上传彩色照片、彩色扫描件复印件需加盖公章鲜章。
* 3、水印仅限于微信支付业务相关。
* 4、指引与示例可参考【指引文档】
* 5、请填写通过《图片上传API》预先上传图片生成好的MediaID
* 示例值0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo
*/
@SerializedName("cert_copy")
private String certCopy;
/**
* 登记证书类型
* 登记证书的类型。
* 1、主体为“政府机关/事业单位/社会组织”时,请上传登记证书类型。
*
* 当主体为事业单位时,选择此枚举值:
* CERTIFICATE_TYPE_2388事业单位法人证书
*
* 当主体为政府机关,选择此枚举值:
* CERTIFICATE_TYPE_2389统一社会信用代码证书
*
* 当主体为社会组织,选择以下枚举值之一:
* CERTIFICATE_TYPE_2389统一社会信用代码证书
* CERTIFICATE_TYPE_2394社会团体法人登记证书
* CERTIFICATE_TYPE_2395民办非企业单位登记证书
* CERTIFICATE_TYPE_2396基金会法人登记证书
* CERTIFICATE_TYPE_2520执业许可证/执业证
* CERTIFICATE_TYPE_2521基层群众性自治组织特别法人统一社会信用代码证
* CERTIFICATE_TYPE_2522农村集体经济组织登记证
* CERTIFICATE_TYPE_2399宗教活动场所登记证
* CERTIFICATE_TYPE_2400政府部门下发的其他有效证明文件
* 示例值CERTIFICATE_TYPE_2388
*/
@SerializedName("cert_type")
private CertTypeEnum certType;
/**
* 证书号
* 请输入与所选证书类型相匹配且符合国家标准规范的证书号其中除政府证明文件外需满足18位阿拉伯数字或大写英文字母不得包含英文字母I/O/Z/S/V
* 示例值111111111111
*/
@SerializedName("cert_number")
private String certNumber;
/**
* 商户名称
* 请填写登记证书上的商户名称
* 1、长度为2-128个字符
* 2、前后不能有空格、制表符、换行符
* 3、不能仅含数字、特殊字符
* 4、仅能填写数字、英文字母、汉字及特殊字符
* 5、仅支持utf-8格式
* 示例值xx公益团体
*/
@SerializedName("merchant_name")
private String merchantName;
/**
* 注册地址
*/
@SerializedName("company_address")
private String companyAddress;
/**
* 法人姓名
* 请填写登记证书上的法定代表人姓名
* 1、长度为2-100个字符
* 2、前后不能有空格、制表符、换行符
* 3、不能仅含特殊字符
* 4、仅能填写数字、英文字母、汉字及特殊字符
* 示例值:李四
*/
@SerializedName("legal_person")
private String legalPerson;
/**
* 证书有效日期
* 1、日期格式应满足合法的YYYY-MM-DD格式参见示例值
* 2、若证件有效期为长期请填写fovever。
* 3、开始时间不能大于等于当前日期结束时间需大于开始时间。
* 示例值:["2017-10-28","2037-10-28"]
*/
@SerializedName("cert_valid_date")
private String certValidDate;
}
/**
* 辅助证明材料信息
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmAssistProveInfo implements Serializable {
private static final long serialVersionUID = -3394274542660805766L;
/**
* 小微经营类型
* MICRO_TYPE_STORE门店场所
* MICRO_TYPE_MOBILE流动经营/便民服务
* MICRO_TYPE_ONLINE线上商品/服务交易
* 示例值MICRO_TYPE_STORE
*/
@SerializedName("micro_biz_type")
private String microBizType;
/**
* 门店名称
* 1、填写规范
* 门店场所:填写门店名称
* 流动经营/便民服务:填写经营/服务名称
* 线上商品/服务交易:填写线上店铺名称
* 2、格式规范
* 长度为1-50个字符
* 前后不能有空格、制表符、换行符
* 不能仅含数字、特殊字符
* 仅能填写数字、英文字母、汉字及特殊字符
* 仅支持utf-8格式
* 示例值:大郎烧饼
*/
@SerializedName("store_name")
private String storeName;
/**
* 门店省市编码
* 1、只能由数字组成
* 2、详细参见微信支付提供的省市对照表
* 3、填写规范
* 门店场所:填写门店省市编码
* 流动经营/便民服务:填写经营/服务所在地省市编码
* 线上商品/服务交易:填写卖家所在地省市编码
* 示例值440305
*/
@SerializedName("store_address_code")
private String storeAddressCode;
/**
* 门店地址
* 1、填写规范
* 门店场所:填写店铺详细地址,具体区/县及街道门牌号或大厦楼层
* 流动经营/便民服务:填写“无”
* 线上商品/服务交易:填写电商平台名称
* 2、格式规范
* 长度为4-512个字符
* 前后不能有空格、制表符、换行符
* 不能仅含数字、特殊字符
* 仅能填写数字、英文字母、汉字及特殊字符
* 仅支持utf-8格式
* 示例值广东省深圳市南山区xx大厦x层xxxx室
*/
@SerializedName("store_address")
private String storeAddress;
/**
* 门店门头照片
* 1、请上传门头正面照片要求门店招牌、门框完整、清晰、可辨识若为停车场等无固定门头照片的经营场所可上传岗亭/出入闸口。具体参考【指引文档】;
* 2、请填写通过《图片上传API》预先上传图片生成好的MediaID
* 示例值0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo
*/
@SerializedName("store_header_copy")
private String storeHeaderCopy;
/**
* 店内环境照片
* 1、请上传门店内部环境照片可辨识经营内容。若为停车场等无固定门头的经营场所可上传停车场内部照片。具体参考【指引文档】
* 2、请填写通过《图片上传API》预先上传图片生成好的MediaID
* 示例值0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo
*/
@SerializedName("store_indoor_copy")
private String storeIndoorCopy;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmSpecialOperationList implements Serializable {
private static final long serialVersionUID = 6016563999835704297L;
/**
* 行业类目id
* 参看微信支付提供的特殊行业id对照表
* 示例值100
*/
@SerializedName("finance_type")
private Integer financeType;
/**
* 行业经营许可证资质照片
* 1、请根据特殊行业id对照表内指引仅当所选择的行业为【必填经营许可证】的行业时才需上传该项资料
* 2、请填写通过《图片上传API》预先上传图片生成好的MediaID
* 3、每个行业最多支持5张资质照片
* 示例值0P3ng6KTIW4-Q_l2FjKLZuhHjBWoMAjmVtCz7ScmhEIThCaV-4BBgVwtNkCHO_XXqK5dE5YdOmFJBZR9FwczhJehHhAZN6BKXQPcs-VvdSo
*/
@SerializedName("operation_copy_list")
private List<String> financeLicensePics;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmFinanceInstitutionInfo implements Serializable {
private static final long serialVersionUID = 6016563999835704297L;
/**
* 金融机构类型
*
* @see FinanceTypeEnum
*/
@SerializedName("finance_type")
private FinanceTypeEnum financeType;
/**
* 金融机构许可证图片
*/
@SerializedName("finance_license_pics")
private List<String> financeLicensePics;
}
}
/**
* 补充材料
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public static class ApplySubConfirmAdditionInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 法人开户承诺函
*/
@SerializedName("legal_person_commitment")
private String legalPersonCommitment;
/**
* 法人开户意愿视频
*/
@SerializedName("legal_person_video")
private String legalPersonVideo;
/**
* 补充材料
*/
@SerializedName("business_addition_pics")
private List<String> businessAdditionPics;
/**
* 补充说明
*/
@SerializedName("business_addition_msg")
private String businessAdditionMsg;
}
}

View File

@@ -0,0 +1,31 @@
package com.github.binarywang.wxpay.bean.applyconfirm;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 间连商户开户意愿确认 提交申请结果响应
*
* @author <a href="https://github.com/wslongchen">Mr.Pan</a>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ApplySubjectConfirmCreateResult implements Serializable {
private static final long serialVersionUID = 6171290256346697399L;
/**
* 微信支付申请单号
*/
@SerializedName("applyment_id")
private String applymentId;
}

View File

@@ -0,0 +1,30 @@
package com.github.binarywang.wxpay.bean.applyconfirm;
import com.github.binarywang.wxpay.bean.applyconfirm.enums.AuthorizeStateEnum;
import com.github.binarywang.wxpay.bean.applyment.enums.ApplymentStateEnum;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
*获取商户开户意愿确认状态返回对象信息
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ApplySubjectConfirmMerchantStateQueryResult implements Serializable {
private static final long serialVersionUID = 3842134912775708112L;
/**
* 授权状态
*/
@SerializedName("authorize_state")
private AuthorizeStateEnum applymentState;
}

View File

@@ -0,0 +1,45 @@
package com.github.binarywang.wxpay.bean.applyconfirm;
import com.github.binarywang.wxpay.bean.applyment.enums.ApplymentStateEnum;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* 查询申请单状态返回对象信息
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ApplySubjectConfirmStateQueryResult implements Serializable {
private static final long serialVersionUID = 3842134912775708112L;
/**
* 申请单状态
*/
@SerializedName("applyment_state")
private ApplymentStateEnum applymentState;
/**
* 二维码图片
*/
@SerializedName("qrcode_data")
private String qrcodeData;
/**
* 驳回参数
*/
@SerializedName("reject_param")
private String rejectParam;
/**
* 驳回原因
*/
@SerializedName("reject_reason")
private String rejectReason;
}

View File

@@ -0,0 +1,18 @@
package com.github.binarywang.wxpay.bean.applyconfirm.enums;
/**
* 授权状态枚举类
*/
public enum AuthorizeStateEnum {
/**
* 未授权
*/
AUTHORIZE_STATE_UNAUTHORIZED,
/**
* 已授权
*/
AUTHORIZE_STATE_AUTHORIZED,
;
}

View File

@@ -0,0 +1,97 @@
package com.github.binarywang.wxpay.service;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmCreateRequest;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmCreateResult;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmMerchantStateQueryResult;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmStateQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException;
/**
* <pre>
* 商户开户意愿确认
* 产品文档:<a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter6_1_1.shtml">商户开户意愿确认流程</a>
* </pre>
*
* @author <a href="https://github.com/wslongchen">Mr.Pan</a>
*/
public interface Apply4SubjectConfirmService {
/**
* <pre>
* 提交申请单
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_1.shtml">间连商户开户意愿确认(提交申请单)</a>
* </pre>
*
* @param request 申请请求参数
* @return 审核结果
* @throws WxPayException 异常
*/
ApplySubjectConfirmCreateResult applyment(ApplySubjectConfirmCreateRequest request) throws WxPayException;
/**
*
* <pre>
* 查询申请单审核结果
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_3.shtml">查询申请单审核结果</a>
* </pre>
*
* @param businessCode 业务申请编号
* @return 审核结果
* @throws WxPayException 异常
*/
ApplySubjectConfirmStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException;
/**
*
* <pre>
* 查询申请单审核结果
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_3.shtml">查询申请单审核结果</a>
* </pre>
*
* @param applymentId 申请编号
* @return 审核结果
* @throws WxPayException 异常
*/
ApplySubjectConfirmStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException;
/**
*
* <pre>
* 获取商户开户意愿确认状态
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_4.shtml">获取商户开户意愿确认状态API</a>
* </pre>
*
* @param subMchId 微信支付分配的特约商户的唯一标识。
* @return 确认状态结果
* @throws WxPayException 异常
*/
ApplySubjectConfirmMerchantStateQueryResult queryMerchantApplyStatusByMchId(String subMchId) throws WxPayException;
/**
*
* <pre>
* 撤销申请单
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_2.shtml">撤销申请单API</a>
* </pre>
*
* @param businessCode 业务申请编号
* @throws WxPayException 异常
*/
void cancelApplyByBusinessCode(String businessCode) throws WxPayException;
/**
*
* <pre>
* 撤销申请单
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_2.shtml">撤销申请单API</a>
* </pre>
*
* @param applymentId 申请编号
* @throws WxPayException 异常
*/
void cancelApplyByApplymentId(String applymentId) throws WxPayException;
}

View File

@@ -0,0 +1,132 @@
package com.github.binarywang.wxpay.service.impl;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmCreateRequest;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmCreateResult;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmMerchantStateQueryResult;
import com.github.binarywang.wxpay.bean.applyconfirm.ApplySubjectConfirmStateQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.Apply4SubjectConfirmService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.v3.util.RsaCryptoUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* <pre>
* 商户开户意愿确认
* 产品文档:<a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter6_1_1.shtml">商户开户意愿确认流程</a>
* </pre>
*
* @author <a href="https://github.com/wslongchen">Mr.Pan</a>
*/
@Slf4j
@RequiredArgsConstructor
public class Apply4SubjectConfirmServiceImpl implements Apply4SubjectConfirmService {
private static final Gson GSON = new GsonBuilder().create();
private final WxPayService payService;
/**
* <pre>
* 提交申请单
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_1.shtml">间连商户开户意愿确认(提交申请单)</a>
* </pre>
*
* @param request 申请请求参数
* @return 审核结果
* @throws WxPayException 异常
*/
@Override
public ApplySubjectConfirmCreateResult applyment(ApplySubjectConfirmCreateRequest request) throws WxPayException {
String url = String.format("%s/v3/apply4subject/applyment", this.payService.getPayBaseUrl());
RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
String result = payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
return GSON.fromJson(result, ApplySubjectConfirmCreateResult.class);
}
/**
* <pre>
* 查询申请单审核结果
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_3.shtml">查询申请单审核结果</a>
* </pre>
*
* @param businessCode 业务申请编号
* @return 审核结果
* @throws WxPayException 异常
*/
@Override
public ApplySubjectConfirmStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException {
String url = String.format("%s/v3/apply4subject/applyment?business_code=%s", this.payService.getPayBaseUrl(), businessCode);
String result = payService.getV3(url);
return GSON.fromJson(result, ApplySubjectConfirmStateQueryResult.class);
}
/**
* <pre>
* 查询申请单审核结果
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_3.shtml">查询申请单审核结果</a>
* </pre>
*
* @param applymentId 申请编号
* @return 审核结果
* @throws WxPayException 异常
*/
@Override
public ApplySubjectConfirmStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException {
String url = String.format("%s/v3/apply4subject/applyment?applyment_id=%s", this.payService.getPayBaseUrl(), applymentId);
String result = payService.getV3(url);
return GSON.fromJson(result, ApplySubjectConfirmStateQueryResult.class);
}
/**
* <pre>
* 获取商户开户意愿确认状态
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_4.shtml">获取商户开户意愿确认状态API</a>
* </pre>
*
* @param subMchId 微信支付分配的特约商户的唯一标识。
* @return 确认状态结果
* @throws WxPayException 异常
*/
@Override
public ApplySubjectConfirmMerchantStateQueryResult queryMerchantApplyStatusByMchId(String subMchId) throws WxPayException {
String url = String.format("%s/v3/apply4subject/applyment/merchants/%s/state", this.payService.getPayBaseUrl(), subMchId);
String result = payService.getV3(url);
return GSON.fromJson(result, ApplySubjectConfirmMerchantStateQueryResult.class);
}
/**
* <pre>
* 撤销申请单
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_2.shtml">撤销申请单API</a>
* </pre>
*
* @param businessCode 业务申请编号
* @return 返回结果
* @throws WxPayException 异常
*/
@Override
public void cancelApplyByBusinessCode(String businessCode) throws WxPayException {
String url = String.format("%s/v3/apply4subject/applyment/%s/cancel", this.payService.getPayBaseUrl(), businessCode);
payService.postV3WithWechatpaySerial(url, "");
}
/**
* <pre>
* 撤销申请单
* 详情请见: <a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter10_1_2.shtml">撤销申请单API</a>
* </pre>
*
* @param applymentId 申请编号
* @return 返回结果
* @throws WxPayException 异常
*/
@Override
public void cancelApplyByApplymentId(String applymentId) throws WxPayException {
String url = String.format("%s/v3/apply4subject/applyment/%s/cancel", this.payService.getPayBaseUrl(), applymentId);
payService.postV3WithWechatpaySerial(url, "");
}
}