2016-11-10 8 views
2

私が達成したいのは、のPayPalによって提供されるButton Manager API、好ましくはNVP APIを使用して動的に作成することです。クライアントサイドのJavascriptを使用しています。JavaScriptを使用したPayPalのButton Manager API

驚いたことに、オンラインで広範な検索を行った後、私はその目標を達成するコードのサンプルを見つけることができませんでした。 PayPalのドキュメントを読むと、xmlhttprequestsでAPIを使用できると私は考えました。しかし、私はPayPalからの回答を得ることができません。私は正しいはずですいくつかの任意のパラメータを持つ文字列を作成し、そして限り来ている:

var xmlhttp; 

function generateButton() 
{ 
    console.log("Function begun") ; 

    var strUrl= "https://api.paypal.com/nvp"; 
    var strParameters="?METHOD=BMCreateButton&VERSION=204.0&BUTTONCODE=HOSTED&BUTTONTYPE=BUYNOW&BUTTONSUBTYPE=PRODUCTS&L_BUTTONVAR0=amount=15.00&L_BUTTONVAR1=item_name=test_item2USER=***&PWD=***&SIGNATURE=***"; 
    var urlRequest= strUrl+encodeURI(strParameters); 

    if (window.XMLHttpRequest) 
    { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) 
    { 
     // code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    else 
    { 
     alert("Your browser does not support XMLHTTP!"); 
    } 
    xmlhttp.open("POST",urlRequest,true); 
    xmlhttp.onreadystatechange= function(){ 
     alert(xmlhttp.statusText) ; 
     if (xmlhttp.readyState==4) 
     { 
      alert(xmlhttp.responseText) ; 
     } 
    }; 
    xmlhttp.send(); 

} 

が私のPayPalの資格情報は、プライバシーのために***としてリストされている、と私のコードでは、それらは適切です。私はこれについて正しいことをしていますか?私のパラメータが間違っているのですか、または私のxmlhttprequestの問題ですか?私はウェブプログラミングには新しいことを念頭に置いてください、そして、詳細な説明は高く評価されます。 ありがとうございます。

答えて

0

さらに読むと、クライアント側のjavascriptを使ってButton Manager APIを呼び出すのは、クロスドメイン要求(ブラウザがセキュリティ上の理由で許可されていないため)が必要なため正しいアプローチではないようです。 CORSメカニズムでこの制限を回避することは可能ですが、PayPalがサポートしていない限り、この制限は回避できます。他の解決策は存在しますが、「汚い」です。 私は、サーバーを介して要求を行う方がよいと結論づけました。自分のサーバーにリクエストを送信すると、ボタンマネージャーAPIが呼び出され、その応答(新しいボタンのHTMLコード)がクライアントに転送されます。 新しいホストボタンを作成するためのNodeJSプログラムコードは次のとおりです。

var querystring = require('querystring'); // to URL encode for the NVP 
    var https = require('https'); // to use the NVP API, request must be https 

// Prototype for a create button request fields, you can get your input from database, client side user or just hard code it 
    function CreateButtonRequest(user, pwd, signature, buttonPrice, buttonName){ 
      this.USER =user, 
      this.PWD = pwd, 
      this.SIGNATURE = signature, 
      this.METHOD = "BMCreateButton", 
      this.VERSION = "204.0", 
      this.BUTTONCODE = "HOSTED", 
      this. BUTTONTYPE = "BUYNOW", 
      this.BUTTONSUBTYPE = "PRODUCTS", 
      this.L_BUTTONVAR0 = "amount="+buttonPrice, 
      this.L_BUTTONVAR1 = "item_name="+buttonName 
    } 
    // A sample request 
    // Replace **** with your API certificate specifics, find them in your paypal account 
    sampleRequestData = { 
     USER : "****", 
     PWD : "****", 
     SIGNATURE : "****", 
     METHOD : "BMCreateButton", 
     VERSION : "204.0", 
     BUTTONCODE : "HOSTED", 
     BUTTONTYPE : "BUYNOW", 
     BUTTONSUBTYPE : "PRODUCTS", 
     L_BUTTONVAR0 : "amount=10.00", 
     L_BUTTONVAR1 : "item_name=test item2" 

    }; 

    sampleRequestData = querystring.stringify(postData); 
    //init your options object after you call querystring.stringify because you need 
    // the return string for the 'content length' header 
    console.log(sampleRequestData) ; 
    var options = { 
     host: 'api-3t.paypal.com', 
     port: 443, 
     method: 'POST', 
     path: '/nvp', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded', 
      'Content-Length': postBody.length 
     } 
    }; 



    var postreq = https.request(options, function (res) { 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { 
      console.log('Response: ' + chunk); 
     }); 
    }); 
    postreq.write(sampleRequestData); 
    postreq.end(); 
    console.log("Message sent...") ; 
関連する問題