6

Paypalエクスプレスチェックアウトと統合されたテストアプリケーションを持っていて、それは正常に動作していました. しかし今、いくつかの問題があるようです。Paypal での支払いが成功した後、IPN ハンドラーが応答をチェックすると、paypal が応答を "VERIFIED" OR "INVALID" ではなく html ページとして返します。このため、支払いを確認できません。エクスプレス チェックアウトに関して最近、Paypal に変更はありますか? 以下は完全なコードです

<form id="Paypal" name="Paypal" action="https://www.sandbox.paypal.com/cgi-bin/webscr"
    method="post">
    @Html.Hidden("cmd", "_xclick")
    @Html.Hidden("business", "myemail@test.com")
    @Html.Hidden("item_name", "Payment for course registration")
    @Html.Hidden("amount", 100 )
    @Html.Hidden("no_shipping", "1")
    @Html.Hidden("return", "http://localhost:49319/cart/IPN")
    @Html.Hidden("rm", "2")
    @Html.Hidden("notify_url", "http://localhost:49319/cart/IPN")
    @Html.Hidden("cancel_return", "http://localhost:49319/cart/PaymentFailure")
    @Html.Hidden("currency_code", "CAD")
    @Html.Hidden("tax_cart", "1")
    @Html.Hidden("custom", "12")
    <div class="checkout-button">
        <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"
            align="left" style="margin-right: 7px;" />
    </div>
    </form>

IPN ハンドラ コード:

 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;

        //for proxy
        //WebProxy proxy = new WebProxy(new Uri("http://urlort#");
        //req.Proxy = proxy;
        //Send the request to PayPal and get the response
        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に送信されたリクエスト文字列は次のとおりです

CONTEXT=wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja&myAllTextSubmitID=&cmd=_flow&transaction_subject=12&txn_type=web_accept&payment_date=01%3A59%3A21+May+02%2C+2011+PDT&last_name=User&residence_country=CA&pending_reason=paymentreview&item_name=Payment+for+course+registration&payment_gross=&mc_currency=CAD&business=pramod_1298956597_biz% 40sumerusolutions.com&payment_type=instant&protection_eligibility=Ineligible&payer_status=verified&verify_sign=Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc&txn_id=15Y20623GD922445F&payer_email=pramod_1298961722_per%40sumerusolutions.com&tax=0.00&test_ipn=1&first_name=Test&receiver_email=pramod_1298956597_biz%40sumerusolutions.com&quantity=1&payer_id=Z2MRT3Q9L6E28&receiver_id=RT3M59WESZHEE&item_number=&payment_status=Pending&handling_amount=0.00&shipping=0.00&mc_gross=850.00&custom=12&charset=windows-1252¬ify_version=3.1&merchant_return_link=click+here&form_charset=UTF-8CONTEXT=wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja&myAllTextSubmitID=&cmd=_flow&transaction_subject=12&txn_type=web_accept&payment_date=01%3A59% 3A21+May+02%2C+2011+PDT&last_name=User&residence_country=CA&pending_reason=paymentreview&item_name=Payment+for+course+registration&payment_gross=&mc_currency=CAD&business=pramod_1298956597_biz%40sumerusolutions.com&payment_type=instant&protection_eligibility=Ineligible&payer_status=verified&verify_sign=Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc&txn_id=15Y20623GD922445F&payer_email=pramod_1298961722_per%40sumerusolutions.com&tax=0.00&test_ipn=1&first_name=Test&receiver_email=pramod_1298956597_biz%40sumerusolutions.com&quantity=1&payer_id=Z2MRT3Q9L6E28&receiver_id=RT3M59WESZHEE&item_number=&payment_status=Pending&handling_amount=0.00&shipping=0.00&mc_gross=850.00&custom=12&charset=windows-1252¬ify_version=3.1&merchant_return_link =クリック+こちら&form_charset=UTF-8&cmd=_notify-validate00&mc_gross=850.00&custom=12&charset=windows-1252¬ify_version=3.1&merchant_return_link=ここをクリック&form_charset=UTF-8&cmd=_notify-validate00&mc_gross=850.00&custom=12&charset=windows-1252¬ify_version=3.1&merchant_return_link=ここをクリック&form_charset=UTF-8&cmd=_notify-validate

4

5 に答える 5

5

Ok。試行錯誤を繰り返し、この問題をペイパルフォーラムに投稿した後、支払いゲートウェイが機能するようになりました。私はこのソリューションに本当に満足していませんが、ソリューションはPDTを使用し、IPNを使用しないことです。ペイパルのサポートから得た回答は、「問題は、IPNが追加の通知システムであり、少し遅れていることです。したがって、自動返信ページの100%完璧なソリューションではありません。」

Paypalは私にPDTを使うように提案しました、そしてそれは今働いています。このような問題に直面している人を助けるために、ここに手順を示します。

  1. PayPalアカウントで「自動返品」およびPDT機能を有効にします。手順:PayPalアカウントにログインし、[プロファイル]をクリックします。[Webサイト]の[支払い設定]をクリックします。[自動リターン]を[オン]に設定します。[リターンURL]テキストボックスに有効なURLを入力し、[支払いデータの転送]をオンに設定します。表示されたPDTトークンを書き留めます。ページの一番下までスクロールして、[保存]をクリックします

  2. 以下のパラメーターをpaypalcmd、business、item_name、amount、return、currency_code、customに渡します。

  3. IPNハンドラーコードをPDTコードに変更します。私の場合のPDTコードは次のとおりです-

    文字列authToken、txToken、query; 文字列strResponse;

        authToken = ConfigurationManager.AppSettings["PDTToken"];
    
        //read in txn token from querystring
        txToken = Request.QueryString.Get("tx");
    
    
        query = string.Format("cmd=_notify-synch&tx={0}&at={1}", txToken, authToken);
    
        // Create the request back
        string url = ConfigurationManager.AppSettings["PayPalUrl"];
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    
        // Set values for the request back
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.ContentLength = query.Length;
    
        // Write the request back IPN strings
        StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
        stOut.Write(query);
        stOut.Close();
    
        // Do the request to PayPal and get the response
        StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
        strResponse = stIn.ReadToEnd();
        stIn.Close();            
    
        // If response was SUCCESS, parse response string and output details
        if (strResponse.StartsWith("SUCCESS"))
        {
    
        }
    
于 2011-05-05T05:36:14.590 に答える
0

IPN をセットアップしようとしているのとまったく同じ問題が発生しています...サンドボックスから「echeck」を送信すると、VERIFIED が返されますが、高速チェックアウトを実行しようとすると、検証済みまたは無効が返されません。 .. echeck とはまったく異なるものを返します... 非常に奇妙です。

これら 2 つのサービスの違いは何なのか、テクニカル サポートに尋ねてみます。

于 2011-09-15T03:10:42.450 に答える
0

IPN は C# から動作します。私はあなたと同じ問題 (ログインを要求する HTML ページを取得する) を抱えていましたが、PayPal への投稿で次の変数が欠落していることがわかりました。

cmd=_notify-validate

それを正しく追加するとすぐに、PayPal へのリクエストは期待どおりに機能しました。

確認すべきもう 1 つのことは、変数を IPN リクエストで受信したとおりに返すことです。ポスト バックの先頭に上記のコマンドを追加するだけです。

私はMVCを使用していませんが、WCFでこれを行っており、魅力的に機能します。

それが役立つことを願っています。

于 2011-10-31T21:29:37.867 に答える
0

返される html を表示する必要があります。あなたのアカウントが停止されたか何かで、Paypal があなたに応答している可能性が非常に高いです。その HTML を見せてもらえますか?

于 2011-04-21T14:38:55.503 に答える
0

まず、 Paypal 開発者サポート サイトにアクセスすることをお勧めします。問題への対応には少し時間がかかる場合がありますが、Paypal の経験が豊富なスタッフが対応してくれると確信しています。

あなたの特定の問題について、そして私の Paypal の経験では、Paypal アカウントには 2 種類あると思います。

1 番目のタイプのアカウントでは、Web サイトがサード パーティとして機能することができます。つまり、次のようになります。

  • ユーザーがあなたのウェブサイトで支払い情報を送信します
  • あなたのウェブサイトはPaypalと通信し、応答を受け取ります
  • あなたのウェブサイトでユーザーへのその応答を表示することができます

これは明らかにあなたがやろうとしていることです。

ただし、2 番目のタイプの Paypal アカウントがあると思います。このアカウントは、より安価で、要件や利用規約の制限が少ないか、統合が簡単である可能性があります (そうでなければ、なぜそれを選択するのかわかりません)。このアカウントでは、あなたのウェブサイトがユーザーを Paypal にリダイレクトする必要があると思います。

  • ユーザーが支払い情報を送信する
  • あなたはそれらをPaypalにリダイレクトします
  • 支払い状況やその他のメッセージが表示され、リンクをクリックして (ベンダー) Web サイトに戻ることができます。

私が間違っているかもしれませんが、これは Paypal API を使用した私の記憶です。上記のリンク先の Paypal 開発者サイトにアクセスすることを強くお勧めします。

于 2011-05-03T06:41:52.523 に答える