From 51aa930547c2188b249631b0644c80ea3c511e09 Mon Sep 17 00:00:00 2001 From: xhxu Date: Tue, 16 Aug 2022 18:14:49 +0800 Subject: [PATCH] // add api --- .../applyment/ApplymentStateQueryResult.java | 87 ++ .../applyment/ModifySettlementRequest.java | 62 + .../bean/applyment/SettlementInfoResult.java | 54 + .../WxPayApplyment4SubCreateRequest.java | 1196 +++++++++++++++++ .../applyment/WxPayApplymentCreateResult.java | 31 + .../bean/applyment/enums/AccountTypeEnum.java | 18 + .../applyment/enums/ApplymentStateEnum.java | 42 + .../applyment/enums/BankAccountTypeEnum.java | 18 + .../bean/applyment/enums/CertTypeEnum.java | 64 + .../bean/applyment/enums/IdTypeEnum.java | 41 + .../applyment/enums/MicroBizTypeEnum.java | 20 + .../applyment/enums/SalesScenesTypeEnum.java | 32 + .../enums/SettlementVerifyResultEnum.java | 23 + .../bean/applyment/enums/SubjectTypeEnum.java | 34 + .../wxpay/bean/bank/BankAccountResult.java | 28 + .../wxpay/bean/bank/BankBranchesResult.java | 176 +++ .../binarywang/wxpay/bean/bank/BankInfo.java | 39 + .../wxpay/bean/bank/BankingResult.java | 64 + .../wxpay/bean/bank/CitiesResult.java | 80 ++ .../binarywang/wxpay/bean/bank/PageLink.java | 59 + .../wxpay/bean/bank/ProvincesResult.java | 81 ++ .../wxpay/bean/media/ImageUploadResult.java | 28 + .../media/MarketingImageUploadResult.java | 29 + .../wxpay/service/Applyment4SubService.java | 74 + .../binarywang/wxpay/service/BankService.java | 121 ++ .../wxpay/service/MerchantMediaService.java | 46 + .../wxpay/service/WxPayService.java | 33 + .../impl/Applyment4SubServiceImpl.java | 66 + .../wxpay/service/impl/BankServiceImpl.java | 68 + .../service/impl/BaseWxPayServiceImpl.java | 18 + .../impl/MerchantMediaServiceImpl.java | 60 + .../impl/WxPayServiceApacheHttpImpl.java | 10 + .../impl/WxPayServiceJoddHttpImpl.java | 5 + 33 files changed, 2807 insertions(+) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankAccountResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankBranchesResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankInfo.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankingResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/CitiesResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/PageLink.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/ProvincesResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/MarketingImageUploadResult.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BankService.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BankServiceImpl.java create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java new file mode 100644 index 00000000..24019fb9 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ApplymentStateQueryResult.java @@ -0,0 +1,87 @@ +package com.github.binarywang.wxpay.bean.applyment; + +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 ApplymentStateQueryResult implements Serializable { + private static final long serialVersionUID = 6539090917423486409L; + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; + /** + * 特约商户号 + */ + @SerializedName("sub_mchid") + private String subMchid; + /** + * 超级管理员签约链接 + */ + @SerializedName("sign_url") + private String signUrl; + + /** + * 申请单状态 + */ + @SerializedName("applyment_state") + private ApplymentStateEnum applymentState; + /** + * 申请状态描述 + */ + @SerializedName("applyment_state_msg") + private String applymentStateMsg; + /** + * 驳回原因详情 + */ + @SerializedName("audit_detail") + private List auditDetail; + + /** + * 驳回原因详情 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AuditDetail { + /** + * 字段名 + */ + @SerializedName("field") + private String field; + /** + * 字段名称 + */ + @SerializedName("field_name") + private String fieldName; + /** + * 驳回原因 + */ + @SerializedName("reject_reason") + private String rejectReason; + + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java new file mode 100644 index 00000000..e374d952 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/ModifySettlementRequest.java @@ -0,0 +1,62 @@ +package com.github.binarywang.wxpay.bean.applyment; + +import com.github.binarywang.wxpay.bean.applyment.enums.AccountTypeEnum; +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; + +/** + * 修改结算账户请求对象 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class ModifySettlementRequest implements Serializable { + private static final long serialVersionUID = 4568552340365230872L; + /** + * 账户类型 + */ + @SerializedName("account_type") + private AccountTypeEnum accountType; + /** + * 开户名称 + */ + @SpecEncrypt + @SerializedName("account_name") + private String accountName; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + /** + * 开户银行全称(含支行) + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + + /** + * 银行账号 + */ + @SpecEncrypt + @SerializedName("account_number") + private String accountNumber; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java new file mode 100644 index 00000000..ffa3bf73 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/SettlementInfoResult.java @@ -0,0 +1,54 @@ +package com.github.binarywang.wxpay.bean.applyment; + +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 SettlementInfoResult implements Serializable { + private static final long serialVersionUID = 4568552340365230872L; + /** + * 账户类型 + */ + @SerializedName("account_type") + private String accountType; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + /** + * 银行账号 + */ + @SerializedName("account_number") + private String accountNumber; + /** + * 汇款验证结果 + * + * @see com.github.binarywang.wxpay.bean.applyment.enums.SettlementVerifyResultEnum + */ + @SerializedName("verify_result") + private String verifyResult; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java new file mode 100644 index 00000000..2bfd5be4 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplyment4SubCreateRequest.java @@ -0,0 +1,1196 @@ +package com.github.binarywang.wxpay.bean.applyment; + +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 zhouyongshen + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class WxPayApplyment4SubCreateRequest implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 业务申请编号 + */ + @SerializedName("business_code") + private String businessCode; + /** + * 超级管理员信息 + */ + @SerializedName("contact_info") + @SpecEncrypt + private ContactInfo contactInfo; + + /** + * 主体资料 + */ + @SerializedName("subject_info") + @SpecEncrypt + private SubjectInfo subjectInfo; + + /** + * 经营资料 + */ + @SerializedName("business_info") + private BusinessInfo businessInfo; + + /** + * 结算规则 + */ + @SerializedName("settlement_info") + private SettlementInfo settlementInfo; + + /** + * 结算银行账户 + */ + @SerializedName("bank_account_info") + @SpecEncrypt + private BankAccountInfo bankAccountInfo; + + /** + * 补充材料 + */ + @SerializedName("addition_info") + private AdditionInfo additionInfo; + + /** + * 超级管理员需在开户后进行签约,并接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class ContactInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 超级管理员类型 + * 1、主体为“个体工商户/企业/政府机关/事业单位/社会组织”,可选择:LEGAL:经营者/法人,SUPER:经办人 。(经办人:经商户授权办理微信支付业务的人员)。 + * 枚举值: + * LEGAL:经营者/法人 + * SUPER:经办人 + * 示例值:LEGAL + */ + @SerializedName("contact_type") + private String contactType; + + /** + * 超级管理员姓名 + */ + @SerializedName("contact_name") + @SpecEncrypt + private String contactName; + + /** + * 超级管理员证件类型 + * 当超级管理员类型是经办人时,请上传超级管理员证件类型。 + * 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、“超级管理员身份证号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号绑定的银行卡实名信息,是否与该证件号码一致。 + * 3、可传身份证、来往内地通行证、来往大陆通行证、护照等证件号码。 + */ + @SerializedName("contact_id_number") + @SpecEncrypt + private String contactIdNumber; + + /** + * 超级管理员证件正面照片 + * 1、当超级管理员类型是经办人时,请上传超级管理员证件的正面照片。 + * 2、若证件类型为身份证,请上传人像面照片。 + * 3、可上传1张图片,请填写通过图片上传API预先上传图片生成好的MediaID。 + * 4、请上传彩色照片or彩色扫描件or复印件(需加盖公章鲜章),可添加“微信支付”相关水印(如微信支付认证)。 + * 示例值:jTpGmxUXqRTvDujqhThn4ReFxikqJ5YW6zFQ + */ + @SerializedName("contact_id_doc_copy") + private String contactIdDocCopy; + + /** + * 超级管理员证件反面照片 + * 1、当超级管理员类型是经办人时,请上传超级管理员证件的反面照片。 + * 2、若证件类型为护照,无需上传反面照片。 + * 3、可上传1张图片,请填写通过图片上传API预先上传图片生成好的MediaID。 + * 4、请上传彩色照片or彩色扫描件or复印件(需加盖公章鲜章),可添加“微信支付”相关水印(如微信支付认证)。 + * 示例值:jTpGmxUX3FBWVQ5NJTZvvDujqhThn4ReFxikqJ5YW6zFQ + */ + @SerializedName("contact_id_doc_copy_back") + private String contactIdDocCopyBack; + + /** + * 超级管理员证件有效期开始时间 + * 1、当超级管理员类型是经办人时,请上传证件有效期开始时间。 + * 2、请按照示例值填写。 + * 3、结束时间大于开始时间。 + * 示例值:2019-06-06 + */ + @SerializedName("contact_period_begin") + private String contactPeriodBegin; + + /** + * 超级管理员证件有效期结束时间 + * 1、当超级管理员类型是经办人时,请上传证件有效期结束时间。 + * 2、请按照示例值填写,若证件有效期为长期,请填写:长期。 + * 3、结束时间大于开始时间。 + * 示例值:2026-06-06 + */ + @SerializedName("contact_period_end") + private String contactPeriodEnd; + + /** + * 业务办理授权函 + * 1、当超级管理员类型是经办人时,请上传业务办理授权函。 + * 2、请参照[示例图]打印业务办理授权函,全部信息需打印,不支持手写商户信息,并加盖公章。 + * 3、可上传1张图片,请填写通过图片上传API预先上传图片生成好的MediaID。 + * 示例值:47ZC6GC-vnrbEny_Ie_An5-tCpqxucuxi-vByf3Gjm7KEIUv0OF4wFNIO4kqg05InE4d2I6_H7I4 + */ + @SerializedName("business_authorization_letter") + private String businessAuthorizationLetter; + + /** + * 超级管理员微信openid + * 1、“超级管理员身份证件号码”与“超级管理员微信openid”,二选一必填。 + * 2、超级管理员签约时,校验微信号是否与该微信openid一致。 + */ + @SerializedName("openid") + private String openid; + + /** + * 1、11位数字。 + * 2、用于接收微信支付的重要管理信息及日常操作验证码。 + */ + @SerializedName("mobile_phone") + @SpecEncrypt + private String mobilePhone; + + /** + * 1、用于接收微信支付的开户邮件及日常业务通知。 + * 2、需要带@,遵循邮箱格式校验,该字段需进行加密处理, + */ + @SerializedName("contact_email") + @SpecEncrypt + private String contactEmail; + + } + + /** + * 主体资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SubjectInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主体类型 + */ + @SerializedName("subject_type") + private SubjectTypeEnum subjectType; + + /** + * 是否是金融机构 + */ + @SerializedName("finance_institution") + private Boolean financeInstitution; + + /** + * 营业执照 + */ + @SerializedName("business_license_info") + private BusinessLicenseInfo businessLicenseInfo; + /** + * 登记证书 + */ + @SerializedName("certificate_info") + private CertificateInfo certificateInfo; + + /** + * 组织机构代码证 + */ + @SerializedName("organization_info") + private OrganizationInfo organizationInfo; + + /** + * 单位证明函照片 + */ + @SerializedName("certificate_letter_copy") + private String certificateLetterCopy; + + /** + * 经营者/法人身份证件 + */ + @SerializedName("identity_info") + @SpecEncrypt + private IdentityInfo identityInfo; + + /** + * 最终受益人信息列表(UBO) + */ + @SerializedName("ubo_info_list") + @SpecEncrypt + private List uboInfoList; + + /** + * 小微辅助证明材料(subjectType为小微商户时必填) + */ + @SerializedName("micro_biz_info") + private MicroBizInfo microBizInfo; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BusinessLicenseInfo implements Serializable { + private static final long serialVersionUID = -1016615300418945838L; + /** + * 营业执照照片 + */ + @SerializedName("license_copy") + private String licenseCopy; + /** + * 注册号/统一社会信用代码 + */ + @SerializedName("license_number") + private String licenseNumber; + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + /** + * 个体户经营者/法人姓名 + */ + @SerializedName("legal_person") + private String legalPerson; + /** + * 注册地址 + */ + @SerializedName("license_address") + private String licenseAddress; + /** + * 有效期限开始日期 + */ + @SerializedName("period_begin") + private String periodBegin; + /** + * 有效期限结束日期 + */ + @SerializedName("period_end") + private String periodEnd; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class CertificateInfo implements Serializable { + private static final long serialVersionUID = 5080675335337916895L; + + /** + * 登记证书照片 + */ + @SerializedName("cert_copy") + private String certCopy; + + /** + * 登记证书类型 + */ + @SerializedName("cert_type") + private CertTypeEnum certType; + + + /** + * 证书号 + */ + @SerializedName("cert_number") + private String certNumber; + + + /** + * 商户名称 + */ + @SerializedName("merchant_name") + private String merchantName; + + + /** + * 注册地址 + */ + @SerializedName("company_address") + private String companyAddress; + + + /** + * 法定代表人 + */ + @SerializedName("legal_person") + private String legalPerson; + + + /** + * 有效期限开始日期 + */ + @SerializedName("period_begin") + private String periodBegin; + + + /** + * 有效期限结束日期 + */ + @SerializedName("period_end") + private String periodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class OrganizationInfo implements Serializable { + private static final long serialVersionUID = 6497045652770046337L; + /** + * 组织机构代码证照片 + */ + @SerializedName("organization_copy") + private String organizationCopy; + /** + * 组织机构代码 + */ + @SerializedName("organization_code") + private String organizationCode; + /** + * 组织机构代码证有效期开始日期 + */ + @SerializedName("org_period_begin") + private String orgPeriodBegin; + /** + * 组织机构代码证有效期结束日期 + */ + @SerializedName("org_period_end") + private String orgPeriodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdentityInfo implements Serializable { + private static final long serialVersionUID = 1683704338370383827L; + + /** + * 证件持有人类型 + */ + @SerializedName("id_holder_type") + private IdTypeEnum idHolderType; + + /** + * 证件类型 + */ + @SerializedName("id_doc_type") + private IdTypeEnum idDocType; + + /** + * 法定代表人说明函 + */ + @SerializedName("authorize_letter_copy") + private IdTypeEnum authorizeLetterCopy; + + /** + * 身份证信息 + */ + @SerializedName("id_card_info") + @SpecEncrypt + private IdCardInfo idCardInfo; + + /** + * 其他类型证件信息 + */ + @SerializedName("id_doc_info") + @SpecEncrypt + private IdDocInfo idDocInfo; + + /** + * 经营者/法人是否为受益人 + */ + @SerializedName("owner") + private Boolean owner; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdCardInfo implements Serializable { + private static final long serialVersionUID = -2897792705297641786L; + /** + * 身份证人像面照片 + */ + @SerializedName("id_card_copy") + private String idCardCopy; + /** + * 身份证国徽面照片 + */ + @SerializedName("id_card_national") + private String idCardNational; + /** + * 身份证姓名 + */ + @SerializedName("id_card_name") + @SpecEncrypt + private String idCardName; + /** + * 身份证号码 + */ + @SerializedName("id_card_number") + @SpecEncrypt + private String idCardNumber; + /** + * 身份证居住地址 + */ + @SerializedName("id_card_address") + @SpecEncrypt + private String idCardAddress; + /** + * 身份证有效期开始时间 + */ + @SerializedName("card_period_begin") + private String cardPeriodBegin; + /** + * 身份证有效期结束时间 + */ + @SerializedName("card_period_end") + private String cardPeriodEnd; + + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class IdDocInfo implements Serializable { + private static final long serialVersionUID = 7335589815924447719L; + /** + * 证件正面照片 + */ + @SerializedName("id_doc_copy") + private String idDocCopy; + /** + * 证件反面照片 + */ + @SerializedName("id_doc_copy_back") + private String idDocCopyBack; + + /** + * 证件姓名 + */ + @SerializedName("id_doc_name") + @SpecEncrypt + private String idDocName; + + /** + * 证件号码 + */ + @SerializedName("id_doc_number") + @SpecEncrypt + private String idDocNumber; + /** + * 身份证居住地址 + */ + @SerializedName("id_card_address") + @SpecEncrypt + private String idCardAddress; + /** + * 证件有效期开始时间 + */ + @SerializedName("doc_period_begin") + private String docPeriodBegin; + /** + * 证件有效期结束时间 + */ + @SerializedName("doc_period_end") + private String docPeriodEnd; + } + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class UboInfo 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 MicroBizInfo implements Serializable { + private static final long serialVersionUID = -5679477993681265764L; + /** + * 小微经营类型 + */ + @SerializedName("micro_biz_type") + private MicroBizTypeEnum microBizType; + + /** + * 门店场所---经营类型为“门店场所”时填写 + */ + @SerializedName("micro_store_info") + private MicroStoreInfo microStoreInfo; + + /** + * 经营类型为“流动经营/便民服务”时填写 + */ + @SerializedName("micro_mobile_info") + private MicroMobileInfo microMobileInfo; + + /** + * 经营类型为“线上商品/服务交易”时填写 + */ + @SerializedName("micro_online_info") + private MicroOnlineInfo microOnlineInfo; + + /** + * 门店场所 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MicroStoreInfo implements Serializable { + private static final long serialVersionUID = 5277440587305558389L; + /** + * 门店名称 + */ + @SerializedName("micro_name") + private String microName; + /** + * 门店省市编码 填写门店省市编码,只能由数字组成,详细参见《微信支付提供的省市对照表》 + * + * @see 下载微信支付提供的省市对照表 + */ + @SerializedName("micro_address_code") + private String microAddressCode; + /** + * 门店地址(填写店铺详细地址,具体区/县及街道门牌号或大厦楼层) + */ + @SerializedName("micro_address") + private String microAddress; + /** + * 门店门头照片 + * + * 1、提交门店门口照片,要求招牌清晰可见 + * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID + * + * + * @see 图片上传API + */ + @SerializedName("store_entrance_pic") + private String storeEntrancePic; + /** + * 店内环境照片 + * + * 1、提交店内环境照片 + * 2、可上传1张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID + * + * + * @see 图片上传API + */ + @SerializedName("micro_indoor_copy") + private String microIndoorCopy; + /** + * 门店经度 + */ + @SerializedName("store_longitude") + private String storeLongitude; + /** + * 门店纬度 + */ + @SerializedName("store_latitude") + private String storeLatitude; + } + + /** + * 流动经营/便民服务 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MicroMobileInfo implements Serializable { + private static final long serialVersionUID = -1308090894511066935L; + /** + * 经营/服务名称 + */ + @SerializedName("micro_mobile_name") + private String microMobileName; + /** + * 经营/服务所在地省市 + */ + @SerializedName("micro_mobile_city") + private String microMobileCity; + /** + * 经营/服务所在地(不含省市) 填写“无" + */ + @SerializedName("micro_mobile_address") + private String microMobileAddress; + /** + * 经营/服务现场照片 + * + * 1、提交经营/服务现场照片 + * 2、可上传多张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID + * + * + * @see 图片上传API + */ + @SerializedName("micro_mobile_pics") + private String microMobilePics; + } + + /** + * 线上商品/服务交易 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MicroOnlineInfo implements Serializable { + private static final long serialVersionUID = 9029168841403055743L; + /** + * 线上店铺名称 + */ + @SerializedName("micro_online_store") + private String microOnlineStore; + /** + * 电商平台名称 + */ + @SerializedName("micro_ec_name") + private String microEcName; + /** + * 店铺二维码 + * + * 1、店铺二维码或店铺链接二选一必填 + * 2、可上传多张图片,请填写通过《图片上传API》预先上传图片生成好的MediaID + * + * + * @see 图片上传API + */ + @SerializedName("micro_qrcode") + private String microQrcode; + /** + * 店铺二维码 + * + * 1、店铺二维码或店铺链接二选一必填 + * 2、请填写店铺主页链接,需符合网站规范 + * + */ + @SerializedName("micro_link") + private String microLink; + } + } + } + + /** + * 经营资料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BusinessInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 商户简称 + */ + @SerializedName("merchant_shortname") + private String merchantShortname; + + /** + * 客服电话 + */ + @SerializedName("service_phone") + private String servicePhone; + + /** + * 经营场景 + */ + @SerializedName("sales_info") + private SalesInfo salesInfo; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SalesInfo implements Serializable { + private static final long serialVersionUID = 6428044729204137659L; + /** + * 经营场景类型 + */ + @SerializedName("sales_scenes_type") + private List salesScenesType; + + /** + * 线下门店场景 + */ + @SerializedName("biz_store_info") + private BizStoreInfo bizStoreInfo; + + /** + * 公众号场景 + */ + @SerializedName("mp_info") + private MpInfo mpInfo; + + /** + * 小程序场景 + */ + @SerializedName("mini_program_info") + private MiniProgramInfo miniProgramInfo; + + /** + * APP场景 + */ + @SerializedName("app_info") + private AppInfo appInfo; + + /** + * 互联网网站场景 + */ + @SerializedName("web_info") + private WebInfo webInfo; + + /** + * 企业微信场景 + */ + @SerializedName("wework_info") + private WeworkInfo weworkInfo; + + /** + * 线下门店场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BizStoreInfo implements Serializable { + private static final long serialVersionUID = 4397253725912709093L; + /** + * 门店名称 + */ + @SerializedName("biz_store_name") + private String bizStoreName; + + /** + * 门店省市编码 + */ + @SerializedName("biz_address_code") + private String bizAddressCode; + + /** + * 门店地址 + */ + @SerializedName("biz_store_address") + private String bizStoreAddress; + + /** + * 门店门头照片 + */ + @SerializedName("store_entrance_pic") + private List storeEntrancePic; + + /** + * 店内环境照片 + */ + @SerializedName("indoor_pic") + private List indoorPic; + + /** + * 线下场所对应的商家APPID + */ + @SerializedName("biz_sub_appid") + private String bizSubAppid; + + } + + /** + * 公众号场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MpInfo implements Serializable { + private static final long serialVersionUID = 167582552189873597L; + /** + * 服务商公众号APPID + */ + @SerializedName("mp_appid") + private String mpAppid; + + /** + * 商家公众号APPID + */ + @SerializedName("mp_sub_appid") + private String mpSubAppid; + + /** + * 公众号页面截图 + */ + @SerializedName("mp_pics") + private List mpPics; + + } + + /** + * 小程序场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class MiniProgramInfo implements Serializable { + private static final long serialVersionUID = -371749335686796436L; + /** + * 服务商小程序APPID + */ + @SerializedName("mini_program_appid") + private String miniProgramAppid; + + /** + * 商家小程序APPID + */ + @SerializedName("mini_program_sub_appid") + private String miniProgramSubAppid; + + /** + * 小程序截图 + */ + @SerializedName("mini_program_pics") + private List miniProgramPics; + + + } + + /** + * APP场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AppInfo implements Serializable { + private static final long serialVersionUID = 3959643687528770473L; + /** + * 服务商应用APPID + */ + @SerializedName("app_appid") + private String appAppid; + + /** + * 商家应用APPID + */ + @SerializedName("app_sub_appid") + private String appSubAppid; + + /** + * APP截图 + */ + @SerializedName("app_pics") + private List appPics; + + } + + /** + * 互联网网站场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WebInfo implements Serializable { + private static final long serialVersionUID = -4183874827185822310L; + /** + * 互联网网站域名 + */ + @SerializedName("domain") + private String domain; + + /** + * 网站授权函 + */ + @SerializedName("web_authorisation") + private String webAuthorisation; + + /** + * 互联网网站对应的商家APPID + */ + @SerializedName("web_appid") + private String webAppid; + + } + + /** + * 企业微信场景 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class WeworkInfo implements Serializable { + private static final long serialVersionUID = 9075531305717309383L; + /** + * 商家企业微信CorpID + */ + @SerializedName("sub_corp_id") + private String subCorpId; + + /** + * 企业微信页面截图 + */ + @SerializedName("wework_pics") + private List weworkPics; + + } + } + } + + /** + * 结算规则 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class SettlementInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 入驻结算规则ID + */ + @SerializedName("settlement_id") + private String settlementId; + + /** + * 所属行业 + */ + @SerializedName("qualification_type") + private String qualificationType; + + /** + * 特殊资质图片 + */ + @SerializedName("qualifications") + private List qualifications; + + /** + * 优惠费率活动ID + */ + @SerializedName("activities_id") + private String activitiesId; + + /** + * 优惠费率活动值 + */ + @SerializedName("activities_rate") + private String activitiesRate; + + /** + * 优惠费率活动补充材料 + */ + @SerializedName("activities_additions") + private List activitiesAdditions; + + } + + /** + * 结算银行账户 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class BankAccountInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 账户类型 + */ + @SerializedName("bank_account_type") + private BankAccountTypeEnum bankAccountType; + + /** + * 开户名称 + */ + @SerializedName("account_name") + @SpecEncrypt + private String accountName; + + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + + /** + * 开户银行省市编码 + */ + @SerializedName("bank_address_code") + private String bankAddressCode; + + /** + * 开户银行联行号 + */ + @SerializedName("bank_branch_id") + private String bankBranchId; + + /** + * 开户银行全称(含支行] + */ + @SerializedName("bank_name") + private String bankName; + + /** + * 银行账号 + */ + @SerializedName("account_number") + @SpecEncrypt + private String accountNumber; + + } + + + /** + * 补充材料 + */ + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Accessors(chain = true) + public static class AdditionInfo 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 businessAdditionPics; + + /** + * 补充说明 + */ + @SerializedName("business_addition_msg") + private String businessAdditionMsg; + + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java new file mode 100644 index 00000000..157b8fc0 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/WxPayApplymentCreateResult.java @@ -0,0 +1,31 @@ +package com.github.binarywang.wxpay.bean.applyment; + +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 zhouyongshen + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class WxPayApplymentCreateResult implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 微信支付申请单号 + */ + @SerializedName("applyment_id") + private String applymentId; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java new file mode 100644 index 00000000..15fcba9f --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/AccountTypeEnum.java @@ -0,0 +1,18 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + + +/** + * 银行结算账户枚举类 + */ +public enum AccountTypeEnum { + /** + * 对公银行账户 + */ + ACCOUNT_TYPE_BUSINESS, + + /** + * 经营者个人银行卡 + */ + ACCOUNT_TYPE_PRIVATE, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java new file mode 100644 index 00000000..2997ed52 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/ApplymentStateEnum.java @@ -0,0 +1,42 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 申请单状态枚举类 + * + * @author zhouyongshen + */ +public enum ApplymentStateEnum { + /** + * (编辑中):提交申请发生错误导致,请尝试重新提交。 + */ + APPLYMENT_STATE_EDITTING, + /** + * (审核中):申请单正在审核中,超级管理员用微信打开“签约链接”,完成绑定微信号后,申请单进度将通过微信公众号通知超级管理员,引导完成后续步骤。 + */ + APPLYMENT_STATE_AUDITING, + /** + * (已驳回):请按照驳回原因修改申请资料,超级管理员用微信打开“签约链接”,完成绑定微信号,后续申请单进度将通过微信公众号通知超级管理员。 + */ + APPLYMENT_STATE_REJECTED, + /** + * (待账户验证):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成账户验证。 + */ + APPLYMENT_STATE_TO_BE_CONFIRMED, + /** + * (待签约):请超级管理员使用微信打开返回的“签约链接”,根据页面指引完成签约。 + */ + APPLYMENT_STATE_TO_BE_SIGNED, + /** + * (开通权限中):系统开通相关权限中,请耐心等待。 + */ + APPLYMENT_STATE_SIGNING, + /** + * (已完成):商户入驻申请已完成。 + */ + APPLYMENT_STATE_FINISHED, + /** + * (已作废):申请单已被撤销。 + */ + APPLYMENT_STATE_CANCELED + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java new file mode 100644 index 00000000..739ad244 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/BankAccountTypeEnum.java @@ -0,0 +1,18 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + + +/** + * 银行结算账户枚举类 + */ +public enum BankAccountTypeEnum { + /** + * 对公银行账户 + */ + BANK_ACCOUNT_TYPE_CORPORATE, + + /** + * 经营者个人银行卡 + */ + BANK_ACCOUNT_TYPE_PERSONAL, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java new file mode 100644 index 00000000..91d0c537 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/CertTypeEnum.java @@ -0,0 +1,64 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 登记证书的类型枚举 + */ +public enum CertTypeEnum { + /** + * 事业单位法人证书 + */ + CERTIFICATE_TYPE_2388, + /** + * 统一社会信用代码证书 + */ + CERTIFICATE_TYPE_2389, + /** + * 有偿服务许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2390, + /** + * 医疗机构执业许可证(军队医院适用) + */ + CERTIFICATE_TYPE_2391, + /** + * 企业营业执照(挂靠企业的党组织适用) + */ + CERTIFICATE_TYPE_2392, + /** + * 组织机构代码证(政府机关适用) + */ + CERTIFICATE_TYPE_2393, + /** + * 社会团体法人登记证书 + */ + CERTIFICATE_TYPE_2394, + /** + * 民办非企业单位登记证书 + */ + CERTIFICATE_TYPE_2395, + /** + * 基金会法人登记证书 + */ + CERTIFICATE_TYPE_2396, + /** + * 宗教活动场所登记证 + */ + CERTIFICATE_TYPE_2399, + /** + * 其他证书/批文/证明 + */ + CERTIFICATE_TYPE_2400, + /** + * 执业许可证/执业证 + */ + CERTIFICATE_TYPE_2520, + /** + * 基层群众性自治组织特别法人统一社会信用代码证 + */ + CERTIFICATE_TYPE_2521, + /** + * 农村集体经济组织登记证 + */ + CERTIFICATE_TYPE_2522, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java new file mode 100644 index 00000000..a46cc845 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/IdTypeEnum.java @@ -0,0 +1,41 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 个体户/企业/党政、机关及事业单位/其他组织:可选择任一证件类型。 + * 枚举值 + */ +public enum IdTypeEnum { + /** + * 中国大陆居民-身份证 + */ + 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, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java new file mode 100644 index 00000000..100f8326 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/MicroBizTypeEnum.java @@ -0,0 +1,20 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 小微经营类型 + */ +public enum MicroBizTypeEnum { + /** + * 门店场所 + */ + MICRO_TYPE_STORE, + /** + * 流动经营/便民服务 + */ + MICRO_TYPE_MOBILE, + /** + * 线上商品/服务交易 + */ + MICRO_TYPE_ONLINE, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java new file mode 100644 index 00000000..b057dd57 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SalesScenesTypeEnum.java @@ -0,0 +1,32 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 经营场景类型枚举值 + */ +public enum SalesScenesTypeEnum { + /** + * 线下门店 + */ + SALES_SCENES_STORE, + /** + * 公众号 + */ + SALES_SCENES_MP, + /** + * 小程序 + */ + SALES_SCENES_MINI_PROGRAM, + /** + * 互联网 + */ + SALES_SCENES_WEB, + /** + * APP + */ + SALES_SCENES_APP, + /** + * 企业微信 + */ + SALES_SCENES_WEWORK, + ; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java new file mode 100644 index 00000000..ed2fbc71 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SettlementVerifyResultEnum.java @@ -0,0 +1,23 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 返回特约商户的结算账户-汇款验证结果枚举类 + * + * @author zhouyognshen + */ +public enum SettlementVerifyResultEnum { + /** + * 系统汇款验证中,商户可发起提现尝试。 + */ + VERIFYING, + /** + * 系统成功汇款,该账户可正常发起提现。 + */ + VERIFY_SUCCESS, + /** + * 系统汇款失败,该账户无法发起提现,请检查修改。 + */ + VERIFY_FAIL, + ; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java new file mode 100644 index 00000000..4a6c9d29 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/applyment/enums/SubjectTypeEnum.java @@ -0,0 +1,34 @@ +package com.github.binarywang.wxpay.bean.applyment.enums; + +/** + * 主体类型枚举类 + *
+ *     商户申请接入时如何选择主体类型? https://kf.qq.com/faq/180910IBZVnQ180910naQ77b.html
+ * 
+ * + * @author zhouyongshen + */ +public enum SubjectTypeEnum { + /** + * (个体户):营业执照上的主体类型一般为个体户、个体工商户、个体经营; + */ + SUBJECT_TYPE_INDIVIDUAL, + /** + * (企业):营业执照上的主体类型一般为有限公司、有限责任公司; + */ + SUBJECT_TYPE_ENTERPRISE, + /** + * (党政、机关及事业单位):包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构); + */ + SUBJECT_TYPE_INSTITUTIONS, + /** + * (其他组织):不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。 + */ + SUBJECT_TYPE_OTHERS, + /** + * (小微):无营业执照、免办理工商注册登记的实体商户 + */ + SUBJECT_TYPE_MICRO, + ; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankAccountResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankAccountResult.java new file mode 100644 index 00000000..44e2acb8 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankAccountResult.java @@ -0,0 +1,28 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 对私银行卡号开户银行信息 + * + * @author zhongjun + **/ +@Data +public class BankAccountResult implements Serializable { + + private static final long serialVersionUID = -8226859146533243501L; + + /** + * 根据卡号查询到的银行列表数据的总条数,未查询到对应银行列表时默认返回0,最大不超过两百条。 + */ + @SerializedName("total_count") + private Integer totalCount; + + @SerializedName("data") + private List data; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankBranchesResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankBranchesResult.java new file mode 100644 index 00000000..72cc4f6a --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankBranchesResult.java @@ -0,0 +1,176 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 支行列表 + * + * @author hupeng + **/ +@Data +public class BankBranchesResult implements Serializable { + + private static final long serialVersionUID = -3500020131951579476L; + + /** + *
+   * 字段名:查询数据总条数
+   * 变量名:total_count
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  经过条件筛选,查询到的支行总数
+   *  示例值:10
+   * 
+ */ + @SerializedName("total_count") + private Integer totalCount; + + /** + *
+   * 字段名:本次查询条数
+   * 变量名:count
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  本次查询到的支行数据条数
+   *  示例值:10
+   * 
+ */ + @SerializedName("count") + private Integer count; + + /** + *
+   * 字段名:支行列表
+   * 变量名:data
+   * 是否必填:否
+   * 类型:array
+   * 描述:
+   *  单次查询返回的支行列表结果数组
+   * 
+ */ + @SerializedName("data") + private List data; + + /** + *
+   * 字段名:本次查询偏移量
+   * 变量名:offset
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  该次请求资源的起始位置,请求中包含偏移量时应答消息返回相同偏移量,否则返回默认值0
+   *  示例值:0
+   * 
+ */ + @SerializedName("offset") + private Integer offset; + + /** + *
+   * 字段名:分页链接
+   * 变量名:offset
+   * 是否必填:是
+   * 类型:object
+   * 描述:
+   *  返回前后页和当前页面的访问链接
+   * 
+ */ + @SerializedName("links") + private PageLink links; + + /** + *
+   * 字段名:开户银行
+   * 变量名:account_bank
+   * 是否必填:是
+   * 类型:string[1, 128]
+   * 描述:
+   *  查询到的支行所属开户银行的名称,非直连银行统一为其他银行
+   *  示例值:招商银行其他银行
+   * 
+ */ + @SerializedName("account_bank") + private String accountBank; + + /** + *
+   * 字段名:开户银行编码
+   * 变量名:account_bank_code
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  查询到的支行所属开户银行的开户银行编码,可用于付款到银行卡等场景中指定银行卡的开户银行
+   *  示例值:1001
+   * 
+ */ + @SerializedName("account_bank_code") + private Integer accountBankCode; + + /** + *
+   * 字段名:银行别名
+   * 变量名:bank_alias
+   * 是否必填:是
+   * 类型:string[1, 128]
+   * 描述:
+   *  查询到的支行所属银行的银行别名
+   *  示例值:工商银行深圳前海微众银行
+   * 
+ */ + @SerializedName("bank_alias") + private String bankAlias; + + /** + *
+   * 字段名:银行别名编码
+   * 变量名:bank_alias_code
+   * 是否必填:是
+   * 类型:string[1, 32]
+   * 描述:
+   *  查询到的支行所属银行的银行别名编码,用于校验回包
+   *  示例值:1000006247
+   * 
+ */ + @SerializedName("bank_alias_code") + private String bankAliasCode; + + @Getter + @Setter + public static class BankBranch { + /** + *
+     * 字段名:开户银行支行名称
+     * 变量名:bank_branch_name
+     * 是否必填:是
+     * 类型:string[1, 128]
+     * 描述:
+     *  开户银行支行名称,用于开户银行为其他银行的情况下,在入驻、修改结算银行卡、企业付款等场景下填写结算银行卡信息。
+     *  示例值:中国工商银行上海市周浦支行
+     * 
+ */ + @SerializedName("bank_branch_name") + private String bankBranchName; + + /** + *
+     * 字段名:开户银行支行联行号
+     * 变量名:bank_branch_id
+     * 是否必填:是
+     * 类型:string[1, 64]
+     * 描述:
+     *  开户银行支行的联行号,用于开户银行为其他银行的情况下,在入驻、修改结算银行卡、企业付款等场景下填写结算银行卡信息。
+     *  示例值:102290072311
+     * 
+ */ + @SerializedName("bank_branch_id") + private String bankBranchId; + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankInfo.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankInfo.java new file mode 100644 index 00000000..da63f00d --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankInfo.java @@ -0,0 +1,39 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +/** + * 银行信息 + * + * @author zhongjun + * @date 2022/5/12 + **/ +@Data +public class BankInfo { + /** + * 银行别名 + */ + @SerializedName("bank_alias") + private String bankAlias; + /** + * 银行别名编码 + */ + @SerializedName("bank_alias_code") + private String bankAliasCode; + /** + * 开户银行 + */ + @SerializedName("account_bank") + private String accountBank; + /** + * 开户银行编码 + */ + @SerializedName("account_bank_code") + private Integer accountBankCode; + /** + * 是否需要填写支行 + */ + @SerializedName("need_bank_branch") + private Boolean needBankBranch; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankingResult.java new file mode 100644 index 00000000..407ad5fc --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/BankingResult.java @@ -0,0 +1,64 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 个人业务的银行列表 + * + * @author zhongjun + **/ +@Data +public class BankingResult implements Serializable { + private static final long serialVersionUID = -8372812998971715894L; + + /** + * 银行列表数据的总条数,调用方需要根据总条数分页查询 + */ + @SerializedName("total_count") + private Integer totalCount; + + /** + * 本次查询银行列表返回的数据条数 + */ + @SerializedName("count") + private Integer count; + + /** + * 该次请求资源的起始位置,请求中包含偏移量时应答消息返回相同偏移量,否则返回默认值0。 + */ + @SerializedName("offset") + private Integer offset; + + @SerializedName("data") + private List data; + + @SerializedName("links") + private Link links; + + @Getter + @Setter + public static class Link { + /** + * 下一页链接 + */ + @SerializedName("next") + private String next; + /** + * 上一页链接 + */ + @SerializedName("prev") + private String prev; + /** + * 当前链接 + */ + @SerializedName("self") + private String self; + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/CitiesResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/CitiesResult.java new file mode 100644 index 00000000..b5bf87c8 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/CitiesResult.java @@ -0,0 +1,80 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 城市列表 + * + * @author hupeng + **/ +@Data +public class CitiesResult implements Serializable { + + private static final long serialVersionUID = -6089905695087974693L; + + /** + *
+   * 字段名:查询数据总条数
+   * 变量名:total_count
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  查询到的省份数据总条数
+   *  示例值:10
+   * 
+ */ + @SerializedName("total_count") + private Integer totalCount; + + /** + *
+   * 字段名:城市列表
+   * 变量名:data
+   * 是否必填:否
+   * 类型:array
+   * 描述:
+   *  查询返回的城市列表结果
+   * 
+ */ + @SerializedName("data") + private List data; + + @Getter + @Setter + public static class CityInfo { + /** + *
+     * 字段名:城市名称
+     * 变量名:city_name
+     * 是否必填:是
+     * 类型:string[1, 256]
+     * 描述:
+     *  城市名称
+     *  示例值:北京市
+     * 
+ */ + @SerializedName("city_name") + private String cityName; + + /** + *
+     * 字段名:城市编码
+     * 变量名:city_code
+     * 是否必填:是
+     * 类型:int
+     * 描述:
+     *  城市编码,唯一标识一座城市,用于结合银行别名编码查询支行列表
+     *  示例值:10
+     * 
+ */ + @SerializedName("city_code") + private Integer cityCode; + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/PageLink.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/PageLink.java new file mode 100644 index 00000000..d8431f67 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/PageLink.java @@ -0,0 +1,59 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 支行列表 + * + * @author hupeng + **/ +@Data +public class PageLink implements Serializable { + + private static final long serialVersionUID = -2624233403271204837L; + + /** + *
+   * 字段名:下一页链接
+   * 变量名:next
+   * 是否必填:否
+   * 类型:string[1, 2048]
+   * 描述:
+   *  使用同样的limit进行下一页查询时的相对请求链接,使用方需要自行根据当前域名进行拼接。如果已经到最后时,为空
+   *  示例值:/v3/capital/capitallhh/banks/1001/branches?offset=10&limit=5
+   * 
+ */ + @SerializedName("next") + private String next; + + /** + *
+   * 字段名:上一页链接
+   * 变量名:prev
+   * 是否必填:否
+   * 类型:string[1, 2048]
+   * 描述:
+   *  使用同样的limit进行上一页查询时的相对请求链接,使用方需要自行根据当前域名进行拼接。如果是第一页,为空
+   *  示例值:/v3/capital/capitallhh/banks/1001/branchesoffset=0&limit=5
+   * 
+ */ + @SerializedName("prev") + private String prev; + + /** + *
+   * 字段名:当前链接
+   * 变量名:self
+   * 是否必填:否
+   * 类型:string[1, 2048]
+   * 描述:
+   *  当前的相对请求链接,使用方需要自行根据当前域名进行拼接
+   *  示例值:/v3/capital/capitallhh/banks/1001/branches?offset=5&limit=5
+   * 
+ */ + @SerializedName("self") + private String self; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/ProvincesResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/ProvincesResult.java new file mode 100644 index 00000000..6525fc1c --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/bank/ProvincesResult.java @@ -0,0 +1,81 @@ +package com.github.binarywang.wxpay.bean.bank; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.List; + +/** + * 省份列表 + * + * @author hupeng + **/ +@Data +public class ProvincesResult implements Serializable { + + private static final long serialVersionUID = -4118613374545722650L; + + /** + *
+   * 字段名:查询数据总条数
+   * 变量名:total_count
+   * 是否必填:是
+   * 类型:int
+   * 描述:
+   *  查询到的省份数据总条数
+   *  示例值:10
+   * 
+ */ + @SerializedName("total_count") + private Integer totalCount; + + /** + *
+   * 字段名:省份列表
+   * 变量名:data
+   * 是否必填:否
+   * 类型:array
+   * 描述:
+   *  查询到的省份列表数组
+   * 
+ */ + @SerializedName("data") + private List data; + + @Getter + @Setter + public static class ProvinceInfo { + + /** + *
+     * 字段名:省份名称
+     * 变量名:province_name
+     * 是否必填:是
+     * 类型:string[1, 256]
+     * 描述:
+     *  省份名称
+     *  示例值:广东省
+     * 
+ */ + @SerializedName("province_name") + private String provinceName; + + /** + *
+     * 字段名:省份编码
+     * 变量名:province_code
+     * 是否必填:是
+     * 类型:int
+     * 描述:
+     *  省份编码,唯一标识一个省份,用于根据省份编码查询省份下的城市列表数据
+     *  示例值:22
+     * 
+ */ + @SerializedName("province_code") + private Integer provinceCode; + } + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java new file mode 100644 index 00000000..8b7f53a2 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/ImageUploadResult.java @@ -0,0 +1,28 @@ +package com.github.binarywang.wxpay.bean.media; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +/** + * 媒体文件上传返回结果对象 + * @author zhouyongshen + */ +@NoArgsConstructor +@Data +public class ImageUploadResult { + + public static ImageUploadResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, ImageUploadResult.class); + } + /** + * 媒体文件标识 Id + * + * 微信返回的媒体文件标识Id。 + * 示例值:6uqyGjGrCf2GtyXP8bxrbuH9-aAoTjH-rKeSl3Lf4_So6kdkQu4w8BYVP3bzLtvR38lxt4PjtCDXsQpzqge_hQEovHzOhsLleGFQVRF-U_0 + * + */ + @SerializedName("media_id") + private String mediaId; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/MarketingImageUploadResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/MarketingImageUploadResult.java new file mode 100644 index 00000000..c0ee3e8a --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/media/MarketingImageUploadResult.java @@ -0,0 +1,29 @@ +package com.github.binarywang.wxpay.bean.media; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +/** + * 媒体文件上传返回结果对象 + * + * @author thinsstar + */ +@NoArgsConstructor +@Data +public class MarketingImageUploadResult { + + public static MarketingImageUploadResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, MarketingImageUploadResult.class); + } + + /** + * 媒体文件URL地址 + *

+ * 微信返回的媒体文件标识url。有效期为永久 + * 示例值:https://qpic.cn/xxx + */ + @SerializedName("media_url") + private String mediaUrl; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java new file mode 100644 index 00000000..ef937bab --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/Applyment4SubService.java @@ -0,0 +1,74 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.applyment.*; +import com.github.binarywang.wxpay.exception.WxPayException; + +/** + * 特约商户进件 + * 产品介绍:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter1_1.shtml + * + * @author zhouyongshen + */ +public interface Applyment4SubService { + /** + * 提交申请单API + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_1.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/ + * + * @param request 请求对象 + * @return WxPayApplymentCreateResult 响应结果 + * @throws WxPayException the wx pay exception + */ + WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException; + + /** + * 通过业务申请编号查询申请状态 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_2.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/business_code/{business_code} + * + * @param businessCode 业务申请编号 + * 1、只能由数字、字母或下划线组成,建议前缀为服务商商户号。 + * 2、服务商自定义的唯一编号。 + * 3、每个编号对应一个申请单,每个申请单审核通过后生成一个微信支付商户号。 + * 4、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息。 + * 示例值:1900013511_10000 + * @return the applyment state query result + * @throws WxPayException the wx pay exception + */ + ApplymentStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException; + + /** + * 通过申请单号查询申请状态 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_2.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/applyment_id/{applyment_id} + * + * @param applymentId 微信支付分的申请单号。示例值:2000001234567890 + * @return the applyment state query result + * @throws WxPayException the wx pay exception + */ + ApplymentStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException; + + /** + * 通过申请单号查询申请状态 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_4.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/settlement + * + * @param subMchid 本服务商进件、已签约的特约商户号。 + * @return the settlement info result + * @throws WxPayException the wx pay exception + */ + SettlementInfoResult querySettlementBySubMchid(String subMchid) throws WxPayException; + + /** + * 修改结算帐号 + * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/applyment4sub/chapter3_3.shtml + * 接口链接:https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement + * + * @param subMchid 特约商户号 + * @param request 修改结算账户请求对象信息 + * @throws WxPayException the wx pay exception + * @return + */ + String modifySettlement(String subMchid, ModifySettlementRequest request) throws WxPayException; + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BankService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BankService.java new file mode 100644 index 00000000..095510d4 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/BankService.java @@ -0,0 +1,121 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.bank.*; +import com.github.binarywang.wxpay.exception.WxPayException; + +/** + *

+ * 微信支付-银行组件
+ * 
+ * + * @author zhongjun + **/ +public interface BankService { + /** + *
+   *
+   * 获取对私银行卡号开户银行
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://api.mch.weixin.qq.com/v3/capital/capitallhh/banks/search-banks-by-bank-account
+   *
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter11_2_1.shtml
+   * 
+ * + * @param accountNumber 银行卡号 该字段需进行加密处理,加密方法详见敏感信息加密说明。(提醒:必须在HTTP头中上送Wechatpay-Serial) + * @return BankAccountResult 对私银行卡号开户银行信息 + * @throws WxPayException . + */ + BankAccountResult searchBanksByBankAccount(String accountNumber) throws WxPayException; + + /** + *
+   *
+   * 查询支持个人业务的银行列表
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://api.mch.weixin.qq.com/v3/capital/capitallhh/banks/personal-banking
+   *
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter11_2_2.shtml
+   * 
+ * + * @param offset 本次查询偏移量 + * @param limit 本次请求最大查询条数,最大值为200 + * @return PersonalBankingResult 支持个人业务的银行列表信息 + * @throws WxPayException . + */ + BankingResult personalBanking(Integer offset, Integer limit) throws WxPayException; + + /** + *
+   *
+   * 支持对公业务的银行列表
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://api.mch.weixin.qq.com/v3/capital/capitallhh/banks/corporate-banking
+   *
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter11_2_3.shtml
+   * 
+ * + * @param offset 本次查询偏移量 + * @param limit 本次请求最大查询条数,最大值为200 + * @return BankingResult 支持对公业务的银行列表信息 + * @throws WxPayException . + */ + BankingResult corporateBanking(Integer offset, Integer limit) throws WxPayException; + + /** + *
+   *
+   * 查询省份列表API
+   * 通过本接口获取省份列表数据(不包含中国港澳台地区),可用于省份下的城市数据查询
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://api.mch.weixin.qq.com/v3/capital/capitallhh/areas/provinces
+   *
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter11_2_4.shtml
+   * 
+ * + * @return ProvincesResult 省份列表信息 + * @throws WxPayException . + */ + ProvincesResult areasProvinces() throws WxPayException; + + /** + *
+   *
+   * 查询城市列表API
+   * 通过本接口根据省份编码获取省份下的城市列表信息,不包含中国港澳台地区城市信息,可用于支行数据过滤查询
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://api.mch.weixin.qq.com/v3/capital/capitallhh/areas/provinces/{province_code}/cities
+   *
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter11_2_5.shtml
+   * 
+ * + * @return CitiesResult 城市列表信息 + * @throws WxPayException . + */ + CitiesResult areasCities(Integer provinceCode) throws WxPayException; + + /** + *
+   *
+   * 查询支行列表API
+   * 本接口可以用于根据银行别名编码(仅支持需要填写支行的银行别名编码)和城市编码过滤查询支行列表数据
+   *
+   * 请求方式:GET(HTTPS)
+   * 请求地址:https://api.mch.weixin.qq.com/v3/capital/capitallhh/banks/{bank_alias_code}/branches
+   *
+   * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/Offline/apis/chapter11_2_5.shtml
+   * 
+ * + * @param bankAliasCode 银行别名的编码,查询支行接口仅支持需要填写支行的银行别名编码。示例值:1000006247 + * @param cityCode 城市编码,唯一标识一座城市,用于结合银行别名编码查询支行列表。示例值:536 + * @param offset 非负整数,表示该次请求资源的起始位置,从0开始计数。调用方选填,默认为0。offset为20,limit为100时,查询第21-120条数据 + * @param limit 非0非负的整数,该次请求可返回的最大资源条数。示例值:200 + * @return BankBranchesResult 城市列表信息 + * @throws WxPayException . + */ + BankBranchesResult bankBranches(String bankAliasCode, Integer cityCode, Integer offset, Integer limit) throws WxPayException; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java new file mode 100644 index 00000000..0e35dbb6 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MerchantMediaService.java @@ -0,0 +1,46 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.media.ImageUploadResult; +import com.github.binarywang.wxpay.exception.WxPayException; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + *
+ * 微信支付通用媒体接口.
+ * 
+ * + * @author zhouyongshen + */ +public interface MerchantMediaService { + /** + *
+   * 通用接口-图片上传API
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/chapter3_1.shtml
+   * 接口链接:https://api.mch.weixin.qq.com/v3/merchant/media/upload
+   * 
+ * + * @param imageFile 需要上传的图片文件 + * @return ImageUploadResult 微信返回的媒体文件标识Id。示例值:6uqyGjGrCf2GtyXP8bxrbuH9-aAoTjH-rKeSl3Lf4_So6kdkQu4w8BYVP3bzLtvR38lxt4PjtCDXsQpzqge_hQEovHzOhsLleGFQVRF-U_0 + * @throws WxPayException the wx pay exception + */ + ImageUploadResult imageUploadV3(File imageFile) throws WxPayException, IOException; + + /** + *
+   * 通用接口-图片上传API
+   * 文档详见: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/tool/chapter3_1.shtml
+   * 接口链接:https://api.mch.weixin.qq.com/v3/merchant/media/upload
+   * 
+ * + * @param inputStream 需要上传的图片文件流 + * @param fileName 需要上传的图片文件名 + * @return ImageUploadResult 微信返回的媒体文件标识Id。示例值:6uqyGjGrCf2GtyXP8bxrbuH9-aAoTjH-rKeSl3Lf4_So6kdkQu4w8BYVP3bzLtvR38lxt4PjtCDXsQpzqge_hQEovHzOhsLleGFQVRF-U_0 + * @throws WxPayException the wx pay exception + */ + ImageUploadResult imageUploadV3(InputStream inputStream, String fileName) throws WxPayException, IOException; + + +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index c6043d6d..0451a922 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -107,6 +107,17 @@ public interface WxPayService { */ String getV3(String url) throws WxPayException; + /** + * 发送get请求,得到响应字符串. + *

+ * 部分字段会包含敏感信息,所以在提交前需要在请求头中会包含"Wechatpay-Serial"信息 + * + * @param url 请求地址 + * @return 返回请求结果字符串 string + * @throws WxPayException the wx pay exception + */ + String getV3WithWechatPaySerial(String url) throws WxPayException; + /** * 发送下载 V3请求,得到响应流. * @@ -144,6 +155,27 @@ public interface WxPayService { */ BusinessCircleService getBusinessCircleService(); + /** + * 特约商户进件服务 + * + * @return + */ + Applyment4SubService getApplyment4SubService(); + + /** + * 媒体上传服务 + * + * @return + */ + MerchantMediaService getMerchantMediaService(); + + /** + * 获取银行组件服务 + * + * @return 银行组件服务 + */ + BankService getBankService(); + /** * 设置企业付款服务类,允许开发者自定义实现类. * @@ -151,6 +183,7 @@ public interface WxPayService { */ void setEntPayService(EntPayService entPayService); + /** *

    * 查询订单.
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java
new file mode 100644
index 00000000..8da4c405
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/Applyment4SubServiceImpl.java
@@ -0,0 +1,66 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.applyment.*;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.Applyment4SubService;
+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;
+
+import java.security.cert.X509Certificate;
+
+@Slf4j
+@RequiredArgsConstructor
+public class Applyment4SubServiceImpl implements Applyment4SubService {
+  private static final Gson GSON = new GsonBuilder().create();
+  private final WxPayService payService;
+
+  private void encryptFiled(Object request) throws WxPayException {
+
+    X509Certificate validCertificate = payService.getConfig().getVerifier().getValidCertificate();
+
+    RsaCryptoUtil.encryptFields(request, validCertificate);
+  }
+
+
+  @Override
+  public WxPayApplymentCreateResult createApply(WxPayApplyment4SubCreateRequest request) throws WxPayException {
+    String url = String.format("%s/v3/applyment4sub/applyment/", this.payService.getPayBaseUrl());
+
+    encryptFiled(request);
+
+    String result = payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+    return GSON.fromJson(result, WxPayApplymentCreateResult.class);
+  }
+
+  @Override
+  public ApplymentStateQueryResult queryApplyStatusByBusinessCode(String businessCode) throws WxPayException {
+    String url = String.format("%s/v3/applyment4sub/applyment/business_code/%s", this.payService.getPayBaseUrl(), businessCode);
+    String result = payService.getV3(url);
+    return GSON.fromJson(result, ApplymentStateQueryResult.class);
+  }
+
+  @Override
+  public ApplymentStateQueryResult queryApplyStatusByApplymentId(String applymentId) throws WxPayException {
+    String url = String.format("%s/v3/applyment4sub/applyment/applyment_id/%s", this.payService.getPayBaseUrl(), applymentId);
+    String result = payService.getV3(url);
+    return GSON.fromJson(result, ApplymentStateQueryResult.class);
+  }
+
+  @Override
+  public SettlementInfoResult querySettlementBySubMchid(String subMchid) throws WxPayException {
+    String url = String.format("%s/v3/apply4sub/sub_merchants/%s/settlement", this.payService.getPayBaseUrl(), subMchid);
+    String result = payService.getV3(url);
+    return GSON.fromJson(result, SettlementInfoResult.class);
+  }
+
+  @Override
+  public String modifySettlement(String subMchid, ModifySettlementRequest request) throws WxPayException {
+    String url = String.format("%s/v3/apply4sub/sub_merchants/%s/modify-settlement", this.payService.getPayBaseUrl(), subMchid);
+    encryptFiled(request);
+    return payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
+  }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BankServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BankServiceImpl.java
new file mode 100644
index 00000000..623a787d
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BankServiceImpl.java
@@ -0,0 +1,68 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.bank.*;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.BankService;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 微信支付-银行组件
+ *
+ * @author zhongjun
+ **/
+@RequiredArgsConstructor
+public class BankServiceImpl implements BankService {
+  private final WxPayService payService;
+  private static final Gson GSON = new GsonBuilder().create();
+
+  @Override
+  public BankAccountResult searchBanksByBankAccount(String accountNumber) throws WxPayException {
+    String url = String.format("%s/v3/capital/capitallhh/banks/search-banks-by-bank-account?account_number=%s", this.payService.getPayBaseUrl(), accountNumber);
+    String response = payService.getV3WithWechatPaySerial(url);
+    return GSON.fromJson(response, BankAccountResult.class);
+  }
+
+  @Override
+  public BankingResult personalBanking(Integer offset, Integer limit) throws WxPayException {
+    offset = offset == null ? 0 : offset;
+    limit = limit == null ? 200 : limit;
+    String url = String.format("%s/v3/capital/capitallhh/banks/personal-banking?offset=%s&limit=%s", this.payService.getPayBaseUrl(), offset, limit);
+    String response = payService.getV3(url);
+    return GSON.fromJson(response, BankingResult.class);
+  }
+
+  @Override
+  public BankingResult corporateBanking(Integer offset, Integer limit) throws WxPayException {
+    offset = offset == null ? 0 : offset;
+    limit = limit == null ? 200 : limit;
+    String url = String.format("%s/v3/capital/capitallhh/banks/corporate-banking?offset=%s&limit=%s", this.payService.getPayBaseUrl(), offset, limit);
+    String response = payService.getV3(url);
+    return GSON.fromJson(response, BankingResult.class);
+  }
+
+  @Override
+  public ProvincesResult areasProvinces() throws WxPayException {
+    String url = String.format("%s/v3/capital/capitallhh/areas/provinces", this.payService.getPayBaseUrl());
+    String response = payService.getV3WithWechatPaySerial(url);
+    return GSON.fromJson(response, ProvincesResult.class);
+  }
+
+  @Override
+  public CitiesResult areasCities(Integer provinceCode) throws WxPayException {
+    String url = String.format("%s/v3/capital/capitallhh/areas/provinces/%s/cities", this.payService.getPayBaseUrl(), provinceCode);
+    String response = payService.getV3WithWechatPaySerial(url);
+    return GSON.fromJson(response, CitiesResult.class);
+  }
+
+  @Override
+  public BankBranchesResult bankBranches(String bankAliasCode, Integer cityCode, Integer offset, Integer limit) throws WxPayException {
+    offset = offset == null ? 0 : offset;
+    limit = limit == null ? 200 : limit;
+    String url = String.format("%s/v3/capital/capitallhh/banks/%s/branches?city_code=%s&offset=%s&limit=%s", this.payService.getPayBaseUrl(), bankAliasCode, cityCode, offset, limit);
+    String response = payService.getV3(url);
+    return GSON.fromJson(response, BankBranchesResult.class);
+  }
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
index 075fed99..c68e11d4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
@@ -61,6 +61,9 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
   private ProfitSharingService profitSharingService = new ProfitSharingServiceImpl(this);
   private RedpackService redpackService = new RedpackServiceImpl(this);
   private BusinessCircleService businessCircleService = new BusinessCircleServiceImpl(this);
+  private Applyment4SubService applyment4SubService = new Applyment4SubServiceImpl(this);
+  private MerchantMediaService merchantMediaService = new MerchantMediaServiceImpl(this);
+  private BankService bankService = new BankServiceImpl(this);
 
   /**
    * The Config.
@@ -87,6 +90,21 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
     return this.redpackService;
   }
 
+  @Override
+  public Applyment4SubService getApplyment4SubService() {
+    return applyment4SubService;
+  }
+
+  @Override
+  public MerchantMediaService getMerchantMediaService() {
+    return merchantMediaService;
+  }
+
+  @Override
+  public BankService getBankService() {
+    return bankService;
+  }
+
   @Override
   public void setEntPayService(EntPayService entPayService) {
     this.entPayService = entPayService;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java
new file mode 100644
index 00000000..7952513f
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MerchantMediaServiceImpl.java
@@ -0,0 +1,60 @@
+package com.github.binarywang.wxpay.service.impl;
+
+import com.github.binarywang.wxpay.bean.media.ImageUploadResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.MerchantMediaService;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.v3.WechatPayUploadHttpPost;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+
+import java.io.*;
+import java.net.URI;
+
+/**
+ * 微信支付-媒体文件上传service
+ * @author zhouyongshen
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class MerchantMediaServiceImpl implements MerchantMediaService {
+  private final WxPayService payService;
+
+  @Override
+  public ImageUploadResult imageUploadV3(File imageFile) throws WxPayException,IOException {
+    String url = String.format("%s/v3/merchant/media/upload", this.payService.getPayBaseUrl());
+
+    try (FileInputStream s1 = new FileInputStream(imageFile)) {
+      String sha256 = DigestUtils.sha256Hex(s1);
+      try (InputStream s2 = new FileInputStream(imageFile)) {
+        WechatPayUploadHttpPost request = new WechatPayUploadHttpPost.Builder(URI.create(url))
+          .withImage(imageFile.getName(), sha256, s2)
+          .build();
+        String result = this.payService.postV3(url, request);
+        return ImageUploadResult.fromJson(result);
+      }
+    }
+  }
+
+  @Override
+  public ImageUploadResult imageUploadV3(InputStream inputStream, String fileName) throws WxPayException, IOException {
+    String url = String.format("%s/v3/merchant/media/upload", this.payService.getPayBaseUrl());
+    try(ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+      byte[] buffer = new byte[2048];
+      int len;
+      while ((len = inputStream.read(buffer)) > -1) {
+        bos.write(buffer, 0, len);
+      }
+      bos.flush();
+      byte[] data = bos.toByteArray();
+      String sha256 = DigestUtils.sha256Hex(data);
+      WechatPayUploadHttpPost request = new WechatPayUploadHttpPost.Builder(URI.create(url))
+        .withImage(fileName, sha256, new ByteArrayInputStream(data))
+        .build();
+      String result = this.payService.postV3(url, request);
+      return ImageUploadResult.fromJson(result);
+    }
+  }
+
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
index 87ba43df..7ec9039c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java
@@ -208,6 +208,16 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl {
     return this.requestV3(url.toString(), httpGet);
   }
 
+  @Override
+  public String getV3WithWechatPaySerial(String url) throws WxPayException {
+    HttpGet httpGet = new HttpGet(url);
+    httpGet.addHeader("Accept", "application/json");
+    httpGet.addHeader("Content-Type", "application/json");
+    String serialNumber = getConfig().getVerifier().getValidCertificate().getSerialNumber().toString(16).toUpperCase();
+    httpGet.addHeader("Wechatpay-Serial", serialNumber);
+    return this.requestV3(url, httpGet);
+  }
+
   @Override
   public InputStream downloadV3(String url) throws WxPayException {
     CloseableHttpClient httpClient = this.createApiV3HttpClient();
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java
index 52ce46df..86801ca2 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceJoddHttpImpl.java
@@ -95,6 +95,11 @@ public class WxPayServiceJoddHttpImpl extends BaseWxPayServiceImpl {
     return null;
   }
 
+  @Override
+  public String getV3WithWechatPaySerial(String url) throws WxPayException {
+    return null;
+  }
+
   @Override
   public InputStream downloadV3(String url) throws WxPayException {
     return null;