-
-
Save lrvick/8789669 to your computer and use it in GitHub Desktop.
// MIT: http://opensource.org/licenses/MIT | |
angular.module('app', []); | |
angular.module('app').controller | |
( 'MainCtrl' | |
, function($scope,$locale) { | |
$scope.currentYear = new Date().getFullYear() | |
$scope.currentMonth = new Date().getMonth() + 1 | |
$scope.months = $locale.DATETIME_FORMATS.MONTH | |
$scope.ccinfo = {type:undefined} | |
$scope.save = function(data){ | |
if ($scope.paymentForm.$valid){ | |
console.log(data) // valid data saving stuff here | |
} | |
} | |
} | |
) | |
angular.module('app').directive | |
( 'creditCardType' | |
, function(){ | |
var directive = | |
{ require: 'ngModel' | |
, link: function(scope, elm, attrs, ctrl){ | |
ctrl.$parsers.unshift(function(value){ | |
scope.ccinfo.type = | |
(/^5[1-5]/.test(value)) ? "mastercard" | |
: (/^4/.test(value)) ? "visa" | |
: (/^3[47]/.test(value)) ? 'amex' | |
: (/^6011|65|64[4-9]|622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))/.test(value)) ? 'discover' | |
: undefined | |
ctrl.$setValidity('invalid',!!scope.ccinfo.type) | |
return value | |
}) | |
} | |
} | |
return directive | |
} | |
) | |
angular.module('app').directive | |
( 'cardExpiration' | |
, function(){ | |
var directive = | |
{ require: 'ngModel' | |
, link: function(scope, elm, attrs, ctrl){ | |
scope.$watch('[ccinfo.month,ccinfo.year]',function(value){ | |
ctrl.$setValidity('invalid',true) | |
if ( scope.ccinfo.year == scope.currentYear | |
&& scope.ccinfo.month <= scope.currentMonth | |
) { | |
ctrl.$setValidity('invalid',false) | |
} | |
return value | |
},true) | |
} | |
} | |
return directive | |
} | |
) | |
angular.module('app').filter | |
( 'range' | |
, function() { | |
var filter = | |
function(arr, lower, upper) { | |
for (var i = lower; i <= upper; i++) arr.push(i) | |
return arr | |
} | |
return filter | |
} | |
) |
<!doctype html> | |
<html ng-app="app" > | |
<head> | |
<meta charset="utf-8"> | |
<title>AngularJS Credit Card Validation Example</title> | |
<script>document.write('<base href="' + document.location + '" />');</script> | |
<link rel="stylesheet" href="style.css"> | |
<script src="http://code.angularjs.org/1.1.4/angular.js"></script> | |
<script src="app.js"></script> | |
</head> | |
<body ng-controller="MainCtrl"> | |
<form novalidate name="paymentForm"> | |
<input | |
type="text" | |
name="creditCard" | |
ng-model="ccinfo.number" | |
required | |
data-credit-card-type | |
data-ng-pattern="/^[0-9]+$/" | |
data-ng-minlength="15" | |
maxlength="19" | |
placeholder="Card Number" >{{ccinfo.type}} | |
<br/> | |
<ul ng-show="paymentForm.submitAttempt && !paymentForm.$valid"> | |
<li ng-show="paymentForm.creditCard.$error.minlength">Credit card must be 15-19 digits</li> | |
<li ng-show="paymentForm.creditCard.$error.pattern">Credit card must consist of only numbers</li> | |
<li ng-show="paymentForm.creditCard.$error.invalid">Credit card must be a valid Amex, Visa, Discover, or Master Card</li> | |
<li ng-show="paymentForm.creditCard.$error.required">Credit card required</li> | |
</ul> | |
<input | |
type="text" | |
name="securityCode" | |
ng-model="ccinfo.securityCode" | |
placeholder="CCV" | |
required | |
data-ng-pattern="/^[0-9]+$/" | |
data-ng-minlength="3" | |
maxlength="4"> | |
<br/> | |
<ul ng-show="paymentForm.submitAttempt && !paymentForm.$valid"> | |
<li ng-show="paymentForm.securityCode.$error.pattern">Security code must contain only numbers</li> | |
<li ng-show="paymentForm.securityCode.$error.minlength">Security code must be 3-4 digits</li> | |
<li ng-show="paymentForm.securityCode.$error.required">Security code required</li> | |
</ul> | |
<select ng-model="ccinfo.month" name="month" data-card-expiration required> | |
<option disabled selected value="">Month</option> | |
<option ng-repeat="month in months" value="{{$index+1}}" > {{$index+1}} - {{month}}</li> | |
</select> | |
<br/> | |
<ul ng-show="paymentForm.submitAttempt && !paymentForm.$valid"> | |
<li ng-show="paymentForm.month.$error.required">Expiration month required</li> | |
</ul> | |
<select ng-model="ccinfo.year" name="year" required> | |
<option disabled selected value="">Year</option> | |
<option ng-repeat="year in [] | range:currentYear:currentYear+13">{{year}}</li> | |
</select> | |
<br/> | |
<ul ng-show="paymentForm.submitAttempt && !paymentForm.$valid"> | |
<li ng-show="paymentForm.year.$error.required">Expiration year required</li> | |
<li ng-show="paymentForm.month.$error.invalid">Provided expiration date is invalid</li> | |
</ul> | |
<button ng-click="paymentForm.submitAttempt=true;save(ccinfo)" type="submit">Submit</button> | |
</body> | |
</html> |
input.ng-invalid.ng-dirty { | |
background-color: #FA787E; | |
} | |
input.ng-valid.ng-dirty { | |
background-color: #78FA89; | |
} | |
ul { | |
margin:0; | |
} |
I think token depends of gateway that you are using.
hi Dears
i made this validation using select option and its working well but when i changed it to editable select it did not work for me .. i need to solve it urgently please
<span editable-select="ccinfo.month" e-ng-options="month.text for month in months track by month.value" e-required e-card-expiration e-ng-model-options="{allowInvalid:true}" e-id="inputCardExpiryMonth" e-name="inputCardExpiryMonth" e-ng-model="ccinfo.month"> {{ ccinfo.month.value || 'empty' }} </span> <span editable-select="ccinfo.year" e-ng-options="year as year for year in [] | range:currentYear:currentYear+13" e-card-expiration e-ng-model-options="{allowInvalid:true}" e-required e-id="inputCardExpiryYear" e-name="inputCardExpiryYear" e-ng-model="ccinfo.year"> {{ ccinfo.year || 'empty' }} </span> <span ng-messages="paymentMethod.inputCardExpiryMonth.$error" ng-messages-include="views/messages.html" ng-if="paymentMethod.inputCardExpiryMonth.$dirty && paymentMethod.inputCardExpiryYear.$dirty"> </span>
Thanks in advance
for security reasons the CVV(CCV, CVC...) must be hidden and for compatibility(mozilla dnt support style password) issues this must be a directive also
how do I tokenize the credit card info? I'm attempting to use strip but doesn't seem to be integrating like i'd hoped. Thanks