关于微信支付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 协议》,转载必须注明作者和本文链接
从来不存在被埋没的努力。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!