Paypal の IPN サービスをアプリ内で動作させようとしています。
「Web Accept」のトランザクション タイプに設定された Paypal Sandbox IPN Simulatorを使用すると、 Paypal はメッセージが正常に処理されたと表示します (また、IPN を処理するアクションのコードを台無しにすると、Paypal はサーバーがあったと表示します)エラーなので、これは正しく通信しているようです)。
ただし、実際には何もしていないようです。ブラウザで IPN アクションに移動すると、myapp.com/Paypal/IPN
paypal から (予想どおり) という応答が返されINVALID
、これが を介して出力に書き込まれますDebug.Write
。Paypal のシミュレーターで [Send IPN] をクリックすると、デバッグ メッセージがまったく表示されませんが、私の IPN アクションはDebug.Write
行でいっぱいです。(ローカル環境外からの呼び出しでは、単にDebug.Write
出力が許可されませんか?)
参考までに、ここに私の IPN アクションの大部分を示します (わかりやすくするために、さまざまなロジックを削除しました)。
public ActionResult IPN()
{
Debug.Write("entering ipn action ");
var formVals = new Dictionary<string, string>();
formVals.Add("cmd", "_notify-validate");
string response = GetPayPalResponse(formVals, true);
Debug.Write("IPN Response received: " + response + " <-- That was response. . . ");
if (response == "VALID")
{
Debug.Write("Response Was Verified");
}
else
{
Debug.Write("RESPONSE WAS NOT VERIFIED");
}
return this.View();
}
string GetPayPalResponse(Dictionary<string, string> formVals, bool useSandbox)
{
string paypalUrl = useSandbox
? "https://www.sandbox.paypal.com/cgi-bin/webscr"
: "https://www.paypal.com/cgi-bin/webscr";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(paypalUrl);
//Set values for the request back
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
byte[] param = Request.BinaryRead(Request.ContentLength);
string strRequest = Encoding.ASCII.GetString(param);
StringBuilder sb = new StringBuilder();
sb.Append(strRequest);
foreach (string key in formVals.Keys)
{
sb.AppendFormat("&{0}={1}", key, formVals[key]);
}
strRequest += sb.ToString();
req.ContentLength = strRequest.Length;
string response = "";
using (StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
{
streamOut.Write(strRequest);
streamOut.Close();
using (StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()))
{
response = streamIn.ReadToEnd();
}
}
return response;
}
Paypal が実際に IPN アクションにリクエストを送信しているDebug.Write
場合、ブラウザ内で IPN アクションにアクセスしたときと同じようにメッセージを受信する必要があるという理解で正しいでしょうか?
Paypal が IPN シミュレートされたメッセージを Web アプリケーションに送信したときに実際に何かが発生したようには見えませんが、Paypal は問題ないと言い、Paypal は、IPN アクションが発生したときに意図的にエラーを発生させるかどうかを何らかの方法で認識しています (したがって、それが表示されます)。実際に何らかの形でアクションを呼び出しています)。
ここで私が理解していないことを誰かが理解するのを手伝ってくれますか?
ユーザーが「今すぐ購入」ボタンを使用してPaypalの標準的な支払い方法を使用しfalse
て支払い、支払いが確認されたときにデータベースの値を「true」に変更できるようにしたいだけです。
お時間をいただきありがとうございます。
注: これをテストしたもう 1 つの方法は、アクションが呼び出された場合にデータベース内の何かを変更することでした (単にMyEntity.Value = new value
thenのようなdb.SaveAll();
ことをしました。ブラウザ内のアクションに直接移動した場合、データベースへのこの変更は行われましたが、変更はありませんでした)。 Paypal IPNシミュレーターでアクションを「ping」したときに発生します。
アップデート:
わかりました。次を使用してトレースを実行しますtrace.axd
:
<trace enabled="true" requestLimit="100" pageOutput="false" traceMode="SortByTime" localOnly="false" />
Paypal IPN シミュレーターを実行したり、ローカル ネットワークに接続されていないデバイスを使用して自分の Web ページを参照したりしても、何も起こらないかのように動作します。
ローカル コンピューターのページにアクセスすると、詳細が変更されることに注意してください。
8 7/8/2012 6:25:01 PM paypal/ipn 200 GET View Details
9 7/8/2012 6:25:02 PM paypal/themes/ui-lightness/jquery-ui-1.8.19.custom.css 404 GET View Details
10 7/8/2012 6:25:02 PM favicon.ico 404 GET View Details
11 7/8/2012 6:25:52 PM favicon.ico 404 GET View Details
12 7/8/2012 6:26:09 PM home/paypaltest 200 GET View Details
更新 2:
デバッガーをにアタッチして、デバッガーにデバッグを開始させました:w3wp.exe
VERIFIED
IPNシミュレーターを使用すると、この時点でPaypalが実際に私のページにアクセスして応答しているようです. これが私にとって何を意味するのかわかりません。更新します。
更新 3:
デバッグが機能していれば、すべてを適切にテストでき、IPN 検証は実際に意図したとおりに機能していました。適切なデバッグ メッセージがないとわかりませんでした。
お時間をいただきありがとうございます。