|
|
@@ -62,7 +62,7 @@ class TransferLogic
|
|
|
*
|
|
|
* @param int $transferAppId 划转应用ID
|
|
|
* @param int $userId 用户ID
|
|
|
- * @param string $amount 转出金额
|
|
|
+ * @param string $amount 转出金额(外部金额,第三方系统的金额)
|
|
|
* @param string|null $outUserId 外部用户ID
|
|
|
* @param string|null $remark 备注
|
|
|
* @param array $callbackData 回调数据
|
|
|
@@ -92,43 +92,48 @@ class TransferLogic
|
|
|
/**
|
|
|
* 创建第三方应用转出订单(内部实现,跳过密码验证)
|
|
|
*
|
|
|
+ * 注意:第三方应用传入的金额是外部金额,需要转换为内部金额进行处理
|
|
|
+ *
|
|
|
* @param array $data 订单数据
|
|
|
* @return TransferOrder
|
|
|
* @throws \Exception
|
|
|
*/
|
|
|
public static function createTransferOutFromArrayForThirdParty(array $data): TransferOrder
|
|
|
{
|
|
|
- // 使用第三方应用专用验证类(跳过密码验证)
|
|
|
- $validation = new \App\Module\Transfer\Validations\TransferOutThirdPartyValidation($data);
|
|
|
- $validation->validated();
|
|
|
-
|
|
|
- // 获取应用配置
|
|
|
+ // 获取应用配置(需要先获取以便进行金额转换)
|
|
|
$app = TransferApp::findOrFail($data['transfer_app_id']);
|
|
|
if (!$app->is_enabled) {
|
|
|
throw new \Exception('应用已禁用');
|
|
|
}
|
|
|
|
|
|
- // 计算金额(转出:内部金额转换为外部金额)
|
|
|
- $amount = (string) $data['amount']; // 内部金额
|
|
|
-
|
|
|
// 验证汇率是否合理
|
|
|
if (bccomp((string) $app->exchange_rate, '0', 10) <= 0) {
|
|
|
throw new \Exception('汇率配置错误:汇率必须大于0');
|
|
|
}
|
|
|
|
|
|
- // 验证内部金额是否合理
|
|
|
- if (bccomp($amount, '0', 10) <= 0) {
|
|
|
+ // 第三方应用金额处理:传入的是外部金额,需要转换为内部金额
|
|
|
+ $outAmount = (string) $data['amount']; // 外部金额(第三方系统金额)
|
|
|
+ $amount = bcmul($outAmount, (string) $app->exchange_rate, 10); // 内部金额 = 外部金额 × 汇率
|
|
|
+
|
|
|
+ // 验证外部金额是否合理
|
|
|
+ if (bccomp($outAmount, '0', 10) <= 0) {
|
|
|
throw new \Exception('转出金额必须大于0');
|
|
|
}
|
|
|
|
|
|
- $outAmount = bcdiv($amount, (string) $app->exchange_rate, 10); // 外部金额 = 内部金额 ÷ 汇率
|
|
|
-
|
|
|
- // 验证计算结果是否合理
|
|
|
- if (bccomp($outAmount, '0', 10) <= 0) {
|
|
|
- throw new \Exception('汇率计算结果异常:外部金额必须大于0');
|
|
|
+ // 验证内部金额计算结果是否合理
|
|
|
+ if (bccomp($amount, '0', 10) <= 0) {
|
|
|
+ throw new \Exception('汇率计算结果异常:内部金额必须大于0');
|
|
|
}
|
|
|
|
|
|
- // 计算手续费
|
|
|
+ // 修改验证数据:将外部金额替换为内部金额,这样验证器就能正确验证余额
|
|
|
+ $validationData = $data;
|
|
|
+ $validationData['amount'] = $amount; // 传递内部金额给验证器
|
|
|
+
|
|
|
+ // 使用第三方应用专用验证类(跳过密码验证)
|
|
|
+ $validation = new \App\Module\Transfer\Validations\TransferOutThirdPartyValidation($validationData);
|
|
|
+ $validation->validated();
|
|
|
+
|
|
|
+ // 计算手续费(基于内部金额)
|
|
|
$feeInfo = $app->calculateOutFee($amount);
|
|
|
|
|
|
// 生成外部订单ID
|