6
0
Fork 0

支付宝

release
李静 2022-01-04 15:09:37 +08:00
parent 1592f13ff5
commit 5f97414495
9 changed files with 646 additions and 198 deletions

View File

@ -0,0 +1,12 @@
<?php
namespace App\Endpoint\Callback\Http\Controllers;
use Illuminate\Http\Request;
class AlipayController extends Controller
{
public function paidNotify(Request $request)
{
}
}

View File

@ -1,5 +1,6 @@
<?php
use App\Endpoint\Callback\Http\Controllers\AlipayController;
use App\Endpoint\Callback\Http\Controllers\Kuaidi100Controller;
use App\Endpoint\Callback\Http\Controllers\WeChatPayController;
use Illuminate\Support\Facades\Route;
@ -9,3 +10,5 @@ Route::post('kuaidi100', [Kuaidi100Controller::class, 'notify']);
// 微信支付通知
Route::post('wxpay/paid-notify', [WeChatPayController::class, 'paidNotify'])->name('wxpay.paid_notify');
Route::post('wxpay/order-refund-notify', [WeChatPayController::class, 'orderRefundedNotify'])->name('wxpay.order_refund_notify');
Route::post('alipay/paid-notify', [AlipayController::class, 'paidNotify'])->name('alipay.paid_notify');

View File

@ -17,6 +17,7 @@ class PayLog extends Model
public const PAY_WAY_WXPAY_JSAPI = 'wxpay_jsapi'; // 微信支付 - JSAPI 支付
public const PAY_WAY_WXPAY_MINI = 'wxpay_mini'; // 微信支付 - 小程序支付
public const PAY_WAY_WXPAY_H5 = 'wxpay_h5'; // 微信支付 - H5 支付
public const PAY_ALIPAY_APP = 'alipay_app'; // 支付宝 - app 支付
public const PAY_WAY_WALLET = 'wallet'; // 钱包付款(可提现)
public const PAY_WAY_BALANCE = 'balance'; // 余额支付
public const PAY_WAY_OFFLINE = 'offline'; // 线下支付
@ -78,6 +79,18 @@ class PayLog extends Model
]);
}
/**
* 确认支付方式是否是支付宝付款
*
* @return bool
*/
public function isAlipay(): bool
{
return in_array($this->pay_way, [
static::PAY_ALIPAY_APP,
]);
}
/**
* 确认支付方式是否是线下支付
*

View File

@ -2,6 +2,8 @@
namespace App\Providers;
use Alipay\EasySDK\Kernel\Config as AlipayConfig;
use Alipay\EasySDK\Kernel\EasySDKKernel as AlipayKernel;
use App\Services\SettingService;
use EasyWeChat\Factory as EasyWeChatFactory;
use EasyWeChat\Payment\Application as EasyWeChatPaymentApplication;
@ -24,6 +26,7 @@ class AppServiceProvider extends ServiceProvider
$this->registerEasyWeChat();
$this->registerRequestRealIp();
$this->registerSettings();
$this->registerAlipay();
}
/**
@ -95,4 +98,29 @@ class AppServiceProvider extends ServiceProvider
return new SettingService($app['cache.store']);
});
}
/**
* 注册应用支付宝服务
*
* @return void
*/
protected function registerAlipay()
{
$this->app->singleton(AlipayKernel::class, function ($app) {
$alipayConfigs = $app['config']->get('alipay');
$config = new AlipayConfig();
$config->protocol = 'https';
$config->gatewayHost = 'openapi.alipay.com';
$config->signType = 'RSA2';
$config->appId = $alipayConfigs['app_id'];
$config->merchantPrivateKey = $alipayConfigs['app_private_key'];
$config->merchantCertPath = $alipayConfigs['app_public_cert_path'];
$config->alipayCertPath = $alipayConfigs['public_cert_path'];
$config->alipayRootCertPath = $alipayConfigs['root_cert_path'];
$config->notifyUrl = $alipayConfigs['notify_url'] ?? url(route('alipay.paid_notify', [], false), [], true);
return new AlipayKernel($config);
});
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Services;
use Alipay\EasySDK\Kernel\EasySDKKernel;
use Alipay\EasySDK\Payment\App\Client as AppClient;
class AlipayService
{
public function __construct(
protected EasySDKKernel $kernel,
) {
}
/**
* 支付
*
* @param array $params
* @return array
*/
public function pay(array $params)
{
$result = (new AppClient($this->kernel))->pay(
$params['subject'],
$params['out_trade_no'],
$params['total_amount'],
);
return $result->body;
}
}

View File

@ -779,29 +779,39 @@ class OrderService
}
} while ($payLog === null);
$data = [
'pay_sn' => $payLog->pay_sn,
];
// 如果支付方式为线下支付,或支付金额为 0则按支付完成处理
if ($payLog->isOffline() || $order->total_amount === 0) {
return (new PayService())->handleSuccess($payLog, [
if ($order->total_amount === 0 || $payLog->isOffline()) {
(new PayService())->handleSuccess($payLog, [
'pay_at' => now(),
]);
}
if ($payLog->isWxpay()) {
$data = null;
} elseif ($payLog->isWxpay()) {
if (! isset(WeChatPayService::$tradeTypes[$payLog->pay_way])) {
throw new BizException('支付方式不支持');
}
return (new WeChatPayService())->pay([
$data = (new WeChatPayService())->pay([
'body' => app_settings('app.app_name').'-商城订单',
'out_trade_no' => $payLog->pay_sn,
'total_fee' => $order->total_amount,
'trade_type' => WeChatPayService::$tradeTypes[$payLog->pay_way],
]);
} elseif ($payLog->isAlipay()) {
$data = app(AlipayService::class)->pay([
'subject' => app_settings('app.app_name').'-商城订单',
'out_trade_no' => $payLog->pay_sn,
'total_amount' => bcdiv($order->total_amount, 100, 2),
]);
}
return [
'pay_sn' => $payLog->pay_sn,
'pay_way' => $payLog->pay_way,
'data' => $data,
];
}

View File

@ -13,6 +13,7 @@
"require": {
"php": "^8.0",
"alibabacloud/sts": "^1.8",
"alipaysdk/easysdk": "^2.2",
"alphasnow/aliyun-oss-laravel": "^3.0",
"dcat/laravel-admin": "2.1.5-beta",
"fruitcake/laravel-cors": "^2.0",

720
composer.lock generated

File diff suppressed because it is too large Load Diff

14
config/alipay.php 100644
View File

@ -0,0 +1,14 @@
<?php
return [
// 应用 ID
'app_id' => env('ALIPAY_APP_ID'),
// 应用私钥证书
'app_private_key' => env('ALIPAY_APP_PRIVATE_KEY'),
// 应用公钥证书文件路径
'app_public_cert_path' => env('ALIPAY_APP_PUBLIC_CERT_PATH'),
// 支付宝公钥证书文件路径
'public_cert_path' => env('ALIPAY_PUBLIC_CERT_PATH'),
// 支付宝根证书文件路径
'root_cert_path' => env('ALIPAY_ROOT_CERT_PATH'),
];