From b84f630615bbc86c554146ad5e3b1dd3de26d541 Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 11:34:59 -0800 Subject: [PATCH 1/7] Adds PayPal REST SDK to package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 13a2e656b2..38227e9566 100755 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "sendgrid": "~0.4.6", "tumblr.js": "~0.0.4", "twit": "~1.1.12", - "underscore": "~1.5.2" + "underscore": "~1.5.2", + "paypal-rest-sdk": "~0.6.4" } } From b023ea1c01f1a20dc2af2358f8d798891b7557c5 Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 11:35:23 -0800 Subject: [PATCH 2/7] Adds PayPal routes for the SDK --- app.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app.js b/app.js index 1e10792ae7..4a44222054 100755 --- a/app.js +++ b/app.js @@ -97,6 +97,9 @@ app.get('/api/lastfm', apiController.getLastfm); app.get('/api/nyt', apiController.getNewYorkTimes); app.get('/api/twitter', passportConf.isAuthenticated, apiController.getTwitter); app.get('/api/aviary', apiController.getAviary); +app.get('/api/paypal', apiController.getPayPal); +app.get('/api/paypal/success', apiController.getPayPalSuccess); +app.get('/api/paypal/cancel', apiController.getPayPalCancel); app.get('/auth/facebook', passport.authenticate('facebook', { scope: 'email' })); app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/login' })); app.get('/auth/github', passport.authenticate('github')); From 3ca51fbbc480719ab2fee6e68bae0f8cb4e8bb80 Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 11:36:59 -0800 Subject: [PATCH 3/7] Adds PayPal to the API browser --- views/api/index.jade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/views/api/index.jade b/views/api/index.jade index 8ce290fb90..09acc68c4f 100644 --- a/views/api/index.jade +++ b/views/api/index.jade @@ -27,3 +27,5 @@ block content small (Login required) li a(href='/api/scraping') Web Scraping + li + a(href='/api/paypal') PayPal From e4d18e73319051f340f08787fee2d8131c6d903b Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 12:01:30 -0800 Subject: [PATCH 4/7] Adds PayPal logo for the API browser --- public/img/paypal.png | Bin 0 -> 5485 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/img/paypal.png diff --git a/public/img/paypal.png b/public/img/paypal.png new file mode 100644 index 0000000000000000000000000000000000000000..d69bbb60e0e5d57446ddd4f575ddb2a7efee163a GIT binary patch literal 5485 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 V#)gFx?SK6MHPA8DuFyn9{0~y1<^%u$ literal 0 HcmV?d00001 From 12d402f8fb954f1bb8b2c9db15ec2a27977829ac Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 12:21:43 -0800 Subject: [PATCH 5/7] Adds view for PayPal SDK sample --- views/api/paypal.jade | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 views/api/paypal.jade diff --git a/views/api/paypal.jade b/views/api/paypal.jade new file mode 100644 index 0000000000..3316588d61 --- /dev/null +++ b/views/api/paypal.jade @@ -0,0 +1,35 @@ +extends ../layout + +block content + .page-header + h2 + i.fa.fa-dollar(style='color: #1B4A7D') + | PayPal API + + .btn-group.btn-group-justified + a.btn.btn-primary(href='https://developer.paypal.com/docs/integration/direct/make-your-first-call/', target='_blank') + i.fa.fa-check-square-o + | Quickstart + a.btn.btn-primary(href='https://developer.paypal.com/docs/api/', target='_blank') + i.fa.fa-code + | API Reference + a.btn.btn-primary(href='https://devtools-paypal.com/hateoas/index.html', target='_blank') + i.fa.fa-gear + | API Playground + + h3 + img(src='/img/paypal.png', width=50, height=50) + span Sample Payment + + if result + if canceled + h3 Payment got canceled! + if success + h3 Payment got executed successfully! + a(href='/api/paypal') + button.btn.btn-primary New payment + else + div + p Redirects to PayPal and allows authorizing the sample payment. + a(href=approval_url) + button.btn.btn-primary Authorize payment \ No newline at end of file From cdb73bf2613bba6e5310c62b6b319678426f9be2 Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 12:22:12 -0800 Subject: [PATCH 6/7] Adds PayPal SDK sample to the API controller --- controllers/api.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/controllers/api.js b/controllers/api.js index f59aa9a2e6..71999dc18f 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -11,6 +11,7 @@ var tumblr = require('tumblr.js'); var foursquare = require('node-foursquare')({ secrets: secrets.foursquare }); var Github = require('github-api'); var Twit = require('twit'); +var paypal = require('paypal-rest-sdk'); /** * GET /api @@ -254,3 +255,77 @@ exports.getTwitter = function(req, res, next) { }); }); }; + +/** + * GET /api/paypal + * PayPal SDK example + */ +exports.getPayPal = function(req, res, next) { + paypal.configure(secrets.paypal); + var payment_details = { + 'intent': 'sale', + 'payer': { + 'payment_method': 'paypal' + }, + 'redirect_urls': { + 'return_url': secrets.paypal.returnUrl, + 'cancel_url': secrets.paypal.cancelUrl + }, + 'transactions': [{ + 'description': 'Node.js Boilerplate', + 'amount': { + 'currency': 'USD', + 'total': '2.99' + } + }] + }; + paypal.payment.create(payment_details, function (error, payment) { + if(error){ + console.log(error); + } else { + req.session.payment_id = payment.id; + var links = payment.links; + for (var i = 0; i < links.length; i++) { + if (links[i].rel === 'approval_url') { + res.render('api/paypal', { + approval_url: links[i].href + }); + } + } + } + }); +}; + +/** + * GET /api/paypal/success + * PayPal SDK example + */ +exports.getPayPalSuccess = function(req, res, next) { + var payment_id = req.session.payment_id; + var payment_details = { 'payer_id': req.query.PayerID }; + paypal.payment.execute(payment_id, payment_details, function(error, payment){ + if(error){ + res.render('api/paypal', { + result: true, + success: false + }); + } else { + res.render('api/paypal', { + result: true, + success: true + }); + } + }); +}; + +/** + * GET /api/paypal/cancel + * PayPal SDK example + */ +exports.getPayPalCancel = function(req, res, next) { + req.session.payment_id = null; + res.render('api/paypal', { + result: true, + canceled: true + }); +}; \ No newline at end of file From a060211375b57e7ec0975287e752437e649452c0 Mon Sep 17 00:00:00 2001 From: Tim Messerschmidt Date: Mon, 27 Jan 2014 12:34:42 -0800 Subject: [PATCH 7/7] Adds PayPal howto --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 094eccebca..defb19159f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Alt](https://lh4.googleusercontent.com/-PVw-ZUM9vV8/UuWeH51os0I/AAAAAAAAD6M/0Ikg7viJftQ/w1286-h566-no/hackathon-starter-logo.jpg) Hackathon Starter [![Dependency Status](https://david-dm.org/sahat/hackathon-starter.png?theme=shields.io)](https://david-dm.org/sahat/hackathon-starter) ================= -A kickstarter for **Node.js** web applications. +A kickstarter for **Node.js** web applications. **Live Demo**: http://hackathonstarter.herokuapp.com @@ -43,7 +43,7 @@ Features - Change Password - Link multipleOAuth 2.0 strategies to one account - Delete Account -- **API Examples**: Facebook, Foursquare, Last.fm, Tumblr, Twitter, and more. +- **API Examples**: Facebook, Foursquare, Last.fm, Tumblr, Twitter, PayPal, and more. Prerequisites ------------- @@ -112,6 +112,15 @@ Obtaining API Keys - Select **Website** - Enter `http://localhost:3000` for *Site URL* + +- Visit [PayPal Developer](https://developer.paypal.com/) +- Log in using your existing PayPal account +- Click **Applications > Create App** in the navigation bar +- Enter *Application Name*, then click **Create app** +- Copy and paste *Client ID* and *Secret* keys into `config/secrets.js` +- *App ID* is **client_id**, *App Secret* is **client_secret** +- Change **host** to api.paypal.com if you want to test against production and use the live credentials + *TODO: Add Twitter and GitHub instructions.* Project Structure