Created
July 12, 2017 11:55
-
-
Save shah-smit/85839a63c682ca6606668970b42fbd19 to your computer and use it in GitHub Desktop.
Stripe Payment into Angular 4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
* { | |
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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<form> | |
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Component, OnInit, EventEmitter, Output, Input } from '@angular/core'; | |
declare var Stripe: any; | |
@Component({ | |
moduleId: module.id, | |
selector: 'payment', | |
templateUrl: 'payment.component.html', | |
styleUrls: ['payment.component.css'] | |
}) | |
export class PaymentComponent implements OnInit { | |
@Input() amount; | |
stripe: any; | |
card: any; | |
@Output() token = new EventEmitter<any>(); | |
constructor() { } | |
ngOnInit() { this.init(); } | |
init() { | |
var current = this; | |
this.stripe = Stripe(''); | |
var elements = this.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'); | |
card.on('change', function (event) { | |
current.setOutcome(event); | |
}); | |
document.querySelector('form').addEventListener('submit', function (e) { | |
console.log("in submit") | |
e.preventDefault(); | |
var form = document.querySelector('form')[0]; | |
console.log("in form",form) | |
var extraDetails = { | |
name: form.querySelector('input[name=cardholder-name]').value, | |
}; | |
current.stripe.createToken(card, extraDetails).then(current.setOutcome); | |
}); | |
} | |
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'); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment