电商收付通系列⑤,商户进件之二级商户进件申请

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 用户提交商家进件资料后,电商平台可使用该接口,帮助其二级商户进件成为微信支付商户。

1、介绍

文档地址:

https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter3_1.shtml

用户提交商家进件资料后,电商平台可使用该接口,帮助其二级商户进件成为微信支付商户。

2、敏感信息加密

有些字段需要先加密处理再传入,否则调用接口会报错。官方有提供加密demo,这里一并贴出来。

商户需先在【商户平台】->【API安全】的页面设置该密钥,请求才能通过微信支

付的签名校验。密钥的长度为32个字节。APIv3密钥属于敏感信息,请妥善保管不

要泄露,如果怀疑信息泄露,请重设密钥。

/**
 * 加密敏感信息
 * @param message
 * @param certificate 这个证书是微信支付平台证书
 * @return
 * @throws IllegalBlockSizeException
 * @throws IOException
 */
public static String rsaEncryptOAEP(String message, X509Certificate certificate)
        throws IllegalBlockSizeException, IOException {
    try {
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey());

        byte[] data = message.getBytes("utf-8");
        byte[] cipherdata = cipher.doFinal(data);
        return Base64.encodeBase64String(cipherdata);
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
    } catch (InvalidKeyException e) {
        throw new IllegalArgumentException("无效的证书", e);
    } catch (IllegalBlockSizeException | BadPaddingException e) {
        throw new IllegalBlockSizeException("加密原串的长度不能超过214字节");
    }
}

image.png

3、创建参数实体

按文档创建参数实体类。

参数实体ApplyParam:

@Data
public class ApplyParam {

    /**
     * 业务申请编号 必填
     * query
     * 1、服务商自定义的商户唯一编号。
     * 2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。
     * 3、若申请单被驳回,可填写相同的“业务申请编号”,即可覆盖修改原申请单信息 。
     * 示例值:APPLYMENT_00000000001
     */
    private String out_request_no;
    /**
     * 主体类型 必填
     * query枚举值:
     * 2401:小微商户,指无营业执照的商户。
     * 4:个体工商户,营业执照上的主体类型一般为个体户、个体工商户、个体经营。
     * 2:企业,营业执照上的主体类型一般为有限公司、有限责任公司。
     * 3:党政、机关及事业单位,包括国内各级、各类政府机构、事业单位等(如:公安、党团、司法、交通、旅游、工商税务、市政、医疗、教育、学校等机构)。
     * 1708:其他组织,不属于企业、政府/事业单位的组织机构(如社会团体、民办非企业、基金会),要求机构已办理组织机构代码证。
     * 示例值:2401
     */
    private String organization_type;
    /**
     * 营业执照/登记证书信息 条件选填
     * query1、主体为“小微”时,不填。
     * 2、主体为“个体工商户/企业”时,请上传营业执照。
     * 3、主体为“党政、机关及事业单位/其他组织”时,请上传登记证书。
     */
    private BusinessLicenseInfo business_license_info;
    /**
     * 组织机构代码证信息 条件选填
     * query主体为企业/党政、机关及事业单位/其他组织,且证件号码不是18位时必填。
     */
    private OrganizationCertInfo organization_cert_info;
    /**
     * 经营者/法人证件类型 非必填
     * query
     * 1、主体为“小微”,只可选择:身份证。
     * 2、主体为“个体户/企业/党政、机关及事业单位/其他组织”,可选择:任一证件类型。
     * 3、若没有填写,系统默认选择:身份证。
     * 枚举值:
     * IDENTIFICATION_TYPE_MAINLAND_IDCARD:中国大陆居民-身份证
     * IDENTIFICATION_TYPE_OVERSEA_PASSPORT:其他国家或地区居民-护照
     * IDENTIFICATION_TYPE_HONGKONG:中国香港居民–来往内地通行证
     * IDENTIFICATION_TYPE_MACAO:中国澳门居民–来往内地通行证
     * IDENTIFICATION_TYPE_TAIWAN:中国台湾居民–来往大陆通行证
     * 示例值:IDENTIFICATION_TYPE_MACAO
     */
    private String id_doc_type;
    /**
     * 经营者/法人身份证信息 条件选填
     * query请填写经营者/法人的身份证信息
     * 证件类型为“身份证”时填写。
     */
    private IdCardInfo id_card_info;
    /**
     * 经营者/法人其他类型证件信息 条件选填
     * query证件类型为“来往内地通行证、来往大陆通行证、护照”时填写。
     */
    private IdDocInfo id_doc_info;
    /**
     * 是否填写结算账户信息 必填
     * query可根据实际情况,填写“true”或“false”。
     * 1、若为“true”,则需填写结算账户信息。
     * 2、若为“false”,则无需填写结算账户信息。
     * 示例值:true
     */
    private Boolean need_account_info;
    /**
     * 结算账户信息 条件选填
     * query若"是否填写结算账户信息"填写为“true”, 则必填,填写为“false”不填 。
     */
    private AccountInfo account_info;
    /**
     * 超级管理员信息 必填
     * query请填写店铺的超级管理员信息。
     * 超级管理员需在开户后进行签约,并可接收日常重要管理信息和进行资金操作,请确定其为商户法定代表人或负责人。
     */
    private ContactInfo contact_info;
    /**
     * 店铺信息 必填
     * query请填写店铺信息
     */
    private SalesSceneInfo sales_scene_info;
    /**
     * 商户简称 必填
     * queryUTF-8格式,中文占3个字节,即最多16个汉字长度。将在支付完成页向买家展示,需与商家的实际售卖商品相符 。
     * 示例值:腾讯
     */
    private String merchant_shortname;
    /**
     * 特殊资质 非必填
     * query
     * 1、若店铺业务包含互联网售药,则需上传特殊资质-《互联网药品交易服务证》。
     * 2、最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
     * 示例值:[\"jTpGmxUX3FBWVQ5NJInE4d2I6_H7I4\"]
     */
    private String qualifications;
    /**
     * 补充材料 非必填
     * query 最多可上传5张照片,请填写通过图片上传接口预先上传图片生成好的MediaID 。
     * 示例值:[\"jTpGmg05InE4d2I6_H7I4\"]
     */
    private String business_addition_pics;
    /**
     * 补充说明 非必填
     * query 可填写512字以内 。
     * 示例值:特殊情况,说明原因
     */
    private String business_addition_desc;

}

参数实体AccountInfo:

@Data
public class AccountInfo {

    private String bank_account_type;
    private String account_bank;
    private String account_name;
    private String bank_address_code;
    private String bank_branch_id;
    private String bank_name;
    private String account_number;
}

参数实体BusinessLicenseInfo:

public class BusinessLicenseInfo {

    private String business_license_copy;
    private String business_license_number;
    private String merchant_name;
    private String legal_person;
    private String company_address;
    private String business_time;
}

参数实体ContactInfo:

public class ContactInfo {

    private String contact_type;
    private String contact_name;
    private String contact_id_card_number;
    private String mobile_phone;
    private String contact_email;
}

参数实体IdCardInfo:

public class IdCardInfo {

    private String id_card_copy;
    private String id_card_national;
    private String id_card_name;
    private String id_card_number;
    private String id_card_valid_time;
}

参数实体IdDocInfo:

public class IdDocInfo {

    private String id_doc_name;
    private String id_doc_number;
    private String id_doc_copy;
    private String doc_period_end;
    private String need_account_info;
}

参数实体OrganizationCertInfo:

public class OrganizationCertInfo {

    private String organization_copy;
    private String organization_number;
    private String organization_time;
    private String id_doc_type  ;
}

参数实体SalesSceneInfo:

@Data
public class SalesSceneInfo {

    private String store_name;
    private String store_url;
    private String store_qr_code;
}

image.png

4、发起请求

注意:请求URL:

public static JSONObject applyments(ApplyParam param) {

  String requestParam = JSON.toJSONString(param);

  logger.info("applyments param:{}",requestParam);

  HttpResponse response = HttpUtils.v3HttpExecute("POST",EcommerceUrl.APPLYMENTS,
          "自己系统的应用名称","服务商商户号","商户API证书序列号","平台证书序列号",requestParam,"商户API证书位置.pem",null);
          
  JSONObject body = JSONObject.parseObject(response.body());

  logger.info("applyments heads result:{}",response.headers());

  logger.info("applyments body result:{}",body);

  return body;
}

image.png

5、测试

敏感信息要使用微信支付平台证书加密,否则会报“平台私钥解密失败”的错

  ApplyParam param = new ApplyParam();
  param.setOut_request_no(System.currentTimeMillis()+"");
  param.setOrganization_type("2401");

  param.setId_doc_type("IDENTIFICATION_TYPE_MAINLAND_IDCARD");

  IdCardInfo idCardInfo = new IdCardInfo();
  idCardInfo.setId_card_copy("SisPNr_iXhGsRplvdY57L15mng49LodEpUJe8ou3o22g_aOIs9Mni3QR7K-3SC67eoOKbemPCQHqruckzq3MEWDdx9tnqNqIgV1uwuSNtDo");
  idCardInfo.setId_card_national("RXjKrNBlqMxFx0jSD_noRzgHLOUeoOKbemPCQHqrSisPC4GItlsQ9xRUP-8TfFLw7VUcC8VdyxJEVlHMNr_o1Rc5AHe5iskLiSZDlPcruKM");
  //该字段需进行加密处理
  idCardInfo.setId_card_name("g3i0pmX96QjI8qkNdFFkLSaOr0z5QWsAKGGMAPqqxG9fXnh81sZinQRNXliZnwiWh2DLQpoo9azM89x9fg+epq1HpbaBaz3K7x5XtVw91Sl1ovoyb3GaNVVH2pHphOo3wO1ob6Vq4dXkXfC0xs7Vn/vyZu67xBBiuMl7FwuAwqxaZ0mba72aknPYZVyiiWauBbc3VZ4nID4q8y5WwmHK4f9G7Fy3xjFemndg5wsOg3qOONmSsMwaj35LlfqHJoQXRXIGotTek5xwof0JVbBqg4PZfAf6uZCdy0H6g8MyKXBuC7CnEZdYidcJBkUI/JWXToDwfUHR0Lk7PPmmGKt3ag==");
  //该字段需进行加密处理
  idCardInfo.setId_card_number("8GaO0szMfe/dGeeTgUxbnSnIguEMZPAKdfzbnjUnNrx+KmFgqnIYWcmNQL+OSUgc3L5sCB87WPBBe6Xn1ff79BhLa8osu6e2QjUz++TuSff3AuXU694v340+3riVwDS8I8ebvCMXNNXT/LJ+9cvXNkik+1dedBv5oebs5hytYEbxBeJZjOZrPDIvd6p5YGfY3hZI9xPrZGGAteCdH516no2GtDkdgPOBi6RZT8mZ9dgP6y4ANTPrjtO8rWA+tpuhO3I+UTr1JQSrQpSHYNl8Pooz7FyaJpNOF1Zr7pyWD2kgWB2VMDbHFFiaPN5WoLpettVuayNPyk2rzLjTBsvDCg==");
  idCardInfo.setId_card_valid_time("2099-09-04");

  param.setId_card_info(idCardInfo);

  param.setNeed_account_info(true);

  AccountInfo accountInfo = new AccountInfo();
  accountInfo.setBank_account_type("75");
  accountInfo.setAccount_bank("工商银行");
  //该字段需进行加密处理
  accountInfo.setAccount_name("2pHphOo3wO1ob6Vq4dXkXfC0xs7VKGGMAPqqxG9fXnh81sZinQRNXliZ+g3i0pmX96QjI8Sl1ovonwiWh2DLQpoo9azM89x9fgyb3GaNVVHn/vyZu67xBBiuMl7FwuAwqxaZ0qkNdFFkLSaOr0z5QWsAepq1HpbaBaz3K7x5XtVw91mba72aknPYZVyiiWauBbc3VZ4nID4q8y5WwmHK4f9G7Fy3xjFemndg5wsOg3qOONmSsMwaj35LlfqHJoQXRXIGotTek5xwof0JVbBqg4PZfAf6uZCdy0H6g8MyKXBuC7CnEZdYidcJBkUI/JWXToDwfUHR0Lk7PPmmGKt3ag==");
  accountInfo.setBank_address_code("350200");
  //该字段需进行加密处理
  accountInfo.setAccount_number("yrcL/3arXHVGc82cRJ1TvRkFoXuqEvndW3KcXpqIg+1h2g1KOEw5hZFZ2UNKryOUUwrybrlaBy/PZe4w3aZMHoYG0zsSczQD5zUb2ZOcnqZoTV88BVm4boGFkDFdHNG0Jvc9c1Twnv98HPoTJPkIUBJCO1oc3SptNjofRQsdjBm1CNSFkK/isdgr5r0kgcAWk+hecc28YTsCJEUB7jM52bWf8zp3xxorp3niZ5CzzPi/J2d8Ug2qqJehf7FBvRyR3IXVc3I2LrqdXqs7DT5KVZEvGa+mnR0YapIkJfyDJPv6KbzUWfncphEJrF3cl0jyoosbeOZ6jSgK8OzMIPyuYA==");

  param.setAccount_info(accountInfo);

  ContactInfo contactInfo = new ContactInfo();
  contactInfo.setContact_type("65");
  //该字段需进行加密处理
  contactInfo.setContact_name("i0pmX96QjI8qkNdFFkLSaOr0z5QWsAKGGMAPqqxG9fXnh81sZinQRNXliZ+g3epq1HpbaBaz3K7x5XtVw91Sl1ovonwiWh2DLQpoo9azM89x9fgyb3GaNV7xBBiuMl7FwuAwqxaZ0mba72aknPYVH2pHphOo3wO1ob6Vq4dXkXfC0xs7Vn/vyZu6ZVyiiWauBbcZdYidcJBkUI/JWXToDwfUHR0Lk7PPmmG3VZ4nID4q8y5WwmHK4f9G7Fy3xjFemndg5wsOg3qOONmSsMwaj35LlfqHJoQXRXIGotTek5xwof0JVbBqg4PZfAf6uZCdy0H6g8MyKXBuC7CnEKt3ag==");
  //该字段需进行加密处理
  contactInfo.setContact_id_card_number("PBBe6Xn1ff79BuSff3AuXU694v340+3riVwSnIguEMZPAUgc3L5sCB87WebvCMXNNXT/LJ+9cvXNkik+1dedBv5oebs5hytYEbxBeJZjOhLa8osu6e2QOBi6RZT8mZ9dgP6y4ANTPrjtO8rWA+tpuhO3I+UTr1JQSrQpSHYNl8Pooz7FyaJpNOF1Zr7pyWD2kgWB2VMDbHFFiaPN5WoLpeDS8I8KdfzbnjUnNrx+KmFgqnIYWcmNQL+jUz++TZrPDIvd6p5YGfY3hZI9xPrZGGAteCdH516no2GtDkdgPOS8GaO0szMfe/dGeeTgUxbnttVuayNPyk2rzLjTBsvDCg==");
  //该字段需进行加密处理
  contactInfo.setMobile_phone("7mnr/TT5Ge5HqGttlhIgVCjQoxsHQZQy/YpjSP1pvCSf87L0wFkRjNcATNmAlY2NhD/rw34YE3A0K2S0Ujy5f+DB7C+2ZcLTA1gl8zZm3rKr6AaSf5Jgqdy9RhoFyMgPCmV4g5qg2bKlIjXbCG7qfU+6U1r+OlzG+gR0ertF70u/JWd1gqn3QbXkKoqvr/cVpwAEjE4eIjH7IotCjWZIFZ5HNUz2tkNaC1ma234z3R0JrzEDf9hb8Vs7UUKwJrwsel5RksQCvDZvpPKmOxsF9F5Cuh1XgVaqBRSUSYzs7l6WouvsUA+cEb1xOeJSipIxC8tU0t57pIiAQVBn8Z1yLw==");
  //该字段需进行加密处理
  contactInfo.setContact_email("TT++JXKKwFLscUIfpSFniSP5uc3ITGcmV0oP1RnFZNdrYm42C8tXIw3RinsFwfEsvTdM1fc7TrKXVJK7w7eZ8fbAdkUHwhJ9DyLxwxtGz21mSiOpIgaoRqrOuQ623jx4myGXK4O02ejmUVgSuuSGTCXcebtS+12m5MaC6PGqYjbVfExz/83CEifmu57HNnde/YfQCSB4gbmFi2cILNF5Eoa4oVVwYlvbYW4ZHCq7cdZVKx2yREu5qwWUnQWChT5EFtR5Q+CCmbBZyX64g8VHtZPMOjbbj6d4sl/bn6NjKsBKIfroFuH1W/8aofKPZkqVG/A0thXkhDGsHFX6aKFUuQ==");

  param.setContact_info(contactInfo);

  SalesSceneInfo salesSceneInfo = new SalesSceneInfo();
  salesSceneInfo.setStore_name("收付通");
  salesSceneInfo.setStore_qr_code("gCVSq6j0dKRaup7VRA3aCfDX5pxgObgXhlOlmUdpskWnlXBmdLyOUNSRzFK1HT1y_9tPWGTr_mxBiD8ICwUvNVr2Pq-JdH6UsZ4Ayo7eVDo");

  param.setSales_scene_info(salesSceneInfo);

  param.setMerchant_shortname("收付通");

  applyments(param);
}

结果

image.png

image.png

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:电商收付通系列④,图片预上传,生成MediaID

相关文章
|
Web App开发
如何实现一个项目配置多个商户信息付款给对应商户
说明:本帖主要说明如何实现给一个平台配置多个商户的号实现多个商户收款。主要用于没有门店和第三方授权方式 支付宝最终是根据请求过来的appid来判断哪一个商户收款(也就是请求是谁的appid就收款到谁的账号下)    方案一:      1.
1386 12
|
前端开发 JavaScript
20分布式电商项目 - 商家申请入驻
20分布式电商项目 - 商家申请入驻
53 0
|
小程序 开发者
电商收付通,商户进件,上传身份证、营业执照自动识别相关信息
二级商户进件的时候,需要提交的资料不少,有一个繁琐的地方就是,不管选择哪种主体类型,都需要上传身份证人像面、身份证国徽面、身份证姓名、身份证号码、身份证居住地址、身份证开始时间和身份证结束时间这些要素。
257 0
电商收付通,商户进件,上传身份证、营业执照自动识别相关信息
|
数据可视化 小程序
支付宝直付通管理系统,进件二级商户
支付宝直付通支付一站式解决方案其实还是给广大商户带来了很多的便捷。买家在该平台的订单支付成功,支持多个商户的订单合并支付后,资金不再需要先结算到支付宝服务商那边,而是直接付给自己的商户号,支付宝记录对应商户待结算资金,待平台确认可结算时,支付宝将资金直接结算至商户指定的收款账户。
764 0
支付宝直付通管理系统,进件二级商户
|
API
电商收付通系列⑥,商户进件之查询申请状态
查询申请状态API可按以下两种不同方式查询:通过申请单ID查询申请状态,通过业务申编号查询申请状态,两种不同查询方式返回结果相同。
184 0
电商收付通系列⑥,商户进件之查询申请状态
|
移动开发 安全 小程序
电商收付通系统,可视化进件二级商户
传统的电商平台都是在用户确认收货后再在一定的周期内结算给商户,就是采取平台先收款的方式,但这样不仅给电商平台带来税务的问题,还影响商户的资金安全。有了电商收付通,就不存在这样的问题了。
294 0
电商收付通系统,可视化进件二级商户
|
JSON API 数据格式
电商收付通系列②,获取微信支付平台证书
微信支付平台证书是指由微信支付负责申请的,包含微信支付平台标识、公钥信息的证书。商户可以使用平台证书中的公钥进行验签。注意,这里的证书区别于商户API证书,商户API证书是直接从商户后台下载查看的,而微信支付平台证书是通过电商收付通的证书接口获取的。
763 0
电商收付通系列②,获取微信支付平台证书
电商收付通系列⑩,合单下单之扫码支付
电商收付通系列合单下单之扫码支付
223 0
电商收付通系列⑩,合单下单之扫码支付
|
小程序 JavaScript
电商收付通系列⑦,合单下单之小程序支付
在我接这个接口的时候,官方并没有明确给出合单支付支持小程序支付,凭借一腔热血去尝试了一下可以成功,prepay_id就是调用JS合单支付获取的。现在再看文档,已经明确列出来了“小程序调起支付”的字眼。所以大家可以放心的接入小程序合单支付哈。支付场景较多,系列文章只介绍小程序合单支付,APP合单支付、JS合单支付依瓢画葫芦,都一样哈。要注意,合单中同一个二级商户只允许有一笔子订单。订单如果需要进行分账等,需要在合单中指定需要进行分账(profit_sharing为true)。
321 0
电商收付通系列⑦,合单下单之小程序支付
|
API
微信开发之普通直连分账(境内普通商户)
单次分账请求按照传入的分账接收方账号和资金进行分账,同时会将订单剩余的待分账金额解冻给本商户。故操作成功后,订单不能再进行分账,也不能进行分账完结。
698 0
微信开发之普通直连分账(境内普通商户)