paytr entegrasyonu yapmaya çalışıyorum daha önce de bir çok kez entegrasyon yapmıştım ama hiç böyle bir hata ile karşılaşmamıştım bu hatayı bir türlü aşamıyorum kodları onlarca kez inceledim ama hatamı bulamadım yardımcı olabilecek var mı acaba ?
Aldığım hata bu :
{"status":"failed","reason":"paytr_token gonderilmedi veya gecersiz"}
Nodejs kodlarım ise şöyle :
var basket = JSON.stringify([
['Örnek Ürün 1', '50.00', 1], // 1. ürün (Ürün Ad - Birim Fiyat - Adet)
]);
var user_basket = basket;
var merchant_oid = "IN" + Date.now(); // Sipariş numarası: Her işlemde benzersiz olmalıdır!! Bu bilgi bildirim sayfanıza yapılacak bildirimde geri gönderilir.
var user_ip = '0.0.0.0.'; // ip adresim var normalde burda
var email = 'testnon3d@paytr.com'; // Müşterinizin sitenizde kayıtlı veya form vasıtasıyla aldığınız eposta adresi.
var payment_amount = '100.99'; // Tahsil edilecek tutar.
var currency = 'TL';
var test_mode = '1';
var user_name = 'PayTR Test';
var user_address = 'test test test'; // Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız adres bilgisi.
var user_phone = '05555555555';
// Başarılı ödeme sonrası müşterinizin yönlendirileceği sayfa.
// Bu sayfa siparişi onaylayacağınız sayfa değildir! Yalnızca müşterinizi bilgilendireceğiniz sayfadır!
// Siparişi onaylayacağız sayfa "Bildirim URL" sayfasıdır (Bakınız: 2.ADIM Klasörü ve sayfanın devamında bulunan /callback adımı).
var merchant_ok_url = 'https://demo.com/odeme_basarili.php';
// Ödeme sürecinde beklenmedik bir hata oluşması durumunda müşterinizin yönlendirileceği sayfa
// Bu sayfa siparişi iptal edeceğiniz sayfa değildir! Yalnızca müşterinizi bilgilendireceğiniz sayfadır!
var merchant_fail_url = 'https://demo.com/odeme_hata.php';
var debug_on = 1;
var client_lang = 'tr'; //Ödeme süreci dil seçeneği tr veya en.
var payment_type = 'card'; // Ödeme türü
var non_3d = '0'; //3d'siz işlem
var card_type = 'axess'; // Alabileceği değerler; advantage, axess, combo, bonus, cardfinans, maximum, paraf, world
var installment_count = '0'; // Taksit Sayısı
//non3d işlemde, başarısız işlemi test etmek için 1 gönderilir (test_mode ve non_3d değerleri 1 ise dikkate alınır!)
var non3d_test_failed = '1';
router.get("/odeme", async (req, res) => {
var hashSTR = `${merchant_id}${user_ip}${merchant_oid}${email}${payment_amount}${payment_type}${installment_count}${currency}${test_mode}${non_3d}`;
var paytr_token = hashSTR + merchant_salt;
var token = crypto.createHmac('sha256', merchant_key).update(paytr_token).digest('base64');
context = {
merchant_id,
user_ip,
merchant_oid,
email,
payment_type,
payment_amount,
currency,
test_mode,
non_3d,
merchant_ok_url,
merchant_fail_url,
user_name,
user_address,
user_phone,
user_basket,
debug_on,
client_lang,
token,
non3d_test_failed,
installment_count,
card_type,
};
const site = await sites.findOne({});
const blog = await blogs.find();
const test = await Test.find();
res.render('home/pages/odeme', { site, user: req.user, blog, test});
});odeme.ejs kodum da böyle :<form action="https://www.paytr.com/odeme" method="post">
<div class="row mt-4 mt-lg-5">
<div class="col-12">
<!--
Hatalı giriş durumunda ilgili "input-group"a "error" classı eklenmeli
-->
<div class="input-group w-100 position-relative">
<input id="kart-isim" name="cc_owner" placeholder="Kart Üzerindeki İsim" class="w-100" type="text" required="" value="PAYTR TEST">
<img src="https://www.demo.com/assets/dist/img/kart-user.svg" alt="">
<div class="error-message">Hatalı Giriş</div>
</div>
</div>
<div class="col-12 mt-4">
<div class="input-group w-100 position-relative">
<input minlength="19" name="card_number" id="card_number" placeholder="Kart Numarası" class="w-100" type="text" required="" maxlength="19" value="9792030394440796">
<img id="card-number-svg" src="https://www.demo.com/assets/dist/img/kart-card.svg" alt="">
<div class="error-message">Hatalı Giriş</div>
</div>
</div>
<div class="col-6 mt-4">
<div class="tia-row-inner">
<div class="input-sm-header">Son Kullanma Tarihi</div>
<select name="expiry_month" id="expiry_month" required="">
<option value="">Ay</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
<select required="" name="expiry_year">
<option value="">Yıl</option>
<option value="2023">2023</option>
<option value="2024">2024</option>
<option value="2025">2025</option>
<option value="2026">2026</option>
<option value="2027">2027</option>
<option value="2028">2028</option>
<option value="2029">2029</option>
<option value="2030">2030</option>
<option value="2031">2031</option>
<option value="2032">2032</option>
<option value="2033">2033</option>
<option value="2034">2034</option>
<option value="2035">2035</option>
<option value="2036">2036</option>
<option value="2037">2037</option>
<option value="2038">2038</option>
<option value="2039">2039</option>
<option value="2040">2040</option>
<option value="2041">2041</option>
<option value="2042">2042</option>
<option value="2043">2043</option>
<option value="2044">2044</option>
<option value="2045">2045</option>
<option value="2046">2046</option>
<option value="2047">2047</option>
<option value="2048">2048</option>
<option value="2049">2049</option>
</select>
</div>
</div>
<div class="col-6 mt-4">
<div class="input-group w-100 position-relative">
<input id="cvv" name="cvv" placeholder="CVV" class="w-100" type="password" value="000" required="" maxlength="3">
<img src="https://www.demo.com/assets/dist/img/kart-cvv.svg" alt="">
<div class="error-message">Hatalı Giriş</div>
</div>
</div>
<div class="col-12 mt-2">
<!-- Hizmet sözleşmesi -->
<div class="d-flex align-items-center my-3">
<!-- Rounded switch -->
<label class="switch flex-shrink-0">
<input id="sozlesmeler" name="sell_confirm" type="checkbox" required="">
<span class="slider round"></span>
</label>
</div>
</div>
<input type="hidden" name="merchant_id" value="<%= context.merchant_id %>">
<input type="hidden" name="user_ip" value="<%= context.user_ip %>">
<input type="hidden" name="merchant_oid" value="<%= context.merchant_oid %>">
<input type="hidden" name="email" value="<%= context.email %>">
<input type="hidden" name="payment_type" value="<%= context.payment_type %>">
<input type="hidden" name="payment_amount" value="<%= context.payment_amount %>">
<input type="hidden" name="currency" value="<%= context.currency %>">
<input type="hidden" name="test_mode" value="<%= context.test_mode %>">
<input type="hidden" name="non_3d" value="<%= context.non_3d %>">
<input type="hidden" name="merchant_ok_url" value="<%= context.merchant_ok_url %>">
<input type="hidden" name="merchant_fail_url" value="<%= context.merchant_fail_url %>">
<input type="hidden" name="user_name" value="<%= context.user_name %>">
<input type="hidden" name="user_address" value="<%= context.user_address %>">
<input type="hidden" name="user_phone" value="<%= context.user_phone %>">
<input type="hidden" name="user_basket" value="<%= context.user_basket %>">
<input type="hidden" name="debug_on" value="<%= context.debug_on %>">
<input type="hidden" name="client_lang" value="<%= context.client_lang %>">
<input type="hidden" name="paytr_token" value="<%= context.token %>">
<input type="hidden" name="non3d_test_failed" value="<%= context.non3d_test_failed %>">
<input type="hidden" name="installment_count" value="<%= context.installment_count %>">
<input type="hidden" name="card_type" value="<%= context.card_type %>">
<div class="col-12">
<!-- Hizmet sözleşmesi -->
<div class="d-flex align-items-center">
<!-- Rounded switch -->
<label class="switch flex-shrink-0">
<input id="kart-saklama" name="save_credit_card_confitm" type="checkbox">
<span class="slider round"></span>
</label>
<div class="sozlesme">
Kart bilgilerimin <strong>güvenli</strong> paytr
sunucularında saklanmasını kabul ediyorum.
</div>
</div>
</div>
<div class="col-12 mt-4 d-none d-lg-block">
<div class="alert alert-danger contractAlert">bilgilendirme metnini kabul etmediniz.</div>
<button type="submit" value="Ödeme Yap" class="odeme-yap">
Ödeme Yap
</button>
</div>
