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

微信支付-电商收付通开发-03.商户进件文章目录二级商户进件二级商户进件申请接口查询进件申请状态接口二级商户修改结算账户修改结算账户查询结算账户参考链接二级商户进件关于申请的主体类型,个人身份证没有营业执照的话只能选择小微。收款额度小微是10万,其他主体类型没有收款额度限制。Q:一个商家,是否可申请多个二级商户号?A:①若为小微主体,则限制一个微信号在同一个电商平台下,只可申请一个小微商户号。(二级商户签约环节会校验微信号是否已申请)例:某人最多有5个实名验证的微信号,即最多可申请5个小微商户号。②若为其他主体,则没有限制,一个商

大家好,欢迎来到IT知识分享网。

二级商户进件

关于申请的主体类型,个人身份证没有营业执照的话只能选择小微。收款额度小微是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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23887.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信