ufutx.love.util/app/Services/WechatPayService.php
2025-08-12 15:00:57 +08:00

104 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Services;
use Illuminate\Support\Facades\Log;
use WeChatPay\Builder;
use WeChatPay\BuilderChainable;
use WeChatPay\Crypto\Rsa;
class WechatPayService
{
/**
* 初始化一个APIv3客户端
* @return void
*/
private function newClient(): BuilderChainable
{
// 商户号
$merchantId = config("wechatpay.payment.mch_id");
// 从本地文件中加载「商户API私钥」「商户API私钥」会用来生成请求的签名
$merchantPrivateKeyFilePath = 'file://' . config("wechatpay.payment.cert_key_path");
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = config("wechatpay.payment.serial");
// 从本地文件中加载「微信支付平台证书」可由内置CLI工具下载到用来验证微信支付应答的签名
$platformCertificateFilePath = 'file://' . config("wechatpay.payment.platform_cert_path");
$onePlatformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
// 「微信支付平台证书」的「平台证书序列号」
// 可以从「微信支付平台证书」文件解析,也可以在 商户平台 -> 账户中心 -> API安全 查询到
$platformCertificateSerial = config("wechatpay.payment.platform_cert_serial");
// // 从本地文件中加载「微信支付公钥」,用来验证微信支付应答的签名
// $platformPublicKeyFilePath = 'file://' . config("wechatpay.payment.public_key_path");
// $twoPlatformPublicKeyInstance = Rsa::from($platformPublicKeyFilePath, Rsa::KEY_TYPE_PUBLIC);
// // 「微信支付公钥」的「微信支付公钥ID」
// // 需要在 商户平台 -> 账户中心 -> API安全 查询
// $platformPublicKeyId = config("wechatpay.payment.public_key_id");
// 构造一个 APIv3 客户端实例
$instance = Builder::factory([
'mchid' => $merchantId,
'serial' => $merchantCertificateSerial,
'privateKey' => $merchantPrivateKeyInstance,
'certs' => [
$platformCertificateSerial => $onePlatformPublicKeyInstance,
// $platformPublicKeyId => $twoPlatformPublicKeyInstance,
],
]);
return $instance;
}
/**
* 转账零钱
* @return void
*/
public function officialUserTransfer(string $trade_no, string $scene_id, string $openid, int $amount, string $remark, array $transfer_scene_report_infos = []): array
{
// 发送请求
if (!empty(count($transfer_scene_report_infos))) {
$transfer_scene_report_infos = [["info_type" => "用户提现", "info_content" => "用户提取账户金额"]];
}
try {
$appid = config("wechat.official_account.default.app_id");
$instance = $this->newClient();
$resp = $instance->chain('v3/fund-app/mch-transfer/transfer-bills')->post([
"json" => [
"appid" => $appid,
"out_bill_no" => $trade_no,
"transfer_scene_id" => (string) $scene_id,
"openid" => $openid,
"transfer_amount" => $amount,
"transfer_remark" => $remark,
"transfer_scene_report_infos" => $transfer_scene_report_infos
]
]);
$res = json_decode($resp->getBody(), true);
dd($res);
} catch (\Exception $e) {
// 进行异常捕获并进行错误判断处理
Log::info($e->getMessage());
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$r = $e->getResponse();
$res = json_decode($r->getBody());
return ["code" => 1, "err_msg" => $res->message];
}
return ["code" => 1, "err_msg" => $e->getMessage()];
}
}
/**
* 转账银行卡
* @return void
*/
public function bankTransfer()
{
}
}