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 0000000..7d54315 Binary files /dev/null and b/storage/wechatpay/apiclient_cert.p12 differ diff --git a/storage/wechatpay/apiclient_cert.pem b/storage/wechatpay/apiclient_cert.pem new file mode 100644 index 0000000..20988a8 --- /dev/null +++ b/storage/wechatpay/apiclient_cert.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIELjCCAxagAwIBAgIUdbjd05etb5a/eQSuX3Z8OfJejcEwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjUwNTIzMDI0MTE1WhcNMzAwNTIyMDI0MTE1WjCBhzETMBEGA1UEAwwK +MTU4MTkwMzYyMTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTMwMQYDVQQL +DCrmt7HlnLPnpo/mgYvmmbrog73kv6Hmga/np5HmioDmnInpmZDlhazlj7gxCzAJ +BgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALrFQuuoccWz0lWLUTuj6okS31WztrXH7XId6ozcyuqx5cDc +WA8EL4qV/Dlzye71vMaCMno9t+IHIBF3p5S/s7o9yB7V/HHdxtgE0LdTasqugNFP +K6YMDVwgNnsIi/TpG0cYZEAHAsxKZ/eWbzvUeHtcLhaLqV6mI0mTbNC1Pxcxs1dv ++AG2M/Y3027qA7lUov8vr3MkmqR69/WINaVb6AuH2zTjRATNWBBAFmZldaEVLV+N +XEy7DTusU5zhoywqeo75v02irSICE1FUdKLPTDK+Zb0mT6omwRaU6YDTnSjZAl6t +pNulNYs9M4tW9ADbPbmylyunfu+AUiBnszhjkOMCAwEAAaOBuTCBtjAJBgNVHRME +AjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDov +L2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUw +REJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJF +MTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IB +AQA0/4EmJf8ZVjNesmTdzklJyE6ZkshlAFWJOFhGqH/gYHGqBjxP+h0NNyET5d7J +pijMCq4g+SfaW0WJ2bq0y7iF5KltqHgbx2Niunu1F8MVJjZyikiTMeradjlUL8Un +rwbBNpzYwE/6OkT0XowpJaIZzCClB16cf4vLSmFxLcRntOll7kMFAMWznfXiQllN +mVst0sRNop9qaLgiVpX7uoYTiaO9Kj/BcTxIxSxLUYVx4piojJ9AxgBAm7rGFvE8 +iOO5O3TFOkWqR2dVYMEbQYQA9b3YQ0xbSK8Px2vHkcFAj1+fhnThcOHL8dlr5Qgn +wZF/z5dlVNeITS3YoeGqGF9t +-----END CERTIFICATE----- diff --git a/storage/wechatpay/apiclient_key.pem b/storage/wechatpay/apiclient_key.pem new file mode 100644 index 0000000..c570f6d --- /dev/null +++ b/storage/wechatpay/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC6xULrqHHFs9JV +i1E7o+qJEt9Vs7a1x+1yHeqM3MrqseXA3FgPBC+Klfw5c8nu9bzGgjJ6PbfiByAR +d6eUv7O6Pcge1fxx3cbYBNC3U2rKroDRTyumDA1cIDZ7CIv06RtHGGRABwLMSmf3 +lm871Hh7XC4Wi6lepiNJk2zQtT8XMbNXb/gBtjP2N9Nu6gO5VKL/L69zJJqkevf1 +iDWlW+gLh9s040QEzVgQQBZmZXWhFS1fjVxMuw07rFOc4aMsKnqO+b9Noq0iAhNR +VHSiz0wyvmW9Jk+qJsEWlOmA050o2QJeraTbpTWLPTOLVvQA2z25spcrp37vgFIg +Z7M4Y5DjAgMBAAECggEBAJogIuNZs9mUVSRmvXhcAjVvr4GHtmU4QQgFDAOGSKV4 +fMK0kq6Bo8HXl7bJiIB7pXajBoi92braamo/tbkYoXY1eamIqLRGccrd3mcKnXv4 +mTEhBkIWfAfkRVEucmB+5RW8WS5FGtf/JuC38b8LzQjvvtC4G+KRc1lKIWfxyciW +vWUjqyCHItS9vLgm36CsttGiRKhJ8JwhtuVzKEn3Uif7IzIrX8/JbVhm+PyKA8js +1NZkDzFUMnU8kA8toOOt5No48ih5/WWREXoAjFt6L/XUQW7y7SjdLO812rgeezvP +zfz8YgQTGe3u3KVE7aoCq+IAkGqDLODZPGW4s0L6uQECgYEA92X/qB9287iefXXN +d0wqdvJRdhg9ZAB3F4hsdPQ007OkgYQi0XcPvlRXd84gw4rFJKCes77MRHWXXc8d +Pp9KAEAlPKjRh9rl8cKf1euGQqlsOMtzL5L5J3nAkmHE01Wn5qZeLqEFRKnCk7yx +gUS4Vm4xYS2ZbQwOlPBwLJ7noiMCgYEAwUOi9bVrSRVe3C3m6x5ZdnDuIwnaOtMm +e8kNfKzMtLW9JR91FuM93W8hAiwQZdgXhrC/DOFXQTn2wQQ0Wba3v209SlrqgjMT +Rj8zX5Rn6YJVUAre/GaKDoeQBqkXif8RI4k6jcCqCtWt4slPEN52ZPezJd1lN6vr +T0d6XbGWYkECgYEAsm4jRHtlDITT8kKbbPZHDkDYlecHp+9Z9WQUbQmQbDt9Y1gM +0Kwhc7Fa4HKPWNjmNPOPYq4ynxF8mVD+k6LI+YNKGATeEjDDdWlcZCoZTEzrW88I +hYBoKJt8U1cmYRG/JfBJrzG9Hfed+XW3RDdvCA8zmBYOOQLgJXWAQf5dq6cCgYEA +muqRlO2QiyuzN0EgKfXQ9oz9hl6ebKrW3UDDK94D1RMdA8XcgLU04Ov0hJ43ort9 +2DyTWErFO4awEfZB1GwPjEWPbKvF8Qnp+FQu5P278cTEh/2+0omLPqxRudUPBlHM +NjUJF5mJdFfmI7UESNxaAQNAuihmuyJ247zDDJmOl0ECgYEAqiIUtWSKu8A3jrx6 +wpAY7IOrOKAo9l5+WQKjtSalimlXUaEZq7r76bCZumaB3kgO+TMOaBcQoE0D3Mg6 +HEX/cNrZwO5rQkgW4/WTmZmY2xfUEIVuRDpNfDfrfQkT97P4YFjTeQxSsTWHEm/v +d6sWvPnGGKrXR440sn7bKbydsvA= +-----END PRIVATE KEY----- diff --git a/storage/wechatpay/apiv3秘钥.txt b/storage/wechatpay/apiv3秘钥.txt new file mode 100644 index 0000000..a93b9eb --- /dev/null +++ b/storage/wechatpay/apiv3秘钥.txt @@ -0,0 +1 @@ +r4wu1Ms2bwApMXFwUJ7jgA5NmMJvhiyL diff --git a/storage/wechatpay/wechatpay.pem b/storage/wechatpay/wechatpay.pem new file mode 100644 index 0000000..4cc57ee --- /dev/null +++ b/storage/wechatpay/wechatpay.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID3DCCAsSgAwIBAgIUQumxG9SBfqfmOjIIwGdO6nkG3vowDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjIwNjAxMDg0MjA1WhcNMjcwNTMxMDg0MjA1WjBuMRgwFgYDVQQDDA9U +ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl +bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo +ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFuTNlYkNKkq4jahfZ +nfNy3yARIHB5X9BODVw6uXBDGVE7lyxP8bK7IKLssmX6Ncf1oHnQdbOwThK2dVaG +qBhDb5bQnMkQakEjZ26rqPPJUOqtHbq4nAJBWq0rm6qCFeygXkSQvZ82bmi6wPbV +puVmmccdBadJbhP6UCciyH32gLNlparlR7amR6G/GcCu/ktwjUt9xtqilK0DJOTT +15oGMKuSbPKBHv0/goawBc52ajUjEoVADB3KEcqd8nDtdsoMxncD/zsmXMQcZWCo +s8JgdufhUOU0qRp1F7F27ve2TtQ879Ev5O3OvGmetp/JODRVG+x3iABkucVycNPj +PO6VAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc +MFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js +P0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ +KoZIhvcNAQELBQADggEBAIQDNof+73Gr42tIwOJLgwC5ZhDmia/x/KqEl/uc2qVA +zDCgDwnwYrmTBjjJiyIl6nOFnfAuF27mAI2253S1jpcOOWZFIR/rjErTKVTVTZaQ +8GuMnVdw8yGzFuKuxE67Sw28JTam4xVH72ZyoSit2zZcXpkfw6Tzq+8HQxGJgCq7 +igZLk5Ot9/xG0P0Hk/G9iyTJa9g0axnJp20FaDdRES7e+B7d4S+ojQFPf4vCHvlK +ofKLHSQOnT0fvosb08WCLTfKbcSsm1AQk1y7kgz1MkHRBVp4muG9Ybfm23z9jEjI +lDCa6okP2gIrh3AEL5+h9/6iOCCTIxHKY83BlCi2Zro= +-----END CERTIFICATE----- diff --git a/storage/wechatpay/序列号.txt b/storage/wechatpay/序列号.txt new file mode 100644 index 0000000..3695624 --- /dev/null +++ b/storage/wechatpay/序列号.txt @@ -0,0 +1 @@ +75B8DDD397AD6F96BF7904AE5F767C39F25E8DC1 diff --git a/storage/wechatpay/证书使用说明.txt b/storage/wechatpay/证书使用说明.txt new file mode 100644 index 0000000..9a0aab1 --- /dev/null +++ b/storage/wechatpay/证书使用说明.txt @@ -0,0 +1,18 @@ +欢迎使用微信支付! +附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。 +证书属于敏感信息,请妥善保管不要泄露和被他人复制。 +不同开发语言下的证书格式不同,以下为说明指引: + 证书pkcs12格式(apiclient_cert.p12) + 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 + 部分安全性要求较高的API需要使用该证书来确认您的调用身份 + windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031) + 证书pem格式(apiclient_cert.pem) + 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem + 证书密钥pem格式(apiclient_key.pem) + 从apiclient_cert.p12中导出密钥部分的文件,为pem格式 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem +备注说明: + 由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 \ No newline at end of file