SlideShare a Scribd company logo
1 of 20
Download to read offline
Creating an Uber Clone - Part XXXI
Billing
✦A bit different from the native Uber app
✦To keep billing simple I'll just charge $1 per minute
✦I won’t use in-app-purchase
✦I’ll use Braintree
© Codename One 2017 all rights reserved
Braintree
© Codename One 2017 all rights reserved
Braintree
© Codename One 2017 all rights reserved
Braintree
© Codename One 2017 all rights reserved
Braintree
© Codename One 2017 all rights reserved
Braintree
© Codename One 2017 all rights reserved
<dependency>
<groupId>com.braintreepayments.gateway</groupId>
<artifactId>braintree-java</artifactId>
<version>2.71.0</version>
</dependency>
POM
@Service
public class BraintreeService {
private final static BraintreeGateway gateway = new BraintreeGateway(
Environment.SANDBOX,
"your_merchant_id",
"your_public_key",
"your_private_key"
);
@Autowired
private RideRepository rides;
public String getClientToken() {
return gateway.clientToken().generate();
}
public void saveNonce(long rideId, String nonce) {
Ride r = rides.findOne(rideId);
r.setNonce(nonce);
rides.save(r);
}
public void pay(BigDecimal amount, String nonce) {
TransactionRequest requestT = new TransactionRequest()
.amount(amount)
.paymentMethodNonce(nonce)
.options()
.submitForSettlement(true)
.done();
}
}
BraintreeService
@Service
public class BraintreeService {
private final static BraintreeGateway gateway = new BraintreeGateway(
Environment.SANDBOX,
"your_merchant_id",
"your_public_key",
"your_private_key"
);
@Autowired
private RideRepository rides;
public String getClientToken() {
return gateway.clientToken().generate();
}
public void saveNonce(long rideId, String nonce) {
Ride r = rides.findOne(rideId);
r.setNonce(nonce);
rides.save(r);
}
public void pay(BigDecimal amount, String nonce) {
TransactionRequest requestT = new TransactionRequest()
.amount(amount)
.paymentMethodNonce(nonce)
.options()
.submitForSettlement(true)
.done();
}
}
BraintreeService
@Service
public class BraintreeService {
private final static BraintreeGateway gateway = new BraintreeGateway(
Environment.SANDBOX,
"your_merchant_id",
"your_public_key",
"your_private_key"
);
@Autowired
private RideRepository rides;
public String getClientToken() {
return gateway.clientToken().generate();
}
public void saveNonce(long rideId, String nonce) {
Ride r = rides.findOne(rideId);
r.setNonce(nonce);
rides.save(r);
}
public void pay(BigDecimal amount, String nonce) {
TransactionRequest requestT = new TransactionRequest()
.amount(amount)
.paymentMethodNonce(nonce)
.options()
.submitForSettlement(true)
.done();
}
}
BraintreeService
@Controller
@RequestMapping("/pay")
public class BraintreeWebservice {
@Autowired
private BraintreeService payment;
@RequestMapping(method=RequestMethod.GET,value = "/token")
public @ResponseBody String getClientToken(long id) {
return payment.getClientToken();
}
@RequestMapping(method=RequestMethod.GET,value="/nonce")
public @ResponseBody String nonce(
@RequestParam(name="ride", required = true) long rideId,
@RequestParam(name="nonce", required = true) String nonce) {
payment.saveNonce(rideId, nonce);
return "OK";
}
}
BraintreeWebservice
private String nonce;
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
Ride
private Long currentRide;
public Long getCurrentRide() {
return currentRide;
}
public void setCurrentRide(Long currentRide) {
this.currentRide = currentRide;
}
Ride
public long acceptRide(String token, long userId) {
User driver = users.findByAuthToken(token).get(0);
User passenger = users.findOne(userId);
if(!passenger.isHailing()) {
throw new RuntimeException("Not hailing");
}
passenger.setHailing(false);
passenger.setAssignedUser(driver.getId());
driver.setAssignedUser(userId);
Ride r = new Ride();
r.setDriver(driver);
r.setPassenger(passenger);
rides.save(r);
driver.setCurrentRide(r.getId());
passenger.setCurrentRide(r.getId());
users.save(driver);
users.save(passenger);
return r.getId();
}
acceptRide
public long acceptRide(String token, long userId) {
User driver = users.findByAuthToken(token).get(0);
User passenger = users.findOne(userId);
if(!passenger.isHailing()) {
throw new RuntimeException("Not hailing");
}
passenger.setHailing(false);
passenger.setAssignedUser(driver.getId());
driver.setAssignedUser(userId);
Ride r = new Ride();
r.setDriver(driver);
r.setPassenger(passenger);
rides.save(r);
driver.setCurrentRide(r.getId());
passenger.setCurrentRide(r.getId());
users.save(driver);
users.save(passenger);
return r.getId();
}
acceptRide
public void finishRide(long rideId) {
Ride current = rides.findOne(rideId);
current.setFinished(true);
if(current.isStarted() && current.getNonce() != null) {
Set<Waypoint> s = current.getRoute();
Iterator<Waypoint> i = s.iterator();
if(i.hasNext()) {
long startTime = i.next().getTime();
long endTime = -1;
while(i.hasNext()) {
endTime = i.next().getTime();
}
if(endTime > -1) {
BigDecimal cost = BigDecimal.valueOf(endTime - startTime).
divide(BigDecimal.valueOf(60000));
current.setCost(cost);
payments.pay(current.getCost(), current.getNonce());
}
}
}
rides.save(current);
}
finishRide
public void finishRide(long rideId) {
Ride current = rides.findOne(rideId);
current.setFinished(true);
if(current.isStarted() && current.getNonce() != null) {
Set<Waypoint> s = current.getRoute();
Iterator<Waypoint> i = s.iterator();
if(i.hasNext()) {
long startTime = i.next().getTime();
long endTime = -1;
while(i.hasNext()) {
endTime = i.next().getTime();
}
if(endTime > -1) {
BigDecimal cost = BigDecimal.valueOf(endTime - startTime).
divide(BigDecimal.valueOf(60000));
current.setCost(cost);
payments.pay(current.getCost(), current.getNonce());
}
}
}
rides.save(current);
}
finishRide
public void finishRide(long rideId) {
Ride current = rides.findOne(rideId);
current.setFinished(true);
if(current.isStarted() && current.getNonce() != null) {
Set<Waypoint> s = current.getRoute();
Iterator<Waypoint> i = s.iterator();
if(i.hasNext()) {
long startTime = i.next().getTime();
long endTime = -1;
while(i.hasNext()) {
endTime = i.next().getTime();
}
if(endTime > -1) {
BigDecimal cost = BigDecimal.valueOf(endTime - startTime).
divide(BigDecimal.valueOf(60000));
current.setCost(cost);
payments.pay(current.getCost(), current.getNonce());
}
}
}
rides.save(current);
}
finishRide
public void finishRide(long rideId) {
Ride current = rides.findOne(rideId);
current.setFinished(true);
if(current.isStarted() && current.getNonce() != null) {
Set<Waypoint> s = current.getRoute();
Iterator<Waypoint> i = s.iterator();
if(i.hasNext()) {
long startTime = i.next().getTime();
long endTime = -1;
while(i.hasNext()) {
endTime = i.next().getTime();
}
if(endTime > -1) {
BigDecimal cost = BigDecimal.valueOf(endTime - startTime).
divide(BigDecimal.valueOf(60000));
current.setCost(cost);
payments.pay(current.getCost(), current.getNonce());
}
}
}
rides.save(current);
}
finishRide

More Related Content

Similar to Creating an Uber Clone - Part XXXI.pdf

Android app development basics
Android app development basicsAndroid app development basics
Android app development basicsAnton Narusberg
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Eliran Eliassy
 
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)Amazon Web Services
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best PracticesYekmer Simsek
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the TrenchesJonathan Wage
 
자바스크립트 비동기 코드(Javascript asyncronous code)
자바스크립트 비동기 코드(Javascript asyncronous code)자바스크립트 비동기 코드(Javascript asyncronous code)
자바스크립트 비동기 코드(Javascript asyncronous code)Kongson Park
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic ComponentsMateusz Tymek
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuningAOE
 
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...Wim Selles
 
Making Service Portal Widgets Work Together
Making Service Portal Widgets Work TogetherMaking Service Portal Widgets Work Together
Making Service Portal Widgets Work TogetherTravisToulson
 
Restaurant Server - Transcript.pdf
Restaurant Server - Transcript.pdfRestaurant Server - Transcript.pdf
Restaurant Server - Transcript.pdfShaiAlmog1
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...OdessaJS Conf
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScriptQiangning Hong
 
Node js introduction
Node js introductionNode js introduction
Node js introductionAlex Su
 
REST to JavaScript for Better Client-side Development
REST to JavaScript for Better Client-side DevelopmentREST to JavaScript for Better Client-side Development
REST to JavaScript for Better Client-side DevelopmentHyunghun Cho
 
Taller evento TestingUY 2017 - API Testing utilizando Chakram
Taller evento TestingUY 2017 - API Testing utilizando ChakramTaller evento TestingUY 2017 - API Testing utilizando Chakram
Taller evento TestingUY 2017 - API Testing utilizando ChakramTestingUy
 
android level 3
android level 3android level 3
android level 3DevMix
 

Similar to Creating an Uber Clone - Part XXXI.pdf (20)

Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
 
Android - Api & Debugging in Android
Android - Api & Debugging in AndroidAndroid - Api & Debugging in Android
Android - Api & Debugging in Android
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 
Hexagonal architecture
Hexagonal architectureHexagonal architecture
Hexagonal architecture
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
 
Node.js server-side rendering
Node.js server-side renderingNode.js server-side rendering
Node.js server-side rendering
 
자바스크립트 비동기 코드(Javascript asyncronous code)
자바스크립트 비동기 코드(Javascript asyncronous code)자바스크립트 비동기 코드(Javascript asyncronous code)
자바스크립트 비동기 코드(Javascript asyncronous code)
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic Components
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
 
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
 
Making Service Portal Widgets Work Together
Making Service Portal Widgets Work TogetherMaking Service Portal Widgets Work Together
Making Service Portal Widgets Work Together
 
Restaurant Server - Transcript.pdf
Restaurant Server - Transcript.pdfRestaurant Server - Transcript.pdf
Restaurant Server - Transcript.pdf
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
 
Node js introduction
Node js introductionNode js introduction
Node js introduction
 
REST to JavaScript for Better Client-side Development
REST to JavaScript for Better Client-side DevelopmentREST to JavaScript for Better Client-side Development
REST to JavaScript for Better Client-side Development
 
Taller evento TestingUY 2017 - API Testing utilizando Chakram
Taller evento TestingUY 2017 - API Testing utilizando ChakramTaller evento TestingUY 2017 - API Testing utilizando Chakram
Taller evento TestingUY 2017 - API Testing utilizando Chakram
 
android level 3
android level 3android level 3
android level 3
 

More from ShaiAlmog1

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...ShaiAlmog1
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfShaiAlmog1
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfShaiAlmog1
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfShaiAlmog1
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfShaiAlmog1
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfShaiAlmog1
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfShaiAlmog1
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfShaiAlmog1
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfShaiAlmog1
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfShaiAlmog1
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfShaiAlmog1
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfShaiAlmog1
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfShaiAlmog1
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfShaiAlmog1
 

More from ShaiAlmog1 (20)

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdf
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdf
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdf
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdf
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdf
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdf
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdf
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdf
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdf
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdf
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdf
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdf
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdf
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdf
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdf
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdf
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdf
 

Recently uploaded

Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data SciencePaolo Missier
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...caitlingebhard1
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuidePixlogix Infotech
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringWSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAnitaRaj43
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard37
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMKumar Satyam
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxMarkSteadman7
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 

Recently uploaded (20)

Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptx
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 

Creating an Uber Clone - Part XXXI.pdf

  • 1. Creating an Uber Clone - Part XXXI
  • 2. Billing ✦A bit different from the native Uber app ✦To keep billing simple I'll just charge $1 per minute ✦I won’t use in-app-purchase ✦I’ll use Braintree © Codename One 2017 all rights reserved
  • 3. Braintree © Codename One 2017 all rights reserved
  • 4. Braintree © Codename One 2017 all rights reserved
  • 5. Braintree © Codename One 2017 all rights reserved
  • 6. Braintree © Codename One 2017 all rights reserved
  • 7. Braintree © Codename One 2017 all rights reserved
  • 9. @Service public class BraintreeService { private final static BraintreeGateway gateway = new BraintreeGateway( Environment.SANDBOX, "your_merchant_id", "your_public_key", "your_private_key" ); @Autowired private RideRepository rides; public String getClientToken() { return gateway.clientToken().generate(); } public void saveNonce(long rideId, String nonce) { Ride r = rides.findOne(rideId); r.setNonce(nonce); rides.save(r); } public void pay(BigDecimal amount, String nonce) { TransactionRequest requestT = new TransactionRequest() .amount(amount) .paymentMethodNonce(nonce) .options() .submitForSettlement(true) .done(); } } BraintreeService
  • 10. @Service public class BraintreeService { private final static BraintreeGateway gateway = new BraintreeGateway( Environment.SANDBOX, "your_merchant_id", "your_public_key", "your_private_key" ); @Autowired private RideRepository rides; public String getClientToken() { return gateway.clientToken().generate(); } public void saveNonce(long rideId, String nonce) { Ride r = rides.findOne(rideId); r.setNonce(nonce); rides.save(r); } public void pay(BigDecimal amount, String nonce) { TransactionRequest requestT = new TransactionRequest() .amount(amount) .paymentMethodNonce(nonce) .options() .submitForSettlement(true) .done(); } } BraintreeService
  • 11. @Service public class BraintreeService { private final static BraintreeGateway gateway = new BraintreeGateway( Environment.SANDBOX, "your_merchant_id", "your_public_key", "your_private_key" ); @Autowired private RideRepository rides; public String getClientToken() { return gateway.clientToken().generate(); } public void saveNonce(long rideId, String nonce) { Ride r = rides.findOne(rideId); r.setNonce(nonce); rides.save(r); } public void pay(BigDecimal amount, String nonce) { TransactionRequest requestT = new TransactionRequest() .amount(amount) .paymentMethodNonce(nonce) .options() .submitForSettlement(true) .done(); } } BraintreeService
  • 12. @Controller @RequestMapping("/pay") public class BraintreeWebservice { @Autowired private BraintreeService payment; @RequestMapping(method=RequestMethod.GET,value = "/token") public @ResponseBody String getClientToken(long id) { return payment.getClientToken(); } @RequestMapping(method=RequestMethod.GET,value="/nonce") public @ResponseBody String nonce( @RequestParam(name="ride", required = true) long rideId, @RequestParam(name="nonce", required = true) String nonce) { payment.saveNonce(rideId, nonce); return "OK"; } } BraintreeWebservice
  • 13. private String nonce; public String getNonce() { return nonce; } public void setNonce(String nonce) { this.nonce = nonce; } Ride
  • 14. private Long currentRide; public Long getCurrentRide() { return currentRide; } public void setCurrentRide(Long currentRide) { this.currentRide = currentRide; } Ride
  • 15. public long acceptRide(String token, long userId) { User driver = users.findByAuthToken(token).get(0); User passenger = users.findOne(userId); if(!passenger.isHailing()) { throw new RuntimeException("Not hailing"); } passenger.setHailing(false); passenger.setAssignedUser(driver.getId()); driver.setAssignedUser(userId); Ride r = new Ride(); r.setDriver(driver); r.setPassenger(passenger); rides.save(r); driver.setCurrentRide(r.getId()); passenger.setCurrentRide(r.getId()); users.save(driver); users.save(passenger); return r.getId(); } acceptRide
  • 16. public long acceptRide(String token, long userId) { User driver = users.findByAuthToken(token).get(0); User passenger = users.findOne(userId); if(!passenger.isHailing()) { throw new RuntimeException("Not hailing"); } passenger.setHailing(false); passenger.setAssignedUser(driver.getId()); driver.setAssignedUser(userId); Ride r = new Ride(); r.setDriver(driver); r.setPassenger(passenger); rides.save(r); driver.setCurrentRide(r.getId()); passenger.setCurrentRide(r.getId()); users.save(driver); users.save(passenger); return r.getId(); } acceptRide
  • 17. public void finishRide(long rideId) { Ride current = rides.findOne(rideId); current.setFinished(true); if(current.isStarted() && current.getNonce() != null) { Set<Waypoint> s = current.getRoute(); Iterator<Waypoint> i = s.iterator(); if(i.hasNext()) { long startTime = i.next().getTime(); long endTime = -1; while(i.hasNext()) { endTime = i.next().getTime(); } if(endTime > -1) { BigDecimal cost = BigDecimal.valueOf(endTime - startTime). divide(BigDecimal.valueOf(60000)); current.setCost(cost); payments.pay(current.getCost(), current.getNonce()); } } } rides.save(current); } finishRide
  • 18. public void finishRide(long rideId) { Ride current = rides.findOne(rideId); current.setFinished(true); if(current.isStarted() && current.getNonce() != null) { Set<Waypoint> s = current.getRoute(); Iterator<Waypoint> i = s.iterator(); if(i.hasNext()) { long startTime = i.next().getTime(); long endTime = -1; while(i.hasNext()) { endTime = i.next().getTime(); } if(endTime > -1) { BigDecimal cost = BigDecimal.valueOf(endTime - startTime). divide(BigDecimal.valueOf(60000)); current.setCost(cost); payments.pay(current.getCost(), current.getNonce()); } } } rides.save(current); } finishRide
  • 19. public void finishRide(long rideId) { Ride current = rides.findOne(rideId); current.setFinished(true); if(current.isStarted() && current.getNonce() != null) { Set<Waypoint> s = current.getRoute(); Iterator<Waypoint> i = s.iterator(); if(i.hasNext()) { long startTime = i.next().getTime(); long endTime = -1; while(i.hasNext()) { endTime = i.next().getTime(); } if(endTime > -1) { BigDecimal cost = BigDecimal.valueOf(endTime - startTime). divide(BigDecimal.valueOf(60000)); current.setCost(cost); payments.pay(current.getCost(), current.getNonce()); } } } rides.save(current); } finishRide
  • 20. public void finishRide(long rideId) { Ride current = rides.findOne(rideId); current.setFinished(true); if(current.isStarted() && current.getNonce() != null) { Set<Waypoint> s = current.getRoute(); Iterator<Waypoint> i = s.iterator(); if(i.hasNext()) { long startTime = i.next().getTime(); long endTime = -1; while(i.hasNext()) { endTime = i.next().getTime(); } if(endTime > -1) { BigDecimal cost = BigDecimal.valueOf(endTime - startTime). divide(BigDecimal.valueOf(60000)); current.setCost(cost); payments.pay(current.getCost(), current.getNonce()); } } } rides.save(current); } finishRide