关于微信支付V3 更新《企业打款到零钱》至《商户转账到零钱》
如题,大概是今年4、5月份开通“微信代付”也就是商户平台的钱通过接口转账到用户余额里这个功能,更新了一版,更新完之后接入方式与之前完全分离,也就是完全不一样了。本文主要详细介绍下关于官方推荐的包 wechatpay 具体如果使用,官方文档有些脑残,让人猜来猜去。
首先我们进入商户平台 账户中心 -> API安全
如果此处显示未申请,先按照步骤申请,申请完之后你会获取到一个压缩包,压缩包中会有两个文件
一个 apiclient_cert.pem 为了防止乱这里给他起别名 “文件A” , 另外一个 apiclient_key.pem 文件起别名 “文件B”
如果已申请则是下方图片,去程序里找这两个文件
然后我们去设置 apiv3 秘钥,一个32位随机数,按照指示设置即可,我们这个这个秘钥起别名 “字符串A”
然后点击 账户中心 -> 商户信息 获取商户号 我们起别名 “字符串B”
然后下一步来阅读以下官方推荐的轮子 wechatpay(叫啥无所谓,我叫习惯了),然后我们安装上 composer require wechatpay/wechatpay
注意这个轮子要求:
Guzzle 7.0,PHP >= 7.2.5
Guzzle 6.5,PHP >= 7.1.2
安装完之后其他不用看,先去看下载平台证书,点进去
然后到这个页面,点击这里
然后进入下一个页面,介绍工具如果使用,使用工具之前确定你已经安装好这个轮子,他生成的方式有很多我采用的是第二个
详细介绍下生成方式,首先我们切换到我们项目的 vendor/bin 文件夹下,你会看到一个 CertificateDownloader.php 这个文件,说明刚轮子就安装对了。
执行命令之前我们还需要获取另外一个字符串 商户API证书序列号 执行以下代码即可获得,我们起名:“字符串C”
$str = openssl_x509_parse(file_get_contents(文件B的相对路径或是绝对路径));
return $str['serialNumberHex'];
然后切换到 vendor/bin 文件夹下 执行
php -f CertificateDownloader.php -- -k 秘钥A -m 字符串B -f 文件B绝对路径 -s 字符串C -o 要生成的证书位置的绝对路径
执行之后我们会在刚才设置的路径上获得一个.pem结尾的文件,这里起名 “文件C”,至此我们的准备工作已全部做完,然后我们去看轮子的接入文档 如下图
详情解析,如下
<?php
require_once('vendor/autoload.php');
use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;
$merchantId = '字符串B';
//注意此处一定要按照“file:///www/wwwroot/...pem”这种格式写,不然报错
$merchantPrivateKeyFilePath = 'file://'.'文件B的绝对路径';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
$merchantCertificateSerial = '字符串C';
//注意此处一定要按照“file:///www/wwwroot/...pem”这种格式写,不然报错
$platformCertificateFilePath = 'file://'.'文件C的绝对路径';
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
// 构造一个 APIv3 客户端实例
$instance = Builder::factory([
'mchid' => $merchantId,
'serial' => $merchantCertificateSerial,
'privateKey' => $merchantPrivateKeyInstance,
'certs' => [
$platformCertificateSerial => $platformPublicKeyInstance,
],
]);
//然后构建代付,下方详细参数说明详见 [发起商家转账API](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter4_3_1.shtml "发起商家转账API")
$resp = $instance->chain('v3/transfer/batches')->post(['json' => [
'appid' => '小程序appid', //因为我这里接的是小程序业务绑定的用户
'out_batch_no' => '订单号',
'batch_name' => '佣金提现',
'batch_remark' => '佣金提现',
'total_amount' => '订单金额' * 100,
'total_num' => 1,
'transfer_detail_list' => [
[
'out_detail_no' =>'子订单号',
'transfer_amount' => '订单金额' * 100,
'transfer_remark' => '佣金提现',
'openid' => '用户openid',
]
],
]]);
if($resp->getStatusCode() != 200){
throw new RequestException("审核提现失败,请联系技术人员");
}
至此算是完成了,本人草草整理了个文档,方便被微信官方文档看的头疼的大家也方便自己看,如有错误或者哪里不清楚感谢留言指出
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: