2

私は現在、PayPal のエクスプレス チェックアウトを支払いサービスとして実装することを含む Web プロジェクトに取り組んでいます。プロジェクトは C# で、私は Visual Studio 2010 と PayPal API の SOAP バージョンを使用しています。私が使用している API のバージョンは 91.0 で (これを他のバージョンに切り替えようとしましたが、問題は残ります)、開発を行うためにサンドボックスで作業しています。

SOAP API 開発者ガイドで、Web 参照としてプロジェクトにサービスをインポートするための WSDL を見つけました。エクスプレス チェックアウトの支払いフローのすべてのステップを実行できます。リクエストを作成することは、サービスからの応答を使用して公園を散歩することですが、そうではありません。

何らかの理由で、応答のデータ フィールドが期待どおりに自動的に入力されません。有用なフィールドはすべて null です。このため、適切なオブジェクトにアクセスするだけでなく、必要なデータを取得するために、応答内の XML 文字列を手動で解析する必要があります。言うまでもなく、私はこのように働きたくありません。

支払いフローの最後のステップ (DoExpressCheckout) の簡単な例:

PayPalAPIAASoapBinding apiaa = new PayPalAPIAASoapBinding();
apiaa.RequesterCredentials = ... ;

DoExpressCheckoutPaymentReq decreq = new DoExpressCheckoutPaymentReq();
decreq.DoExpressCheckoutPaymentRequest = new DoExpressCheckoutPaymentRequestType();
/* Filling in all the fields required */

DoExpressCheckoutPaymentResponseType decres = apiaa.DoExpressCheckoutPayment(decreq);

通常、decres オブジェクトには、必要なすべての詳細を含むフィールド DoExpressCheckoutPaymentResponseDetails があります。マニュアルと私が期待することによると、たとえば、次のように応答で返されたトークンを読み取ることができるはずです。

string token = decres.DoExpressCheckoutPaymentResponseDetails.Token;

代わりに、DoExpressCheckoutPaymentResponseDetails フィールドは null であり、次のようなトークンを取得しました。

string token = decres.Any.ChildNodes[0].InnerText;

PayPal サービスからエラー コードが表示されません。

さらに奇妙なのは、TransactionSearch 関数を使用して複数のトランザクションを検索する場合です。関数が 50 件のトランザクションを返すとします。49 個のトランザクションが、API ドキュメントを読んだ後に見つかるはずの正しいオブジェクトに入力されています。ただし、最初のトランザクションはそうではなく、応答の Any フィールドから手動で解析する必要があります。

誰かが同じまたは同様の問題に遭遇したことがありますか?

Fyi: 私は Web アプリケーション PHP のプログラミングに慣れています。特定の要求に応じて、C# でこれを行っています。これは標準的な C# または Visual Studio の動作ですか (疑わしい)、または Visual Studio で SOAP サービスの側面を間違った方法で実行/構成していますか?

4

2 に答える 2

6

解決済み: 解決策は、従来の「Web REFERENCE」の使用をやめ、代わりに新しい標準の Service Reference を使用することです。

私のコードのほとんどは、新しいサービス リファレンスで問題なく動作しました。Web.config をセットアップし、サービスのインスタンスを作成する方法を変更するだけで済みました。

return new PayPalAPIAAInterfaceClient("PayPalAPIAA"); PayPalAPIAASoapBinding に取って代わりました。

元の投稿が続きます........

私はこの質問に賛成です。無効な認証情報、トランザクションの失敗、または API バージョンの不一致の問題ではありません。私はすべてを正しく行っています。応答にはトークンが含まれていますが、それが属する場所ではなく、anyField変数に入ります。

このバグは、VS 2008 .Net 3.5 から VS 2010 .Net 4 にアップグレードした後、醜い頭をもたげてきました。このバグは PayPal 側にあるのではなく、.Net 4 XML 解析のバグであると思われます。

トークンは、ここの Token プロパティに入る必要があります...

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:api:PayPalAPI")]
public partial class SetExpressCheckoutResponseType : AbstractResponseType {

    private string tokenField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public string Token {
        get {
            return this.tokenField;
        }
        set {
            this.tokenField = value;
        }
    }
}

代わりに、ここで終わります....

[System.Xml.Serialization.XmlAnyElementAttribute()]
        public System.Xml.XmlElement Any {
            get {
                return this.anyField;
            }
            set {
                this.anyField = value;
            }
        }

Reference.cs ファイル内でこれを修正できる可能性がありますが、Web サービス参照を更新するとすぐに修正が上書きされます。

ここに同じ問題を抱えている他の人がいますが、彼らの解決策は私にはうまくいきませんでした. https://www.x.com/developers/paypal/forums/soap/paypal-api-aa-and-net-wcf-undeserialized-fields

ヘルプ!!

于 2012-09-16T06:04:44.617 に答える
0

正確に言うのは難しい。通常、トランザクションが失敗するとこれらのフィールドは null になり、トランザクションが成功すると表示されます。

decres.Ack電話してから確認していますDoExpressCheckoutPaymentか?decres.AckAckCodeType.Successまたはの場合AckCodeType.SuccessWithWarning、トランザクションは成功し、データDoExpressCheckoutPaymentResponseDetailsが入力されるはずです。それ以外の場合、トランザクションは失敗し、フィールドは null になります。

于 2012-08-24T22:13:58.703 に答える