私はもともとこの質問を別の SO スレッド (旧: PayPal REST API .net SDK - 400 Bad Requests )のコメントとして投稿しましたが、応答が見られなかったので、おそらく質問が最善であると考えました。
RestAPISDK を自分で変更せずに、検証エラーが発生したときにエラー メッセージをコードに返す方法はありますか? 今のところ、ログファイルを読んで何が起こったのかを確認するしかありませんが、カード番号が有効でないなどの単純な理由で請求が失敗した理由をユーザーに報告しようとすると、それは役に立ちません。現在、400 Bad Request が返されますが、失敗がログに記録されるため、API は明らかに何が起こったかを確認し、それを報告しません。
これが私が使用しているコードです - payment.Create(apiContext) を実行するとエラーが発生します。
var card = new PayPal.Api.Payments.CreditCard
{
billing_address = new PayPal.Api.Payments.Address
{
city = customer.BillingAddress.City,
country_code = customer.BillingAddress.Country,
line1 = customer.BillingAddress.Address1,
postal_code = customer.BillingAddress.PostalCode,
state = customer.BillingAddress.StateProvince
},
cvv2 = customer.CreditAccount.SecurityCode,
expire_month = customer.CreditAccount.ExpirationMonth,
expire_year = customer.CreditAccount.ExpirationYear,
first_name = customer.FirstName,
last_name = customer.LastName,
number = customer.CreditAccount.CardNumber
};
//only send line 2 if it exists, otherwise it'll error out
if (!string.IsNullOrEmpty(customer.BillingAddress.Address2))
card.billing_address.line2 = customer.BillingAddress.Address2;
switch (customer.CreditAccount.CardType)
{
case CardTypes.AmericanExpress:
card.type = "amex";
break;
default:
card.type = customer.CreditAccount.CardType.ToString().ToLower();
break;
}
var amt = new PayPal.Api.Payments.Amount
{
currency = "USD",
details = new PayPal.Api.Payments.Details
{
shipping = Math.Round(customer.CreditAccount.Shipping, 2).ToString(),
subtotal = Math.Round(customer.CreditAccount.Amount, 2).ToString(),
tax = Math.Round(customer.CreditAccount.Tax, 2).ToString()
},
total = Math.Round(customer.CreditAccount.GrandTotal, 2).ToString()
};
var payer = new PayPal.Api.Payments.Payer
{
funding_instruments = (new FundingInstrument[] { new FundingInstrument { credit_card = card } }).ToList(),
payment_method = "credit_card"
};
var payment = new Payment
{
intent = "sale",
payer = payer,
transactions = (new Transaction[] {
new Transaction { description = customer.CreditAccount.Description, amount = amt }
}).ToList()
};
try
{
var accessToken = new PayPal.OAuthTokenCredential(this.Configuration.ClientID, this.Configuration.ClientSecret).GetAccessToken();
var apiContext = new PayPal.APIContext(accessToken);
var result = payment.Create(apiContext);
if (result.state == "approved")
creditResponse = new CreditResponse { AuthorizationCode = result.id, Status = CreditResponseTypes.Success, TransactionId = result.id };
else
creditResponse = new CreditResponse { Status = CreditResponseTypes.Declined };
}
catch (Exception ex)
{
creditResponse = new CreditResponse
{
Message = ex.ToString(),
Status = CreditResponseTypes.Error
};
}
編集:サンプルコードを追加