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

本文关键字:11502 令牌 无效 错误 交易 经常性 Paypal | 更新日期: 2023-09-27 17:57:59

我是贝宝的新手,我需要为我的客户实现订阅(定期付款)。我正在使用贝宝沙盒来实现它。我遵循了贝宝坚持创建定期付款档案的方式。关于从SetExpressCheckout、GetExpressCheckOut和DoExpressCheckOut获得"成功"确认。我曾尝试使用DoExpressCheckOutpayment响应中的令牌创建Recurring Payment配置文件,但CreateRecurrinpayment配置文件的响应返回失败,说明ivnalid中的令牌。我尝试在我设置的快速结账请求上设置"BILLINGAGREEMENTDESCRIPTION和BILLINGTYPE=RecurringPayments",但同样的错误仍然存在。

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

设置EXpressCheckout

{
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<string>()
              .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)
                {
}

创建ReEcurringPaymentsProfile

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;
              }

任何帮助都将不胜感激。

提前感谢

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

Sujth,根据您的需要,正确的版本是51.0。快乐编码!

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