Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhabalar,

Bir adet telegram miniapp botu kodladım. Kullanıcılar ton wallet ile cüzdan adreslerini backendi php olan sisteme kaydetmeli ancak bir türlü veritabanına kayıt ettiremiyorum.

Döküman: https://www.npmjs.com/package/@tonconnect/ui

cuzdan.php sayfamdaki script kodu

<script src="https://unpkg.com/@tonconnect/ui@latest/dist/tonconnect-ui.min.js"></script>
<script>
     const tonConnectUI = new TON_CONNECT_UI.TonConnectUI({
    manifestUrl: 'https://babanas.click/tonconnect-manifest.json',
    buttonRootId: 'connect-wallet'
});

tonConnectUI.onStatusChange(async (walletInfo) => {
    if (walletInfo && walletInfo.wallet) {
        const walletAddress = walletInfo.wallet.account.address;  

        const username = '<?= $username; ?>';  

        const response = await fetch('kaydet.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: new URLSearchParams({
                'wallet_address': walletAddress,
                'username': username
            })
        });

        const result = await response.text();
        console.log(result); 
    }
});
</script>

kaydet.php sayfam

<?php
include("wisex.php");

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!empty($_POST['wallet_address']) && !empty($_POST['username'])) {
        $wallet_address = htmlspecialchars($_POST['wallet_address'], ENT_QUOTES, 'UTF-8');
        $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
        
        try {
            $sorgu = $baglanti->prepare("UPDATE kullanicilar SET wallet_address = :wallet_address WHERE username = :username");
            $sorgu->bindParam(':wallet_address', $wallet_address);
            $sorgu->bindParam(':username', $username);

            if ($sorgu->execute()) {
                echo "Cüzdan adresi başarıyla kaydedildi.";
            } else {
                echo "Cüzdan adresi kaydedilemedi.";
            }
        } catch (PDOException $e) {
            echo "Veritabanı hatası: " . $e->getMessage();
        }
    } else {
        echo "Gerekli veriler eksik.";
    }
} else {
    echo "Geçersiz istek.";
}
?>
<script>
    const tonConnectUI = new TON_CONNECT_UI.TonConnectUI({
        manifestUrl: 'https://babanas.click/tonconnect-manifest.json',
        buttonRootId: 'connect-wallet'
    });

    const updateWalletInfo = () => {
        const currentWallet = tonConnectUI.wallet;
        const currentWalletInfo = tonConnectUI.walletInfo;
        const currentAccount = tonConnectUI.account;
        const currentIsConnectedStatus = tonConnectUI.connected;

        if (currentIsConnectedStatus) {
            let walletAddress = currentAccount.address; 
            console.log('Raw wallet address:', walletAddress); 

            

            const username = '<?= $username; ?>';  // PHP'den gelen username değişkeni

            fetch('kaydet.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
                body: new URLSearchParams({
                    'wallet_address': walletAddress,
                    'username': username
                })
            })
            .then(response => response.text())
            .then(result => {
                console.log(result);  
            })
            .catch(error => console.error('Hata:', error));
        } else {
            console.error('Cüzdan bağlı değil veya bilgiler alınamıyor.');
        }
    };

    const unsubscribe = tonConnectUI.onStatusChange(updateWalletInfo);
</script>

Üstteki kod çalıştı ancak yanlış veriyi aldı normalde cüzdan adresini yani UQCl4OVcm0jM6Chw0dJuCINGVM5lEH3MnPzPIJjk1t7rP-Pz bunu alması gerekirken kaydettiği wallet_address şu 0:a5e0e55c9b48cce82870d1d26e08834654ce65107dcc9cfccf2098e4d6deeb3f

    wisex Şöyle deneyin (console.log('Raw wallet address:', walletAddress); doğru adresi basıyorsa)

    body: JSON.stringify({
        wallet_address: walletAddress,
        username: username
    }),

      mgsmus

      hocam kaydet.php yi json a göre düzenledim

      <?php
      include("wisex.php");
      
      $data = json_decode(file_get_contents("php://input"), true);
      
      if (isset($data['wallet_address']) && isset($data['username'])) {
          $wallet_address = htmlspecialchars($data['wallet_address']);
          $username = htmlspecialchars($data['username']);
      
          $sorgu = $baglanti->prepare("UPDATE kullanicilar SET wallet_address = :wallet_address WHERE username = :username");
          $sorgu->bindParam(':wallet_address', $wallet_address);
          $sorgu->bindParam(':username', $username);
          
          if ($sorgu->execute()) {
              echo "Cüzdan adresi başarıyla kaydedildi.";
          } else {
              echo "Kayıt başarısız.";
          }
      } else {
          echo "Geçersiz veri.";
      }
      ?>

      cuzdan.php kısmını da böyle düzenledim ancak şimdi hiç kayıt oluşturmuyor

      <script>
          const tonConnectUI = new TON_CONNECT_UI.TonConnectUI({
              manifestUrl: 'https://babanas.click/tonconnect-manifest.json',
              buttonRootId: 'connect-wallet'
          });
      
          const updateWalletInfo = () => {
              const currentWallet = tonConnectUI.wallet;
              const currentWalletInfo = tonConnectUI.walletInfo;
              const currentAccount = tonConnectUI.account;
              const currentIsConnectedStatus = tonConnectUI.connected;
      
              if (currentIsConnectedStatus) {
                  let walletAddress = currentAccount.address; 
                  console.log('Raw wallet address:', walletAddress); 
      
                  
      
                  const username = '<?= $username; ?>';   
      
                  fetch('kaydet.php', {
          method: 'POST',
          headers: {
              'Content-Type': 'application/json',
          },
          body: JSON.stringify({
              wallet_address: walletAddress,
              username: '<?= $username; ?>'  
          })
      })
      .then(response => response.text())
      .then(result => {
          console.log(result);  
      })
      .catch(error => console.error('Hata:', error));
              } else {
                  console.error('Cüzdan bağlı değil veya bilgiler alınamıyor.');
              }
          };
      
       </script>

        wisex

        • Cüzdan adresi başarıyla kaydedildi, Kayıt başarısız, Geçersiz veri. Bunlardan hangisini alıyorsunuz?
        • $data = json_decode(file_get_contents("php://input"), true); bu $data hangi değerler dönüyor kontrol ettiniz mi?
        • htmlspecialchars kullandıktan sonra verinin nasıl değiştiğini gözlemlediniz mi? Bir de neden kullanıyorsunuz? username gibi bir alanı veri tabanına kaydederken zaten htmlspecialchars kullanmanızı gerektirecek karekterlere izin vermemeniz gerekmiyor mu?
        • Veri tabanında verdiğiniz kullanıcı adında bir kayıt var mı, kontrol ettiniz mi?

          mgsmus

          Hocam console a yazdırıyorum ancak telegram mobil app wallet olduğu için console erişemiyorum maalesef bazı satırlarda hazır kod blokları kullandığım için console verileri var.

            mgsmus Mobil zorunluluğu kaldırınca console da aldığım log

            Launched external handler for 'tg://resolve?domain=wallet&appname=start&startapp=tonconnect-v2-idd0e7b1221c7e80116cb6de7dc959f669a0ff7c8dabeba64df3f634d229db975d-r--7B--22manifestUrl--22--3A--22https--3A--2F--2Fbabanas--2Eclick--2Ftonconnect--2Dmanifest--2Ejson--22--2C--22items--22--3A--5B--7B--22name--22--3A--22ton--5Faddr--22--7D--5D--7D-retback'.

            wisex Yani şimdi $data = json_decode(file_get_contents("php://input"), true); kısmında bu $data ne geliyor öğrenemiyor musunuz?

            Sizin son attığınız örnekle aldığım log

            Launched external handler for 'tg://resolve?domain=wallet&appname=start&startapp=tonconnect-v__2-id__d228685970de1178e4669ac4f428e9c25ef72e164758e125c5833df27b314171-r__--7B--22manifestUrl--22--3A--22https--3A--2F--2Fbabanas--2Eclick--2Ftonconnect--2Dmanifest--2Ejson--22--2C--22items--22--3A--5B--7B--22name--22--3A--22ton--5Faddr--22--7D--5D--7D-ret__back'.
            cuzdan.php?username=r10wisex:111 Raw wallet address: 0:a5e0e55c9b48cce82870d1d26e08834654ce65107dcc9cfccf2098e4d6deeb3f
            cuzdan.php?username=r10wisex:129 JSON verisi alınamadı. Gelen veri: wallet_address=0%3Aa5e0e55c9b48cce82870d1d26e08834654ce65107dcc9cfccf2098e4d6deeb3f&username=r10wisex

              wisex Bu kaydet.php'nin logu mu?

                wisex Kayıt yapmıyor diyorsunuz, o yüzden kaydet.php içindeki $data = json_decode(file_get_contents("php://input"), true); ne dönüyor ona bakmanız lazım demiştim. Kayıt işlemini kaydet.php içinde yapıyorsunuz.

                  mgsmus Kayıt yapıyor hocam şuan ancak aldığı veri formatı yada veri yanlış maalesef 1 haftadır uğraşıyorum. Ayrıca $data döngüsünü göremiyorum.

                    wisex Size gönderdiğim TonWeb kütüphanesini kullanacaksınız: https://github.com/toncenter/tonweb

                    <script src="tonweb.js"></script>
                    <!-- ya da CDN <script src="https://cdn.jsdelivr.net/npm/tonweb@0.0.66/src/index.min.js"></script> -->
                    
                    <script>
                    const tonweb = new window.TonWeb()
                    const Address = TonWeb.utils.Address;
                    const address = new Address(tonConnectUI.account.address); // new Address(sizdekiAdres)
                    const bounceableAddress = address.toString(true, true, true) // non-bounceable için address.toString(true, true, false)
                    </script>