/* =================================================================== * 20260911 — Didit hesap secimi, karar cekme ve takilan oturum senkronu * * NEDEN: kyc-ping.php bir webhook DEGIL, Didit'in kullaniciyi geri * yolladigi donus sayfasi. Karar yalnizca kullanici siteye DONERSE * cekiliyordu. Donmeyen / Didit tarafinda insan incelemesine dusen * oturumlar sonsuza kadar 'In Review' kaliyordu (11 Eyl olcumu: * 25 kayit, 20'si 14 gunden eski, en eskisi 84 gun). * * Karar cekme + KYC'ye yansitma mantigi artik TEK yerde: * api_diditFetchDecision(). kyc-ping.php ve cron ikisi de bunu cagirir. * =================================================================== */ /** * Didit'ten oturum kararini ceker, api_didit'i gunceller ve sonucu * musterinin KYC statusune yansitir. * * Expired ozel durumu: Didit oturumunun suresi dolmasi bir RET DEGILDIR * (kullanici hic baslamamis olabilir). Eski kod Declined ile ayni kefeye * koyup musteriyi 'rejected' yapiyordu; 11 Eyl olcumunde 'Not Started' * gorunen 456 kaydin eskilerinin Didit'te gercekte Expired oldugu * gorulunce bu ayrim eklendi. Expired'da musteri 'pending_didit' kalir, * geri geldiginde /kyc-api zaten yeni oturum acar. * * @return array ['err','status','action','customer_id','errmsg'] * action: approved | rejected | expired | pending | none */ function api_diditFetchDecision($api_didit_id, $opts = []) { $api_didit_id = clInt($api_didit_id); if($api_didit_id <= 0) { return ['err' => '1', 'errmsg' => 'gecersiz api_didit_id', 'action' => 'none']; } $api_diditShow = api_diditShow($api_didit_id); if(!$api_diditShow || trim((string)($api_diditShow['api_didit_sessionid'] ?? '')) === '') { return ['err' => '1', 'errmsg' => 'oturum/sessionid bulunamadi', 'action' => 'none']; } $settingdiditShow = settingdiditShow($api_diditShow['settingdidit_id']); if(!$settingdiditShow || trim((string)($settingdiditShow['settingdidit_apikey'] ?? '')) === '') { return ['err' => '1', 'errmsg' => 'didit hesabi/apikey okunamadi', 'action' => 'none']; } $timeout = isset($opts['timeout']) ? clInt($opts['timeout']) : 20; $url = 'https://verification.didit.me/v3/session/' . rawurlencode($api_diditShow['api_didit_sessionid']) . '/decision/'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout > 0 ? $timeout : 20); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'x-api-key: ' . $settingdiditShow['settingdidit_apikey'], ]); curl_setopt($ch, CURLOPT_POST, false); $responseDidit = curl_exec($ch); $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlErr = curl_error($ch); curl_close($ch); // Hata halinde MEVCUT KAYDI EZME - sadece bildir. if($responseDidit === false || $httpCode < 200 || $httpCode >= 300) { return ['err' => '1', 'action' => 'none', 'http' => $httpCode, 'errmsg' => "didit yanit vermedi (http {$httpCode})" . ($curlErr ? " {$curlErr}" : '')]; } $responseDiditJSON = json_decode($responseDidit, true); $status = (is_array($responseDiditJSON) && isset($responseDiditJSON['status'])) ? trim((string) $responseDiditJSON['status']) : ''; if($status === '') { return ['err' => '1', 'action' => 'none', 'http' => $httpCode, 'errmsg' => 'didit status bos']; } api_diditUpdate($api_didit_id, [ 'api_didit_status' => $status, 'api_didit_pingresponse' => $responseDidit, 'api_didit_synctime' => getTimeStamp(), ]); $customer_id = clInt($api_diditShow['customer_id']); $action = 'none'; if($customer_id > 0) { if($status === 'Approved') { $idv = $responseDiditJSON['id_verifications'][0] ?? []; $lv = $responseDiditJSON['liveness_checks'][0] ?? []; $fm = $responseDiditJSON['face_matches'][0] ?? []; $ipa = $responseDiditJSON['ip_analyses'][0] ?? []; $mrz = $idv['mrz'] ?? null; customerSetForeignKYCVerified($customer_id, [ 'source' => isset($opts['source']) ? clText($opts['source']) : 'didit', 'session_id' => $api_diditShow['api_didit_sessionid'], 'api_didit_id' => $api_diditShow['api_didit_id'], 'didit_account' => $settingdiditShow['settingdidit_tag'] ?: ($settingdiditShow['settingdidit_mail'] ?? ''), 'name' => $idv['first_name'] ?? '', 'surname' => $idv['extra_fields']['last_name_latin'] ?? $idv['last_name'] ?? '', 'full_name' => $idv['full_name'] ?? '', 'doc_type' => $idv['document_type'] ?? '', 'doc_number' => $idv['document_number'] ?? '', 'personal_number' => $idv['personal_number'] ?? '', 'nationality' => $idv['nationality'] ?? '', 'dob' => $idv['date_of_birth'] ?? null, 'gender' => $idv['gender'] ?? '', 'issuing_state' => $idv['issuing_state'] ?? '', 'expiration_date' => $idv['expiration_date'] ?? null, 'place_of_birth' => $idv['place_of_birth'] ?? '', 'address' => $idv['address'] ?? null, 'mrz_raw' => $mrz, 'portrait_url' => $idv['portrait_image'] ?? '', 'front_url' => $idv['front_image'] ?? '', 'back_url' => $idv['back_image'] ?? '', 'liveness_score' => $lv['score'] ?? null, 'liveness_method' => $lv['method'] ?? '', 'face_score' => $fm['score'] ?? null, 'age_estimation' => $lv['age_estimation'] ?? null, 'face_quality' => $lv['face_quality'] ?? null, 'ip_address' => $ipa['ip_address'] ?? '', 'ip_country_code' => $ipa['ip_country_code'] ?? '', 'ip_city' => $ipa['ip_city'] ?? '', 'ip_is_vpn' => $ipa['is_vpn_or_tor'] ?? false, 'device_brand' => $ipa['device_brand'] ?? '', 'device_model' => $ipa['device_model'] ?? '', 'platform' => $ipa['platform'] ?? '', 'raw_json' => $responseDidit, ]); $action = 'approved'; } elseif($status === 'Declined') { customerSetKYCRejected($customer_id, 'declined'); $action = 'rejected'; } elseif($status === 'Expired') { // RET DEGIL - musteri statusune dokunulmaz, yeni oturum acabilir. $action = 'expired'; } else { // In Review / In Progress / Not Started — karar yok, bekliyor. $action = 'pending'; } } return ['err' => '0', 'status' => $status, 'action' => $action, 'customer_id' => $customer_id, 'http' => $httpCode]; } /** * Musterisi hala 'pending_didit' olan, sonuclanmamis oturumlari Didit'ten * senkronize eder. cron2023/cron_didit_sync.php tarafindan cagrilir. * * Kapsam kurallari: * - Oncelik 'In Review' / 'In Progress' (gercekten takilan kayitlar). * - 'Not Started' yalnizca oturum belli bir yastan eskiyse sorgulanir; * yeni oturumlar zaten kullanici akisinda ilerliyor olabilir. * - Ayni kayit `recheckhour` saatten once tekrar sorgulanmaz (api_didit_synctime). * - `maxageday` gununden eski oturumlar olu kabul edilir, sorgulanmaz. */ function api_diditSyncStuck($param = []) { $limit = isset($param['limit']) ? clInt($param['limit']) : 40; $notStartedDay = isset($param['notstartedday']) ? clInt($param['notstartedday']) : 3; $recheckHour = isset($param['recheckhour']) ? clInt($param['recheckhour']) : 6; $maxAgeDay = isset($param['maxageday']) ? clInt($param['maxageday']) : 120; $sleepUs = isset($param['sleepus']) ? clInt($param['sleepus']) : 400000; if($limit <= 0) $limit = 40; if($notStartedDay < 0) $notStartedDay = 3; if($recheckHour < 0) $recheckHour = 6; if($maxAgeDay <= 0) $maxAgeDay = 120; $db = DB::getInstance(); $selectSQL = " SELECT a.`api_didit_id`, a.`api_didit_status` FROM `api_didit` a JOIN `customer` c ON c.`customer_id` = a.`customer_id` WHERE c.`customer_kyc_status` = 'pending_didit' AND COALESCE(a.`api_didit_sessionid`,'') <> '' AND a.`api_didit_status` IN ('In Review','In Progress','Not Started') AND a.`api_didit_createtime` > DATE_SUB(NOW(), INTERVAL {$maxAgeDay} DAY) AND (a.`api_didit_synctime` IS NULL OR a.`api_didit_synctime` < DATE_SUB(NOW(), INTERVAL {$recheckHour} HOUR)) AND (a.`api_didit_status` <> 'Not Started' OR a.`api_didit_createtime` < DATE_SUB(NOW(), INTERVAL {$notStartedDay} DAY)) ORDER BY FIELD(a.`api_didit_status`,'In Review','In Progress','Not Started'), a.`api_didit_createtime` ASC LIMIT {$limit}"; $query = mysqli_query($db, $selectSQL); $ozet = ['bakilan' => 0, 'approved' => 0, 'rejected' => 0, 'expired' => 0, 'pending' => 0, 'none' => 0, 'hata' => 0, 'detay' => []]; if(!$query) { $ozet['hata']++; $ozet['detay'][] = 'sorgu basarisiz: ' . mysqli_error($db); return $ozet; } $idArr = []; while($d = mysqli_fetch_assoc($query)) { $idArr[] = $d; } mysqli_free_result($query); foreach($idArr as $d) { $ozet['bakilan']++; $sonuc = api_diditFetchDecision($d['api_didit_id'], ['source' => 'didit_sync']); if($sonuc['err'] === '1') { $ozet['hata']++; $ozet['detay'][] = "#{$d['api_didit_id']} HATA: {$sonuc['errmsg']}"; } else { $act = $sonuc['action']; if(!isset($ozet[$act])) $ozet[$act] = 0; $ozet[$act]++; if($act !== 'pending') { $ozet['detay'][] = "#{$d['api_didit_id']} {$d['api_didit_status']} -> {$sonuc['status']} ({$act})"; } } if($sleepUs > 0) usleep($sleepUs); } return $ozet; } /** * Oturum acmak icin Didit hesabi secer. * * Eski kod settingdiditList(['sort'=>'apicount']) kullaniyordu; o alt sorgu * `date_sub(api_didit_createtime, ...)` yaziyordu (NOW() degil, satirin KENDI * tarihi) ve settingdidit_id eslesmesi yoktu -> her hesap icin ayni sayiyi * donduruyordu, yani siralama anlamsizdi ve yuk hep ayni hesaba biniyordu * (11 Eyl: #1=674, #3=566, #4=82). settingdidit_maxrequest de hicbir yerde * uygulanmiyordu. * * Kota dolmussa hizmeti DURDURMAK yerine en az kullanilan hesap secilir ve * sonucta 'kota' bayragi doner - cagiran taraf loglar. */ function settingdiditPick($param = []) { $db = DB::getInstance(); $sayimSQL = "(SELECT COUNT(*) FROM `api_didit` a WHERE a.`settingdidit_id` = s.`settingdidit_id` AND a.`api_didit_createtime` > DATE_SUB(NOW(), INTERVAL GREATEST(COALESCE(s.`settingdidit_maxrequestday`,0),1) DAY))"; $selectSQL = "SELECT s.*, {$sayimSQL} AS `apicount` FROM `settingdidit` s WHERE s.`settingdidit_status` = 'active' ORDER BY `apicount` ASC, s.`settingdidit_id` ASC"; $query = mysqli_query($db, $selectSQL); if(!$query) return []; $hepsi = []; while($d = mysqli_fetch_assoc($query)) { $hepsi[] = $d; } mysqli_free_result($query); if(!$hepsi) return []; foreach($hepsi as $s) { $mx = clInt($s['settingdidit_maxrequest']); if($mx <= 0 || clInt($s['apicount']) < $mx) { $s['kota'] = '0'; return $s; } } // Hepsi kotayi doldurmus: en az kullanilani ver, bayragi kaldir. $s = $hepsi[0]; $s['kota'] = '1'; return $s; } Achat-vente de personnages Knight Online (Ring) 2026 | Kopazar
Solde actuel , TL
Ajouter du solde

Notifications Parcourir tout

Tête

Tête

Tête

Tête

Votre panier contient des articles. Ils seront supprimés pour l'achat rapide. Confirmez-vous ?

Knight Online Cypher Ring Guide

Cypher Ring de Knight Online

Acheter et vendre des personnages (CHAR) sur Knight Online avec le Cypher Ring

Qu'est-ce que le Cypher Ring ?

Le Cypher Ring est un objet qui sert à transformer le personnage à l'aide du Character Seal Scroll. Il est vendu dans la boutique Power Up (PUS) de Knight Online et coûte 2 800 Knight Cash.

Pourquoi utiliser le Cypher Ring pour acheter ou vendre un personnage (CHAR) ?

Auparavant, la vente de personnages se faisait en communiquant des données comme l'adresse e-mail et le mot de passe, et certains vendeurs malintentionnés déclaraient le personnage volé avec un code Esn, causant des problèmes à l'acheteur. Avec le Cypher Ring, la vente de personnages est devenue plus sûre et protège l'acheteur de ce type de perte. C'est aujourd'hui la méthode la plus sûre pour acheter ou vendre des personnages Knight Online. Lorsque nous transférons vers un autre compte le personnage contenu dans le Cypher Ring, nous pouvons l'utiliser sur ce compte.

Cypher Ring dans l'inventaire

Ce que vous devez savoir avant d'acheter un personnage Knight Online avec Cypher Ring

◽ Le compte vers lequel vous transférez le Cypher Ring doit disposer d'un emplacement (slot) libre.

◽ Le Cypher Ring ne peut pas être transféré vers un autre serveur.

◽ Il ne peut pas être envoyé par courrier (Letter) et ne peut pas être supprimé.

Comment transférer sur mon compte le personnage (CHAR) contenu dans le Cypher Ring ?

◽ Connectez-vous au jeu et rendez-vous chez l'Inn Hostess pour ouvrir le Cypher Ring.

◽ Faites un clic droit sur l'Inn Hostess et choisissez l'option Character Seal/Cancel.

◽ Sur la page qui s'ouvre, appuyez sur le bouton Unseal. (Seal = mettre en vente, Unseal = vente finalisée)

◽ Faites glisser le Cypher Ring sur cette page, appuyez sur OK puis sur Confirm, dans cet ordre.

◽ Vous verrez à l'écran le personnage disponible et les emplacements libres.

◽ Sélectionnez un emplacement libre et appuyez sur Unseal : vous aurez correctement ajouté le personnage de l'anneau à cet emplacement.

Comment faire un Unseal sur un Cypher Ring de Knight Online

Rendez-vous chez n'importe quelle Inn Hostess (banque) pour ouvrir le Cypher Ring et faites un clic droit sur elle.

Inn Hostess dans Knight Online

Menu de l'Inn Hostess

Appuyez sur l'option Character Seal / Cancel dans le menu de l'Inn Hostess.

Option Character Seal / Cancel

Sur l'écran Character Seal and Unseal, choisissez Unseal.

Écran Character Seal and Unseal

Sélection de l'option Unseal

Nous plaçons le Cypher Ring dans la case du menu, appuyons sur OK puis sur Confirm.

Confirmation de la procédure d'Unseal

Dans le menu Unseal Character, nous voyons notre personnage disponible et les emplacements libres. En sélectionnant un emplacement libre et en appuyant sur Unseal, le personnage du Cypher Ring est ajouté à cet emplacement comme personnage secondaire. La procédure d'Unseal est alors terminée avec succès.

AVERTISSEMENTS IMPORTANTS

  • Lorsque votre objet est vendu, le seul moyen de nous contacter est la ligne d'assistance en direct de notre site. Ne prenez jamais contact par téléphone, Skype, e-mail ou message privé en jeu. Utilisez UNIQUEMENT notre assistance en direct pour remettre l'objet.
  • Lorsque votre objet est vendu, le SMS que vous recevez provient du 0850 259 11 66. Ignorez les messages provenant de tout autre numéro.
  • N'indiquez jamais de coordonnées dans vos annonces et veillez à ce que vos messages privés n'apparaissent pas sur les images jointes. Ces annonces ne sont pas validées et ne seront pas publiées.
  • Ne faites jamais confiance à quelqu'un qui se présente comme un représentant de Kopazar et tente de récupérer vos objets en notre nom.

5.0/5
42 évaluations
5 étoiles
41
4 étoiles
1
3 étoiles
0
2 étoiles
0
1 étoiles
0

Commentaires (42)

Laisser un commentaire
SG
S.G 12.08.2026

KOPAZARI YAKLAŞIK 13 YILDIR BİLİRİM. OYUNA ARA ARA DÖNÜP OYNADIĞIM ZAMANLARDA KESİNLİKLE ALIŞVERİŞ İÇİN GÜVENLE KULLANABİLECEĞİM TEK SİTE. EKİBİ VE DANIŞMANLIĞI MÜKEMMEL. İYİ Kİ VARSINIZ.

5.0 / 5.0
CA
C.A 04.07.2026

ilanlar güncel, knight online için karakter bulmak kolay

5.0 / 5.0
EY
E.Y 23.03.2026

Knight Online karakter aldım, oyun içinde hemen teslim edildi

5.0 / 5.0
RR
R.R 25.05.2026

aradığım karakter buradaydı, satıcıyla iletişim çok rahat :)

5.0 / 5.0
AK
A.K 14.01.2026

karakter teslimi sorunsuz oldu, güvenle alışveriş yapılıyor

5.0 / 5.0

Nous avons mis à jour nos contrats !

Nous avons mis à jour tous nos contrats afin de mieux vous servir. Veuillez approuver les contrats ci-dessous pour poursuivre votre adhésion.


Bu alan zorunludur.
Bu alan zorunludur.

Nous avons mis à jour nos contrats !

Nous avons mis à jour tous nos contrats afin de mieux vous servir. Veuillez approuver les contrats ci-dessous pour poursuivre votre adhésion.


Bu alan zorunludur.
Bu alan zorunludur.