微信支付-电商收付通开发-03.商户进件

二级商户进件

关于申请的主体类型,个人身份证没有营业执照的话只能选择小微。收款额度小微是10万,其他主体类型没有收款额度限制。

Q:一个商家,是否可申请多个二级商户号?
A:① 若为小微主体,则限制一个微信号在同一个电商平台下,只可申请一个小微商户号。(二级商户签约环节会校验微信号是否已申请)
例:某人最多有5个实名验证的微信号,即最多可申请5个小微商户号。
② 若为其他主体,则没有限制,一个商家主体可申请多个二级商户号。

进件流程图:
在这里插入图片描述

  1. 账户验证:小微和企业的主体类型,管理员身份为法人无需账户验证。
  2. 微信审核:小微类型审核时间一般10分钟内,其他类型的1~2个工作日内完成审核。
  3. 待签约:审核通过后调用[查询进件申请状态接口]获取到签约URL,转换为二维码后由管理员微信扫码进行签约,微信会校验扫码的微信号-绑定银行卡实名信息(姓名+身份证号),是否与申请单-管理员信息(姓名+身份证号)一致。

待签约签约信息

二级商户进件申请接口

这里需要使用到之前的图片上传接口,先将图片上传到微信服务器获取到MediaID。
开户银行省市编码和开户银行全称 (含支行)需要参考微信支付提供的对照表:
https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter4_1.shtml

在这里插入图片描述

    /**
     * 二级商户进件接口
     */
    @Test
    public void applyments() {
        String idCardName = "你的名字";  //法人姓名
        String idCardNum = "你的身份证号码"; //法人身份证
        String accountBankNum = "你的银行卡号";  //银行卡账号
        String accountBank = "你的银行卡名称";  //银行卡名称
        String storeName = "店铺名称";

        JSONObject reqJsonObject = new JSONObject();
        //业务申请编号:1、服务商自定义的商户唯一编号。2、每个编号对应一个申请单,每个申请单审核通过后会生成一个微信支付商户号。3、填写相同的申请编号,会覆盖原申请信息
        reqJsonObject.put("out_request_no", "4");
        //主体类型: 2401:小微。4:个体工商户。2:企业。
        reqJsonObject.put("organization_type", "2401");

/*        //营业执照,小微不填
        JSONObject business_license_info = new JSONObject();
        //证件扫描件的MediaID
        business_license_info.put("business_license_copy", "2JHHOqESBTBPs3axLokFzWNUr0vIIClmOOvKcMnchqh6AuV_EmJrmyUV-jJwH5MfGEPXWDIy8Q_NztsNdocb4gRvCX5cjgcOtWwFX4cle0A");
        //证件注册号,最小15个字节
        business_license_info.put("business_license_number", "92510115MA63JNC62X");
        //商户名称,2~110个字符
        business_license_info.put("merchant_name", "温江庆丰所爱美妆化妆品店");
        //经营者/法定代表人姓名
        business_license_info.put("legal_person", idCardName);
        reqJsonObject.put("business_license_info", business_license_info);*/

        //法人证件类型
        String id_doc_type = "IDENTIFICATION_TYPE_MAINLAND_IDCARD";
        //法人身份证信息
        JSONObject id_card_info = new JSONObject();
        //身份证人像面照片,MediaID
        id_card_info.put("id_card_copy", "hr-Wq5DVfGvsBk5DnPbzO6gqHjayWvJXJ4Tt6wnTKm_74dlV1y4bnDQ-ekV9ZGsm4j_xpXoKTawjxruM-e1jlROQ5vw93ZQ2UR123456789");
        //身份证国徽面照片,MediaID
        id_card_info.put("id_card_national", "hr-Wq5DVfGvsBk5DnPbzO_qb-g6aaBtCoWblUYGDhxZrBWrs9yhuoQhjGFP4joJgaLyhZ6-H2qbxDD0JdnQF7CrvufMFwsysHl123456789");
        //身份证姓名,需加密
        id_card_info.put("id_card_name", WxPayUtils.rsaEncryptOAEP(idCardName));
        //身份证号码,需加密
        id_card_info.put("id_card_number", WxPayUtils.rsaEncryptOAEP(idCardNum));
        //身份证有效期限的结束时间,需大于60天,如果为长期填写长期
        id_card_info.put("id_card_valid_time", "2039-04-01");

        //结算账户信息,need_account_info 为true时必填
        JSONObject account_info = new JSONObject();
        //账户类型,74-对公账户 或 75-对私账户
        account_info.put("bank_account_type", "75");
        //开户银行
        account_info.put("account_bank", accountBank);
        //开户名称,需加密,选择对公账户时,开户名称必须与营业执照上的“商户名称”一致。
        account_info.put("account_name", WxPayUtils.rsaEncryptOAEP(idCardName));
        //开户银行省市编码	,至少精确到市
        account_info.put("bank_address_code", "110114");
        //开户银行全称 (含支行), 非17家直连银行必填
        if (!WxPayConfig.accountBankHashMap.containsKey(accountBank)) {
            account_info.put("bank_name", "中国建设银行股份有限公司杭州经济技术开发区支行");
        }
        //银行帐号,需加密
        account_info.put("account_number", WxPayUtils.rsaEncryptOAEP(accountBankNum));
        //是否填写结算账户信息,若入驻时未填写结算银行账户,则需入驻后调用修改结算账户API补充信息,才能发起提现
        reqJsonObject.put("need_account_info", true);
        reqJsonObject.put("account_info", account_info);

        //超级管理员信息,超级管理员需在开户后进行签约
        JSONObject contact_info = new JSONObject();
        //超级管理员类型,65:法人,66:负责人
        contact_info.put("contact_type", "65");
        //超级管理员姓名,需加密
        contact_info.put("contact_name", WxPayUtils.rsaEncryptOAEP(idCardName));
        //超级管理员身份证件号码,需加密
        contact_info.put("contact_id_card_number", WxPayUtils.rsaEncryptOAEP(idCardNum));
        //超级管理员手机,需加密
        contact_info.put("mobile_phone", WxPayUtils.rsaEncryptOAEP("12345678901"));
        //超级管理员邮箱,需加密
        contact_info.put("contact_email", WxPayUtils.rsaEncryptOAEP("123456789@qq.com"));

        //店铺信息
        JSONObject sales_scene_info = new JSONObject();
        //店铺名称
        sales_scene_info.put("store_name", storeName);
        //店铺二维码,MediaID
        //sales_scene_info.put("store_qr_code", "");
        //店铺主页链接。(店铺二维码or店铺链接二选一必填。)
        sales_scene_info.put("store_url", "http://youdomian.com");

        //商户简称
        String merchant_shortname = storeName;

        reqJsonObject.put("id_doc_type", id_doc_type);
        reqJsonObject.put("id_card_info", id_card_info);
        reqJsonObject.put("contact_info", contact_info);
        reqJsonObject.put("sales_scene_info", sales_scene_info);
        reqJsonObject.put("merchant_shortname", merchant_shortname);
        System.out.println("请求的body:" + reqJsonObject + "\n\n");

        String headerToken = WxPayUtils.getHeaderAuthorization("POST",
                HttpUrl.parse(WxPayConfig.ecommerce_applyments_url), reqJsonObject.toJSONString());
        System.out.println("请求接口携带的 header:  \n" + headerToken + "\n\n");

        Map<String, String> headersMap = new HashMap<>();
        headersMap.put("User-Agent", WxPayConfig.userAgent);
        headersMap.put("Accept", "application/json");
        headersMap.put("Authorization", headerToken);
        headersMap.put("Wechatpay-Serial", WxPayConfig.api_v3_cert_serial_no);

        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqJsonObject.toJSONString());
        ResponseAndStatusAndHeaders post = ClientUtil.getAndPostJson("POST", WxPayConfig.ecommerce_applyments_url, requestBody, headersMap);

        System.out.println(post);
        //{"applyment_id":2000002143997097,"out_request_no":"test_123456789"}, 
    }

查询进件申请状态接口

微信支持微信订单号和平台订单号两种查询方式,这里用的是查询平台订单号。

    /**
     * 二级商户进件查询接口
     */
    @Test
    public void applymentsQuery() throws Exception {
        String param = "58";
        String headerToken =WxPayUtils.getHeaderAuthorization("GET", HttpUrl.parse(WxPayConfig.ecommerce_applyments_query_url + param), "");
        System.out.println("请求接口携带的 header:  \n" + headerToken + "\n\n");

        Map<String, String> headersMap = new HashMap<>();
        headersMap.put("User-Agent", WxPayConfig.userAgent);
        headersMap.put("Accept", "application/json");
        headersMap.put("Authorization", headerToken);
        headersMap.put("Wechatpay-Serial", WxPayConfig.api_v3_cert_serial_no);

        ResponseAndStatusAndHeaders response = ClientUtil.getAndPostJson("GET",
                WxPayConfig.ecommerce_applyments_query_url + param, null, headersMap);
        System.out.println(response);

        JSONObject responseData = JSON.parseObject(response.getResponseData().toString());
        /*
          //待签约
          ResponseAndStatusAndHeaders{status=SUCCESS, responseData={"applyment_id":2000002143130839,"applyment_state":"NEED_SIGN",
          "applyment_state_desc":"待签约","audit_detail":[],"out_request_no":"test_123456789",
          "sign_url":"https://pay.weixin.qq.com/public/apply4ec_sign/s?applymentId=2000002143130839&sign=7178c7c80f2f5c6efd79d139a8fc8100","sub_mchid":"1595728911"}
          //已完成
          ResponseAndStatusAndHeaders{status=SUCCESS, responseData={"applyment_id":2000002143130839,"applyment_state":"FINISH",
          "applyment_state_desc":"完成","audit_detail":[],"out_request_no":"test_123456789","sub_mchid":"1595728911"}
         */

        String applyment_state = responseData.get("applyment_state").toString();
        if (StrUtil.isBlank(applyment_state)) {
            return Results.result(HttpStatusEnum.SYSTEM_ERROR_WX);
        }
        //待签约,返回签约链接二维码图片的base64数据
        if (applyment_state.equals("NEED_SIGN")) {
            String sign_url = responseData.get("sign_url").toString();
            byte[] generatePngByte = cn.hutool.extra.qrcode.QrCodeUtil.generatePng(sign_url, 230, 230);
            String base64Png = Base64.encode(generatePngByte);
        }
    }

二级商户修改结算账户

修改结算账户

使用本接口修改已签约的二级商户的结算账户信息。

结算账户只和提现有关,发起修改结算账户信息,校验通过后会即时生效新资料;

修改成功后微信会向新卡打款0.01元,验证该卡是否正常可用,通过[查询结算账户]接口知道汇款成功了就可以发起提现。(这里是不是可以反复横跳换绑银行卡薅羊毛呢)

这个接口比较特殊,没有返回数据,根据返回的状态码判断为204即调用成功;

    /**
     * 修改结算帐号接口
     */
    @Test
    public void modifySettlement() {
        String sub_mchid = "1596741381";
        String param = sub_mchid + "/modify-settlement";

        JSONObject reqJsonObject = new JSONObject();
        //账户类型,枚举值:
        //ACCOUNT_TYPE_BUSINESS:对公银行账户
        //ACCOUNT_TYPE_PRIVATE:经营者个人银行卡
        reqJsonObject.put("account_type", "ACCOUNT_TYPE_PRIVATE");
        //开户银行
        reqJsonObject.put("account_bank", "其他银行");
        //开户银行省市编码	,至少精确到市
        reqJsonObject.put("bank_address_code", "330106");
        //开户银行全称 (含支行)
        reqJsonObject.put("bank_name", "杭州银行股份有限公司丰潭支行");
        //account_info.put("bank_branch_id", "313331000645");
        //银行帐号,需加密
        reqJsonObject.put("account_number", WxPayUtils.rsaEncryptOAEP("623061571123456789"));

        Map<String, String> headersMap = WxPayUtils.getHeaderMap("POST", WxPayConfig.ecommerce_applyments_settlement_modify_url + param, reqJsonObject.toJSONString());
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqJsonObject.toJSONString());

        ResponseAndStatusAndHeaders response = ClientUtil.getAndPostJson("POST", WxPayConfig.ecommerce_applyments_settlement_modify_url + param, requestBody, headersMap);
        if (response.getStatus() != Status.SUCCESS || response.getResponseData() == null) {
            LogUtil.printErrorLog(LogUtil.log_front_wxpay + "修改结算帐号请求错误,返回信息为:\n" + response.toString() + "\n请求的参数为:\n" + reqJsonObject + "\n\n");
            return;
        }
        LogUtil.printInfoLog(LogUtil.log_front_wxpay + "修改结算帐号请求成功,返回信息为:\n" + response.toString() + "\n请求的参数为:\n" + reqJsonObject + "\n\n");

        if (response.getHttpCode() == 204) {
            System.out.println("请求修改成功");
        }
    }

查询结算账户

用于核实是否成功修改结算账户信息及查询系统汇款验证结果。

    /**
     * 查询修改结算帐号状态接口
     */
    @Test
    public void queryModifySettlement() {
        String sub_mchid = "1596741381";
        String param = sub_mchid + "/settlement";
        Map<String, String> headersMap = WxPayUtils.getHeaderMap("GET", WxPayConfig.ecommerce_applyments_settlement_modify_url + param, "");
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "");

        ResponseAndStatusAndHeaders response = ClientUtil.getAndPostJson("GET", WxPayConfig.ecommerce_applyments_settlement_modify_url + param, requestBody, headersMap);
        if (response.getStatus() != Status.SUCCESS || response.getResponseData() == null) {
            LogUtil.printErrorLog(LogUtil.log_front_wxpay + "查询修改结算帐号状态请求错误,返回信息为:\n" + response.toString() + "\n请求的参数为:\n" + param + "\n\n");
            return;
        }
        LogUtil.printInfoLog(LogUtil.log_front_wxpay + "查询修改结算帐号状态请求成功,返回信息为:\n" + response.toString() + "\n请求的参数为:\n" + param + "\n\n");

        JSONObject jsonObject = JSON.parseObject(response.getResponseData().toString());

        /*
        返回特约商户的结算账户-汇款验证结果。
        VERIFYING:系统汇款验证中,商户可发起提现尝试。
        VERIFY_SUCCESS:系统成功汇款,该账户可正常发起提现。
        VERIFY_FAIL:系统汇款失败,该账户无法发起提现,请检查修改。
         */
        String verify_result = jsonObject.getString("verify_result");
        if (verify_result.equals("VERIFYING")) {
            System.out.println("系统汇款验证中");
        }
        if (verify_result.equals("VERIFY_SUCCESS")) {
            System.out.println("系统成功汇款");
        }
        if (verify_result.equals("VERIFY_FAIL")) {
            System.out.println("系统汇款失败");
        }
    }

参考链接

电商收付通二级商户进件接口开发文档:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/applyments/chapter2_1.shtml

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值