SlideShare a Scribd company logo
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

PDF
Creating an Uber Clone - Part XXVI - Transcript.pdf
PDF
Creating an Uber Clone - Part XXVI.pdf
PDF
Creating an Uber Clone - Part XXXI - Transcript.pdf
PDF
Creating an Uber Clone - Part XXIX - Transcript.pdf
PDF
Introducing Rendr: Run your Backbone.js apps on the client and server
PDF
Joe Walker Interactivewebsites Cometand Dwr
PDF
Workshop 13: AngularJS Parte II
PPTX
Pro typescript.ch03.Object Orientation in TypeScript
Creating an Uber Clone - Part XXVI - Transcript.pdf
Creating an Uber Clone - Part XXVI.pdf
Creating an Uber Clone - Part XXXI - Transcript.pdf
Creating an Uber Clone - Part XXIX - Transcript.pdf
Introducing Rendr: Run your Backbone.js apps on the client and server
Joe Walker Interactivewebsites Cometand Dwr
Workshop 13: AngularJS Parte II
Pro typescript.ch03.Object Orientation in TypeScript

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

KEY
Android app development basics
PPT
Android - Api & Debugging in Android
PDF
Angular server side rendering - Strategies & Technics
PDF
Android Best Practices
PDF
Hexagonal architecture
PDF
Symfony2 from the Trenches
PDF
Node.js server-side rendering
PDF
자바스크립트 비동기 코드(Javascript asyncronous code)
PDF
Zend Framework 2 - Basic Components
PDF
Performance measurement and tuning
 
PDF
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
PPTX
Making Service Portal Widgets Work Together
PDF
Restaurant Server - Transcript.pdf
PDF
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
PDF
服务框架: Thrift & PasteScript
PDF
Node js introduction
PDF
REST to JavaScript for Better Client-side Development
PPSX
Taller evento TestingUY 2017 - API Testing utilizando Chakram
PDF
android level 3
PPT
Android Froyo
Android app development basics
Android - Api & Debugging in Android
Angular server side rendering - Strategies & Technics
Android Best Practices
Hexagonal architecture
Symfony2 from the Trenches
Node.js server-side rendering
자바스크립트 비동기 코드(Javascript asyncronous code)
Zend Framework 2 - Basic Components
Performance measurement and tuning
 
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
Making Service Portal Widgets Work Together
Restaurant Server - Transcript.pdf
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
服务框架: Thrift & PasteScript
Node js introduction
REST to JavaScript for Better Client-side Development
Taller evento TestingUY 2017 - API Testing utilizando Chakram
android level 3
Android Froyo
Ad

More from ShaiAlmog1 (20)

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

Recently uploaded (20)

PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
cuic standard and advanced reporting.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Big Data Technologies - Introduction.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Approach and Philosophy of On baking technology
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Electronic commerce courselecture one. Pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Machine Learning_overview_presentation.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
sap open course for s4hana steps from ECC to s4
PDF
A comparative analysis of optical character recognition models for extracting...
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
cuic standard and advanced reporting.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Big Data Technologies - Introduction.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Encapsulation_ Review paper, used for researhc scholars
20250228 LYD VKU AI Blended-Learning.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
Approach and Philosophy of On baking technology
MIND Revenue Release Quarter 2 2025 Press Release
Electronic commerce courselecture one. Pdf
Network Security Unit 5.pdf for BCA BBA.
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Assigned Numbers - 2025 - Bluetooth® Document
Building Integrated photovoltaic BIPV_UPV.pdf
Machine Learning_overview_presentation.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
sap open course for s4hana steps from ECC to s4
A comparative analysis of optical character recognition models for extracting...

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