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

Creating an Uber Clone - Part XXXI.pdf

  • 1.
    Creating an UberClone - Part XXXI
  • 2.
    Billing ✦A bit differentfrom 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 One2017 all rights reserved
  • 4.
    Braintree © Codename One2017 all rights reserved
  • 5.
    Braintree © Codename One2017 all rights reserved
  • 6.
    Braintree © Codename One2017 all rights reserved
  • 7.
    Braintree © Codename One2017 all rights reserved
  • 8.
  • 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; publicString getNonce() { return nonce; } public void setNonce(String nonce) { this.nonce = nonce; } Ride
  • 14.
    private Long currentRide; publicLong getCurrentRide() { return currentRide; } public void setCurrentRide(Long currentRide) { this.currentRide = currentRide; } Ride
  • 15.
    public long acceptRide(Stringtoken, 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(Stringtoken, 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(longrideId) { 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(longrideId) { 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(longrideId) { 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(longrideId) { 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