Skip to content

Commit dd64615

Browse files
committed
Merge pull request #42 from killpack/master
[feature] Adds support for creating personally identifiable information (PII) data tokens
2 parents 8c8d2ae + 6ba5f43 commit dd64615

File tree

5 files changed

+125
-0
lines changed

5 files changed

+125
-0
lines changed

README.md

+29
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,35 @@ The interface is similar for bank account tokens:
106106
})
107107
````
108108

109+
## Creating Stripe Tokens for PII Data
110+
111+
The interface is similar yet again for PII data tokens:
112+
113+
````javascript
114+
115+
// obtain access to the injected service
116+
var stripe = this.get('stripe');
117+
118+
var piiData = {
119+
personalIdNumber: '123456789'
120+
}
121+
122+
return stripe.piiData.createToken(piiData).then(function(response) {
123+
// you get access to your newly created token here
124+
customer.set('personalIdNumberStripeToken', response.id);
125+
return customer.save();
126+
})
127+
.catch(response) {
128+
// if there was an error retrieving the token you could get it here
129+
130+
if (response.error.type === 'invalid_request_error') {
131+
// show an error in the form
132+
}
133+
}
134+
}
135+
})
136+
````
137+
109138
## Debugging
110139
By setting `LOG_STRIPE_SERVICE` to true in your application configuration you can enable some debugging messages from the service
111140

addon/services/stripe.js

+28
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ export default Ember.Service.extend({
1313
createToken: this._createBankAccountToken.bind(this)
1414
};
1515

16+
this.piiData = {
17+
createToken: this._createPiiDataToken.bind(this)
18+
};
19+
1620
this._checkForAndAddCardFn('cardType', Stripe.card.cardType);
1721
this._checkForAndAddCardFn('validateCardNumber', Stripe.card.validateCardNumber);
1822
this._checkForAndAddCardFn('validateCVC', Stripe.card.validateCVC);
@@ -66,6 +70,30 @@ export default Ember.Service.extend({
6670
});
6771
},
6872

73+
/**
74+
* Creates a piiData token using Stripe.js API, exposed as `piiData.createToken`
75+
* @param {object} piiData PiiData
76+
* @return {promise} Returns a promise that holds response, see stripe.js docs for details
77+
* status is not being returned at the moment but it can be logged
78+
*/
79+
_createPiiDataToken(piiData) {
80+
this.debug('piiData.createToken:', piiData);
81+
82+
return new Ember.RSVP.Promise((resolve, reject) => {
83+
Stripe.piiData.createToken(piiData, (status, response) => {
84+
85+
this.debug('piiData.createToken handler - status %s, response:', status, response);
86+
87+
if (response.error) {
88+
reject(response);
89+
} else {
90+
resolve(response);
91+
}
92+
});
93+
});
94+
95+
},
96+
6997
/**
7098
* Uses Ember.Logger.info to output service information if LOG_STRIPE_SERVICE is
7199
* set

package.json

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
{
2424
"name": "Sam Selikoff",
2525
"email": "[email protected]"
26+
},
27+
{
28+
"name": "Jordan Killpack",
29+
"email": "[email protected]"
2630
}
2731
],
2832
"license": "MIT",

tests/integration/stripe-test.js

+13
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ var bankAccount= {
2222
accountNumber: '000123456789',
2323
};
2424

25+
var piiData = {
26+
personalIdNumber: '123456789'
27+
};
28+
2529
Stripe.setPublishableKey(env.stripe.publishableKey);
2630

2731
test('card.createToken sets the token and returns a promise', function(assert) {
@@ -41,3 +45,12 @@ test('bankAccount.createToken sets the token and returns a promise', function(as
4145
assert.ok(res.id, 'correct token set');
4246
});
4347
});
48+
49+
test('piiData.createToken sets the token and returns a promise', function(assert) {
50+
var service = this.subject();
51+
52+
return service.piiData.createToken(piiData)
53+
.then(function(res) {
54+
assert.ok(res.id, 'correct token set');
55+
});
56+
});

tests/unit/services/stripe-test.js

+51
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,54 @@ test('bankAccount.createToken rejects the promise if Stripe errors', function(as
109109
createBankAccountToken.restore();
110110
});
111111
});
112+
113+
// PII Data
114+
//
115+
var pii = {
116+
personalIdNumber: '123456779'
117+
};
118+
119+
test('piiData.createToken sets the token and returns a promise', function(assert) {
120+
var service = this.subject();
121+
var response = {
122+
id: 'the_token'
123+
};
124+
125+
var createPiiDataToken = sinon.stub(
126+
Stripe.piiData,
127+
'createToken',
128+
function(piiData, cb) {
129+
assert.equal(piiData, pii, 'called with sample piiData');
130+
cb(200, response);
131+
}
132+
);
133+
134+
return service.piiData.createToken(pii)
135+
.then(function(res) {
136+
assert.equal(res.id, 'the_token');
137+
createPiiDataToken.restore();
138+
});
139+
});
140+
141+
test('piiData.createToken rejects the promise if Stripe errors', function(assert) {
142+
var service = this.subject();
143+
var response = {
144+
error : {
145+
type: "api_error"
146+
}
147+
};
148+
149+
var createPiiDataToken = sinon.stub(
150+
Stripe.piiData,
151+
'createToken',
152+
function(piiData, cb) {
153+
cb(500, response);
154+
}
155+
);
156+
157+
return service.piiData.createToken(ba)
158+
.catch((res) => {
159+
assert.equal(res, response, 'error passed');
160+
createPiiDataToken.restore();
161+
});
162+
});

0 commit comments

Comments
 (0)