公司开发商城项目,还是放在公众号里面的,所以一系列的支付都需要使用微信的支付功能。产品就提出了用户奖金提现要走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,自行下载吧
请求上面这个接口会返回证书信息
第二步:转换秘钥
将这个public_key
保存一下,因为还要转换。PKCS#1转PKCS#8
openssl rsa -RSAPublicKey_in -in <filename> -pubout
这个命令需要在服务器执行,如果报错的话,说明你姿势不对
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 😎
总是提示银行卡号非纯数字是啥回事啊
@future 银行卡号对吗?
@沈唁 对的呢 我转为int 型就是不对 转为string 就提示银行卡号非纯数字
@future 加我QQ帮你解决吧
微信没有提供golang的sdk 头疼
@liaozixu 哇 go语言大佬
@沈唁 我不是 我是写java的,公司比较新,基础设施是go写的=-=
@liaozixu 可以的 那也能学到些go语言
厉害,在接触,666666
牛逼style,膜拜膜拜 😆
@西枫里博客 😈 你才是大佬好不好