|
|
@@ -86,9 +86,6 @@ class ClearController extends BaseController
|
|
|
if ($clear->status == ClearClass::STATUS_EXPIRE) {
|
|
|
util::fail('账单已取消');
|
|
|
}
|
|
|
- $clear->status = ClearClass::STATUS_EXPIRE;
|
|
|
- $clear->remark = "商家主动取消 " . date("m-d H:i") . ' 操作人 ' . $staffName;
|
|
|
- $clear->save();
|
|
|
|
|
|
$ghsShop = $this->shop;
|
|
|
$merchantPrivateKeyPath = Yii::getAlias("@vendor/lakala") . '/production/api_private_key.pem';
|
|
|
@@ -102,16 +99,34 @@ class ClearController extends BaseController
|
|
|
'lklCertificatePath' => $lklCertificatePath,
|
|
|
];
|
|
|
$laResource = new Lakala($params);
|
|
|
+
|
|
|
+ // 1. 先查询拉卡拉订单状态,确保未付款成功,防止时序竞争问题
|
|
|
+ $queryResponse = $laResource->query(['orderSn' => $orderSn]);
|
|
|
+ if (isset($queryResponse['code']) && $queryResponse['code'] == 'BBS00000') {
|
|
|
+ $tradeState = $queryResponse['resp_data']['trade_state'] ?? '';
|
|
|
+ if ($tradeState == 'SUCCESS') {
|
|
|
+ util::fail('账单已付款成功,不可取消!');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 调用拉卡拉关单,防止后续再次支付成功
|
|
|
$closeParams = [
|
|
|
'orderSn' => $orderSn,
|
|
|
];
|
|
|
$response = $laResource->close($closeParams);
|
|
|
if (isset($response['code']) == false || $response['code'] != 'BBS00000') {
|
|
|
- //$msg = $response['msg'] ?? '';
|
|
|
- //noticeUtil::push("\n花店结账单:" . $orderSn . "\n关单失败了\n{$msg} ", '15280215347');
|
|
|
- }
|
|
|
-
|
|
|
- //收银台关单
|
|
|
+ $msg = $response['msg'] ?? '';
|
|
|
+ $code = $response['code'] ?? 0;
|
|
|
+ // 如果拉卡拉明确返回已经支付,则阻断本地状态更新为取消
|
|
|
+ if (in_array($code, ['BBS11112', 'BBS11113'])) {
|
|
|
+ util::fail('账单在第三方支付渠道已被支付或处理中,无法取消!');
|
|
|
+ }
|
|
|
+ if (!in_array($code, ['BBS11114'])) {
|
|
|
+ noticeUtil::push("\n花店结账单:" . $orderSn . "\n关单失败了\n{$msg} {$code}", '15280215347');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 收银台关单
|
|
|
$closeParams = ['orderSn' => $orderSn];
|
|
|
$response = $laResource->cashClose($closeParams);
|
|
|
if (isset($response['code']) == false || $response['code'] != '000000') {
|
|
|
@@ -119,6 +134,11 @@ class ClearController extends BaseController
|
|
|
//noticeUtil::push('单号:' . $orderSn . ',关单没有成功(收银台-支付宝),' . $msg, '15280215347');
|
|
|
}
|
|
|
|
|
|
+ // 3. 第三方关单/状态校验通过后,最后才修改并保存本地数据库状态为 STATUS_EXPIRE
|
|
|
+ $clear->status = ClearClass::STATUS_EXPIRE;
|
|
|
+ $clear->remark = "商家取消 " . date("m-d H:i") . ' 操作人 ' . $staffName;
|
|
|
+ $clear->save();
|
|
|
+
|
|
|
util::complete();
|
|
|
}
|
|
|
|