对接微信商家转账到零钱来实现资金提现功能

大家好,我是小悟

使用场景

不管是做APP、电脑网站、手机网站还是小程序,为了推广基本上都离不开用户分佣的场景。

换句话说就是在其平台内为每个用户设置“电子钱包”功能,而电子钱包在平台那里只是一串数字,这就需要平台为用户实现提现的功能。

以前可以使用企业付款到零钱产品来实现这个功能,但随着微信支付下线了这个产品,如果是下线前已经开通的还可以继续使用,不过额度下降了很多。而在下线之后,商户号已经无法再申请企业付款到零钱产品。

不过上线了替代品即商家转账到零钱,可以同时向多个微信零钱转账,当然,对于提现这种业务,只转一个微信零钱肯定也是可以的。主要解决多种行业商家在其平台内存在佣金报酬、员工福利发放、费用报销或行政补贴支付等场景下,平台内的用户资金提现时面临的主要问题。

方便快捷

使用微信提供的商家转账到零钱接入很灵活,可应用于多行业平台内用户分佣等场景。可以和自身业务系统直接集成实现转账功能,无需频繁登录微信支付商户平台转账。

当发起接口转账后,用户可收到微信APP到账消息提醒。对商家来说最重要的是,可以免费使用接口,无手续费,微信支付官方提供安全保障。而对用户来说最重要的是,提现资金实时到账。

功能实现

实现功能前需要先到微信支付商户平台开通商家转账到零钱,审核通过了才可以调用。

微信支付商家转账到零钱使用的是V3接口,交互略微繁琐但更安全。调用/v3/transfer/batches,实现转账功能。

代码语言:javascript
复制
public class InitiateBatchTransfer {
  public static String merchantId = "商户号";
  public static String privateKeyPath = "商户api证书位置路径";
  public static String merchantSerialNumber = "商户api证书序列号";
  public static String wechatPayCertificatePath = "微信支付平台证书位置路径";
  public static TransferBatchService service;
  public static void main(String[] args) {
    RSAConfig config =
        new RSAConfig.Builder()
            .merchantId(merchantId)
            .privateKeyFromPath(privateKeyPath)
            .merchantSerialNumber(merchantSerialNumber)
            .wechatPayCertificatesFromPath(wechatPayCertificatePath)
            .build();
    service = new TransferBatchService.Builder().config(config).build();
    InitiateBatchTransferRequest initiateBatchTransferRequest =
        new InitiateBatchTransferRequest();
    initiateBatchTransferRequest.setAppid("直连商户的appid");
    initiateBatchTransferRequest.setOutBatchNo("商家批次单号");
    initiateBatchTransferRequest.setBatchName("批次名称");
    initiateBatchTransferRequest.setBatchRemark("批次备注");
    initiateBatchTransferRequest.setTotalAmount(转账金额单位为“分”);
    initiateBatchTransferRequest.setTotalNum(转账总笔数);
    {
      List<TransferDetailInput> transferDetailListList = new ArrayList<>();
      {
        TransferDetailInput transferDetailInput = new TransferDetailInput();
        transferDetailInput.setOutDetailNo("商家明细单号");
        transferDetailInput.setTransferAmount(转账金额单位为分);
        transferDetailInput.setTransferRemark("转账备注");
        transferDetailInput.setOpenid("用户在直连商户应用下的用户标示");
        transferDetailInput.setUserName(
            "收款用户姓名,明细转账金额 >= 2,000元,收款用户姓名必填,该字段需进行加密处理");
        transferDetailListList.add(transferDetailInput);
      }
      initiateBatchTransferRequest.setTransferDetailList(
          transferDetailListList);
    }
    initiateBatchTransferRequest.setTransferSceneId("转账场景ID,如不填写则使用商家的默认转账场景");
    InitiateBatchTransferResponse response =
        service.initiateBatchTransfer(initiateBatchTransferRequest);
  }
}

注意事项

值得注意的是,目前准入条件仅针对企业商户号,且保持正常健康交易。记得去微信支付商户平台转账发起方式开启API发起,不然无法调用接口。

默认有转账验密,就是说为保障出资安全,通过API接口发起转账后,商户需通过商家助手小程序输入操作密码确认转账才会继续发起转账。

那结合提现功能的场景,这显然不大可行,别慌,可以通过设置免密额度来解决这个二次确认的问题。意思就是说单笔转账明细单金额不超过免密额度时,系统不会向验密人发起验密请求,将直接执行转账。

当明细转账金额也就是单笔转账金额不少于2000元时,必须传入收款用户姓名进行校验,但不是明文,需要进行加密处理。

转账额度

涉及到转账,自然就有限额的问题,对于单笔转账额度,根据不同的应用场景,有不同的转账额度,默认为0.3元,但可以调整,最低可设置0.1元。

商户号单日转账额度最高为10万元,如果有更高的需求,可以调整最高到100万元。单日向单个用户最高限制可转2万元,这个无法提高。

您的一键三连,是我更新的最大动力,谢谢

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

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