Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trouble with PayPal Adaptive Payments in Node.js

I cannot for the life of me figure out what's going on. I'm just trying to do a basic call to PayPal's Adaptive Payments API, the Pay call specifically. I'm trying to achieve this with node.js. I can make successful calls with curl, but node simply refuses to work. I keep getting a 'Invalid request: {0}' error message, errorId 580001. I've searched for a long time for a solution, and although many people have had seemingly similar issues, their problems were different from mine, and so their solutions haven't worked.

Any help you can offer is MUCH appreciated.

Here is the response I keep getting (prettified):

{ responseEnvelope: 
   { timestamp: '2012-11-05T03:50:08.216-08:00',
     ack: 'Failure',
     correlationId: 'b1dbb6fea8378',
     build: '4110101' },
  error: 
   [ { errorId: '580001',
       domain: 'PLATFORM',
       subdomain: 'Application',
       severity: 'Error',
       category: 'Application',
       message: 'Invalid request: {0}' } ] }

Here's my node code: (Note: I'm using the request module: https://github.com/mikeal/request)

request = require 'request'

body = JSON.stringify

  actionType: "PAY"
  senderEmail: "[email protected]"
  receiverList:
    receiver: [
      email: "[email protected]"
      amount: "1.00"
    ]
  currencyCode: "USD"
  feesPayer: "EACHRECEIVER"
  memo: "This is a test"
  cancelUrl: "http://cancelurl"
  returnUrl: "http://returnUrl"
  ipnNotificationUrl: "http://your_ipn_notification_url"
  requestEnvelope:
    errorLanguage: "en_US"

console.log body

console.log request

  url: 'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay'

  headers:
    "X-PAYPAL-SECURITY-USERID": "happy_1349101075_biz_api1.onehappystudent.com"
    "X-PAYPAL-SECURITY-PASSWORD": "1349101103"
    "X-PAYPAL-SECURITY-SIGNATURE": "AFcWxV21C7fd0v3bYYYRCpSSRl31Avw12OuF33eJo9IbQpXMS6wrOp1."

    "X-PAYPAL-REQUEST-DATA-FORMAT": "JSON"
    "X-PAYPAL-RESPONSE-DATA-FORMAT": "JSON"

    "X-PAYPAL-APPLICATION-ID": "APP-80W284485P519543T"

    "Content-Type": "application/json"

  body: body

, (err, res, bod) ->

  console.log bod

Here's the output from running the above code:

{"actionType":"PAY","senderEmail":"[email protected]","receiverList":{"receiver":[{"email":"[email protected]","amount":"1.00"}]},"currencyCode":"USD","feesPayer":"EACHRECEIVER","memo":"This is a test","cancelUrl":"http://cancelurl","returnUrl":"http://returnUrl","ipnNotificationUrl":"http://your_ipn_notification_url","requestEnvelope":{"errorLanguage":"en_US"}}
{ readable: true,
  writable: true,
  headers: 
   { 'X-PAYPAL-SECURITY-USERID': 'happy_1349101075_biz_api1.onehappystudent.com',
     'X-PAYPAL-SECURITY-PASSWORD': '1349101103',
     'X-PAYPAL-SECURITY-SIGNATURE': 'AFcWxV21C7fd0v3bYYYRCpSSRl31Avw12OuF33eJo9IbQpXMS6wrOp1.',
     'X-PAYPAL-REQUEST-DATA-FORMAT': 'JSON',
     'X-PAYPAL-RESPONSE-DATA-FORMAT': 'JSON',
     'X-PAYPAL-APPLICATION-ID': 'APP-80W284485P519543T',
     'Content-Type': 'application/json',
     host: 'svcs.sandbox.paypal.com',
     'content-length': 409 },
  body: <Buffer 7b 22 61 63 74 69 6f 6e 54 79 70 65 22 3a 22 50 41 59 22 2c 22 73 65 6e 64 65 72 45 6d 61 69 6c 22 3a 22 68 61 70 70 79 5f 31 33 34 39 31 30 31 30 37 35 ...>,
  callback: [Function],
  pool: {},
  dests: [],
  __isRequestRequest: true,
  _callback: [Function],
  _events: 
   { error: [Function],
     complete: [Function],
     pipe: { [Function: g] listener: [Function] } },
  uri: 
   { protocol: 'https:',
     slashes: true,
     host: 'svcs.sandbox.paypal.com',
     hostname: 'svcs.sandbox.paypal.com',
     href: 'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay',
     pathname: '/AdaptivePayments/Pay',
     path: '/AdaptivePayments/Pay',
     port: 443 },
  _redirectsFollowed: 0,
  maxRedirects: 10,
  followRedirect: true,
  followAllRedirects: false,
  redirects: [],
  setHost: true,
  originalCookieHeader: undefined,
  _jar: undefined,
  port: 443,
  host: 'svcs.sandbox.paypal.com',
  clientErrorHandler: [Function],
  _parserErrorHandler: [Function],
  path: '/AdaptivePayments/Pay',
  httpModule: 
   { Server: { [Function: Server] super_: [Object] },
     createServer: [Function],
     globalAgent: 
      { options: {},
        requests: {},
        sockets: {},
        maxSockets: 5,
        _events: [Object],
        createConnection: [Function: createConnection] },
     Agent: { [Function: Agent] super_: [Object] },
     request: [Function],
     get: [Function] },
  agentClass: 
   { [Function: Agent]
     super_: { [Function: Agent] super_: [Function: EventEmitter], defaultMaxSockets: 5 } },
  agent: 
   { options: {},
     requests: {},
     sockets: {},
     maxSockets: 5,
     _events: { free: [Function] },
     createConnection: [Function: createConnection] } }
{"responseEnvelope":{"timestamp":"2012-11-05T03:50:08.216-08:00","ack":"Failure","correlationId":"b1dbb6fea8378","build":"4110101"},"error":[{"errorId":"580001","domain":"PLATFORM","subdomain":"Application","severity":"Error","category":"Application","message":"Invalid request: {0}"}]}

Here's the successful curl:

curl -s --insecure \
-H "X-PAYPAL-SECURITY-USERID: happy_1349101075_biz_api1.onehappystudent.com" \
-H "X-PAYPAL-SECURITY-PASSWORD: 1349101103" \
-H "X-PAYPAL-SECURITY-SIGNATURE: AFcWxV21C7fd0v3bYYYRCpSSRl31Avw12OuF33eJo9IbQpXMS6wrOp1." \
-H "X-PAYPAL-REQUEST-DATA-FORMAT: JSON" \
-H "X-PAYPAL-RESPONSE-DATA-FORMAT: JSON" \
-H "X-PAYPAL-APPLICATION-ID: APP-80W284485P519543T" \
-H "host: svcs.sandbox.paypal.com" \
https://svcs.sandbox.paypal.com/AdaptivePayments/Pay -d '{
  "actionType":"PAY",
  "senderEmail":"[email protected]",
  "receiverList":{
    "receiver":[{
      "email":"[email protected]",
      "amount":"1.00"
    }]
  },
  "currencyCode":"USD",
  "feesPayer":"EACHRECEIVER",
  "memo":"This is a test",
  "cancelUrl":"http://cancelurl",
  "returnUrl":"http://returnUrl",
  "ipnNotificationUrl":"http://your_ipn_notification_url",
  "requestEnvelope":{
    "errorLanguage":"en_US"
  }
}'

And here's the response: (prettified for your convenience)

{ responseEnvelope: 
   { timestamp: '2012-11-05T03:40:10.613-08:00',
     ack: 'Success',
     correlationId: 'abaf5b13c5515',
     build: '4110101' },
  payKey: 'AP-4B1870921M506553S',
  paymentExecStatus: 'COMPLETED' }

Again, any help you can offer is MUCH appreciated.

like image 980
LukeGT Avatar asked Nov 05 '12 11:11

LukeGT


2 Answers

not sure if you have pasted your code correct but this code works for me - see if you can find the difference :

var request = require('request');
body = JSON.stringify(
  {actionType: "PAY",
  senderEmail: "[email protected]",
  receiverList: { receiver:
    [{
      email: "[email protected]",
      amount: "1.00"
    }]},
  currencyCode: "USD",
  feesPayer: "EACHRECEIVER",
  memo: "This is a test",
  cancelUrl: "http://cancelurl",
  returnUrl: "http://returnUrl",
  ipnNotificationUrl: "http://your_ipn_notification_url",
  requestEnvelope: {
    errorLanguage: "en_US" }
  })

console.log(body)

request.post({
        headers: {"X-PAYPAL-SECURITY-USERID": "happy_1349101075_biz_api1.onehappystudent.com", "X-PAYPAL-SECURITY-PASSWORD": "1349101103", "X-PAYPAL-SECURITY-SIGNATURE": "AFcWxV21C7fd0v3bYYYRCpSSRl31Avw12OuF33eJo9IbQpXMS6wrOp1.", "X-PAYPAL-REQUEST-DATA-FORMAT": "JSON", "X-PAYPAL-RESPONSE-DATA-FORMAT": "JSON", "X-PAYPAL-APPLICATION-ID": "APP-80W284485P519543T", "Content-Type": "application/json"},
        url: 'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay',
         body: body
         }, function(error, response, body){
            console.log(body);
    });
like image 122
Praveen Avatar answered Nov 15 '22 00:11

Praveen


Oh God I feel stupid... I was missing one line...

method: 'POST'

Lesson learnt - don't code when tired

(unless perhaps you have a large supply of coffee)

like image 37
LukeGT Avatar answered Nov 14 '22 23:11

LukeGT