Skip to content

Commit 8bec5b9

Browse files
xjanovaclaude
andcommitted
fix: LINE push notification ไม่เด้งหลังชำระเงิน + ปรับ prompt ไพ่ยิปซี
Root cause: FortuneReading ถูกสร้างโดยไม่มี platform field ทำให้ SmsPaymentService/ProcessDeepFortuneReadingJob ใช้ fallback 'facebook' แทน 'line' → push notification ส่งไปผิด channel แก้ไข: 1. เพิ่ม platform + platform_user_id ใน FortuneReading::create() ทุกจุด (FortuneConversationService - 4 จุด) 2. เพิ่ม LINE user ID detection fallback (U + 32 hex chars) ในทุกจุดที่ อ่าน $reading->platform — กรณี reading เก่าที่ไม่มี platform 3. ปรับ buildTarotAnalysisSection() prompt ให้มี 4 ย่อหน้าชัดเจน - "ไพ่ที่คุณเปิดได้คือ..." - "เมื่อวิเคราะห์ไพ่ร่วมกับดวงดาว..." - ตำแหน่งไพ่ + คำแนะนำ - สรุปฟันธง Files affected: - FortuneConversationService.php (platform in create + prompt) - FortuneChannelManager.php (LINE ID fallback) - SmsPaymentService.php (LINE ID fallback) - SmsPaymentController.php (5 จุด) - FortuneBillingController.php (2 จุด) - FortuneReadingsController.php (2 จุด) - FortuneCheckPendingReadings.php (1 จุด) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a968c7e commit 8bec5b9

File tree

7 files changed

+44
-18
lines changed

7 files changed

+44
-18
lines changed

app/Console/Commands/FortuneCheckPendingReadings.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ public function handle(): int
104104
foreach ($pendingReadings as $reading) {
105105
$waitMinutes = (int) $reading->paid_at->diffInMinutes(now());
106106
$billRef = $reading->bill_reference ?? "#{$reading->id}";
107-
$platform = $reading->platform ?? 'facebook';
108107
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
108+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
109109

110110
// ตรวจสอบ retry count จาก conversation_state
111111
$retryCount = $reading->getConversationState('auto_retry_count', 0);

app/Http/Controllers/Admin/FortuneBillingController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,8 @@ public function manualConfirm(Request $request, FortuneReading $reading)
173173
$hasQuestions = ! empty($reading->getCollectedQuestions());
174174

175175
if ($hasQuestions) {
176-
$platform = $reading->platform ?? 'facebook';
177176
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
177+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
178178

179179
if (! $userId) {
180180
return back()->with('error', 'ไม่พบ User ID — ไม่สามารถส่งข้อความได้');
@@ -252,8 +252,8 @@ public function retryFortune(FortuneReading $reading)
252252
return back()->with('error', 'บิลนี้ไม่มีคำถาม — ไม่สามารถสร้างคำทำนายได้');
253253
}
254254

255-
$platform = $reading->platform ?? 'facebook';
256255
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
256+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
257257

258258
if (! $userId) {
259259
return back()->with('error', 'ไม่พบ User ID — ไม่สามารถส่งข้อความได้');

app/Http/Controllers/Admin/FortuneReadingsController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ public function retryDeepReading(FortuneReading $reading)
133133
return redirect()->back()->with('error', 'ไม่สามารถดำเนินการได้: ต้องเป็น deep reading ที่ชำระเงินแล้ว');
134134
}
135135

136-
$platform = $reading->platform ?? 'facebook';
137136
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
137+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
138138

139139
if (empty($userId)) {
140140
return redirect()->back()->with('error', 'ไม่พบ user ID สำหรับส่งข้อความ');
@@ -188,8 +188,8 @@ public function resendDeepReading(FortuneReading $reading)
188188
return redirect()->back()->with('error', 'ไม่มีคำทำนายเชิงลึก กรุณาใช้ปุ่ม "สร้างคำทำนายใหม่" แทน');
189189
}
190190

191-
$platform = $reading->platform ?? 'facebook';
192191
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
192+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
193193

194194
if (empty($userId)) {
195195
return redirect()->back()->with('error', 'ไม่พบ user ID สำหรับส่งข้อความ');

app/Http/Controllers/Api/V1/SmsPaymentController.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -899,8 +899,8 @@ public function approveOrder(Request $request, $identifier): JsonResponse
899899

900900
// Dispatch background job สร้างคำทำนาย + ส่งข้อความ
901901
// ใช้ queue job แทน sync call → ไม่ติด web server timeout
902-
$platform = $model->platform ?? 'facebook';
903902
$userId = $model->platform_user_id ?? $model->facebook_user_id;
903+
$platform = $model->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
904904

905905
if ($userId) {
906906
ProcessDeepFortuneReadingJob::dispatchSmart(
@@ -1072,7 +1072,7 @@ private function retryStuckFortuneReadings(): void
10721072
$reading->update(['conversation_status' => FortuneReading::STATUS_PAID]);
10731073
}
10741074

1075-
$platform = $reading->platform ?? 'facebook';
1075+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
10761076

10771077
ProcessDeepFortuneReadingJob::dispatchSmart(
10781078
$reading->id, null, $platform, $userId
@@ -1347,8 +1347,8 @@ public function bulkApproveOrders(Request $request): JsonResponse
13471347
}
13481348
if (! $model->is_paid) {
13491349
// Dispatch background job สร้างคำทำนาย + ส่งข้อความ
1350-
$platform = $model->platform ?? 'facebook';
13511350
$userId = $model->platform_user_id ?? $model->facebook_user_id;
1351+
$platform = $model->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
13521352

13531353
if ($userId) {
13541354
ProcessDeepFortuneReadingJob::dispatchSmart(
@@ -1677,8 +1677,8 @@ public function matchOrderByAmount(Request $request): JsonResponse
16771677

16781678
// Dispatch job สร้างคำทำนาย + ส่งข้อความ (เหมือน approveOrder)
16791679
// ถ้าไม่ dispatch ตรงนี้ → Android เห็น auto_approved → skip เรียก /approve → ไม่มีใครสร้างคำทำนาย
1680-
$platform = $fortuneReading->platform ?? 'facebook';
16811680
$userId = $fortuneReading->platform_user_id ?? $fortuneReading->facebook_user_id;
1681+
$platform = $fortuneReading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
16821682

16831683
if ($userId) {
16841684
\App\Jobs\ProcessDeepFortuneReadingJob::dispatchSmart(
@@ -2295,8 +2295,8 @@ private function executeFortuneApproveAction(array $payload, FortuneReading $rea
22952295

22962296
// Dispatch background job สร้างคำทำนาย + ส่งข้อความ
22972297
// ใช้ queue job แทน sync call → ไม่ติด web server timeout
2298-
$platform = $reading->platform ?? 'facebook';
22992298
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
2299+
$platform = $reading->platform ?: ((preg_match('/^U[0-9a-f]{32}$/i', $userId ?? '')) ? 'line' : 'facebook');
23002300

23012301
if ($userId) {
23022302
ProcessDeepFortuneReadingJob::dispatchSmart(

app/Services/FortuneChannelManager.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2470,8 +2470,12 @@ public function getSupportedPlatforms(): array
24702470
*/
24712471
public function sendDeepReadingAfterPayment(FortuneReading $reading): array
24722472
{
2473-
$platform = $reading->platform ?? self::PLATFORM_FACEBOOK;
2473+
// ✅ ตรวจจับ LINE user จาก ID format เป็น fallback (กรณี reading เก่าที่ไม่มี platform)
24742474
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
2475+
$platform = $reading->platform;
2476+
if (! $platform) {
2477+
$platform = (preg_match('/^U[0-9a-f]{32}$/i', $userId)) ? self::PLATFORM_LINE : self::PLATFORM_FACEBOOK;
2478+
}
24752479

24762480
// Dispatch background job → ไม่ติด web server timeout / webhook 5s timeout
24772481
// Job จะ: confirmPayment → สร้าง chart → สร้างคำทำนาย → ส่ง Messenger → save DB

app/Services/FortuneConversationService.php

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,6 +1606,8 @@ protected function askFortuneConfirmation(string $facebookUserId, string $messag
16061606
'response_type' => 'private_message',
16071607
'ai_response' => '',
16081608
'ai_provider' => '',
1609+
'platform' => $this->currentPlatform,
1610+
'platform_user_id' => $facebookUserId,
16091611
]);
16101612

16111613
// เก็บข้อความต้นฉบับไว้ใน state เพื่อส่งให้ AI ตอนยืนยัน
@@ -1931,6 +1933,8 @@ protected function askForQuestionBeforeReading(string $facebookUserId, string $m
19311933
'response_type' => 'private_message',
19321934
'ai_response' => '',
19331935
'ai_provider' => '',
1936+
'platform' => $this->currentPlatform,
1937+
'platform_user_id' => $facebookUserId,
19341938
]);
19351939

19361940
// เก็บว่าเป็น "รอคำถาม" (ไม่ใช่รอยืนยัน)
@@ -2125,6 +2129,8 @@ protected function startNewConversation(string $facebookUserId, string $messageT
21252129
'response_type' => 'private_message',
21262130
'ai_response' => '',
21272131
'ai_provider' => '',
2132+
'platform' => $this->currentPlatform,
2133+
'platform_user_id' => $facebookUserId,
21282134
]);
21292135

21302136
// ✅ ดึงบริบทจากประวัติผู้ใช้ (Personalization)
@@ -2408,6 +2414,8 @@ protected function startDeepReadingFlow(string $facebookUserId, ?array $userProf
24082414
'response_type' => 'private_message',
24092415
'ai_response' => '',
24102416
'ai_provider' => '',
2417+
'platform' => $this->currentPlatform,
2418+
'platform_user_id' => $facebookUserId,
24112419
]);
24122420

24132421
Log::info('Fortune: เริ่ม deep reading flow ใหม่ (ข้าม free limit)', [
@@ -5842,13 +5850,22 @@ protected static function buildTarotAnalysisSection(?array $tarotCard, string $g
58425850
? 'กลับหัว: เน้นความท้าทาย อุปสรรค สิ่งที่ต้องระวัง และวิธีรับมือ'
58435851
: 'หงาย: เน้นพลังงานเชิงบวก โอกาส จุดแข็งที่เสริมดวง';
58445852

5845-
return "🃏 **วิเคราะห์ไพ่ยิปซี** (⚠️ ห้ามข้ามหัวข้อนี้! ต้องเขียนอย่างน้อย 80 คำ):
5846-
- เริ่มต้นด้วย: \"ไพ่{$cardNameTh}ที่{$genderPrefix}{$name}เปิดได้...\"
5847-
- อธิบายความหมายของไพ่ใบนี้ในบริบทของคำถาม \"{$question}\" อย่างละเอียด
5848-
- เชื่อมโยงไพ่กับตำแหน่งดาวในแผนที่ดวงชะตา เช่น \"ไพ่นี้สอดคล้องกับดาว[ชื่อ]ที่อยู่ภพ[ชื่อ] ซึ่งบ่งบอกว่า...\"
5853+
return "🃏 **วิเคราะห์ไพ่ยิปซี** (⚠️ ห้ามข้ามหัวข้อนี้! ต้องเขียนอย่างน้อย 100 คำ):
5854+
5855+
**ย่อหน้าที่ 1 — แนะนำไพ่:** เริ่มด้วยประโยคแบบนี้:
5856+
\"ไพ่ที่{$genderPrefix}{$name}เปิดได้คือ ไพ่{$cardNameTh}ค่ะ ไพ่ใบนี้มีความหมายเกี่ยวกับ [อธิบายความหมายหลักของไพ่ 1-2 ประโยค]\"
5857+
5858+
**ย่อหน้าที่ 2 — วิเคราะห์ร่วมกับดวงดาว:** ต้องมีประโยคที่เชื่อมไพ่กับดวงดาว เช่น:
5859+
\"เมื่อวิเคราะห์ไพ่{$cardNameTh}ร่วมกับดวงดาวของ{$genderPrefix}{$name}แล้ว พบว่า ไพ่ใบนี้สอดคล้องกับดาว[ชื่อ]ที่อยู่ภพ[ชื่อ] ซึ่งบ่งบอกว่า...\" + ขยายว่าพลังของไพ่เสริม/ขัดกับดาวอย่างไร
5860+
5861+
**ย่อหน้าที่ 3 — ตำแหน่งไพ่ + คำแนะนำ:**
58495862
- ไพ่ตำแหน่ง{$positionAdvice}
5850-
- สรุปว่าไพ่ใบนี้บอกอะไร{$genderPrefix}{$name}เกี่ยวกับเรื่องนี้ — ฟันธงชัดเจน
5851-
- ⚠️ ต้องเขียนเนื้อหาวิเคราะห์ไพ่จริงๆ ห้ามแค่บอกชื่อไพ่แล้วข้ามไป!
5863+
- บอกว่าไพ่ใบนี้แนะนำ{$genderPrefix}{$name}ว่าควรทำอะไร/ระวังอะไรในเรื่อง \"{$question}\"
5864+
5865+
**ย่อหน้าที่ 4 — สรุปฟันธง:**
5866+
\"สรุปจากไพ่{$cardNameTh}ประกอบดวงชะตาของ{$genderPrefix}{$name} หมอจันทราเห็นว่า [ฟันธงชัดเจน 1-2 ประโยค]\"
5867+
5868+
⚠️ ห้ามเขียนแค่ชื่อไพ่แล้วข้ามไปหัวข้อถัดไป! ต้องมีเนื้อหาวิเคราะห์ครบ 4 ย่อหน้า!
58525869
58535870
";
58545871
}

app/Services/SmsPaymentService.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,8 +533,13 @@ protected function handleFortuneReadingPayment(SmsPaymentNotification $notificat
533533
}
534534

535535
// ระบุ platform และ user ID ที่จะส่งข้อความ
536-
$platform = $reading->platform ?? 'facebook';
536+
// ✅ ตรวจจับ LINE user จาก ID format (U + 32 hex chars) เป็น fallback
537+
// ป้องกันกรณี reading เก่าที่ยังไม่มี platform field
537538
$userId = $reading->platform_user_id ?? $reading->facebook_user_id;
539+
$platform = $reading->platform;
540+
if (! $platform) {
541+
$platform = (preg_match('/^U[0-9a-f]{32}$/i', $userId)) ? 'line' : 'facebook';
542+
}
538543

539544
Log::info('SMS Payment: พบ Fortune Reading ที่รอชำระ', [
540545
'notification_id' => $notification->id,

0 commit comments

Comments
 (0)