14

私はサンドボックスで作業しており、PayPal REST.netSDKメソッドPayment.CreateをCreditCardオブジェクトで使用しています。すべてのパラメーターが有効で、https://developer.paypal.com/webapps/developer/docs/integration/direct/accept-credit-cards/のテストCC番号を使用している場合、Paymentオブジェクトはそのメソッドから返され、すべてが良い。

ただし、過去の有効期限やサンドボックスで認識されないCC番号などのパラメーターが無効な場合、Paymentオブジェクトは返されません。代わりに、メソッドは例外をスローします:「HttpConnection実行の例外:無効なHTTP応答リモートサーバーがエラーを返しました:(400)不正な要求」が、それ以上の説明はありません。

「400BadRequest」に加えて、cURLで同じリクエストを実行すると、JSONレスポンスが返されます。これには、「VALIDATION_ERROR」や「無効な有効期限(過去にはできません)」などのより役立つメッセージが含まれます。

私の質問:SDKからこれらのメッセージを取り戻す方法はありますか?

私が試したこと:

  • PayPalドキュメント:https ://developer.paypal.com/webapps/developer/docs/api/#errors このドキュメントでは、エラーが発生した場合、応答の本文に詳細が返されると記載されています。残念ながら、SDKからこれらにアクセスできるかどうかについてはわかりません。
  • さまざまなGoogleおよびSO検索。
  • SDKで提供されるPizzaAppサンプルコードには、例外処理やこの問題へのさらなる洞察の方法は何もありません。
  • SDKにPayPalExceptionオブジェクトが表示されますが、その使用方法や、この問題に関連するかどうかを示すものは見つかりませんでした。

すべての助けは大歓迎です。

4

8 に答える 8

22

私は今日SDKとAPIをいじり始めたばかりで、すぐにこの問題に遭遇しました。つまり、支払いを処理するための独自のフォームを作成する場合、問題が発生した場合はユーザーからのフィードバックを提供したいと思います。

いずれにせよ、私は内部の例外にいくつかの隠された情報を見つけました。多分これは役立つでしょう。

catch (PayPal.Exception.PayPalException ex)
{
    if (ex.InnerException is PayPal.Exception.ConnectionException)
    {
        context.Response.Write(((PayPal.Exception.ConnectionException)ex.InnerException).Response);
    }
    else
    {
        context.Response.Write(ex.Message);
    }
}

結果の応答:

{"name":"VALIDATION_ERROR","details":[{"field":"payer.funding_instruments[0].credit_card.number","issue":"Must be numeric"}],"message":"Invalid request - see details","information_link":"https://developer.paypal.com/webapps/developer/docs/api/#VALIDATION_ERROR","debug_id":"0548e52ef9d95"} 
于 2013-08-24T06:36:45.197 に答える
7

これに対する答えを誰も知らないようであるため、PayPalの.NET SDK forRESTAPIのソースコードを掘り下げました。このレビューから、現在のバージョンでは、サーバーから4xxまたは5xxHTTPステータスコードが返されたときにエラーメッセージを返すためのプロビジョニングがないようです。この質問への回答を参照し、SDKを変更して、該当する場合にエラー応答を返すことができるようにしました。これがHttpConnection.csの関連部分です。

catch (WebException ex)
{
    if (ex.Response is HttpWebResponse)
    {
        HttpStatusCode statusCode = ((HttpWebResponse)ex.Response).StatusCode;
        logger.Info("Got " + statusCode.ToString() + " response from server");
        using (WebResponse wResponse = (HttpWebResponse)ex.Response)
        {
            using (Stream data = wResponse.GetResponseStream ())
            {
                string text = new StreamReader (data).ReadToEnd ();
                return text;
            }
        }                           
    }
    if (!RequiresRetry(ex))
    {
        // Server responses in the range of 4xx and 5xx throw a WebException
        throw new ConnectionException("Invalid HTTP response " + ex.Message);
    }                       
}

もちろん、これには、エラー応答を適切に解釈するために呼び出し元の関数を変更する必要があります。私はPaymentCreateAPIのみを使用しているため、一般的な使用には機能しないショートカットをいくつか使用しました。ただし、基本的な考え方は、PaymentErrorクラスとDetailクラスを作成してから、Payment.CreateメソッドとPayPalResource.ConfigureAndExecuteメソッドを変更して、PaymentErrorオブジェクトにデータを入力して返すことです。


3年後、PayPalのAPIエラー応答処理にいくつかの改善があります。他のいくつかの問題のために、アプリケーションを作り直して、以前のコードを削除する必要がありました。PayPal.Exception.PaymentsExceptionをトラップしてから、JSON応答文字列をPayPal.Exception.PaymentsErrorオブジェクトに逆シリアル化できることがわかりました。

Catch ex As PayPal.Exception.PaymentsException
    Dim tmpPmtErr As PayPal.Exception.PaymentsError = _
        JsonConvert.DeserializeObject(Of PayPal.Exception.PaymentsError)(ex.Response)

例外をより綿密に調査するためのヘッズアップの他の回答の@lanceに感謝します。そのソリューションを使おうとしましたが、うまくいきませんでした。

于 2013-03-26T19:21:23.720 に答える
2

これは変わったようで、これらの答えの多くは正しい方向を示していますが、どれも私にとって正確に機能しませんでした。これは、現在最も賛成されている答えに相当します。

catch (PayPal.PaymentsException ex)
{
    context.Response.Write(ex.Response);
}

応答付き:

{"name":"VALIDATION_ERROR","details":[{"field":"start_date","issue":"Agreement start date is required, should be valid and greater than the current date. Should be consistent with ISO 8601 Format"}],"message":"Invalid request. See details.","information_link":"https://developer.paypal.com/docs/api/payments.billing-agreements#errors","debug_id":"8c56c13fccd49"}
于 2017-10-19T21:42:01.390 に答える
1

@ Jonathan、REST APIにはlog4netが統合されており、設定すると完全なエラー応答がログファイルに出力されます。この構成セクションをweb.configに追加する必要があります。

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

また、オプションを設定します。

<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
  <file value="rest-api.log"/>
  <appendToFile value="true"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] %message%newline"/>
  </layout>
</appender>
<root>
  <level value="DEBUG"/>
  <appender-ref ref="FileAppender"/>
</root>

global.asaxを開き、これをApplication_Startに追加します。

log4net.Config.XmlConfigurator.Configure();

これで、ログフォルダーに書き込み権限が設定されている限り、PayPalRESTSDKはエラーメッセージをログファイルに吐き出します。

于 2013-05-17T05:49:01.203 に答える
0

私の問題は、、、が$ 1,000.00のような値を渡していてtotal、小数が必要なので、次のようなものを使用することでした。detail.subtotalitems.price

total = Regex.Replace(model.OrderTotal, "[^0-9.]", "")
于 2013-12-21T11:44:29.170 に答える
0

ここでのソリューションの改善は...単純に(PayPalをインポート)

    Try
    Catch ex As PaymentsException
        For Each i In ex.Details.details
            Response.Write(i.field) 'Name of Field
            Response.Write(i.code) 'Code If Any
            Response.Write(i.issue) 'Validation Issue
        Next
    End Try
于 2016-06-13T20:42:54.160 に答える
0

上記のすべての解決策は、実際には問題を把握していません..

私はしばらく前に同様の問題に遭遇しました..私のコードをデバッグした後、私が行っていたトランザクションが論理的に間違っていることがわかりました..小計は$ 0.25であり、ペイパルサーバーはそれを見て処理を拒否し、私400悪いリクエスト

于 2017-08-08T07:42:14.033 に答える
-1

米国以外でグローバリゼーションを使用している場合は、小数をInvariantCultureに変換する必要があります。

order.GetTotal().ToString("N2", CultureInfo.InvariantCulture)
于 2014-06-04T15:46:49.710 に答える