3

编辑:我已经解决了我原来的问题,并在我的回答中展示了一个米特示例。

尝试在 Meteor 中获取我的 PayPal API 应用程序的令牌时出现错误 500:

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);

此代码的输出:

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":{}}

显然 PayPal 正在向我返回错误 500。我无法弄清楚可能是什么原因造成的。当然 Auth 是实际数据,而不是 user:pass。

为什么我收到错误 500?

编辑:编译的 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);
4

3 回答 3

7

这是一个使用流星进行贝宝 API 调用的示例实现。

在您的程序启动时,获取您的令牌。总是用你自己的替换clientid和。clientsecret

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;

现在,创建一个付款,这里显示在一个Meteor.methods方法中(并返回一个 URL 供客户端访问):

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

这将在 Meteor 中创建一个 PayPal 结帐式付款。

于 2013-03-18T16:13:49.533 回答
0

我会提供示例代码,但我不熟悉 Meteor。

基本上你有2个问题:

在您的标头中,您没有传递客户端 ID 或客户端密码。这应该看起来像:

Authorization: Basic clientid:clientsecret

此外,在您的请求中,您的请求应如下所示: response_type=token&grant_type=client_credentials

看起来你的 in json 然后对其进行字符串化,所以无论你需要什么方式来获取我刚刚放在那里的 POST 请求,一旦你得到它,你应该会很好。

[编辑] PayPal 的文档没有让您对客户端 ID 或密码进行 base64 编码[/编辑]

于 2013-03-15T21:43:20.700 回答
0

然后,当您需要执行付款时,您可以执行以下操作。在此处查看整个付款流程

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
于 2014-05-04T17:44:18.590 回答