<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>generators/USAGE</filename>
    </added>
    <added>
      <filename>generators/templates/migration.rb</filename>
    </added>
    <added>
      <filename>generators/transaction_migration_generator.rb</filename>
    </added>
    <added>
      <filename>lib/amazon_fps_foo/pipeline.rb</filename>
    </added>
    <added>
      <filename>lib/amazon_fps_foo/transaction.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -5,7 +5,7 @@ require 'base64'
 require 'yaml'
 require 'rexml/document'
 
-module AmazonFpsFoo
+module AmazonFPSFoo
   $KCODE = &quot;u&quot;
   VERSION = &quot;2007-01-08&quot;
   SIGNATURE_VERSION = &quot;1&quot;
@@ -21,7 +21,7 @@ module AmazonFpsFoo
     end
     ACCESS_KEY = config[:access_key]
     SECRET_ACCESS_KEY = config[:secret_access_key]
-    RETURN_BASE = config[:return_base]
+    SERVICE_NAME = config[:service_name]
   end
   
   begin
@@ -29,5 +29,28 @@ module AmazonFpsFoo
     CALLER_TOKEN = config[:caller_token]
     RECIPIENT_TOKEN = config[:recipient_token]
     SENDER_TOKE = config[:sender_token]
+  rescue
   end
+  
+  class &lt;&lt; self
+    
+    # Send a pay request to FPS
+    def pay(caller_token, recipient_token, sender_token, amount, payer, options = {})
+      @transaction = Transaction.create!(:caller_token =&gt; caller_token,
+                                         :sender_token =&gt; sender_token,
+                                         :recipient_token =&gt; recipient_token,
+                                         :amount =&gt; amount,
+                                         :caller_reference =&gt; 'Order-' + Time.now.to_i.to_s,
+                                         :sender_reference =&gt; Time.now.to_i.to_s,
+                                         :recipient_reference =&gt; Time.now.to_i.to_s,
+                                         :payer =&gt; payer)
+      response = Query.do(call)
+      @transaction.update_attributes(:transaction_id =&gt; response[:transaction_response][:transaction_id],
+                                     :response_id =&gt; response[:response_id],
+                                     :state =&gt; Transaction.state_map[response[:transaction_response][:status]]
+      return @transaction.id
+    end
+    
+  end
+  
 end
\ No newline at end of file</diff>
      <filename>lib/amazon_fps_foo.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,8 @@
-module AmazonFpsFoo
+module AmazonFPSFoo
   class Query
+    
+    class FPSError &lt; StandardError; end
+    
     class &lt;&lt; self
       include AmazonFPSFoo::Signature
       
@@ -7,7 +10,12 @@ module AmazonFpsFoo
       def do params
         query = build_query params
         xml_response = send_query query
-        return parse(xml_response)
+        response = parse(xml_response)
+        if response[:status] == 'Success'
+          return response
+        else
+          raise FPSError, parse_error(response, params)
+        end
       end
       
       def build_query params
@@ -15,7 +23,7 @@ module AmazonFpsFoo
                       'SignatureVersion' =&gt; SIGNATURE_VERSION,
                       'Version' =&gt; VERSION,
                       'Timestamp' =&gt; Time.now.gmtime.iso8601 }
-        params = params.merge defaults
+        params = params.camelize(:lower).merge defaults
         # case-insensitive sort params by Hash key, returns Array
         params = fps_sort(params)
         # create digest of concatenated params
@@ -68,12 +76,16 @@ module AmazonFpsFoo
         node_name = node.name.underscore.to_sym
         case
         when node.has_elements?
-          node.elements.each{|e| parse_element(response, e) }
+          node.elements.each{|e| parse_element(response[node_name], e) }
         else
           response[node_name] = node.text
         end
       end
       
+      def parse_error(response, call)
+        &quot;FPS Error (#{response[:service_error][:error_type]}): #{response[:service_error][:error_code]}\n#{response[:service_error][:reason_text]}\nOriginal Service Call: #{call.inspect}&quot;
+      end
+      
     end
   end
 end
\ No newline at end of file</diff>
      <filename>lib/amazon_fps_foo/query.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-module AmazonFpsFoo
+module AmazonFPSFoo
   module Signature
     
     # case-insensitive sort by Hash key</diff>
      <filename>lib/amazon_fps_foo/signature.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-module AmazonFpsFoo
+module AmazonFPSFoo
   module Version
     MAJOR = 0
     MINOR = 1</diff>
      <filename>lib/amazon_fps_foo/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,35 +4,47 @@ namespace :afps do
     # Generate 'Caller' token
     call = { 'Action' =&gt; 'InstallPaymentInstruction',
              'PaymentInstruction' =&gt; &quot;MyRole == 'Caller' orSay 'Role does not match';&quot;,
-             'CallerReference' =&gt; Time.now.to_i.to_s,
+             'CallerReference' =&gt; (Time.now.to_i + rand(100000)).to_s,
              'TokenType' =&gt; 'Unrestricted' }
-    response = AmazonFpsFoo::Query.do(call)
+    response = AmazonFPSFoo::Query.do(call)
     if response[:status] &amp;&amp; response[:status] == &quot;Success&quot;
       @caller_token_id = response[:token_id]
+    else
+      puts &quot;Error requesting caller token:&quot;
+      puts response.inspect
+      raise
     end
     
     # Generate 'Receiver' token
     call = {'Action' =&gt; 'InstallPaymentInstruction',
             'PaymentInstruction' =&gt; &quot;MyRole == 'Recipient' orSay 'Roles do not match';&quot;,
-            'CallerReference' =&gt; Time.now.to_i.to_s,
+            'CallerReference' =&gt; (Time.now.to_i + rand(100000)).to_s,
             'TokenType' =&gt; 'Unrestricted' }
-    response = AmazonFpsFoo::Query.do(call)
+    response = AmazonFPSFoo::Query.do(call)
     if response[:status] &amp;&amp; response[:status] == &quot;Success&quot;
       @receiver_token_id = response[:token_id]
+    else
+      puts &quot;Error requesting receiver token:&quot;
+      puts response.inspect
+      raise
     end
     
     # Generate 'Sender' token
     call = {'Action' =&gt; 'InstallPaymentInstruction',
             'PaymentInstruction' =&gt; &quot;MyRole == 'Sender' orSay 'Roles do not match';&quot;,
-            'CallerReference' =&gt; Time.now.to_i.to_s,
+            'CallerReference' =&gt; (Time.now.to_i + rand(100000)).to_s,
             'TokenType' =&gt; 'Unrestricted' }
-    response = AmazonFpsFoo::Query.do(call)
+    response = AmazonFPSFoo::Query.do(call)
     if response[:status] &amp;&amp; response[:status] == &quot;Success&quot;
       @sender_token_id = response[:token_id]
+    else
+      puts &quot;Error requesting sender token:&quot;
+      puts response.inspect
+      raise
     end
     
     # Dump tokens to config file
-    filename = &quot;#{RAILS_ROOT}/coonfig/amazon_fps_tokens.yml&quot;
+    filename = &quot;#{RAILS_ROOT}/config/amazon_fps_tokens.yml&quot;
     File.open(filename, 'w') do |file|
       file.write &quot;caller_token: '#{@caller_token_id}'\n&quot;
       file.write &quot;receiver_token: '#{@receiver_token_id}'\n&quot;</diff>
      <filename>tasks/amazon_fps_foo_tasks.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,19 +1,23 @@
 development:
-  access_key_id: 
+  access_key: 
   secret_access_key: 
   test: true
+  service_name: 'Application Name'
 
 test:
-  access_key_id: 
+  access_key: 
   secret_access_key: 
   test: true
+  service_name: 'Application Name'
 
 staging:
-  access_key_id: 
+  access_key: 
   secret_access_key: 
   test: true
+  service_name: 'Application Name'
 
 production:
-  access_key_id: 
+  access_key: 
   secret_access_key: 
-  test: false
\ No newline at end of file
+  test: false
+  service_name: 'Application Name'
\ No newline at end of file</diff>
      <filename>templates/amazon_fps.yml.tpl</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>lib/amazon_fps_foo/cbui.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>b7d3ac583bb6661e3328fd938c8800cdb74e9069</id>
    </parent>
  </parents>
  <author>
    <name>Matt Hodgson</name>
    <email>mhodgson@youcastr.com</email>
  </author>
  <url>http://github.com/mhodgson/amazon_fps_foo/commit/a1b76186410a2a70d9367ab18d1ac1d0f038b712</url>
  <id>a1b76186410a2a70d9367ab18d1ac1d0f038b712</id>
  <committed-date>2008-12-08T19:32:57-08:00</committed-date>
  <authored-date>2008-12-08T19:32:57-08:00</authored-date>
  <message>Added database based transaction tracking</message>
  <tree>f867751be0e9fe43b00f2f2290674f753434b386</tree>
  <committer>
    <name>Matt Hodgson</name>
    <email>mhodgson@youcastr.com</email>
  </committer>
</commit>
