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 = 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

meteor を使用してペイパル 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

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 に答える