You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
payment/app/Controller/Payment/NotifyController.php

168 lines
5.9 KiB
PHTML

2 years ago
<?php
declare(strict_types=1);
namespace App\Controller\Payment;
2 years ago
use App\Helper\Efps\Signer;
use App\Helper\Log;
use App\Helper\Platform\Notification;
use App\Model\App;
use App\Model\Order;
use App\Model\RefundOrder;
2 years ago
use Hyperf\HttpServer\Contract\RequestInterface;
2 years ago
class NotifyController extends AbstractController
{
2 years ago
2 years ago
public function __construct()
2 years ago
{
}
2 years ago
public function payment(RequestInterface $request)
2 years ago
{
$params = $request->all();
2 years ago
Log::info('paymentNotifyToOut params:', $params);
$sign = $request->getHeader('x-efps-sign');
$data = json_encode($params);
if (!Signer::verify($data, $sign)) {
Log::info('paymentNotifyToOut data: ' . $data . ' sign: ' . $sign);
return [
'returnCode' => '0001',
'returnMsg' => '签名验证失败'
];
}
$outOrderNo = $params['outTradeNo'] ?: '';
$order = Order::where('out_order_no', $outOrderNo)->first();
if (!$order) {
Log::info('paymentNotifyToOut: ' . '订单号不存在[' . $outOrderNo . ']');
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
$app = App::where('app_id', $order->app_id)->first();
if (!$app) {
Log::info('paymentNotifyToOut: ' . 'APP不存在[' . $outOrderNo . '][' . $order->app_id . ']');
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
if ($order->status != Order::STATUS_WAIT_PAY) {
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
if ($params['payState'] === '00') {
$order->status = Order::STATUS_PAYED;
$order->fee = $params['procedureFee'] ?: 0;
$order->pay_order_no = $params['transactionNo'] ?: '';
$order->channel_order_no = $params['channelOrder'] ?: '';
$order->payed_at = date('Y-m-d H:i:s');
$order->save();
} elseif ($params['payState'] === '01') {
$order->status = Order::STATUS_FAILED;
$order->error_code = '01';
$order->error_msg = '处理失败';
$order->payed_at = date('Y-m-d H:i:s');
$order->save();
}
$result = $this->notify($order->notify_url, $app, [
'outTradeNo' => $params['outTradeNo'] ?: '',
'transactionNo' => $params['transactionNo'] ?: '',
'payState' => $params['payState'],
'amount' => $params['amount'] ?: 0,
]);
Log::info('paymentNotifyToOut result: ' . '订单[' . $outOrderNo . '][' . $$result . ']');
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
2 years ago
}
2 years ago
2 years ago
public function refund(RequestInterface $request)
{
2 years ago
$params = $request->all();
2 years ago
Log::info('refundNotifyToOut params:', $params);
$sign = $request->getHeader('x-efps-sign');
$data = json_encode($params);
if (!Signer::verify($data, $sign)) {
Log::info('refundNotifyToOut data: ' . $data . ' sign: ' . $sign);
return [
'returnCode' => '0001',
'returnMsg' => '签名验证失败'
];
}
$outRefundNo = $params['outRefundNo'] ?: '';
$order = RefundOrder::where('out_refund_order_no', $outRefundNo)->first();
if (!$order) {
Log::info('refundNotifyToOut: ' . '订单号不存在[' . $outRefundNo . ']');
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
$app = App::where('app_id', $order->app_id)->first();
if (!$app) {
Log::info('refundNotifyToOut: ' . 'APP不存在[' . $outRefundNo . '][' . $order->app_id . ']');
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
if ($order->status != RefundOrder::STATUS_APPLY_SUCCESS) {
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
if ($params['payState'] === '00') {
$order->status = RefundOrder::STATUS_REFUND_SUCCESS;
$order->fee = $params['procedureFee'] ?: 0;
$order->refunded_at = date('Y-m-d H:i:s');
$order->save();
} elseif ($params['payState'] === '01') {
$order->status = RefundOrder::STATUS_REFUND_FAILED;
$order->error_code = '01';
$order->error_msg = '处理失败';
$order->refunded_at = date('Y-m-d H:i:s');
$order->save();
}
$result = $this->notify($order->notify_url, $app, [
'outRefundNo' => $params['outRefundNo'] ?: '',
'transactionNo' => $params['transactionNo'] ?: '',
'payState' => $params['payState'],
'amount' => $params['amount'] ?: 0,
'refundAmount' => $params['refundAmount'] ?: 0,
]);
Log::info('paymentNotifyToOut result: ' . '订单[' . $outRefundNo . '][' . $$result . ']');
return [
'returnCode' => '0000',
'returnMsg' => '处理成功'
];
}
protected function notify($url, $app, $data) {
$params = [
'app_id' => $app->app_id,
'nonce_str' => StringHelper::getRandomString(32),
'timestamp' => time(),
];
$params['data'] = json_encode($data);
$params['sign'] = PlatformSigner::sign($params, $app->app_key);
Log::info('notifyToOut params:', $params, 'platform');
Log::info('notifyToOut url:' . $url, [], 'platform');
$result = Notification::post($url, $params);
Log::info('notifyToOut response:' . $result, [], 'platform');
return $result;
2 years ago
}
2 years ago
}