微信提现到银行卡开发过程

微信支付 企业付款到银行卡开发过程

1. 业务背景

微信支付付款到指定银行卡。商户可以将商户号余额付款至指定的收款银行账户。通过指定收款银行账户户名、卡号,以及收款银行信息即可实现付款。

注意事项:

  1. 企业付款至银行卡只支持新资金流类型账户

  2. 目前企业付款到银行卡支持17家银行,更多银行逐步开放中

  3. 付款到账实效为1-3日,最快次日到账

  4. 每笔按付款金额收取手续费,按金额0.1%收取,最低1元,最高25元,

    如果商户开通了运营账户,手续费和付款的金额都从运营账户出。如果没有开通,则都从基本户出。

  5. 每个商户号每天可以出款100万,单商户给同一银行卡付款每天限额5万

  6. 发票:在账户中心-发票信息页面申请开票的商户会按月收到发票(已申请的无需重复申请)。

    企业付款到银行卡发票与交易手续费发票为拆分单独开具。

2. 支持银行

银行名称 银行Id
工商银行 1002
农业银行 1005
中国银行 1026
建设银行 1003
招商银行 1001
邮储银行 1066
交通银行 1020
浦发银行 1004
民生银行 1006
兴业银行 1009
平安银行 1010
中信银行 1021
华夏银行 1025
广发银行 1027
光大银行 1022
北京银行 1032
宁波银行 1056

3. 微信接口文档

4. 企业付款到银行卡API加密

在付款到指定银行卡的接口中,“收款方银行卡号” 与 “收款方用户名” 必须使用微信请求回来的RSA公钥加密,密文提交数据到接口,中间涉及到RSA加密问题

  1. 获取微信RSA加密公钥

    请求得到报文:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <xml>
    <return_code><![CDATA[SUCCESS]]></return_code>
    <return_msg><![CDATA[OK]]></return_msg>
    <result_code><![CDATA[SUCCESS]]></result_code>
    <mch_id><![CDATA[微信商户号]]></mch_id>
    <pub_key><![CDATA[-----BEGIN RSA PUBLIC KEY-----
    MIIBCgKCAQEAxJcg631t+6ev+K5fWWX+S96OIrCiR3cDCsn0izbmcc7hTUwOKP50
    oaFCFzDEfh1Vkt9fEoyvyqbwbJFUJlTWlQrTYi2DdzOSyYA5XR7PiCtCJO+zeJ2x
    6lHeW+xS5w+PGR3FGWbqdubtFOk5WdRKWBW0Mk2ghfThn9n8QI9aMUurkr/XFoEx
    rzeJNWbPrrl69CgdaoCq4p/CW2z8A/oXuEdBIsP75e7sDBFH+SfvY5dDZptIslah
    rOL544CGctLRy4tsqhesXBlz+Rt/crBmfKPbbxNSIZlp9wNRuqK+cBuHBkBFaNYm
    R2NdZOPbymjwTPWLiNjqiCa5d/ff4RX8XwIDAQAB
    -----END RSA PUBLIC KEY-----
    ]]></pub_key>
    </xml>

    得到的公钥为PKcs#1的格式,在使用对接过程中,java使用PKcs#8 格式公钥,Csharp同样也可以使用PKcs#8格式的公钥进行加密。注意在:用标准的RSA加密库对敏感信息进行加密,选择RSA_PKCS1_OAEP_PADDING填充模式 (eg:Java的填充方式要选 “ RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING”) ,而在Csharp中没有对应的填充方式,进而造成接口返回“解密真实姓名或银行卡号出错”。

  2. 转换RSA公钥格式PKcs#1 到Pkcs#8方法

    有几点原因会造成转换失败:

    • 请求得到的公钥不能改动格式,不能移除/n /r 等换行符
    • 在Windows保存.pem 格式,会保存ANSI格式(应为UFT-8无BOM格式)

    使用CentOS转换如下:

    RsaPkcs1ConvertToPkcs8

  3. 使用CShap代码使用PKcs#8格式公钥加密字段

    • 引用 Nuget包:Install-Package BouncyCastle -Version 1.8.2

    • 实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static string RsaEncryptWithPkcs8PublicKey(string publicKey,
string content,
string inputCharset = "UTF-8")
{
var contentBytes = Encoding.GetEncoding(inputCharset).GetBytes(content);
var publicKeyParameters = ConvertFromPublicKey(publicKey);
var key = DotNetUtilities.GetRsaPublicKey(publicKeyParameters);
var cipher = CipherUtilities.GetCipher("RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING");
cipher.Init(true, key);
var resultBytes = cipher.DoFinal(contentBytes);
return Convert.ToBase64String(resultBytes);
}

5. 参考链接

6. 赞助

wechat_reward_20180530104425