Christian Stewart
Christian Stewart

Reputation: 15519

Meteor PayPal Payments (using Meteor.http)

Edit: I've fixed my original problem and have shown a metor example in my answer.

I'm getting a error 500 when trying to get the token for my PayPal API app in Meteor:

token = EJSON.stringify(Meteor.http.call "POST", "https://api.sandbox.paypal.com/v1/oauth2/token",
    headers:
      "Accept": "application/json"
      "Accept-Language": "en_US"
    auth: "user:pass"
    params:
      "grant_type":"client_credentials"
  );
  console.log("Token: "+token);

Output of this code:

Token: {"statusCode":500,"headers":{"server":"Apache-Coyote/1.1","date":"Fri, 15 Mar 2013 05:04:43 GMT","content-length":"0","connection":"close"},"data":null,"error":{}}

Obviously PayPal is returning a error 500 to me. I can't figure out what may be causing this. Of course Auth is actual data, not user:pass.

Why am I getting error 500?

Edit: Compiled Javascript var token;

token = EJSON.stringify(Meteor.http.call("POST", "https://api.sandbox.paypal.com/v1/oauth2/token", {
  headers: {
    "Accept": "application/json",
    "Accept-Language": "en_US"
  },
  auth: "user:pass",
  params: {
    "grant_type": "client_credentials"
  }
}));

console.log("Token: " + token);

Upvotes: 3

Views: 2081

Answers (3)

Julien Le Coupanec
Julien Le Coupanec

Reputation: 7988

Then, when you need to execute the payment you can do as below. See the whole payment process here.

Meteor.methods
  'executePaypalPayment': (payerId) ->
    payment = PaypalPayments.findOne({ userId: @userId },
      { sort: { 'create_time': -1 } })

    token = Meteor.call 'getPaypalToken'

    url = 'https://api.sandbox.paypal.com/v1/payments/payment/' +
           payment.id + '/execute'

    res = Meteor.http.post url,
      headers:
        Authorization: 'Bearer ' + token.access_token
        'Content-Type': 'application/json'
      data:
        payer_id: payerId

    payment = res.data
    payment['userId'] = @userId

    if payment.state is 'approved' 
      # we insert the sucessful payment here
      PaypalPayments.insert payment

    return if payment.state is 'approved' then true else false

Upvotes: 0

Christian Stewart
Christian Stewart

Reputation: 15519

Here's an example implementation to make paypal API calls with meteor.

In the startup of your program, fetch your token. Always replace clientid and clientsecret with your own.

token = EJSON.parse(Meteor.http.post("https://api.sandbox.paypal.com/v1/oauth2/token",
    headers:
      "Accept": "application/json"
      "Accept-Language":"en_US"
    auth: "clientid:clientsecret"
    params:
      "grant_type":"client_credentials"
    #encoding: "base64"
  ).content).access_token;

Now, create a payment, shown here in a Meteor.methods method (and returning a URL for the client to go to):

buySingleItem: () ->
      console.log "Starting new payment, user id: "+Meteor.userId()
      result = Meteor.http.post("https://api.sandbox.paypal.com/v1/payments/payment",
      headers:
        "Authorization":"Bearer "+token
        "Content-Type": "application/json"
      data:
        {
          "intent":"sale"
          "redirect_urls":
            "return_url":"http://mysite.herokuapp.com/done",
            "cancel_url":"http://mysite.herokuapp.com/cancel"
          "payer":
            "payment_method":"paypal"
          "transactions":[
            {
              "amount":
                "total":"3.00",
                "currency":"USD"
              "description":"My item description."
            }
          ]
        }
      )
      payment = result.data
      console.log "PayPal redirect: "+payment.links[1].href
      return payment.links[1].href

This will create a PayPal checkout style payment, within Meteor.

Upvotes: 7

Sugitime
Sugitime

Reputation: 1888

I would provide sample code, but I'm not familiar with Meteor.

Basically you have 2 issues here:

in your headers, you are not passing the client id or client secret. This should look like:

Authorization: Basic clientid:clientsecret

Also, in your request, your request should look like this: response_type=token&grant_type=client_credentials

Looks like your in json then stringifying it, so whatever way you need to get the POST request I just put up there, once you get it, you should be good.

[edit]PayPal's doc's dont have you base64 encode the client id or secret[/edit]

Upvotes: 0

Related Questions