mirror of
				https://github.com/KevinMidboe/planetposen.git
				synced 2025-10-29 17:50:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			171 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
|   <div class="container">
 | ||
|     <div ref="confirmDiag" class="feedback-text"></div>
 | ||
|     <div class="card">
 | ||
|       <div ref="card"></div>
 | ||
|     </div>
 | ||
| 
 | ||
|     <Button @click="pay" :small="true">Pay</Button>
 | ||
| 
 | ||
|     <div class="applePay">
 | ||
|       <div ref="paymentRequestButton"></div>
 | ||
|     </div>
 | ||
|   </div>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| import { loadStripe } from '@stripe/stripe-js';
 | ||
| import Button from '@/components/ui/Button';
 | ||
| 
 | ||
| export default {
 | ||
|   components: {
 | ||
|     Button
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       clientSecret: null,
 | ||
|       card: null,
 | ||
|       stripe: null
 | ||
|     }
 | ||
|   },
 | ||
|   created() {
 | ||
|   },
 | ||
|   async mounted() {
 | ||
|     this.stripe = await loadStripe('pk_test_YiU5HewgBoClZCwHdhXhTxUn')
 | ||
|     this.mountCard();
 | ||
|     this.mountApplePay();
 | ||
| 
 | ||
|     this.makeIntent();
 | ||
|   },
 | ||
|   methods: {
 | ||
|     pay() {
 | ||
|       this.stripe.confirmCardPayment(this.clientSecret, {
 | ||
|         payment_method: {
 | ||
|           card: this.card,
 | ||
|           billing_details: {
 | ||
|             name: 'Kevin Testost'
 | ||
|           }
 | ||
|         }
 | ||
|       })
 | ||
|       .then(result => {
 | ||
|         if (result.error) {
 | ||
|           console.log('Error confirmPayment:', result.error.message)
 | ||
|         } else {
 | ||
|           if (result.paymentIntent.status === 'succeeded') {
 | ||
|             this.$refs.confirmDiag.innerText = 'Confirmed transaction!';
 | ||
|           }
 | ||
|         }
 | ||
|       })
 | ||
|     },
 | ||
|     makeIntent() {
 | ||
|       let url = '/api/stripe/create-payment-intent';
 | ||
|       if (window.location.href.includes('localhost'))
 | ||
|         url = 'http://localhost:30010'.concat(url)
 | ||
| 
 | ||
|       fetch(url, {
 | ||
|         method: 'POST',
 | ||
|         headers: {
 | ||
|           'Content-Type': 'application/json'
 | ||
|         }
 | ||
|       })
 | ||
|         .then(resp => resp.json())
 | ||
|         .then(data => this.clientSecret = data.clientSecret)
 | ||
|     },
 | ||
|     mountApplePay() {
 | ||
|       const paymentRequest = this.stripe.paymentRequest({
 | ||
|         country: 'NO',
 | ||
|         currency: 'nok',
 | ||
|         total: {
 | ||
|           label: 'Demo total',
 | ||
|           amount: 1009
 | ||
|         },
 | ||
| //        requestShipping: true,
 | ||
|         requestPayerName: true,
 | ||
|         requestPayerEmail: true
 | ||
|       });
 | ||
| 
 | ||
|       console.log('payment request:', paymentRequest);
 | ||
| 
 | ||
|       const elements = this.stripe.elements();
 | ||
|       const prButton = elements.create('paymentRequestButton', {
 | ||
|         paymentRequest
 | ||
|       });
 | ||
| 
 | ||
|       paymentRequest.on('paymentmethod', ev => {
 | ||
|         console.log('ev from paymentmethods:', ev)
 | ||
|         this.stripe.confirmCardPayment(this.clientSecret,
 | ||
|           { payment_method: ev.paymentMethod.id },
 | ||
|           { handleActions: false }
 | ||
|         ).then(confirmResult => {
 | ||
|           if (confirmResult.error) {
 | ||
|             console.log('confirm error:', confirmResult.error);
 | ||
|             ev.complete('fail');
 | ||
|           } else {
 | ||
|             console.log('confirm success:', confirmResult)
 | ||
|             ev.complete('success')
 | ||
|             this.stripe.confirmCardPayment(this.clientSecret)
 | ||
|               .then(result => {
 | ||
|                 console.log('finall response from stripe:', result)
 | ||
|               })
 | ||
|           }
 | ||
|         })
 | ||
|       })
 | ||
| 
 | ||
|       paymentRequest.canMakePayment()
 | ||
|         .then(result => {
 | ||
|           if (result) {
 | ||
|             prButton.mount(this.$refs.paymentRequestButton)
 | ||
|           } else
 | ||
|             console.error('unable to load', result);
 | ||
|         })
 | ||
|     },
 | ||
|     mountCard() {
 | ||
|       const elements = this.stripe.elements();
 | ||
| 
 | ||
|       const style = {
 | ||
|         base: {
 | ||
|           color: '#32325d',
 | ||
|           fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
 | ||
|           fontSmoothing: 'antialiased',
 | ||
|           fontSize: '16px',
 | ||
|           '::placeholder': {
 | ||
|             color: '#aab7c4'
 | ||
|           }
 | ||
|         },
 | ||
|         invalid: {
 | ||
|           color: '#fa755a',
 | ||
|           iconColor: '#fa755a'
 | ||
|         }
 | ||
|       };
 | ||
| 
 | ||
|       this.card = elements.create('card', { style: style });
 | ||
|       
 | ||
|       this.card.mount(this.$refs.card)
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss" scoped>
 | ||
| .container {
 | ||
|   background-color: white;
 | ||
|   padding: 1rem;
 | ||
|   border-radius: 6px;
 | ||
| }
 | ||
| 
 | ||
| .card {
 | ||
|   border: 2px solid var(--background-color);
 | ||
|   border-radius: 6px;
 | ||
|   padding: 0.5rem;
 | ||
|   margin-bottom: 1rem;
 | ||
| }
 | ||
| 
 | ||
| .feedback-text {
 | ||
|   color: var(--color-background);
 | ||
| }
 | ||
| 
 | ||
| .applePay {
 | ||
|   margin-top: 1rem;
 | ||
| }
 | ||
| </style>
 |