Paypal经常性付款交易错误:11502:令牌无效

我是paypal的新手,我需要为我的客户实现订阅(定期付款)。我正在使用paypal沙箱实现它。 我遵循paypal坚持创建定期付款资料的方式。 从SetExpressCheckout,GetExpressCheckOut和DoExpressCheckOut获得“成功”确认。 我尝试使用DoExpressCheckOutpayment响应中的令牌创建定期付款配置文件,但CreateRecurrinpayment配置文件的响应返回失败,说明了ivnalid中的toke。 我试着通过设置快速结账请求设置“BILLINGAGREEMENTDESCRIPTION和BILLINGTYPE = RecurringPayments”,但同样的错误仍然存​​在。

请在下面找到我用于实施定期存款的代码。

SetEXpressCheckout

{ NameValueCollection values = new NameValueCollection(); values["METHOD"] = "SetExpressCheckout"; values["RETURNURL"] = PayPalSettings.ReturnUrl; values["CANCELURL"] = PayPalSettings.CancelUrl; values["PAYMENTACTION"] = "Sale"; values["CURRENCYCODE"] = "USD"; values["BUTTONSOURCE"] = "PP-ECWizard"; values["USER"] = PayPalSettings.Username; values["PWD"] = PayPalSettings.Password; values["SIGNATURE"] = PayPalSettings.Signature; values["SUBJECT"] = ""; values["L_NAME0"] = "MyName"; values["L_AMT0"] = "20.00"; values["VERSION"] = "2.3"; values["AMT"] = PayPalSettings.OrderAmount; values["L_BILLINGTYPE0"] = "RecurringPayments"; values["L_BILLINGAGREEMENTDESCRIPTION0"] = "Test subscription"; values = Submit(values); string ack = values["ACK"].ToLower(); if (ack == "success" || ack == "successwithwarning") { return new PayPalRedirect { Token = values["TOKEN"], Url = String.Format("https://{0}/cgi-bin/webscr?cmd=_express-checkout&token={1}", PayPalSettings.CgiDomain, values["TOKEN"]) }; } else { throw new Exception(values["L_LONGMESSAGE0"]); } } 

提交

 private static NameValueCollection Submit(NameValueCollection values) { string data = String.Join("&", values.Cast() .Select(key => String.Format("{0}={1}", key, HttpUtility.UrlEncode(values[key])))); HttpWebRequest request = (HttpWebRequest)WebRequest.Create( String.Format("https://{0}/nvp", PayPalSettings.ApiDomain)); request.Method = "POST"; request.ContentLength = data.Length; using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) { writer.Write(data); } using (StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream())) { return HttpUtility.ParseQueryString(reader.ReadToEnd()); } } 

GetExpressCheckout

 public ActionResult Success(string token) { GetExpressCheckout getExpressCheckout = new GetExpressCheckout(); GetExpressCheckoutDetailsResponseType getExpressCheckoutResponse = getExpressCheckout.ECGetExpressCheckoutCode(token); if (getExpressCheckoutResponse.Ack == AckCodeType.Success) { ExpressCheckout expressCheckout = new ExpressCheckout(); DoExpressCheckoutPaymentResponseType doExpressCheckoutResponse = expressCheckout.DoExpressCheckoutPayment ( token, getExpressCheckoutResponse.GetExpressCheckoutDetailsResponseDetails.PayerInfo.PayerID, PayPalSettings.OrderAmount, PaymentActionCodeType.Sale, CurrencyCodeType.USD ); if (doExpressCheckoutResponse.Ack == AckCodeType.Success) { CreateRecurringPaymentsProfile createRecurringPaymentsProfile = new CreateRecurringPaymentsProfile(); CreateRecurringPaymentsProfileResponseType recurringPaymentProfileResponse = createRecurringPaymentsProfile.CreateRecurringPaymentsProfileCode( doExpressCheckoutResponse.DoExpressCheckoutPaymentResponseDetails.Token, doExpressCheckoutResponse.Timestamp, PayPalSettings.OrderAmount, 1, BillingPeriodType.Month, CurrencyCodeType.USD ); if (recurringPaymentProfileResponse.Ack == AckCodeType.Success) { } 

CreateReEcurringPaymentsProfile

 public CreateRecurringPaymentsProfileResponseType CreateRecurringPaymentsProfileCode(string token, DateTime date, string amount, int BF, BillingPeriodType BP, CurrencyCodeType currencyCodeType) { CallerServices caller = new CallerServices(); IAPIProfile profile = ProfileFactory.createSignatureAPIProfile(); // Set up your API credentials, PayPal end point, and API version. profile.APIUsername = PayPalSettings.Username; profile.APIPassword = PayPalSettings.Password; profile.APISignature = PayPalSettings.Signature; profile.Environment="sandbox"; caller.APIProfile = profile; // Create the request object. CreateRecurringPaymentsProfileRequestType pp_request=new CreateRecurringPaymentsProfileRequestType(); pp_request.Version="51.0"; // Add request-specific fields to the request. pp_request.CreateRecurringPaymentsProfileRequestDetails= new CreateRecurringPaymentsProfileRequestDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.Token=token; pp_request.CreateRecurringPaymentsProfileRequestDetails.RecurringPaymentsProfileDetails=new RecurringPaymentsProfileDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.RecurringPaymentsProfileDetails.BillingStartDate=date; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails=new ScheduleDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod=new BillingPeriodDetailsType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount=new BasicAmountType(); pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount.Value =amount ; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.Amount.currencyID= currencyCodeType;//Enum for currency code is CurrencyCodeType.USD pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.BillingFrequency=BF; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.PaymentPeriod.BillingPeriod=BP;////Enum for BillingPeriod is BillingPeriodType.Day //pp_request.Version = "51.0"; pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.Description = "Test subscription"; //pp_request.CreateRecurringPaymentsProfileRequestDetails.ScheduleDetails.Description // Execute the API operation and obtain the response. CreateRecurringPaymentsProfileResponseType pp_response=new CreateRecurringPaymentsProfileResponseType(); pp_response= (CreateRecurringPaymentsProfileResponseType) caller.Call("CreateRecurringPaymentsProfile", pp_request); return pp_response; } 

任何帮助将不胜感激。

提前致谢

Sujth,正确的版本是51.0满足您的需求。 快乐的编码!

在SetExpressCheckout调用中,将VERSION设置为更新的内容,例如97.0 。 版本2.3中不存在L_BILLINGTYPE0L_BILLINGAGREEMENTDESCRIPTION ,因此API无法识别它们。