-2

私はペイパルNVPを使用しており、NVPはキーと値のペアの文字列で応答します

TOKEN = EC-3XXXXXXXXXXX154J&BILLINGAGREEMENTACCEPTEDSTATUS = 1&CHECKOUTSTATUS = PaymentActionNotInitiated&TIMESTAMP = 2012-07-10T11:45:59Z&CORRELATIONID=ecf9bfe9b1168&ACK=Success&VERSION=64.0&BUILD=3242673&EMAIL=govind_1341920205_per@gmail.com&PAYERID=3V85HKW32SXKG&PAYERSTATUS=verified&FIRSTNAME=Govind&LASTNAME=Malviya&COUNTRYCODE=US&SHIPTONAME=Govind Malviya&SHIPTOSTREET = 1メインセント&SHIPTOCITY =サンノゼ&SHIPTOSTATE = CA&SHIPTOZIP = 95131&SHIPTOCOUNTRYCODE = US&SHIPTOCOUNTRYNAME =米国&ADDRESSSTATUSは=確認&CURRENCYCODE = USD&AMT = 30.90&SHIPPINGAMT = 0.00&HANDLINGAMT = 0.00&TAXAMT = 0.00&DESC =テストEC決済&INSURANCEAMT = 0.00&SHIPDISCAMT = 0.00&PAYMENTREQUEST_0_CURRENCYCODE = USD&PAYMENTREQUEST_0_AMT = 30.90&PAYMENTREQUEST_0_SHIPPINGAMT = 0.00&PAYMENTREQUEST_0_HANDLINGAMT = 0.00&PAYMENTREQUEST_0_TAXAMT = 0.00&PAYMENTREQUEST_0_DESC =テストEC決済&PAYMENTREQUEST_0_INSURANCEAMT = 0.00&PAYMENTREQUEST_0_SHIPDISCAMT = 0.00&PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED =偽&PAYMENTREQUEST_0_SHIPTONAME = Govind Malviya&PAYMENTREQUEST_0_SHIPTOSTREET = 1 MAIN ST&PAYMENTREQUEST_0_SHIPTOCITY =サンノゼ&PAYMENTREQUEST_0_SHIPTOSTATE = CA&PAYMENTREQUEST_0_SHIPTOZIP = 95131&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE = US&PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME =米国&PAYMENTREQUESTINFO_0_ERRORCODE = 0PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED =偽&PAYMENTREQUEST_0_SHIPTONAME = Govind Malviya&PAYMENTREQUEST_0_SHIPTOSTREET = 1 MAIN ST&PAYMENTREQUEST_0_SHIPTOCITY =サンノゼ&PAYMENTREQUEST_0_SHIPTOSTATE = CA&PAYMENTREQUEST_0_SHIPTOZIP = 95131&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE = US&PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME =米国&PAYMENTREQUESTINFO_0_ERRORCODE = 0PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED =偽&PAYMENTREQUEST_0_SHIPTONAME = Govind Malviya&PAYMENTREQUEST_0_SHIPTOSTREET = 1 MAIN ST&PAYMENTREQUEST_0_SHIPTOCITY =サンノゼ&PAYMENTREQUEST_0_SHIPTOSTATE = CA&PAYMENTREQUEST_0_SHIPTOZIP = 95131&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE = US&PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME =米国&PAYMENTREQUESTINFO_0_ERRORCODE = 0

JavaScriptSerializerがjson文字列に対して行うように、強く型付けされたデータでそれをdesrializeしたいと思います。マジックストリングを避けたい辞書を使用した解決策を提供しないでください。各プロパティに属性を追加できます。

私のクラスは

 public class GetExpressCheckoutDetailsResponse : IPaypalResponse
    {
        public string Token { get; set; }
        public string BillingAgreementAcceptedStatus { get; set; }
        public string CheckoutStatus { get; set; }
        public string Timestamp { get; set; }
        public string CorrelationID { get; set; }
        public Status Acknowledgement { get; set; }
        public string Version { get; set; }
        public string Build { get; set; }
        public string Email { get; set; }
        public string PayerID { get; set; }
        public string PayerStatus { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string CountryCode { get; set; }
        public string ShiptoName { get; set; }
        public string ShiptoStreet { get; set; }
        public string ShipToCity { get; set; }
        public string ShipToState { get; set; }
        public string ShipToZip { get; set; }
        public string ShipToCountryCode { get; set; }
        public string ShipToCountryName { get; set; }
        public string AddressStatus { get; set; }
        public string CurrencyCode { get; set; }
        public string Amount { get; set; }
        public string ShippingAmount { get; set; }
        public string HandlingAmount { get; set; }
        public string TaxAmount { get; set; }
        public string Description { get; set; }
        public string InsuranceAmount { get; set; }
        public string ShipdiscAmount { get; set; }
        public string PaymentRequestCurrencycode { get; set; }
        public string PaymentRequestAmount { get; set; }
        public string PaymentRequestShippingAmount { get; set; }
        public string PaymentRequestHandlingAmount { get; set; }
        public string PaymentRequestTaxAmount { get; set; }
        public string PaymentRequestDescription { get; set; }
        public string PaymentRequestInsuranceAmount { get; set; }
        public string PaymentRequestShipdiscAmount { get; set; }
        public string PaymentRequestInsuranceOptionOffered { get; set; }
        public string PaymentRequestShipToName { get; set; }
        public string PaymentRequestShipToStreet { get; set; }
        public string PaymentRequestShipToCity { get; set; }
        public string PaymentRequestShipToState { get; set; }
        public string PaymentRequestShipToZip { get; set; }
        public string PaymentRequestShipToCountryCode { get; set; }
        public string PaymentRequestShipToCountryName { get; set; }
        public string PaymentRequestInfoErrorCode { get; set; }
    }
4

4 に答える 4

3

LINQを使用してデータを抽出Dictionary<TKey, TValue>し、クラス内のデータをマッピングするために使用できます。

var paypalResponse = "...";
var data = paypalResponse.Split('&') 
                         .Select(x => x.Split('=')) 
                         .ToDictionary(x => x[0], x => x[1]);

次に、これをクラスのコンストラクターに渡すGetExpressCheckoutDetailsResponseか、クラス内でこれを行うことができます。

public class GetExpressCheckoutDetailsResponse : IPaypalResponse
{
    public GetExpressCheckoutDetailsResponse(Dictionary<string, string> data)
    {
        this.Token = data["TOKEN"];
        this.BillingAgreementAcceptedStatus = data["BILLINGAGREEMENTACCEPTEDSTATUS"];
        ...
    }
}

このようなものにリフレクションを使用すると、プロパティが完全に一致しないため、価値があるよりも面倒になる可能性があります。そのため、各プロパティにメタデータ属性を追加する必要があります。

于 2012-07-10T12:47:52.880 に答える
2

HttpUtility.ParseQueryString文字列をに変換するために使用できますNameValueCollection。残りはただですreflection

string responseString = "TOKEN=EC......";
var dict = HttpUtility.ParseQueryString(responseString);
GetExpressCheckoutDetailsResponse respObj = new GetExpressCheckoutDetailsResponse();
foreach (var p in respObj.GetType().GetProperties())
{
    p.SetValue(respObj, dict[p.Name]);
}

//respObj is ready to use
于 2012-07-10T18:31:38.473 に答える
1

したがって、問題に対してすぐに使用できるデシリアライザーがないため、次のことを行う必要があります。

  1. ペイパルの応答を表す属性を各プロパティに追加します。
  2. クラスインスタンスのプロパティを反映し、それらをにキャッシュしDictionary<string, PropertyInfo>ます。ここで、文字列は属性の値です。
  3. ペイパルの応答に関するメソッドの結果を繰り返し処理し"some string".Split(..)、文字列と値を収集してから、辞書で検索する必要がある対応するプロパティにそれらを保存します。
于 2012-07-10T12:40:47.623 に答える
0

あなたの特定のケースでは、車輪の再発明の代わりに; PayPal SDKを使用するのはどうですか?

http://paypal.github.io/sdk/

必要なのは、C#用のExpressCheckoutSDKです。

正しいデータ型で必要なすべてのフィールドがすでに含まれており、いくつかの単純な関数呼び出しの背後にある応答のすべての呼び出し/解析を自動化するという追加の利点があります。

独自のAPI呼び出しを手動で作成し、応答を解析することは、これに対する最善のアプローチではありません。確かに、最終的にはそれを機能させることになりますが、そうするまでは、時間がかかり、エラーが発生しやすいプロセスになります...

于 2012-07-11T04:13:22.643 に答える