2017-03-26 35 views
7

Şerit ödemeyi kullanmanın gerçekten basit bir örneğini oluşturmaya çalışıyorum. Bu Bu i dayanarak javascript konsoldaŞerit ödeme örneği görüntülenmiyor

Uncaught Error: The selector you specified (#card-element) applies to no DOM elements that are currently on the page. 
Make sure the element exists on the page before calling mount(). 
    at new t (js.stripe.com/:1) 
    at t.value (js.stripe.com/:1) 

var hatadır ben Stripe

gelen örneği takip

// Create a Stripe client 
 
var stripe = Stripe('pk_test_XSHE4IYLLy9qCPe7lW7pK4ZE'); 
 

 
// Create an instance of Elements 
 
var elements = stripe.elements(); 
 

 
// Custom styling can be passed to options when creating an Element. 
 
// (Note that this demo uses a wider set of styles than the guide below.) 
 
var style = { 
 
base: { 
 
    color: '#32325d', 
 
    lineHeight: '24px', 
 
    fontFamily: '"Helvetica Neue", Helvetica, sans-serif', 
 
    fontSmoothing: 'antialiased', 
 
    fontSize: '16px', 
 
    '::placeholder': { 
 
    color: '#aab7c4' 
 
    } 
 
}, 
 
invalid: { 
 
    color: '#fa755a', 
 
    iconColor: '#fa755a' 
 
} 
 
}; 
 

 
// Create an instance of the card Element 
 
var card = elements.create('card', {style: style}); 
 

 
// Add an instance of the card Element into the `card-element` <div> 
 
card.mount('#card-element'); 
 

 
// Handle real-time validation errors from the card Element. 
 
card.addEventListener('change', function(event) { 
 
var displayError = document.getElementById('card-errors'); 
 
if (event.error) { 
 
    displayError.textContent = event.error.message; 
 
} else { 
 
    displayError.textContent = ''; 
 
} 
 
}); 
 

 
// Handle form submission 
 
var form = document.getElementById('payment-form'); 
 
form.addEventListener('submit', function(event) { 
 
event.preventDefault(); 
 

 
stripe.createToken(card).then(function(result) { 
 
    if (result.error) { 
 
    // Inform the user if there was an error 
 
    var errorElement = document.getElementById('card-errors'); 
 
    errorElement.textContent = result.error.message; 
 
    } else { 
 
    // Send the token to your server 
 
    stripeTokenHandler(result.token); 
 
    } 
 
}); 
 
});
.StripeElement { 
 
background-color: white; 
 
padding: 8px 12px; 
 
border-radius: 4px; 
 
border: 1px solid transparent; 
 
box-shadow: 0 1px 3px 0 #e6ebf1; 
 
-webkit-transition: box-shadow 150ms ease; 
 
transition: box-shadow 150ms ease; 
 
} 
 

 
.StripeElement--focus { 
 
box-shadow: 0 1px 3px 0 #cfd7df; 
 
} 
 

 
.StripeElement--invalid { 
 
border-color: #fa755a; 
 
} 
 

 
.StripeElement--webkit-autofill { 
 
background-color: #fefde5 !important; 
 
}
<html lang="en"> 
 
    <head> 
 
    <meta charset="utf-8"> 
 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
 
    <script src="https://js.stripe.com/v3/"></script> 
 
    <title>test</title> 
 
    </head> 
 
    <body> 
 
    <form action="/charge" method="post" id="payment-form"> 
 
     <div class="form-row"> 
 
     <label for="card-element"> 
 
      Credit or debit card 
 
     </label> 
 
     <div id="card-element"> 
 
      <!-- a Stripe Element will be inserted here. --> 
 
     </div> 
 

 
     <!-- Used to display form errors --> 
 
     <div id="card-errors"></div> 
 
     </div> 
 

 
     <button>Submit Payment</button> 
 
    </form> 
 

 
    </body> 
 
</html>

benim PHP dosyasıdır hata, sanırım js js # kart-elementini bulamadı. Ama orada.

Bu bir dökümü sorun olabilir: D ancak bu ilk defa şerit kullanıyorum, bu yüzden birisi bana yardım ederse harika olur. Çok teşekkürler.

+0

gibi, gelen html sonra komut var mı atmak? Kodunuza bakmadan hala 'stripeTokenHandler' (result.token) tarafından başvurulan şekilde 'stripeTokenHandler' öğesini tanımlamanız gerekiyor gibi görünüyor, --- --- burada bir örnek var https://stripe.com/docs/elements#submit-token – duck

+0

@duck Sadece örneklerini tam olarak takip ettim. Mesajımı düzenledim, hataları görebiliyorum. Çok fazla – trinhdh

+4

hmm, 'no DOM öğesi' hatası alıyorsanız, evet, JS'yi sayfada # kart-öğesi var olmadan önce yüklediğinize benziyor. Burada bir örneğe bakın http://jsbin.com/dukecivela/edit?html, çıkış – duck

cevap

5

Komut dosyasını başlığa eklemeyin, yerine gövdeyi kapatmadan hemen önce ekleyin.

<html lang= "en"> 
    <head> 
     <meta charset="utf-8"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
     <title>test</title> 
    </head> 
    <body> 
     <form action="/charge" method="post" id="payment-form"> 
      <div class="form-row"> 
       <label for="card-element"> 
        Credit or debit card 
       </label> 
       <div id="card-element"> 
       <!-- a Stripe Element will be inserted here. --> 
       </div> 
       <!-- Used to display form errors --> 
       <div id="card-errors"></div> 
      </div> 
      <button>Submit Payment</button> 
     </form> 
     <script src="https://js.stripe.com/v3/"></script> 
    </body> 
</html> 

altta Senaryonu koyarak bu hile yapacağım böylece DOM senaryoyu yürütmeden önce işlenen olmasını sağlar!

3

yerde özellikle sen sıkışmış olduğunu

<from></from> 
//after your stripe form put stripe script 
<script><script> 

Körük

<style type="text/css"> 
    * { 
    font-family: "Helvetica Neue", Helvetica; 
    font-size: 15px; 
    font-variant: normal; 
    padding: 0; 
    margin: 0; 
} 

html { 
    height: 100%; 
} 

body { 
    background: #E6EBF1; 
    align-items: center; 
    min-height: 100%; 
    display: flex; 
    width: 100%; 
} 

form { 
    width: 480px; 
    margin: 20px auto; 
} 

.group { 
    background: white; 
    box-shadow: 0 7px 14px 0 rgba(49,49,93,0.10), 
       0 3px 6px 0 rgba(0,0,0,0.08); 
    border-radius: 4px; 
    margin-bottom: 20px; 
} 

label { 
    position: relative; 
    color: #8898AA; 
    font-weight: 300; 
    height: 40px; 
    line-height: 40px; 
    margin-left: 20px; 
    display: block; 
} 

.group label:not(:last-child) { 
    border-bottom: 1px solid #F0F5FA; 
} 

label > span { 
    width: 20%; 
    text-align: right; 
    float: left; 
} 

.field { 
    background: transparent; 
    font-weight: 300; 
    border: 0; 
    color: #31325F; 
    outline: none; 
    padding-right: 10px; 
    padding-left: 10px; 
    cursor: text; 
    width: 70%; 
    height: 40px; 
    float: right; 
} 

.field::-webkit-input-placeholder { color: #CFD7E0; } 
.field::-moz-placeholder { color: #CFD7E0; } 
.field:-ms-input-placeholder { color: #CFD7E0; } 

button { 
    float: left; 
    display: block; 
    background: #666EE8; 
    color: white; 
    box-shadow: 0 7px 14px 0 rgba(49,49,93,0.10), 
       0 3px 6px 0 rgba(0,0,0,0.08); 
    border-radius: 4px; 
    border: 0; 
    margin-top: 20px; 
    font-size: 15px; 
    font-weight: 400; 
    width: 100%; 
    height: 40px; 
    line-height: 38px; 
    outline: none; 
} 

button:focus { 
    background: #555ABF; 
} 

button:active { 
    background: #43458B; 
} 

.outcome { 
    float: left; 
    width: 100%; 
    padding-top: 8px; 
    min-height: 24px; 
    text-align: center; 
} 

.success, .error { 
    display: none; 
    font-size: 13px; 
} 

.success.visible, .error.visible { 
    display: inline; 
} 

.error { 
    color: #E4584C; 
} 

.success { 
    color: #666EE8; 
} 

.success .token { 
    font-weight: 500; 
    font-size: 13px; 
} 
</style> 

<form action="subscription.php" method="post"> 
    <div class="group"> 
    <label> 
     <span>Name</span> 
     <input name="cardholder-name" class="field" placeholder="Jane Doe" /> 
    </label> 
    <label> 
     <span>Phone</span> 
     <input class="field" placeholder="(123) 456-7890" type="tel" /> 
    </label> 
    </div> 
    <div class="group"> 
    <label> 
     <span>Card</span> 
     <div id="card-element" class="field"></div> 
    </label> 
    </div> 
    <button type="submit">Pay $25</button> 
    <div class="outcome"> 
    <div class="error" role="alert"></div> 
    <div class="success"> 
     Success! Your Stripe token is <span class="token"></span> 
    </div> 
    </div> 
</form> 
<script src="https://js.stripe.com/v3/"></script> 
<script type="text/javascript"> 

    var stripe = Stripe('YOUR_PUBLIC_KEY'); 
    var elements = stripe.elements(); 

var card = elements.create('card', { 
    style: { 
    base: { 
     iconColor: '#666EE8', 
     color: '#31325F', 
     lineHeight: '40px', 
     fontWeight: 300, 
     fontFamily: '"Helvetica Neue", Helvetica, sans-serif', 
     fontSize: '15px', 

     '::placeholder': { 
     color: '#CFD7E0', 
     }, 
    }, 
    } 
}); 

card.mount('#card-element'); 
function setOutcome(result) { 
    var successElement = document.querySelector('.success'); 
    var errorElement = document.querySelector('.error'); 
    successElement.classList.remove('visible'); 
    errorElement.classList.remove('visible'); 

    if (result.token) { 
    // Use the token to create a charge or a customer 
    // https://stripe.com/docs/charges 
    successElement.querySelector('.token').textContent = result.token.id; 
    successElement.classList.add('visible'); 
    } else if (result.error) { 
    errorElement.textContent = result.error.message; 
    errorElement.classList.add('visible'); 
    } 
} 

card.on('change', function(event) { 
    setOutcome(event); 
}); 

document.querySelector('form').addEventListener('submit', function(e) { 
    e.preventDefault(); 
    var form = document.querySelector('form'); 
    var extraDetails = { 
    name: form.querySelector('input[name=cardholder-name]').value, 
    }; 
    stripe.createToken(card, extraDetails).then(setOutcome); 
}); 
</script>