この問題は、payflowpro ゲートウェイからセキュア トークンを要求するときに渡される RETURNURL パラメータを URL エンコードしているために発生します。
統合ガイドの「名前と値のパラメーター データを URL エンコードしない」セクションを参照してください。
また、ここでは、使用できるいくつかの C# コードを動作させることができます。
また、PayPal HTTP に関するガイドラインはこちら.
セキュア トークンを要求するために HTTP POST を使用しSystem.Net.Http.HttpClient
たり、作成したりしないでください。System.Net.WebClient
代わりに、低レベルSystem.Net.WebRequest
を使用して、エンコードされていない POST データを書き込むことができるようにします。
例えば:
private string RequestSecureToken(double amount)
{
var secureTokenId = Guid.NewGuid().ToString();
var requestId = Guid.NewGuid().ToString();
var pairs = new Dictionary<string, string>()
{
{"PARTNER", "PayPal"},
{"VENDOR", "VENDOR NAME"},
{"USER", "USER NAME"},
{"PWD", "PASSWORD"},
{"TRXTYPE", "S"},
{"AMT", amount.ToString()},
{"CREATESECURETOKEN", "Y"},
{"SECURETOKENID", secureTokenId},
{"SILENTTRAN", "TRUE"},
{"RETURNURL", "http://mycompany.com/success"},
{"ERRORURL", "http://mycompany.com/error"}
};
string postData = string.Join("&", pairs.Select(p => string.Format("{0}[{2}]={1}", p.Key, p.Value, p.Value.Length)));
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://pilot-payflowpro.paypal.com");
request.Method = "POST";
request.ContentType = "text/namevalue";
request.Headers.Add("X-VPS-CLIENT-TIMEOUT", "45");
request.Headers.Add("X-VPS-REQUEST-ID", requestId);
request.ContentLength = postData.Length;
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(postData);
}
//Get the response
var response = request.GetResponse();
using (var reader = new StreamReader(response.GetResponseStream()))
{
return reader.ReadToEnd();
}
}