aboutsummaryrefslogtreecommitdiff
path: root/examples/shop/checkout.php
blob: 4daa1d89e4b7f7f74dc2a35c58b169f683ebe5da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<!DOCTYPE html>
<!--
  This file is aprt of GNU TALER
  Copyright (C) 2014,2015, 2016 INRIA

  TALER is free software: you can
  redistribute it and/or modify it under the terms of the GNU
  Lesser General Public License (GNU LGPL) as published by the
  Free Software
  Foundation, either version 3 of the License, or (at your option)
  any later version.  The code is distributed WITHOUT ANY WARRANTY;
  without even the implied warranty of MERCHANTABILITY or FITNESS
  FOR A PARTICULAR PURPOSE.  See the GNU LGPL for more details.

  As additional permission under GNU LGPL version 3 section 7, you
  may distribute non-source (e.g., minimized or compacted) forms of
  that code without the copy of the GNU LGPL normally required by
  section 4, provided you include this license notice and a URL
  through which recipients can access the Corresponding Source.

-->
<html>
<head>
  <title>Toy Store - Payment method - Taler Demo</title>
  <link rel="stylesheet" type="text/css" href="web-common/style.css">
  <script type="application/javascript" src="web-common/taler-presence.js"></script>
</head>
<body>

<?php
  // get the donation information from form
  $donation_receiver = $_POST['donation_receiver'];
  $donation_amount = $_POST['donation_amount'];
  $donation_currency = $_POST['donation_currency'];

  // get frational part
  list ($donation_value, $donation_fraction) = explode (".", $donation_amount, 2);
  // create PHP session and store donation information in session
  $donation_fraction = (float) ("0." . $donation_fraction);
  session_start();
  $_SESSION['receiver'] = $donation_receiver;
  $_SESSION['amount_value'] = (int) $donation_amount;
  $_SESSION['amount_fraction'] = (int) ($donation_fraction * 1000000);
  $_SESSION['currency'] = $donation_currency;
?>

  <header>
    <div id="logo">
      <svg height="100" width="100">
        <circle cx="50" cy="50" r="40" stroke="darkcyan" stroke-width="6" fill="white" />
        <text x="19" y="82" font-family="Verdana" font-size="90" fill="darkcyan">S</text>
      </svg>
    </div>
    <!--#include virtual="web-common/dropdown-navbar.html" -->
    <h1 class="nav">Toy Store - Select payment method</h1>
  </header>

  <aside class="sidebar" id="left">
  </aside>

  <section id="main">
    <article>
      <h1>Select your payment method</h1>

      <p>
        This is an example for a "checkout" page of a Web shop.
        On the previous page, you have created the shopping cart
        and decided which product to buy (i.e. which project to
        donate KUDOS to).  Now in this page, you are asked to
        select a payment option.  As Taler is not yet universally
        used, we expect merchants will offer various payment options.
      </p>
      <p>
        The page also demonstrates how to only enable (or show) the Taler
        option if Taler is actually supported by the browser.  For example,
        if you disable the Taler extension now, the Taler payment option
        will be disabled in the page.  Naturally, you could also trivially
        hide the Taler option entirely by changing the visibility instead.
      </p>
      <p>
        Note that you MUST select Taler here for the demo to continue,
        as the other payment options are just placeholders and not
        really working in the demonstration.  Also, it is of course
        possible to ask the user to make this choice already on the
        previous page (with the shopping cart), we just separated the
        two steps to keep each step as simple as possible.
      </p>

      <form name="tform" action="" method="POST">
        <div id="opt-form" align="left"><br>
          <input type="radio" name="payment_system" value="lisa"
                 id="lisa-radio-button-id">Lisa</input>
          <br/>
          <input type="radio" name="payment_system" value="ycard">You Card</input>
          <br/>
          <input type="radio" name="payment_system" value="cardme">Card Me</input>
          <br/>
          <input type="radio" name="payment_system" value="taler"
                 checked
                 id="taler-radio-button-id" class="taler-installed-enable">Taler</input>
          <br/>
          <input type="button" onclick="pay(this.form)" value="Ok"></input>
        </div>
      </form>

    </article>
  </section>

<script type="text/javascript">

/* This function is called from "taler_pay" after
   we downloaded the JSON contract from the merchant.
   We now need to pass it to the extension. */
function handle_contract(contract_wrapper) {
  var cEvent = new CustomEvent('taler-confirm-contract', {
    detail: {
      contract_wrapper: contract_wrapper
    }
  });
  document.dispatchEvent(cEvent);
};


/* Trigger Taler contract generation on the server, and pass the
   contract to the extension once we got it. */
function taler_pay(form) {
  var contract_request = new XMLHttpRequest();

  /* Note that the URL we give here is specific to the Demo-shop
     and not dictated by the protocol: each web shop can
     have its own way of generating and transmitting the
     contract, there just must be a way to get the contract
     and to pass it to the wallet when the user selects 'Pay'. */
  contract_request.open("GET", "generate_taler_contract.php", true);
  contract_request.onload = function (e) {
    if (contract_request.readyState == 4) {
      if (contract_request.status == 200) {
        /* display contract_requestificate (i.e. it sends the JSON string
          to the extension) alert (contract_request.responseText); */
        console.log("response text:", contract_request.responseText);
        var contract_wrapper = JSON.parse(contract_request.responseText);
        if (!contract_wrapper) {
          console.error("response text is invalid JSON");
          return;
        }
        handle_contract(contract_wrapper);
      } else {
        /* There was an error obtaining the contract from the merchant,
           obviously this should not happen. To keep it simple, we just
           alert the user to the error. */
        alert("Failure to download contract from merchant " +
              "(" + contract_request.status + "):\n" +
              contract_request.responseText);
      }
    }
  };
  contract_request.onerror = function (e) {
    /* There was an error obtaining the contract from the merchant,
       obviously this should not happen. To keep it simple, we just
       alert the user to the error. */
    alert("Failure requesting the contract:\n" + contract_request.statusText);
  };
  contract_request.send();
}


/* This function is called when the user presses the
   'Ok' button.  We are now supposed to trigger the
   "correct" payment system logic. For this demo, we
   only handle "taler". */
function pay(form) {
  var choice = form.elements["payment_system"].value;
  if (choice == "taler") {
    taler_pay(form);
  }
  else {
    alert("You selected '" + choice + "', but we do not support this payment system in the demo.");
  }
};

</script>
</body>
</html>