gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-merchant] branch master updated: misc edits to manua


From: gnunet
Subject: [GNUnet-SVN] [taler-merchant] branch master updated: misc edits to manual, some open comments
Date: Sun, 11 Mar 2018 23:08:33 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new 5f64092  misc edits to manual, some open comments
5f64092 is described below

commit 5f64092af04ceef6a1962969fbee1bcaea8548c2
Author: Christian Grothoff <address@hidden>
AuthorDate: Sun Mar 11 23:08:30 2018 +0100

    misc edits to manual, some open comments
---
 doc/merchant-api.content.texi | 245 +++++++++++++++++++++++++++---------------
 1 file changed, 160 insertions(+), 85 deletions(-)

diff --git a/doc/merchant-api.content.texi b/doc/merchant-api.content.texi
index 88b96b3..fa1f7f5 100644
--- a/doc/merchant-api.content.texi
+++ b/doc/merchant-api.content.texi
@@ -31,7 +31,7 @@ Texts.  A copy of the license is included in the section 
entitled
 @c Titlepage
 @c
 @titlepage
address@hidden The GNU Taler Merchant API tutorial 
address@hidden The GNU Taler Merchant API tutorial
 @subtitle Version @value{VERSION}
 @subtitle @value{UPDATED}
 @author Christian Grothoff (@email{christian@@grothoff.org})
@@ -56,7 +56,7 @@ Texts.  A copy of the license is included in the section 
entitled
 * Introduction::                                  What this tutorial is about
 * Accepting a Simple Payment::                    How to accept simple payments
 * Giving Refunds::                                How to give refunds to 
customers
-* Giving Customer Tips::                          How to reward customers with 
tips
+* Giving Customers Tips::                         How to reward customers with 
tips
 * Advanced topics::                               Detailed solutions to 
specific issues
 
 
@@ -159,10 +159,12 @@ Some functionality of the backend (the ``public 
interface``) is also exposed to
 customer's browser directly.  In the HTTP API, all public endpoints are 
prefixed with @code{/public/}.
 
 @section Public Sandbox Backend and Authentication
address@hidden sandbox
address@hidden authorization
 
-How the frontend authenticates with the Taler backend depends in the 
configuration. @xref{Top,,, manual, Taler Merchant Operating Manual}.
+How the frontend authenticates to the Taler backend depends on the 
configuration. @xref{Top,,, manual, Taler Merchant Operating Manual}.
 
-The public sandbox backend @url{https://backend.demo.taler.net} uses an API key
+The public sandbox backend @url{https://backend.demo.taler.net/} uses an API 
key
 in the @code{Authorization} header.  The value of this header must be
 @code{ApiKey sandbox} for the public sandbox backend.
 
@@ -198,18 +200,20 @@ curl -i 'https://backend.demo.taler.net/' \
 If an HTTP status code other than 200 is returned, something went wrong. You
 should figure out what the problem is before continuing with this tutorial.
 
-The sandbox backend @url{https://backend.demo.taler.net} uses @code{KUDOS} as
-an imaginary currency.  Coins denominated with @code{KUDOS} can be withdrawn
-from @url{https://bank.demo.taler.net}.
+The sandbox backend @url{https://backend.demo.taler.net/} uses @code{KUDOS} as
+an imaginary currency.  Coins denominated in @code{KUDOS} can be withdrawn
+from @url{https://bank.demo.taler.net/}.
 
 @section Merchant Instances
address@hidden instance
+
 The same Taler merchant backend server can be used by multiple separate
 merchants that are separate business entities.  Each of these separate business
 entities is called a @emph{merchant instance}, and is identified by an
 alphanumeric @emph{instance id}.  If the instance is omitted, the instance id
 @code{default} is assumed.
 
-The following merchant instances are configured on 
@url{https://backend.demo.taler.net}:
+The following merchant instances are configured on 
@url{https://backend.demo.taler.net/}:
 @itemize
 @item @code{GNUnet} (The GNUnet project)
 @item @code{FSF} (The Free Software Foundation)
@@ -217,18 +221,20 @@ The following merchant instances are configured on 
@url{https://backend.demo.tal
 @item @code{default} (Kudos Inc.)
 @end itemize
 
-Note that these are fictional merchants and not necessarily affiliated with the
-respective project.
+Note that these are fictional merchants used for our demonstrators and
+not affiliated with or officially approved by the respective projects.
 
 
 @node Accepting a Simple Payment
 @chapter Accepting a Simple Payment
 
 @section Creating an Order for a Payment
address@hidden order
 
 Payments in Taler revolve around an @emph{order}, which is a machine-readable
-description of the payment's details.  Before accepting a Taler payment as a 
merchant
-you must create an order.
+description of the business transaction for which the payment is to be made.
+Before accepting a Taler payment as a merchant
+you must create such an order.
 
 This is done by posting a JSON object to the backend's @code{/order} API 
endpoint.  At least the
 following fields must be given:
@@ -238,9 +244,9 @@ following fields must be given:
 @code{CURRENCY:DECIMAL_VALUE}, for example @code{EUR:10} for 10 Euros or
 @code{KUDOS:1.5} for 1.5 KUDOS.
 
address@hidden @var{summary}:  A human-readable summary for what the payment is 
about,
-should be short enough to fit into titles, though currently no hard limit is
-enforced.
address@hidden @var{summary}:  A human-readable summary for what the payment is 
about.
+The summary should be short enough to fit into titles, though no
+hard limit is enforced.
 
 @item @var{fulfillment_url}:  A URL that will be displayed once the payment is
 completed.  For digital goods, this should be a page that displays the product
@@ -249,7 +255,9 @@ the @code{order_id} as a query parameter, as well as the 
@code{session_sig} for
 session-bound payments (discussed later).
 @end itemize
 
-After successfully POSTing to @code{/order}, an @code{order_id} will be
+Orders can have many more fields, see @ref{The Taler Order Format}.
+
+After successfully @code{POST}ing to @code{/order}, an @code{order_id} will be
 returned.  Together with the merchant @code{instance}, the order id uniquely
 identifies the order within a merchant backend.
 
@@ -297,13 +305,15 @@ curl -i -X POST 'https://backend.demo.taler.net/order' \
 @end ifclear
 
 The backend will fill in some details missing in the order, such as the address
-of the merchant instance.  The full details are often called the @emph{contract
+of the merchant instance.  The full details are called the @emph{contract
 terms}.
address@hidden contract
address@hidden terms
 
 @section Checking Payment Status and Prompting for Payment
 The status of a payment can be checked with the @code{/check-payment} 
endpoint.  If the payment
-wasn't completed yet by the customer, @code{/check-payment} will give the 
frontend a URL (@var{payment_redirect_url})
-that will trigger the customer's wallet to trigger the payment.
+is yet to be completed by the customer, @code{/check-payment} will give the 
frontend a URL (the @var{payment_redirect_url})
+that will trigger the customer's wallet to execute the payment.
 
 Note that the only way to obtain the @var{payment_redirect_url} is to check 
the status of the payment,
 even if you know that the user did not pay yet.
@@ -318,7 +328,7 @@ curl -i 
"https://backend.demo.taler.net/check-payment?order_id=$ORDER_ID"; \
   --header "Authorization: ApiKey sandbox"
 # HTTP/1.1 200 OK
 # [...]
-# 
+#
 # {
 #   "payment_redirect_url":
 #      "https://backend.demo.taler.net/public/trigger-pay?[...]";,
@@ -345,43 +355,54 @@ curl -i 
"https://backend.demo.taler.net/check-payment?order_id=$ORDER_ID"; \
 @end example
 @end ifclear
 
-Depending on the value of the @var{paid} field in the response, the other 
fields will be different.  Once the
-payment was completed by the user, the response will contain the following 
fields:
+If the @var{paid} field in the response is @code{true}, the other
+fields in the response will be different. Once the payment was
+completed by the user, the response will contain the following fields:
 
 @itemize
 @item @var{paid}: Set to @var{true}.
address@hidden @var{contract_terms}:  The full contract terms derived from the 
order.
address@hidden @var{refunded}:  Boolean that indicates whether any (partial) 
refund happened for this purchase.
address@hidden @var{contract_terms}:  The full contract terms of the order.
address@hidden @var{refunded}: @code{true} if a (possibly partial) refund was 
granted for this purchase.
 @item @var{refunded_amount}:  Amount that was refunded
address@hidden @var{last_session_id}:  Last session ID used by the customer's 
wallet.  Advanced feature, explained later.
address@hidden @var{last_session_id}:  Last session ID used by the customer's 
wallet. @xref{Session-Bound Payments}.
 @end itemize
 
+Once the frontend has confirmed that the payment was successful, it
+usually needs to trigger the business logic for the merchant to
+fulfill the merchant's obligations under the contract.
+
+
 @node Giving Refunds
 @chapter Giving Refunds
address@hidden refunds
+
 A refund in GNU Taler is a way to ``undo'' a payment.  It needs to be
-authorized by the merchant at request of the customer.  Refunds can be full
-refunds, or only refund a fraction of the original amount paid.  Refunds are
+authorized by the merchant.  Refunds can be for any fraction of the
+original amount paid, but they cannot exceed the original payment.
+Refunds are
 time-limited and can only happen while the exchange holds funds for a
 particular payment in escrow.  The time during which a refund is possible
 can be controlled by setting the @code{refund_deadline} in an order.  The 
default
-value for the refund deadline depends on the configuration of the backend.
+value for this refund deadline is specified in the configuration of the
+merchant's backend.
 
-The frontend can instruct the merchant backend to authorize a refund by 
posting to the
address@hidden/refund} endpoint.
+The frontend can instruct the merchant backend to authorize a refund
+by @code{POST}ing to the @code{/refund} endpoint.
 
 The refund request JSON object has the following fields:
 @itemize
address@hidden @var{order_id}: The ID that identifies the order to be refunded.
address@hidden @var{instrance}: The merchant instance to use (defaults to 
@code{default}).
address@hidden @var{refund}:  The amount to be refunded.  If a previous refund 
was
-authorized for the same order, the new amout must be higher.  Indicates the
-total amount refunded, @emph{not} an increase in the refund.
address@hidden @var{reason}:  Reason for the refund, only used for the Back 
Office and not directly shown to the customer.
address@hidden @var{order_id}: Identifies for which order a customer should be 
refunded.
address@hidden @var{instrance}: Merchant instance to use (defaults to 
@code{default}).
address@hidden @var{refund}:  Amount to be refunded.  If a previous refund was
+authorized for the same order, the new amount must be higher, otherwise
+the operation has no effect. The value indicates the
+total amount to be refunded, @emph{not} an increase in the refund.
address@hidden @var{reason}:  Human-readable justification for the refund. The 
reason is only used by the Back Office and is not exposed to the customer.
 @end itemize
 
 If the request is successful (indicated by HTTP status code 200), the response
-includes a @code{refund_redirect_url}.  The frontend must navigate the
-customer's browser to allow the refund to be processed by the wallet.
+includes a @code{refund_redirect_url}.  The frontend must redirect the
+customer's browser to that URL to allow the refund to be processed by the 
wallet.
 
 This code snipped illustrates giving a refund:
 @clear GOT_LANG
@@ -427,16 +448,31 @@ curl -i -X POST 'https://backend.demo.taler.net/refund' \
 @end example
 @end ifclear
 
address@hidden Giving Customer Tips
address@hidden Giving Customer Tips
-GNU Taler allows merchants to give small sums of money directly to the
-customer, for example to incentivize actions such as filling out a survey or
-trying a new feature.  The merchant backend must be properly configured for
-this, and enough funds must be made available for tipping @xref{Top,,, manual,
address@hidden Giving Customers Tips
address@hidden Giving Customers Tips
address@hidden tips
+
address@hidden NOTE: Terminology should not be merchant/customer here, as
address@hidden the relationship is completely different. So I use
address@hidden ``site'' and ``visitor'', as that is right now the proper
address@hidden context. We may want to use more payment-ish terminology
address@hidden in the future, but ``donor'' and ``grantee'' sound excessive
address@hidden in the context of ``tips''.
+
+GNU Taler allows Web sites to grant small amounts directly to the
+visitor.  The idea is that some sites may want incentivize actions
+such as filling out a survey or trying a new feature.  It is important
+to note that tips are not enforcable for the visitor, as there is no
+contract. It is simply a voluntary gesture of appreciation of the site
+to its visitor.  However, once a tip has been granted, the visitor
+obtains full control over the funds provided by the site.
+
+The ``merchant'' backend of the site must be properly configured for
+tipping, and sufficient funds must be made available for tipping @xref{Top,,, 
manual,
 Taler Merchant Operating Manual}.
 
-To check if tipping is configured properly and if there are enough funds 
available to tip,
-query the @code{/tip-query} endpoint:
+To check if tipping is configured properly and if there are
+sufficient funds available for tipping, query the @code{/tip-query} endpoint:
 
 @clear GOT_LANG
 @ifset LANG_CURL
@@ -472,20 +508,20 @@ curl -i 
'https://backend.demo.taler.net/tip-query?instance=default' --header "Au
 @end example
 @end ifclear
 
-To authorize a tip, post to @code{/tip-authorize}.  The following fields are 
recognized in the JSON
address@hidden authorize tip
+To authorize a tip, @code{POST} to @code{/tip-authorize}.  The following 
fields are recognized in the JSON
 request object:
+
 @itemize
address@hidden @var{amount}: Amount that should be given to the customer as a 
tip.
address@hidden @var{instance}: Merchant instance that gives the tip (each 
instance has
-their own independend tipping funds configured).
address@hidden @var{justification}: Description of why the tip was given.  Not 
given to the customer, but
-used from back office purposes.
address@hidden @var{next_url}: The URL that the user's browser will be 
redirected to by the wallet, once
-the tip has been processed.
address@hidden @var{amount}: Amount that should be given to the visitor as a 
tip.
address@hidden @var{instance}: Merchant instance that grants the tip (each 
instance may have its own independend tipping funds configured).
address@hidden @var{justification}: Description of why the tip was granted.  
Human-readable text not exposed to the customer, but used by the Back Office.
address@hidden @var{next_url}: The URL that the user's browser should be 
redirected to by the wallet, once the tip has been processed.
 @end itemize
 
-The response contains a @code{tip_redirect_url}, the customer's browser must be
-redirected to this URL to accept the tip.
+The response from the backend contains a @code{tip_redirect_url}. The 
customer's browser must be
+redirected to this URL for the wallet to pick up the tip.
address@hidden pick up tip
 
 This code snipped illustrates giving a tip:
 @clear GOT_LANG
@@ -539,6 +575,7 @@ curl -i -X POST 
'https://backend.demo.taler.net/tip-authorize' \
 * Detecting the Presence of the Taler Wallet::  Detecting the Presence of the 
Taler Wallet
 * Integration with the Back Office::            Integration with the Back 
Office
 * Session-Bound Payments::                      Session-bound payments for 
digital goods
+* Product Identification::                      Product Identification
 * The Taler Order Format::                      The Taler Order Format
 @end menu
 
@@ -546,10 +583,13 @@ curl -i -X POST 
'https://backend.demo.taler.net/tip-authorize' \
 @section Detecting the Presence of the Taler Wallet
 @cindex wallet
 
-Taler offers ways to detect whether a user has the wallet installed in their
-browser, and take actions accordingly.  Note that not all platforms can do
-presence detection reliably.  Some platforms might have a Taler wallet 
installed,
-but the browser is not aware of its presence.
+Taler offers ways to detect whether a user has the wallet installed in
+their browser. This allows Web sites to adapt accordingly.  Note that
+not all platforms can do presence detection reliably.  Some platforms
+might have a Taler wallet installed as a separate App instead of using
+a Web extension.  In these cases, presence detection will fail. Thus,
+sites may want to allow users to request Taler payments even if a
+wallet could not be detected, especially for visitors using mobiles.
 
 @subsection Presence detection without JavaScript
 Presence detection without JavaScript is based on CSS classes.  You can hide or
@@ -598,8 +638,9 @@ The following is a complete example:
 @end smallexample
 
 The @code{taler-fallback.css} is part of the Taler's @emph{web-common} 
repository,
-available at @code{https://git.taler.net/web-common.git}.  Please adjust the 
@code{href}
-attribute in order to make it work with your Web site.
+available at 
@url{https://git.taler.net/web-common.git/tree/taler-fallback.css}.
+You may have to adjust the @code{href} attribute in the HTML code above to 
point
+to the correct location of the @code{taler-fallback.css} file on your Web site.
 
 @subsection Detection with JavaScript
 
@@ -608,60 +649,94 @@ available at 
@url{https://git.taler.net/web-common.git/tree/taler-wallet-lib.js}
 
 @table @code
 @item onPresent(callback: () => void)
-Add a callback to be called when support for Taler payments is detected.
+Adds a callback to be called when support for Taler payments is detected.
 
 @item onAbsent(callback: () => void)
-Add a callback to be called when support for Taler payments is disabled.
+Adds a callback to be called when support for Taler payments is disabled.
 
 @end table
 
-Note that the registered callbacks can be called more than once, since a user
-can disable/enable the wallet in the browser's setting while a shop frontend
-page is open.
+Note that the registered callbacks may be called more than once. This may
+happen if a user disables or enables the wallet in the browser's extension
+settings while a shop's frontend page is open.
+
address@hidden FIXME: include full example of Web site including 
taler-wallet-lib.js
address@hidden and using JS detection actions.  (alert()?)
 
 @node Integration with the Back Office
 @section Integration with the Back Office
-Taler ships the back-office feature as a stand-alone Web application.
-See how to run it, on its own documentaion: 
@url{https://docs.taler.net/backoffice/html/manual.html}.
+
+Taler ships a Back Office application as a stand-alone Web application.
+The Back Office has its own documentation at 
@url{https://docs.taler.net/backoffice/html/manual.html}.
+
+Developers wishing to tightly integrate back office support for
+Taler-based payments into an existing back office application should
+focus on the wire transfer tracking and transaction history sections
+of the Taler Backend API specification at
address@hidden://docs.taler.net/api/api-merchant.html}
 
 @node Session-Bound Payments
 @section Session-Bound Payments
-Sometimes checking if an order has been paid for is not enough, but the
-merchant wants to checked if the ``payment receipt'' is available on the user's
-current device.  This prevents users from easily sharing digital goods by just
-sharing a link to the fulfillment page.  Of course advanced users can
-easily share these payment receipts, but it is not as easy as sharing a link.
address@hidden session
+
+Sometimes checking if an order has been paid for is not enough. For
+example, when selling access to online media, the publisher may want
+to be paid for exactly the same product by each customer.  Taler
+supports this model by allowing the mechant to check whether the
+``payment receipt'' is available on the user's current device.  This
+prevents users from easily sharing media access by transmitting a link
+to the fulfillment page.  Of course sophisticated users could share
+payment receipts as well, but this is not as easy as sharing a link,
+and in this case they are more likely to just share the media
+directly.
 
 To use this feature, the merchant must first assign the user's current browser
 an ephemeral @code{session_id}, usually via a session cookie.  When executing
-or re-playing a payment, the wallet will receive a signature
-(@code{session_sig}) that certifies that in the current session, the wallet
-showed a payment receipt for the respective order.
+or re-playing a payment, the wallet will receive an additional signature
+(@code{session_sig}).  This signature certifies that the wallet
+showed a payment receipt for the respective order in the current session.
address@hidden cookie
 
 Session-bound payments are triggerd by passing the @code{session_id} parameter
 to the @code{/check-payment} endpoint.  The wallet will then redirect to the
 fulfillment page, but include an additional @code{session_sig} parameter.  The
 frontend can query @code{/check-payment} with both the @code{session_id} and
-the @code{session_sig} again to verify that the signature is correct.
+the @code{session_sig} to verify that the signature is correct.
 
 The last session ID that was successfuly used to prove that the payment
 receipt is in the user's wallet is also available as @code{last_session_id} in
 the response to @code{/check-payment}.
address@hidden FIXME: used for what?
 
-In some situations the user has paid for some digital good, but the frontend
-does not know the exact order ID, and thus can't instruct the wallet to show
address@hidden Product Identification
address@hidden Product Identification
address@hidden resource url
+
+In some situations the user may have paid for some digital good, but the 
frontend
+does not know the exact order ID, and thus cannot instruct the wallet to reveil
 the existing payment receipt.  This is common for simple shops without a login
 system.  In this case, the user would be prompted for payment again, even
-though they already purchased the product.  To allow the wallet to instead show
-the existing payment receipt, the @code{resource_url} parameter must be given
-to @code{/check-payment}.  It should correspond to the fulfillment URL for the
-potentially existing payment for the same product.
+though they already purchased the product.
+
+To allow the wallet to instead find the existing payment receipt, the
+shop must use a unique fulfillment URL for each product.  Then, the
+frontend must provide an additional @code{resource_url} parameter to
+to @code{/check-payment}.  It should identify this unique fulfillment
+URL for the product.  The wallet will then check whether it has paid
+for a contract with the same @code{resource_url} before, and if so
+replay the previous payment.
address@hidden FIXME: design question (!): why do we not simply set a flag 
(``unique fulfillment url'')
address@hidden instead of passing the fulfillment URL a *second* time to the 
backend?
address@hidden (and having to worry about it being the same as in the order on 
/order)?
+
 
 @c Section describing the format of Taler contracts/proposals in detail
 
 @node The Taler Order Format
 @section The Taler Order Format
 @cindex contract
address@hidden terms
address@hidden order
 
 A Taler order can specify many details about the payment.
 This section describes each of the fields in depth.
@@ -836,7 +911,7 @@ Street number (number of the house) for delivery, as found 
on a postal package.
 @end table
 
 Note that locations are not required to specify all of these fields,
-and it is also allowed to have additional fields.  Contract renderers
+and they is also allowed to have additional fields.  Contract renderers
 must render at least the fields listed above, and should render fields
 that they do not understand as a key-value list.
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]