|
@@ -39,6 +39,168 @@ class ApiController extends Controller
|
|
|
public function log(Request $request){
|
|
public function log(Request $request){
|
|
|
Util::WriteLog("log",$request->all());
|
|
Util::WriteLog("log",$request->all());
|
|
|
}
|
|
}
|
|
|
|
|
+ public function weblog(Request $request){
|
|
|
|
|
+ Util::WriteLog("weblog",$request->all());
|
|
|
|
|
+ return "OK";
|
|
|
|
|
+ }
|
|
|
|
|
+ public function sendfbevent(Request $request){
|
|
|
|
|
+ Util::WriteLog("sendfbevent",$request->all());
|
|
|
|
|
+ return "OK";
|
|
|
|
|
+ }
|
|
|
|
|
+ public function sendggevent(Request $request){
|
|
|
|
|
+ Util::WriteLog("sendggevent",$request->all());
|
|
|
|
|
+ return "OK";
|
|
|
|
|
+ }
|
|
|
|
|
+ public function inith5client(Request $request){
|
|
|
|
|
+ Util::WriteLog("inith5client",$request->all());
|
|
|
|
|
+ return "OK";
|
|
|
|
|
+ }
|
|
|
|
|
+ public function pushSubscribe(Request $request)
|
|
|
|
|
+ {
|
|
|
|
|
+ //{"fingerprint":"","userid":0,"subscibe_info":"{\"endpoint\":\"https://fcm.googleapis.com/fcm/send/eg7A5CJ_pyA:APA91bEZYZd92knXEH-qRzinP6H7kguaVDwmAvDjCFgwCPW-BMKOraXaQxBf5ONP5vMJu0jmZLOn0_f0wONxlmTOu3yBVmBlkQBFY4XrDofNhGJwnVxKbNh3sxWFqvptmCo97St9ZPSe\",\"expirationTime\":null,\"keys\":{\"p256dh\":\"BB8s_jUbX-0UPuy3aGLLxYbbNNdA0aEu7awsmK-Bxe0ZLX5lPItWHpRHVtTfxQnXDwVflEhbG6qnUSBLQxiLduA\",\"auth\":\"UnYCllcPM7nMmjj4XLXxZQ\"}}","channel":"100","web_site":"https://dev.winus777.com/pwa/landingpage2?pixel=2775919695949438&campaign=%7B%7Bcampaign.name%7D%7D+%28%7B%7Bcampaign.id%7D%7D%29&adgroup=%7B%7Badset.name%7D%7D+%28%7B%7Badset.id%7D%7D%29&creative=%7B%7Bad.name%7D%7D+%28%7B%7Bad.id%7D%7D%29&fbclid=","platform":"Android","installed":0}
|
|
|
|
|
+// {"publicKey":"BEKE0qlrGMp-XyUHppeFMscDiJg-sL98jr4b51glbvicHnD69oNZ9JiLHKIQ9_3K0ImSZlo0Ggw-RE3FxYOUwJo","privateKey":"VPFE6_2QL-pFHENBuhbp2WH-8DeBbK92WIwZg6BPJtc"}
|
|
|
|
|
+ try {
|
|
|
|
|
+ $fpid = $request->input('fingerprint');
|
|
|
|
|
+ $userid = $request->input('userid');
|
|
|
|
|
+ $subscibe_info = $request->input('subscibe_info');
|
|
|
|
|
+ $channel = $request->input('channel');
|
|
|
|
|
+ $web_site = $request->input('web_site');
|
|
|
|
|
+ $platform = $request->input('platform');
|
|
|
|
|
+ $installed = $request->input('installed', 0);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证必填字段
|
|
|
|
|
+ if (empty($fpid) || empty($subscibe_info)) {
|
|
|
|
|
+ return apiReturnFail(__('messages.api.common.missing_info'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 解析订阅信息
|
|
|
|
|
+ if (is_string($subscibe_info)) {
|
|
|
|
|
+ $subscibe_info = json_decode($subscibe_info, true);
|
|
|
|
|
+ if (json_last_error() !== JSON_ERROR_NONE) {
|
|
|
|
|
+ return apiReturnFail('Invalid subscription info format');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 提取endpoint作为唯一标识
|
|
|
|
|
+ $endpoint = $subscibe_info['endpoint'] ?? '';
|
|
|
|
|
+ if (empty($endpoint)) {
|
|
|
|
|
+ return apiReturnFail('Missing endpoint in subscription info');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查是否已存在该订阅
|
|
|
|
|
+ $existing = DB::table('QPAccountsDB.dbo.WebPushSubscriptions')
|
|
|
|
|
+ ->where('Endpoint', $endpoint)
|
|
|
|
|
+ ->first();
|
|
|
|
|
+
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'FPID' => $fpid,
|
|
|
|
|
+ 'UserID' => $userid ?? 0,
|
|
|
|
|
+ 'SubscriptionInfo' => json_encode($subscibe_info),
|
|
|
|
|
+ 'Endpoint' => $endpoint,
|
|
|
|
|
+ 'Channel' => $channel ?? '',
|
|
|
|
|
+ 'WebSite' => $web_site ?? '',
|
|
|
|
|
+ 'Platform' => $platform ?? 'Other',
|
|
|
|
|
+ 'Installed' => $installed,
|
|
|
|
|
+ 'Status' => 1, // 1=激活, 0=禁用
|
|
|
|
|
+ 'UpdatedAt' => date('Y-m-d H:i:s')
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ if ($existing) {
|
|
|
|
|
+ // 更新现有订阅
|
|
|
|
|
+ DB::table('QPAccountsDB.dbo.WebPushSubscriptions')
|
|
|
|
|
+ ->where('ID', $existing->ID)
|
|
|
|
|
+ ->update($data);
|
|
|
|
|
+
|
|
|
|
|
+ return apiReturnSuc(['message' => 'Subscription updated', 'id' => $existing->ID]);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 创建新订阅
|
|
|
|
|
+ $data['CreatedAt'] = date('Y-m-d H:i:s');
|
|
|
|
|
+ $id = DB::table('QPAccountsDB.dbo.WebPushSubscriptions')->insertGetId($data);
|
|
|
|
|
+
|
|
|
|
|
+ return apiReturnSuc(['message' => 'Subscription created', 'id' => $id]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ } catch (\Exception $e) {
|
|
|
|
|
+ Log::error('Push subscribe error: ' . $e->getMessage(), [
|
|
|
|
|
+ 'request' => $request->all(),
|
|
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
|
|
+ ]);
|
|
|
|
|
+ return apiReturnFail('Subscription failed: ' . $e->getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 上传订阅状态
|
|
|
|
|
+ * 记录用户对Web Push订阅的响应结果
|
|
|
|
|
+ */
|
|
|
|
|
+ public function uploadSubscribeState(Request $request)
|
|
|
|
|
+ {
|
|
|
|
|
+ try {
|
|
|
|
|
+ $userid = $request->input('userid', 0);
|
|
|
|
|
+ $result = $request->input('result'); // 1=接受, 2=未接受, 3=不支持, 4=拒绝
|
|
|
|
|
+ $machineserial = $request->input('machineserial'); // FPID
|
|
|
|
|
+ $ish5 = $request->input('ish5', 0); // 0=app(w2a), 1=h5(pwa)
|
|
|
|
|
+ $p_source = $request->input('p_source'); // channel
|
|
|
|
|
+
|
|
|
|
|
+ // 验证必填字段
|
|
|
|
|
+ if (empty($machineserial) || !in_array($result, [1, 2, 3, 4])) {
|
|
|
|
|
+ return apiReturnFail(__('messages.api.common.missing_info'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 状态映射
|
|
|
|
|
+ $statusMap = [
|
|
|
|
|
+ 1 => 'accepted', // 接受
|
|
|
|
|
+ 2 => 'not_accepted', // 未接受
|
|
|
|
|
+ 3 => 'not_supported', // 不支持
|
|
|
|
|
+ 4 => 'denied' // 拒绝
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ $status = $statusMap[$result] ?? 'unknown';
|
|
|
|
|
+
|
|
|
|
|
+ // 检查是否已存在记录
|
|
|
|
|
+ $existing = DB::table('QPAccountsDB.dbo.WebPushSubscribeStates')
|
|
|
|
|
+ ->where('FPID', $machineserial)
|
|
|
|
|
+ ->where('UserID', $userid)
|
|
|
|
|
+ ->orderBy('ID', 'desc')
|
|
|
|
|
+ ->first();
|
|
|
|
|
+
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'UserID' => $userid,
|
|
|
|
|
+ 'FPID' => $machineserial,
|
|
|
|
|
+ 'Result' => $result,
|
|
|
|
|
+ 'Status' => $status,
|
|
|
|
|
+ 'IsH5' => $ish5,
|
|
|
|
|
+ 'Channel' => $p_source ?? '',
|
|
|
|
|
+ 'UserAgent' => substr($request->header('user-agent') ?? '', 0, 500),
|
|
|
|
|
+ 'ClientIP' => $request->ip(),
|
|
|
|
|
+ 'UpdatedAt' => date('Y-m-d H:i:s')
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ if ($existing) {
|
|
|
|
|
+ // 如果状态没有变化,只更新时间
|
|
|
|
|
+ if ($existing->Result == $result) {
|
|
|
|
|
+ DB::table('QPAccountsDB.dbo.WebPushSubscribeStates')
|
|
|
|
|
+ ->where('ID', $existing->ID)
|
|
|
|
|
+ ->update(['UpdatedAt' => date('Y-m-d H:i:s')]);
|
|
|
|
|
+
|
|
|
|
|
+ return apiReturnSuc(['message' => 'State updated', 'id' => $existing->ID]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 插入新记录
|
|
|
|
|
+ $data['CreatedAt'] = date('Y-m-d H:i:s');
|
|
|
|
|
+ $id = DB::table('QPAccountsDB.dbo.WebPushSubscribeStates')->insertGetId($data);
|
|
|
|
|
+
|
|
|
|
|
+ return apiReturnSuc(['message' => 'State recorded', 'id' => $id, 'status' => $status]);
|
|
|
|
|
+
|
|
|
|
|
+ } catch (\Exception $e) {
|
|
|
|
|
+ Log::error('Upload subscribe state error: ' . $e->getMessage(), [
|
|
|
|
|
+ 'request' => $request->all(),
|
|
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
|
|
+ ]);
|
|
|
|
|
+ return apiReturnFail('Upload state failed: ' . $e->getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
public function checkLocale(Request $request){
|
|
public function checkLocale(Request $request){
|
|
|
$UserID=$request->input("UserID");
|
|
$UserID=$request->input("UserID");
|