整合ThinkPHP功能系列之微信企业付款至用户零钱银行卡

公司开发商城项目,还是放在公众号里面的,所以一系列的支付都需要使用微信的支付功能。产品就提出了用户奖金提现要走 API,不然把财务累死 😈 

企业付款到零钱以及银行卡是 2 个接口,功能不一样,而且付款到零钱是有付款条件的

1、商户号(或同主体其他商户号)已入驻 90 日

2、商户号(或同主体其他商户号)有 30 天连续正常交易

3、 登录微信支付商户平台-产品中心,开通企业付款。

就这样我们公司用不了零钱付款的功能,但是我也集成了,可以看看

这里还是主要说付款至用户银行卡,微信上线的企业付款至银行卡功能,商户可以将商户号余额付款至指定的收款银行账户,通过指定收款银行账户户名、卡号,以及收款银行信息就可以实现付款功能

目前企业付款到银行卡仅支持 17 家银行,更多银行在逐步开放中,但是看着常用的银行基本都有,这个不影响使用

使用企业付款接口是需要双向证书的,这个找你们公司负责的人吧

第一步:获取 RSA 加密公钥

调用获取 RSA 公钥 API 获取 RSA 公钥,落地成本地文件,假设为 public.pem,确定 public.pem 文件的存放路径,同时修改代码中文件的输入路径,加载 RSA 公钥,用标准的 RSA 加密库对敏感信息进行加密,选择 RSA_PKCS1_OAEP_PADDING 填充模式, 得到进行 rsa 加密并转 base64 之后的密文,将密文传给微信侧相应字段,如付款接口(enc_bank_no/enc_true_name)

这个接口默认输出 PKCS#1 格式的公钥,我们需要这个,所以先写一个接口去请求一下,然后将证书文件保存一下

public function rsa()
{
    $config = C('WECHAT');
    vendor('Weixin.WeChatPayBank');
    $model = new WechatPayBank($config);
    $model->rsa();
}

将集成好的 SDK 放在/ThinkPHP/Library/Vendor/Weixin,集成好的代码有点多,这里就不发了,万一熊掌号不给我收录就 GG 了,最后会上传 Github,自行下载吧

请求上面这个接口会返回证书信息

整合 ThinkPHP 功能系列之微信企业付款至用户零钱银行卡

第二步:转换秘钥

将这个public_key保存一下,因为还要转换。PKCS#1 转 PKCS#8

openssl rsa -RSAPublicKey_in -in <filename> -pubout

这个命令需要在服务器执行,如果报错的话,说明你姿势不对 :mrgreen:

Error opening Public Key pkcs8.pem
139840771336096:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('pkcs8.pem','r')
139840771336096:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
unable to load Public Key

类似这样~就是命令的问题了

openssl rsa -RSAPublicKey_in -in pkcs1.pem -pubout > pkcs8.pem

这样提示writing RSA key就说明成功了,当然敲这个命令的时候要进入你放证书以及上面的公钥的目录,放在一个不可直接访问的目录!这是重点,防止别人直接盗用造成资金损失

毕竟这是涉及金钱方面的东西,最好多测试几次。我也不想看到有人来找我说,因为使用了我的 SDK 而造成资金损失,来找我要赔偿,哈哈 🙄

这样就可以把之前写的rsa控制器方法注释掉了,因为他没用了

第三步:配置信息

TP3 使用 C 方法读取配置文件,所以你要将商户号那些配置文件放在/Application/Common/Conf/config.php中,记得补全一下信息。并且我将证书放在了/Common/Credential/

'WECHAT' => [
    'appid' => '',//公众号 id
    'appKey' => '',//公众号 APPKey
    'apiKey' => '',//商户 API 密钥
    'mchid' => '',//商户号
    'certificate_path' => dirname(dirname(__FILE__)).'/Credential',//证书路径
],

第四步:调用

然后就可以调用了,具体还是要根据你的业务逻辑来操作,做好写一个事务,防止资金损失,不然你钱怎么没的你都不知道

public function check()
{
    $config = C('WECHAT');
    vendor('Weixin.WeChatPayBank');
    $model = new WechatPayBank($config);
    $result = $model->paybank($bank_no, $true_name, $bank_code, $amount, $partner_trade_no);
}

调用的时候将用户的银行卡号,用户名,开户行 ID,企业付款金额(单位为分),商户订单号传过去就行了。开户行 ID 微信那边有提供,然后就没然后了,具体自己看代码吧

项目地址:

Github,如果项目对你有所帮助,请给一个 star 😎

相关文档:

获取 RSA 加密公钥 API

银行编号列表

11 条评论

发表评论

*