From 42729d0f3d1ab585828edbe354c8273a1abf82ff Mon Sep 17 00:00:00 2001 From: Hankin Date: Tue, 12 Aug 2025 14:46:31 +0800 Subject: [PATCH] transfer --- app/Facades/AlipayService.php | 11 ++ app/Facades/UtilService.php | 13 ++ app/Facades/WechatPayService.php | 11 ++ .../Controllers/Admin/EarningController.php | 174 ++++++++++++++++++ app/Http/Controllers/Controller.php | 10 +- app/Models/Live/Anchor.php | 13 ++ app/Models/Server/MEarningAccount.php | 11 ++ app/Models/Server/MEarningwithdraws.php | 12 ++ app/Providers/AppServiceProvider.php | 12 ++ app/Services/AlipayService.php | 24 +++ app/Services/UtilService.php | 18 ++ app/Services/WechatPayService.php | 103 +++++++++++ composer.json | 3 +- composer.lock | 75 +++++++- config/wechat.php | 87 +++++++++ config/wechatpay.php | 42 +++++ routes/util/api.php | 11 ++ routes/web.php | 1 - storage/wechatpay/apiclient_cert.p12 | Bin 0 -> 2774 bytes storage/wechatpay/apiclient_cert.pem | 25 +++ storage/wechatpay/apiclient_key.pem | 28 +++ storage/wechatpay/apiv3秘钥.txt | 1 + storage/wechatpay/wechatpay.pem | 23 +++ storage/wechatpay/序列号.txt | 1 + storage/wechatpay/证书使用说明.txt | 18 ++ 25 files changed, 723 insertions(+), 4 deletions(-) create mode 100644 app/Facades/AlipayService.php create mode 100644 app/Facades/UtilService.php create mode 100644 app/Facades/WechatPayService.php create mode 100644 app/Http/Controllers/Admin/EarningController.php create mode 100644 app/Models/Live/Anchor.php create mode 100644 app/Models/Server/MEarningAccount.php create mode 100644 app/Models/Server/MEarningwithdraws.php create mode 100644 app/Services/AlipayService.php create mode 100644 app/Services/UtilService.php create mode 100644 app/Services/WechatPayService.php create mode 100644 config/wechat.php create mode 100644 config/wechatpay.php create mode 100644 storage/wechatpay/apiclient_cert.p12 create mode 100644 storage/wechatpay/apiclient_cert.pem create mode 100644 storage/wechatpay/apiclient_key.pem create mode 100644 storage/wechatpay/apiv3秘钥.txt create mode 100644 storage/wechatpay/wechatpay.pem create mode 100644 storage/wechatpay/序列号.txt create mode 100644 storage/wechatpay/证书使用说明.txt diff --git a/app/Facades/AlipayService.php b/app/Facades/AlipayService.php new file mode 100644 index 0000000..29d4bc1 --- /dev/null +++ b/app/Facades/AlipayService.php @@ -0,0 +1,11 @@ +id(); + $log = MEarningwithdraws::where('id', $id)->where('status', 'freezing')->first(); + if (empty($log)) + return $this->failure('该记录不存在或已被其他管理员审核'); + //获取该商户的收益账号 + $account = MEarningAccount::where('m_id', $log->m_id)->where('m_user_id', 0)->first(); + $balance = $account->balance;//账户余额 + $frozen_withdraw = $account->frozen_withdraw;//账户冻结提现金额 + //如果当前用户冻结提现金额 小于 本次提现金额 + if ($frozen_withdraw < $log->value) + return $this->failure('当前账户异常,联系开发人员处理'); + $anchor = Anchor::where('m_id', $log->m_id)->first(); + $openid = MerchantAccount::where('id', $log->m_id)->value('openid');//商家openid + if (empty($openid)) + $openid = $anchor->openid; + if ($log->way == 'alipay') { + $transfer_way = '支付宝'; + } elseif ($log->way == 'weixin') { + $transfer_way = '微信'; + } elseif ($log->way == 'bank') { + $transfer_way = '银行卡'; + } + $status = $request->status; + if (!in_array($status, ['finished', 'canceled', 'manual'])) + throw new \Exception("提供审核参数有误", 1); + $url = ''; + DB::beginTransaction(); + switch ($status) { + case 'finished': //审核通过 + if ($log->way == 'alipay') { + $data = []; + $data['remark'] = '提现已到账'; //提现备注 + $data['out_biz_no'] = $log->trade_no; + $data['amount'] = $log->real_value;//实际到账金额 + $data['payee_account'] = $log->account;//支付宝账号 + $data['payee_real_name'] = $log->name;//支付宝绑定姓名 + if ($log->alipay_id) + $data['payee_account'] = $log->alipay_id; + if ($log->alipay_id) {//通过支付宝id打款 + $result = AlipayService::UserTransferAccount($data); + } else {//通过支付宝账号和名字打款 + $result = AlipayService::platTransferAccount($data); + } + } elseif ($log->way == 'weixin') { + $result = WechatPayService::officialUserTransfer($log->trade_no, $log->account, $log->real_value * 100, '提现已到账'); + } elseif ($log->way == 'bank') { + $result = WechatPayService::bankTransfer($log->trade_no, $log->account, $log->name, $log->bank_code, $log->real_value * 100, '打款至个人银行卡'); + } + //\Log::info($result); + //判断打款是否成功 + if (is_array($result)) {//失败 + //\Log::info('打款失败'); + $err_msg = isset($result['msg']) ? $result['msg'] : $result['err_code_des']; + return $this->failure($err_msg); + $log->update(['status' => 'canceled', 'admin_id' => $admin_id, 'audit_at' => date('Y-m-d H:i:s'), 'err_msg' => $err_msg]); + $account->update(['frozen_withdraw' => $frozen_withdraw - $log->value, 'balance' => $balance + $log->value]); + // 短信通知 邓智锋 + $mobile = '15707534403'; + $message = '商户' . $anchor->name . ' 提现' . $log->real_value . '元失败,原因:' . $err_msg; + $this->sentMessage($mobile, $message); + //模板通知 邓智锋 + $data['touser'] = ['oPC_2vnSECnYp5p--uaq3rca3Ry0', 'oPC_2vpJd34uN2E1tTsFbf8Lhlcs']; + $data['template_id'] = 'AqwVt0liVmQfzfnX3ZGvmVOdOh62nkCbhlOUI0NVQGs'; + $data['url'] = $url; + $data['data'] = [ + 'first' => '商户' . $anchor->name . '提现失败', + 'keyword1' => $log->real_value . '元', + 'keyword2' => $transfer_way, + 'keyword3' => $err_msg, + 'remark' => '点击查看提现记录', + ]; + SendTemplateMsg::dispatch($data)->onQueue('template_message'); + //短信通知 + $message = $anchor->name . ',提现' . $log->real_value . '元失败,具体原因请查看你的后台系统的提现反馈。'; + $this->sentMessage($anchor->mobile, $message); + DB::commit(); + return $this->failure($err_msg); + } else {//成功 + //\Log::info('打款成功'); + $log->update(['status' => 'finished', 'admin_id' => $admin_id, 'audit_at' => date('Y-m-d H:i:s')]); + //将冻结提现金额 换成已提现金额 //冻结提现金额 0 + $account->withdrawl = $account->withdrawl + $log->value; + $account->frozen_withdraw = $account->frozen_withdraw - $log->value; + $account->save(); + //模板通知 + $data['touser'] = $openid; + $data['template_id'] = 'aV4ic7jr5bOlf55CgR0jmMsFYyhdRAiVmqqXEjnUqQU'; + $data['url'] = $url; + $data['data'] = [ + 'first' => '提现已到账,请在' . $transfer_way . '查收', + 'keyword1' => $log->real_value . '元', + 'keyword2' => date('Y-m-d H:i:s'), + 'keyword3' => '提现到' . $transfer_way . '余额', + 'remark' => '感谢您的的使用', + ]; + SendTemplateMsg::dispatch($data)->onQueue('template_message'); + //短信通知 + $message = $anchor->name . ',提现金额' . $log->real_value . '元已到账,请在' . $transfer_way . '查收。'; + $this->sentMessage($anchor->mobile, $message); + } + break; + case 'canceled': //审核拒绝 + $reason = $request->reason; + if (!$reason) + return $this->failure('请输入拒绝理由'); + $account->update(['frozen_withdraw' => $frozen_withdraw - $log->value, 'balance' => $balance + $log->value]); + $log->update(['status' => $status, 'admin_id' => $admin_id, 'audit_at' => date('Y-m-d H:i:s'), 'err_msg' => $request->reason]); + $data['touser'] = $openid; + $data['template_id'] = 'AqwVt0liVmQfzfnX3ZGvmVOdOh62nkCbhlOUI0NVQGs'; + $data['url'] = $url; + $data['data'] = [ + 'first' => '商户' . $anchor->name . '提现失败', + 'keyword1' => $log->real_value . '元', + 'keyword2' => $transfer_way, + 'keyword3' => $reason, + 'remark' => '账号信息存在异常', + ]; + $message = $anchor->name . ',提现' . $log->real_value . '元失败,失败原因:' . $reason . ',具体原因请查看你的后台系统的提现反馈。'; + $this->sentMessage($anchor->mobile, $message); + SendTemplateMsg::dispatch($data)->onQueue('template_message'); + break; + case 'manual': //手工处理 + //\Log::info('打款已经由人工处理'); + // $log->update(['status' => 'finished', 'admin_id' => $admin_id, 'audit_at' => date('Y-m-d H:i:s'), 'way' => 'manual']); + // //将冻结提现金额 换成已提现金额 //冻结提现金额 0 + // $account->withdrawl = $account->withdrawl + $log->value; + // $account->frozen_withdraw = $account->frozen_withdraw - $log->value; + // $account->save(); + // //模板通知用户 + // $data['touser'] = ['oPC_2vudVLVHj2U7dNinr2IEDHR4', 'oPC_2vuTj7YRgUzQQY7PlSJVLBBc']; + // $data['template_id'] = 'OwXPF2dKEjPQUoGyzH944ATsJ6SgxpZ8kzB-KVVxanY'; + // $data['url'] = $url; + // $data['data'] = [ + // 'first' => '商户:' . $anchor->name . '提现人工审核通过,处理方式:手工打款,请即时处理', + // 'keyword1' => $anchor->name, + // 'keyword2' => date('Y-m-d H:i:s'), + // 'keyword3' => $log->real_value . '元', + // 'keyword4' => '手动打款处理', + // 'remark' => '提现人工审核通过,处理方式:手工打款', + // ]; + // SendTemplateMsg::dispatch($data)->onQueue('template_message'); + break; + default: + break; + } + DB::commit(); + return $this->success('审核完成'); + } catch (\Exception $e) { + DB::rollBack(); + $this->getError($e); + return $this->failure('审核失败,请联系开发人员'); + } + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 2ef94ef..9900f06 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use App\Facades\UtilService; +use App\Facades\WechatPayService; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; @@ -13,6 +15,12 @@ class Controller extends BaseController public function test() { - dd(1); + $trade_no = UtilService::getTradeNo(); + $scene_id = config("wechatpay.screen.commission"); + $openid = "oPC_2vneOWpQbicNZQAUCxuwZ4mw"; + $amount = 100; + $remark = "测试"; + $res = WechatPayService::officialUserTransfer($trade_no, $scene_id, $openid, $amount, $remark); + dd($res); } } diff --git a/app/Models/Live/Anchor.php b/app/Models/Live/Anchor.php new file mode 100644 index 0000000..14dd8c8 --- /dev/null +++ b/app/Models/Live/Anchor.php @@ -0,0 +1,13 @@ +app->singleton('uploadservice', function () { return new UploadService(); }); + $this->app->singleton('wechatpayservice', function () { + return new WechatPayService(); + }); + $this->app->singleton('alipayservice', function () { + return new AlipayService(); + }); + $this->app->singleton('utilservice', function () { + return new UtilService(); + }); } /** diff --git a/app/Services/AlipayService.php b/app/Services/AlipayService.php new file mode 100644 index 0000000..b015b80 --- /dev/null +++ b/app/Services/AlipayService.php @@ -0,0 +1,24 @@ + 账户中心 -> 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" => $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() + { + + } +} diff --git a/composer.json b/composer.json index 80c3084..56c0be3 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,8 @@ "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^9.19", "laravel/sanctum": "^3.0", - "laravel/tinker": "^2.7" + "laravel/tinker": "^2.7", + "wechatpay/wechatpay": "^1.4" }, "require-dev": { "fakerphp/faker": "^1.9.1", diff --git a/composer.lock b/composer.lock index 6cfd6ac..14d9ebe 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "90bf28afc39610ecdbd4915168d447df", + "content-hash": "9824f12aeda8b0dc6d475ee5d9fb8ba9", "packages": [ { "name": "alibabacloud/oss-v2", @@ -6055,6 +6055,79 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "wechatpay/wechatpay", + "version": "1.4.12", + "source": { + "type": "git", + "url": "https://github.com/wechatpay-apiv3/wechatpay-php.git", + "reference": "bd2148e0456f560df4d1c857d6cd1f8ad9f5222e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wechatpay-apiv3/wechatpay-php/zipball/bd2148e0456f560df4d1c857d6cd1f8ad9f5222e", + "reference": "bd2148e0456f560df4d1c857d6cd1f8ad9f5222e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-curl": "*", + "ext-libxml": "*", + "ext-openssl": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5 || ^7.0", + "guzzlehttp/uri-template": "^0.2 || ^1.0", + "php": ">=7.1.2" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.89 || ^1.0", + "phpunit/phpunit": "^7.5 || ^8.5.16 || ^9.3.5" + }, + "bin": [ + "bin/CertificateDownloader.php" + ], + "type": "library", + "autoload": { + "psr-4": { + "WeChatPay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "James ZHANG", + "homepage": "https://github.com/TheNorthMemory" + }, + { + "name": "WeChatPay Community", + "homepage": "https://developers.weixin.qq.com/community/pay" + } + ], + "description": "[A]Sync Chainable WeChatPay v2&v3's OpenAPI SDK for PHP", + "homepage": "https://pay.weixin.qq.com/", + "keywords": [ + "AES-GCM", + "aes-ecb", + "openapi-chainable", + "rsa-oaep", + "wechatpay", + "xml-builder", + "xml-parser" + ], + "support": { + "issues": "https://github.com/wechatpay-apiv3/wechatpay-php/issues", + "source": "https://github.com/wechatpay-apiv3/wechatpay-php/tree/v1.4.12" + }, + "time": "2025-01-26T14:16:41+00:00" } ], "packages-dev": [ diff --git a/config/wechat.php b/config/wechat.php new file mode 100644 index 0000000..9a1b92d --- /dev/null +++ b/config/wechat.php @@ -0,0 +1,87 @@ + env('WECHAT_APPID', 'wx2485d1c0ddd1eb24'), // AppID + 'secret' => env('WECHAT_SECRET', '7b63c3b030333c6bae890a4221e65374'), // AppSecret + 'token' => env('WECHAT_TOKEN', 'weiphp'), // Token + 'aes_key' => env('WECHAT_AES_KEY', 'vLvcmNuEZkY3Ww6wNJQIPxA8QauTAHrHwsL6SgjdCnt'), // EncodingAESKey + + 'official_account' => [ + 'default' => [ + 'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'wx2485d1c0ddd1eb24'), // AppID + 'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', '7b63c3b030333c6bae890a4221e65374'), // AppSecret + 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'weiphp'), // Token + 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', 'vLvcmNuEZkY3Ww6wNJQIPxA8QauTAHrHwsL6SgjdCnt'), // EncodingAESKey + /* + * OAuth 配置 + * + * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login + * callback:OAuth授权完成后的回调页地址(如果使用中间件,则随便填写。。。) + */ + 'oauth' => [ + 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))), + 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'), + ], + ], + 'znsj' => [ + 'app_id' => env('OTHER_WECHAT_OFFICIAL_ACCOUNT_APPID', 'wx0745fa0688992c01'), // AppID + 'secret' => env('OTHER_WECHAT_OFFICIAL_ACCOUNT_SECRET', 'af3366efe18b1149da9567ec1414d9af'), // AppSecret + + 'oauth' => [ + 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_base'))), + 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'), + ], + ], + 'ufutx' => [ + 'app_id' => env('UFUTX_WECHAT_OFFICIAL_ACCOUNT_APPID', 'wx7e80298ed20df081'), // AppID + 'secret' => env('UFUTX_WECHAT_OFFICIAL_ACCOUNT_SECRET', 'e118a5ec4974068a75846517f8baf9e3'), // AppSecret + + 'oauth' => [ + 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_base'))), + 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'), + ], + ], + 'new' => [ + 'app_id' => env('NEW_UFUTX_WECHAT_OFFICIAL_ACCOUNT_APPID', 'wx36c72a00f1b2be64'), // AppID + 'secret' => env('NEW_UFUTX_WECHAT_OFFICIAL_ACCOUNT_SECRET', '77f3fa72e17186ecc94ca3038a3ec467'), // AppSecret + 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'fulink'), + 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', 'BSJ8qDeiIXdCxc9ZK0Z4lHD7FxfWMd68uMFMu4hYO8h'), + 'oauth' => [ + 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))), + 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'), + ], + ], + 'test' => [ + 'app_id' => env('TEST_WECHAT_OFFICIAL_ACCOUNT_APPID', 'wx4adff200da8333ca'), // AppID + 'secret' => env('TEST_WECHAT_OFFICIAL_ACCOUNT_SECRET', '5fcb32966614cd61fd22ec53e820d48b'), // AppSecret + 'token' => env('TEST_WECHAT_OFFICIAL_ACCOUNT_TOKEN', ''), + 'aes_key' => env('TEST_WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), + 'oauth' => [ + 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_base'))), + 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/wx/test/login'), + ], + 'response_type' => 'array', + ], + //福恋订阅号 + 'fulink' => [ + 'app_id' => env('FULINK_WECHAT_OFFICIAL_ACCOUNT_APPID', 'wx8260646b00d5d615'), // AppID + 'secret' => env('FULINK_WECHAT_OFFICIAL_ACCOUNT_SECRET', '77f3fa72e17186ecc94ca3038a3ec467'), // AppSecret + 'token' => env('FULINK_WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'weiphp'), + 'aes_key' => env('FULINK_WECHAT_OFFICIAL_ACCOUNT_AES_KEY', '39LDjI8q9oPWVH25xynJSDqCzOw0bYMR0F0sUX14XS0'), + ], + + ], + + /** + * 小程序配置信息 + */ + 'mini_program' => [ + 'app_id' => env('WECHAT_MINI_PROGRAM_APPID', 'wxc41491431733671e'), + 'secret' => env('WECHAT_MINI_PROGRAM_SECRET', '21cb800372b79c205c7235ae2cd9a6d7'), + 'token' => env('WECHAT_MINI_PROGRAM_TOKEN', 'love'), + 'aes_key' => env('WECHAT_MINI_PROGRAM_AES_KEY', 'gx31ucZ7tqDVRZekaPD1JzmaSCv5sLUs4rmJJ0snX9Y'), + ], +]; diff --git a/config/wechatpay.php b/config/wechatpay.php new file mode 100644 index 0000000..8388d06 --- /dev/null +++ b/config/wechatpay.php @@ -0,0 +1,42 @@ + [ + 'mch_id' => env('WECHAT_PAYMENT_MERCHANT_ID', ''), // 商户id + + 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', ''), // 商户API证书 + 'cert_key_path' => env('WECHAT_PAYMENT_CERT_KEY_PATH', ''), // 商户API证书秘钥 + 'serial' => env('WECHAT_PAYMENT_SERIAL', ''), // 商户证书序列号 + + 'api2_key_path' => env('WECHAT_PAYMENT_API2_KEY_PATH', ''), // APIv2秘钥 + 'api3_key_path' => env('WECHAT_PAYMENT_API3_KEY_PATH', ''), // APIv3秘钥 + + 'public_key_path' => env('WECHAT_PAYMENT_PUBLIC_KEY_PATH', ''), // 微信支付公钥 + 'public_key_id' => env('WECHAT_PAYMENT_PUBLIC_KEY_ID', ''), // 微信支付公钥ID + + 'platform_cert_path' => env('WECHAT_PUBLIC_PLATFORM_PATH', ''), // 平台证书 + 'platform_cert_serial' => env('WECHAT_PAYMENT_PUBLIC_PLATFORM_SERIAL', ''), // 平台证书序列号 + + 'debug' => env('WECHAT_PAYMENT_DEBUG', false), + ], + + "screen" => [ + "commission" => 1005, //佣金报酬 + ], + + /** + * 服务商支付 + */ + 'service_payment' => [ + 'mch_id' => env('SERVICE_PAYMENT_MERCHANT_ID', '1581887811'), + 'key' => env('SERVICE_PAYMENT_KEY', 'b8c8ead6dbd4d351e6f3f2340f1244f8'), + 'app_id' => env('SERVICE_OFFICIAL_APP_ID', 'wx36c72a00f1b2be64'), + 'cert_path' => env('SERVICE_PAYMENT_CERT_PATH', ''), // XXX: 绝对路径!!!! + 'key_path' => env('SERVICE_PAYMENT_KEY_PATH', ''), // XXX: 绝对路径!!!! + 'serial' => env('SERVICE_PAYMENT_MERCHANT_CERT_SERIAL', '37A244C365A3FEED15CC650B027D1BE82CB8AEDE'), + 'sandbox' => env('SERVICE_PAYMENT_SANDBOX', false), + ], +]; diff --git a/routes/util/api.php b/routes/util/api.php index 9f3a3bd..57e90a3 100644 --- a/routes/util/api.php +++ b/routes/util/api.php @@ -1,6 +1,8 @@ group(function () { Route::post('/ueditor', [CommonController::class, "upload"]); }); + +//微信转账 +Route::prefix("transfer")->group(function () { + //saas端提现审核 + Route::put('saas/withdraw/{id}/audit/transfer', [EarningController::class, "auditWithdraw"])->where('id', '[0-9]+'); + +}); + +Route::get("test", [Controller::class, "test"]); diff --git a/routes/web.php b/routes/web.php index a080f1d..01b5120 100644 --- a/routes/web.php +++ b/routes/web.php @@ -20,4 +20,3 @@ Route::get('/', function () { - diff --git a/storage/wechatpay/apiclient_cert.p12 b/storage/wechatpay/apiclient_cert.p12 new file mode 100644 index 0000000000000000000000000000000000000000..7d54315635beed468c65dd6eab8dc4a8841b37c8 GIT binary patch literal 2774 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 T_*c7PFo)jNv#QCDbuRu3o;?