私はすべてPayPal's documentationをソートしていますが、そのすべてがASPには適用されますが、MVCでは(そのほかに便利な統合ウィザードを含めて)適用されていません。私はoft-参照guide by Rick Strahlを見たことがありますが、ASP用でもあり、WebformsでMVCに変換する経験はありません。MVC3でのPaypal APIリクエスト
私は1つの部分に固執しており、別の部分についてセキュリティ上の懸念があります。
最初に、実際にPayPal APIにリクエストをどのように提出しますか? documentationには、パスワードを含むフォームを使用するよう指示されています。
<form method=post action=https://api-3t.sandbox.paypal.com/nvp>
<input type=hidden name=USER value=API_username>
<input type=hidden name=PWD value=API_password>
<input type=hidden name=SIGNATURE value=API_signature>
<input type=hidden name=VERSION value=XX.0>
<input type=hidden name=PAYMENTREQUEST_0_PAYMENTACTION
value=Sale>
<input name=PAYMENTREQUEST_0_AMT value=19.95>
<input type=hidden name=RETURNURL
value=https://www.YourReturnURL.com>
<input type=hidden name=CANCELURL
value=https://www.YourCancelURL.com>
<input type=submit name=METHOD value=SetExpressCheckout>
</form>
確かにこのフォームは表示されません。あなたのソースをチェックするユーザーは、ログイン情報を盗む可能性があります。私はこれをコントローラから行う必要があると仮定しますが、コントローラからこれを作成する方法はわかりません。 HttpWebRequestとWebClientは有望ですが、フォームを実際に追加する方法はわかりません。
2番目:このフォームとAPIコールをユーザーが見ることができないコントローラの内側から呼び出しても、ソースコードにアクセスできる人(ウェブホストや他の開発者など)はパスワードを参照してください。これは良いセキュリティのようには見えません。ここでの練習は何ですか?どのようにこれを安全にすることができますか?
探して来る人のためにEDIT 、これは私が最終的に最初の要求を提出する方法である(読みやすくするための1つのブロックにコードを凝縮)
public static string GetResponse(RequestContext context, decimal price)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp");
//HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp");
request.Method = "POST";
UrlHelper url = new UrlHelper(context);
string urlBase = string.Format("{0}://{1}", context.HttpContext.Request.Url.Scheme, context.HttpContext.Request.Url.Authority);
string formContent = "USER=" + System.Configuration.ConfigurationManager.AppSettings["paypalUser"] +
"&PWD=" + System.Configuration.ConfigurationManager.AppSettings["paypalPassword"] +
"&SIGNATURE=" + System.Configuration.ConfigurationManager.AppSettings["paypalSignature"] +
"&VERSION=84.0" +
"&PAYMENTREQUEST_0_PAYMENTACTION=Sale" +
"&PAYMENTREQUEST_0_AMT=" + String.Format("{0:0.00}", price) +
"&RETURNURL=" + urlBase + url.Action("Confirm", "Checkout") +
"&CANCELURL=" + urlBase + url.Action("Canceled", "Checkout") +
"&METHOD=SetExpressCheckout";
byte[] byteArray = Encoding.UTF8.GetBytes(formContent);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = HttpUtility.UrlDecode(reader.ReadToEnd());
reader.Close();
dataStream.Close();
response.Close();
return responseFromServer;
}
ですが、私はまだそれにフォーム(または任意のデータ)を追加する方法がわからないです。ストリームに文字列を書いているだけでしょうか?申し訳ありませんが、これまでにこれをやったことはありません。また、web.configの情報をどのように暗号化するのですか?これまでに聞いたことはありませんでしたか? – Tyrsius
はい、基本的に、フィールド名と値を連結し、それをバイト配列に変換します。この例の 'postdata'変数を参照してください。だから、あなたのビューでは、単にユーザーデータ(量など)をキャプチャするためにフィールドを配置し、コントローラには他のフィールドを追加します。ここでは、Webconfig値の暗号化に関する情報を確認できます。http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx – Romias