2017-09-04 5 views
10

私はストライプで支払いを処理する簡単なウェブサイトを構築しています。私は私のスタイリングにBootstrapを使用しています。ストライプエレメントを使用して支払いフィールドを挿入すると、それらはブートストラップでスタイルされません。 Bootstrapのスタイリングをエレメントの支払いフィールドに適用するにはどうしたらいいですか?ストライプエレメントの入力をブートストラップでスタイルするにはどうすればよいですか?

答えて

6

もう少しドキュメントの周りに掘った後、私は https://stripe.com/docs/stripe.js#the-element-containerが言うことがわかった「あなたは あなたはそれがあなたのページの をしたかのように要素をマウントするコンテナのスタイルを設定する必要があります。」

私はフィールドは他のほとんどのブートストラップスタイルの入力フィールドのように見え、中に素子を搭載しています<div>にブートストラップのform-controlクラスを追加することにより:

<div id="card-element" class="form-control"></div> 

いくつかの理由について、フィールドの高さはdoesnの「tはかなり一致しますが、試行錯誤しながら、私はそれを を得た:

var stripe = Stripe('your_key'); 
var elements = stripe.elements(); 
var card = elements.create('card', { style: 
    { 
    base: { 
     lineHeight: '1.429' 
    } 
    } 
}); 
card.mount('#card-element'); 
+0

これは当てはまりますが、要素がフォーカスされているときに境界線の色を適用する必要があります。また、ブートストラップ4ベータ版を使用していて入力グループを使用しようとしている場合は、エレメントCSSを 'display:flex'ではなく' display:block'に変更する必要があります。私はこれの実証的なデモを持っています...しかし、それはあなたの質問に対する答えではありません...そうでない限り。 –

+0

大きなポイント!それは答えのように聞こえます:)私はデモを見るのが大好きです。 – michael

10

さてさて、私はStripe.js V2を使用していた、とセキュリティ上の脆弱性がに説明したので、私は、これを理解しなければなりませんでした私はStripeの技術サポートによって、Stripe.js v3の "Elements"に切り替える義務があると感じました。彼らが言ったことは、あなたのクレジットカードフォーム要素と同じページのJavaScriptが、慎重なクレジットカードデータの価値を得ることができたということでした。人が外部のスクリプトを引っ張っていた場合、これが起こる可能性があると思います。それが起こったに違いないと思うか、それとも気にしないでしょう。とにかく、これは私がStripe.js v3の要素をBootstrap 4の入力グループと一緒に使う方法です。完全な実例ですが、公開鍵を変更するだけです。

デフォルトのjQueryベースの例

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 
    <title>Stripe.js v3 with Bootstrap 4 Test</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> 
    <style> 
     /* Blue outline on focus */ 
     .StripeElement--focus { 
      border-color: #80BDFF; 
      outline:0; 
      box-shadow: 0 0 0 .2rem rgba(0,123,255,.25); 
      transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; 
     } 
     /* Can't see what I type without this */ 
     #card-number.form-control, 
     #card-cvc.form-control, 
     #card-exp.form-control { 
      display:inline-block; 
     } 
    </style> 
</head> 
<body> 

    <div class="container-fluid"> 
     <h1 class="mt-5">Stripe.js v3 with Bootstrap 4 (beta) Test</h1> 
     <div id="card-errors" role="alert"></div> 
     <div class="card"> 
      <div class="card-body"> 
       <form id="payment-form"> 
        <label for="name">Name on Card</label> 
        <div class="input-group mb-2"> 
         <div class="input-group-prepend"> 
          <span class="input-group-text">A</span> 
         </div> 
         <input type="text" class="form-control" id="name"> 
         <div class="input-group-append"> 
          <span class="input-group-text">B</span> 
         </div> 
        </div> 
        <label for="card-number">Credit Card Number</label> 
        <div class="input-group mb-2"> 
         <div class="input-group-prepend"> 
          <span class="input-group-text">C</span> 
         </div> 
         <span id="card-number" class="form-control"> 
          <!-- Stripe Card Element --> 
         </span> 
         <div class="input-group-append"> 
          <span class="input-group-text">D</span> 
         </div> 
        </div> 
        <label for="card-cvc">CVC Number</label> 
        <div class="input-group mb-2"> 
         <div class="input-group-prepend"> 
          <span class="input-group-text">E</span> 
         </div> 
         <span id="card-cvc" class="form-control"> 
          <!-- Stripe CVC Element --> 
         </span> 
        </div> 
        <label for="card-exp">Expiration</label> 
        <div class="input-group mb-2"> 
         <span id="card-exp" class="form-control"> 
          <!-- Stripe Card Expiry Element --> 
         </span> 
         <div class="input-group-append"> 
          <span class="input-group-text">F</span> 
         </div> 
        </div> 
        <button id="payment-submit" class="btn btn-primary mt-1">Submit Payment</button> 
       </form> 
      </div> 
     </div> 
    </div> 

<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> 
<script src="https://js.stripe.com/v3/"></script> 
<script> 
    $(document).ready(function(){ 

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

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

     // Try to match bootstrap 4 styling 
     var style = { 
      base: { 
       'lineHeight': '1.35', 
       'fontSize': '1.11rem', 
       'color': '#495057', 
       'fontFamily': 'apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif' 
      } 
     }; 

     // Card number 
     var card = elements.create('cardNumber', { 
      'placeholder': '', 
      'style': style 
     }); 
     card.mount('#card-number'); 

     // CVC 
     var cvc = elements.create('cardCvc', { 
      'placeholder': '', 
      'style': style 
     }); 
     cvc.mount('#card-cvc'); 

     // Card expiry 
     var exp = elements.create('cardExpiry', { 
      'placeholder': '', 
      'style': style 
     }); 
     exp.mount('#card-exp'); 

     // Submit 
     $('#payment-submit').on('click', function(e){ 
      e.preventDefault(); 
      var cardData = { 
       'name': $('#name').val() 
      }; 
      stripe.createToken(card, cardData).then(function(result) { 
       console.log(result); 
       if(result.error && result.error.message){ 
        alert(result.error.message); 
       }else{ 
        alert(result.token.id); 
       } 
      }); 
     }); 

    }); 
</script> 
</body> 
</html> 

は、私はAndroid上のFirefox、クロム、およびChromeでテストしました。うまく動作するようです。問題が発生した場合はお知らせください。

オプションVue.jsベースの例

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 
    <title>Stripe.js v3 with Bootstrap 4 and Vue.js</title> 
    <link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap/dist/css/bootstrap.min.css"/> 
    <link type="text/css" rel="stylesheet" href="https://unpkg.com/[email protected]/dist/bootstrap-vue.css"/> 
    <style> 
     /* This background color not essential for the example */ 
     html, body { 
      background:#999; 
     } 

     /* Padding for Stripe Element containers */ 
     .stripe-element-container { 
      padding-top: .55rem; 
      padding-bottom: .50rem; 
     } 

     /* Blue outline on focus */ 
     .StripeElement--focus { 
      border-color: #80BDFF; 
      outline:0; 
      box-shadow: 0 0 0 .2rem rgba(0,123,255,.25); 
      transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out; 
     } 

     /* Can't see what I type without this */ 
     #card-number.form-control, 
     #card-cvc.form-control, 
     #card-exp.form-control { 
      display:inline-block; 
     } 
    </style> 
</head> 
<body> 
    <div id="app"> 
     <stripe-form inline-template> 
      <div class="container-fluid"> 
       <div class="row"> 
        <div class="col-md-4 offset-md-4 pt-5"> 
         <div class="card"> 
          <div class="card-header"> 
           <h3 class="mb-0">Pay Now</h3> 
          </div> 
          <div class="card-body"> 
           <div v-bind:class="{alert: activeError, 'alert-danger': activeError}" role="alert" v-html="errorText"></div> 

           <form> 

            <div class="form-group mb-4"> 
             <label for="name">Name on Card</label> 
             <input type="text" class="form-control" v-model="ccName" /> 
            </div> 

            <div class="form-group"> 
             <label for="card-number">Credit Card Number</label> 
             <span id="card-number" class="form-control stripe-element-container"> 
              <!-- Stripe Card Element --> 
             </span> 
            </div> 

            <div class="form-group"> 
             <label for="card-cvc">CVC Number</label> 
             <span id="card-cvc" class="form-control stripe-element-container"> 
              <!-- Stripe CVC Element --> 
             </span> 
            </div> 

            <div class="form-group"> 
             <label for="card-exp">Expiration</label> 
             <span id="card-exp" class="form-control stripe-element-container"> 
              <!-- Stripe Card Expiry Element --> 
             </span> 
            </div> 

            <button @click.prevent="paymentSubmit" class="btn btn-primary mt-1 float-right">Submit Payment</button> 

           </form> 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
     </stripe-form> 
     <modal></modal> 
    </div> 

<script src="https://unpkg.com/[email protected]/dist/vue.js"></script> 
<script src="https://unpkg.com/[email protected]/dist/polyfill.min.js"></script> 
<script src="https://unpkg.com/[email protected]/dist/bootstrap-vue.js"></script> 
<script src="https://js.stripe.com/v3/"></script> 
<script> 

// Your Stripe public key 
const stripePublicKey = 'pk_test_XxXxXxXxXxXxXxXxXxXxXxXx'; 

/** 
* Class allows firing of events and 
* listening of events between components 
*/ 
window.Events = new class { 

    constructor(){ 
     this.vue = new Vue(); 
    } 

    fire(event, data = null){ 
     this.vue.$emit(event, data); 
    } 

    listenFor(event, callback){ 
     this.vue.$on(event, callback); 
    } 
} 

/** 
* See: https://bootstrap-vue.js.org/docs/components/modal/ 
*/ 
Vue.component('modal', { 

    template: ` 
     <div> 
      <b-modal ref="myModalRef" ok-only ok-title="Close" v-bind:title="title"> 
       <p class="mb-0">{{ body }}</p> 
      </b-modal> 
     </div> 
    `, 

    data: function(){ 
     return { 
      title: '', 
      body: '' 
     } 
    }, 

    methods: { 
     showModal() { 
      this.$refs.myModalRef.show() 
     } 
     /* This not needed for this example 
     , 
     hideModal() { 
      this.$refs.myModalRef.hide() 
     } 
     */ 
    }, 

    created(){ 
     Events.listenFor('modalShow', (data) => { 
      this.title = data.title; 
      this.body = data.message; 
      this.showModal(); 
     }); 
    } 

}); 

Vue.component('stripe-form', { 

    data: function(){ 
     return { 
      activeError: false, 
      errorText: '', 
      ccName: '', 
      stripe: null, 
      card: null, 
      cvc: null, 
      exp: null 
     } 
    }, 

    methods: { 
     paymentSubmit: function(){ 
      let cardData = { 
       'name': this.ccName 
      }; 
      // Ensure the name field is not empty 
      if(cardData.name.trim() == ''){ 
       // Show an error 
       this.activeError = true; 
       this.errorText = '<b>Submission Error:</b><br />Name is required.'; 
       // Abort !! 
       return; 
      } 
      this.stripe.createToken(this.card, cardData).then((result) => { 
       if(result.error && result.error.message){ 

        // Show any errors 
        this.activeError = true; 
        this.errorText = '<b>Submission Error:</b><br />' + result.error.message; 

       }else{ 

        /** 
        * Success message in modal. 
        * This is normally where you'd post to your server, 
        * and have it actually attempt the credit card transaction 
        * using the token ID that was just received. 
        */ 
        Events.fire('modalShow', { 
         'title': 'Success', 
         'message': result.token.id 
        }); 

        // Clear the form 
        this.activeError = false; 
        this.errorText = ''; 
        this.ccName = ''; 
        // Stripe elements must be cleared in a special way 
        this.card.clear(); 
        this.cvc.clear(); 
        this.exp.clear(); 
       } 
      }); 
     } 
    }, 

    mounted: function(){ 
     // Create a Stripe client 
     this.stripe = Stripe(stripePublicKey); 

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

     /** 
     * Try to match bootstrap 4 styling. 
     * -------------------------------- 
     * fontSize was in rem units, but Stripe says that it should be in pixels. 
     */ 
     const style = { 
      base: { 
       'fontSize': '16px', 
       'color': '#495057', 
       'fontFamily': 'apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif' 
      } 
     }; 

     // Card number 
     this.card = elements.create('cardNumber', { 
      'placeholder': '', 
      'style': style 
     }); 
     this.card.mount('#card-number'); 

     // CVC 
     this.cvc = elements.create('cardCvc', { 
      'placeholder': '', 
      'style': style 
     }); 
     this.cvc.mount('#card-cvc'); 

     // Card expiry 
     this.exp = elements.create('cardExpiry', { 
      'placeholder': '', 
      'style': style 
     }); 
     this.exp.mount('#card-exp'); 
    } 

}); 

new Vue({ el: '#app' }); 

</script> 
</body> 
</html> 

これは、例えば、いくつかの仕事から利益を得ることができるが、あなたが始めるのに役立つかもしれVue.js。

+0

これは私にとって素晴らしいですね!あなたは間違いなく私が見逃したいくつかのスタイルをキャッチしました。 – michael

関連する問題