You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
5.7 KiB
223 lines
5.7 KiB
<?php
|
|
|
|
namespace App\Controller\v3;
|
|
use App\Constants\v3\OrderState;
|
|
use App\Controller\BaseController;
|
|
use App\Model\v3\Order;
|
|
use App\Model\v3\OrderMain;
|
|
use Hyperf\DbConnection\Db;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
|
|
/**
|
|
* 顺丰同城回调
|
|
*/
|
|
class SfExpressController extends BaseController
|
|
{
|
|
private string $dev_id;
|
|
private string $dev_key;
|
|
// private string $shop_id;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct(); //此句不能少,否则$this->request和$this->response获取不到
|
|
$this->dev_id = env('SF_EXPRESS_DEV_ID');
|
|
$this->dev_key = env('SF_EXPRESS_DEV_KEY');
|
|
// $this->shop_id = env('SF_EXPRESS_SHOP_ID');
|
|
}
|
|
|
|
/**
|
|
* 配送状态更改回调
|
|
*/
|
|
public function riderStatus(): ResponseInterface
|
|
{
|
|
if (!$this->checkSign($this->request->query('sign'))) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '签名错误',
|
|
]);
|
|
}
|
|
|
|
$formData = $this->request->all();
|
|
if (empty($formData['shop_order_id'])) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '无效的shop_order_id',
|
|
]);
|
|
}
|
|
|
|
# 主订单表
|
|
$orderMain = OrderMain::whereIn('state', [OrderState::PAID, OrderState::DELIVERY])
|
|
->where('global_order_id', $formData['shop_order_id'])
|
|
->first();
|
|
|
|
if (!$orderMain) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '订单不存在',
|
|
]);
|
|
}
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
# 主订单表
|
|
$orderMain->state = OrderState::DELIVERY;
|
|
//order_status 订单状态 10-配送员确认;12:配送员到店;15:配送员配送中
|
|
if (!empty($formData['order_status'])) {
|
|
if ($formData['order_status'] == 10 && $orderMain->receive_time == 0) {
|
|
$orderMain->receive_time = time(); // 接单时间
|
|
} else if ($formData['order_status'] == 12 && $orderMain->delivery_start_time == 0) {
|
|
$orderMain->delivery_start_time = time(); // 开始配送时间
|
|
}
|
|
}
|
|
$orderMain->save();
|
|
|
|
# 子订单表
|
|
Order::where('order_main_id', $formData['shop_order_id'])
|
|
->update(['state' => $orderMain->state]);
|
|
|
|
DB::commit();
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => $exception->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return $this->response->json([
|
|
'error_code' => 0,
|
|
'error_msg' => 'success',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 骑士撤单状态回调
|
|
*/
|
|
public function riderRecall(): ResponseInterface
|
|
{
|
|
if (!$this->checkSign($this->request->query('sign'))) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '签名错误',
|
|
]);
|
|
}
|
|
|
|
$formData = $this->request->all();
|
|
if (empty($formData['shop_order_id'])) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '无效的shop_order_id',
|
|
]);
|
|
}
|
|
|
|
//order_status 22-配送员撤单
|
|
//TODO 因目前订单表没有相关撤单的字段,故目前不做处理,仅仅返回成功给顺丰
|
|
return $this->response->json([
|
|
'error_code' => 0,
|
|
'error_msg' => 'success',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 订单完成回调
|
|
*/
|
|
public function orderComplete(): ResponseInterface
|
|
{
|
|
if (!$this->checkSign($this->request->query('sign'))) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '签名错误',
|
|
]);
|
|
}
|
|
|
|
$formData = $this->request->all();
|
|
if (empty($formData['shop_order_id'])) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '无效的shop_order_id',
|
|
]);
|
|
}
|
|
|
|
# 主订单表
|
|
$orderMain = OrderMain::where('state', '>', OrderState::UNPAID)
|
|
->where('global_order_id', $formData['shop_order_id'])
|
|
->first();
|
|
|
|
if (!$orderMain) {
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => '订单不存在',
|
|
]);
|
|
}
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
# 主订单表
|
|
$orderMain->state = OrderState::COMPLETED;
|
|
$orderMain->complete_time = time();
|
|
$orderMain->delivery_time = time();
|
|
$orderMain->save();
|
|
|
|
# 子订单表
|
|
Order::where('order_main_id', $formData['shop_order_id'])
|
|
->update(['state' => $orderMain->state]);
|
|
|
|
DB::commit();
|
|
} catch (\Exception $exception) {
|
|
DB::rollBack();
|
|
return $this->response->json([
|
|
'error_code' => 500,
|
|
'error_msg' => $exception->getMessage(),
|
|
]);
|
|
}
|
|
|
|
return $this->response->json([
|
|
'error_code' => 0,
|
|
'error_msg' => 'success',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 顺丰原因订单取消回调
|
|
*/
|
|
public function sfCancel(): ResponseInterface
|
|
{
|
|
//TODO 因目前订单表没有相关撤单的字段,故目前不做处理,仅仅返回成功给顺丰
|
|
return $this->riderRecall();
|
|
}
|
|
|
|
/**
|
|
* 订单异常回调
|
|
*/
|
|
public function riderException(): ResponseInterface
|
|
{
|
|
/** ex_id枚举值:
|
|
4003:托寄物丢失或损坏
|
|
1001:商家出货慢
|
|
2010:顾客拒绝实名认证
|
|
3004:实名认证校验失败
|
|
1007:更改取货地址
|
|
2001:顾客电话无法接通
|
|
2004:更改期望送达时间
|
|
2005:顾客拒收
|
|
2008:顾客不在家
|
|
2009:更改送货地址
|
|
4001:配送地址错误
|
|
4002:其他
|
|
*/
|
|
//TODO 因目前订单表没有相关撤单的字段,故目前不做处理,仅仅返回成功给顺丰
|
|
return $this->riderRecall();
|
|
}
|
|
|
|
/**
|
|
* 回调签名校验
|
|
*/
|
|
private function checkSign(?string $checkSign): bool
|
|
{
|
|
$post_data = $this->request->getBody()->getContents();
|
|
echo PHP_EOL, '$post_data', PHP_EOL;
|
|
print_r($post_data);
|
|
$sign_char = $post_data . "&{$this->dev_id}&{$this->dev_key}";
|
|
return $checkSign == base64_encode(md5($sign_char));
|
|
}
|
|
}
|