302 url重定向到paypal主页

Posted

技术标签:

【中文标题】302 url重定向到paypal主页【英文标题】:302 url redirect to paypal home page 【发布时间】:2017-05-29 23:22:40 【问题描述】:

我们使用 PayPal AdaptivePayments SDK 已有一段时间了,

现在,50% 的时间使用 302 临时重定向将客户重定向到贝宝主页。

https://www.paypal.com/webscr&cmd=_ap-payment&paykey=XXXXXXXXXX.

代码主要是从贝宝示例中复制过去

public override string CreateRedirectUrl(NameValueCollection parameters)


    ReceiverList receiverList = new ReceiverList();
    receiverList.receiver = new List<Receiver>();

    PayRequest request = new PayRequest();
    RequestEnvelope requestEnvelope = new RequestEnvelope("en_CA");
    request.requestEnvelope = requestEnvelope;
    request.feesPayer = "PRIMARYRECEIVER";
    //request.feesPayer = "SECONDARYONLY";

    Receiver receiver1 = new Receiver();

    if (parameters["amount1"] != null && parameters["amount1"].Trim() != string.Empty)
    
        // Required) Amount to be paid to the receiver
        receiver1.amount = Convert.ToDecimal(parameters["amount1"].ToString(), CultureInfo.InvariantCulture);
    

    if (parameters["mail1"] != null && parameters["mail1"].Trim() != string.Empty)
    
        // Receiver's email address. This address can be unregistered with
        // paypal.com. If so, a receiver cannot claim the payment until a PayPal
        // account is linked to the email address. The PayRequest must pass
        // either an email address or a phone number. Maximum length: 127 characters
        receiver1.email = parameters["mail1"];
    

    //if (parameters["primaryReceiver1"] != null && parameters["primaryReceiver1"].Trim() != string.Empty)
    //
    //    receiver1.primary = Convert.ToBoolean(parameters["primaryReceiver1"]);
    //

    receiver1.primary = true;
    receiver1.invoiceId = parameters["invoiceId"];

    receiverList.receiver.Add(receiver1);

    Receiver receiver2 = new Receiver();

    if (parameters["amount2"] != null && parameters["amount2"].Trim() != string.Empty)
    
        // (Required) Amount to be paid to the receiver
        receiver2.amount = Convert.ToDecimal(parameters["amount2"], CultureInfo.InvariantCulture);
    

    if (parameters["mail2"] != null && parameters["mail2"].Trim() != string.Empty)
    
        // Receiver's email address. This address can be unregistered with
        // paypal.com. If so, a receiver cannot claim the payment until a PayPal
        // account is linked to the email address. The PayRequest must pass
        // either an email address or a phone number. Maximum length: 127 characters
        receiver2.email = parameters["mail2"];
    

    //if (parameters["primaryReceiver2"] != null && parameters["primaryReceiver2"].Trim() != string.Empty)
    //
    //    receiver2.primary = Convert.ToBoolean(parameters["primaryReceiver2"]);
    //

    receiverList.receiver.Add(receiver2);

    ReceiverList receiverlst = new ReceiverList(receiverList.receiver);
    request.receiverList = receiverlst;

    // (Optional) Sender's email address. Maximum length: 127 characters
    if (parameters["senderEmail"] != null && parameters["senderEmail"].Trim() != string.Empty)
    
        request.senderEmail = parameters["senderEmail"];
    

    // The action for this request. Possible values are: PAY – Use this
    // option if you are not using the Pay request in combination with
    // ExecutePayment. CREATE – Use this option to set up the payment
    // instructions with SetPaymentOptions and then execute the payment at a
    // later time with the ExecutePayment. PAY_PRIMARY – For chained
    // payments only, specify this value to delay payments to the secondary
    // receivers; only the payment to the primary receiver is processed.
    //if (parameters["actionType"] != null && parameters["actionType"].Trim() != string.Empty)
    //
    //    request.actionType = parameters["actionType"];
    //
    request.actionType = "PAY";

    // URL to redirect the sender's browser to after canceling the approval
    // for a payment; it is always required but only used for payments that
    // require approval (explicit payments)
    if (parameters["cancelURL"] != null && parameters["cancelURL"].Trim() != string.Empty)
    
        request.cancelUrl = parameters["cancelURL"];
    

    // The code for the currency in which the payment is made; you can
    // specify only one currency, regardless of the number of receivers
    if (parameters["currencyCode"] != null && parameters["currencyCode"].Trim() != string.Empty)
    
        request.currencyCode = parameters["currencyCode"];
    

    // URL to redirect the sender's browser to after the sender has logged
    // into PayPal and approved a payment; it is always required but only
    // used if a payment requires explicit approval
    if (parameters["returnURL"] != null && parameters["returnURL"].Trim() != string.Empty)
    
        request.returnUrl = parameters["returnURL"];
    

    request.requestEnvelope = requestEnvelope;

    // (Optional) The URL to which you want all IPN messages for this
    // payment to be sent. Maximum length: 1024 characters
    if (parameters["ipnNotificationURL"] != null && parameters["ipnNotificationURL"].Trim() != string.Empty)
    
        request.ipnNotificationUrl = parameters["ipnNotificationURL"];
    

    AdaptivePaymentsService service = null;

    try
    
        // Configuration map containing signature credentials and other required configuration.
        // For a full list of configuration parameters refer in wiki page
        // (https://github.com/paypal/sdk-core-dotnet/wiki/SDK-Configuration-Parameters)
        Dictionary<string, string> configurationMap = PaypalAdaptiveConfiguration.GetAcctAndConfig();

        // Creating service wrapper object to make an API call and loading
        // configuration map for your credentials and endpoint
        service = new AdaptivePaymentsService(configurationMap);

        Response = service.Pay(request);
    
    catch (System.Exception ex)
    
       // contextHttp.Response.Write(ex.Message);
        //return;
    

    Dictionary<string, string> responseValues = new Dictionary<string, string>();
    string redirectUrl = null;

    if (!Response.responseEnvelope.ack.ToString().Trim().ToUpper().Equals(AckCode.FAILURE.ToString()) && !Response.responseEnvelope.ack.ToString().Trim().ToUpper().Equals(AckCode.FAILUREWITHWARNING.ToString()))
    
        if (ConfigurationManager.AppSettings["PAYPAL_MODE"].ToLower() == "live")
        
            redirectUrl = ConfigurationManager.AppSettings["PAYPAL_REDIRECT_URL_LIVE"] + "_ap-payment&paykey=" + Response.payKey;
        
        else
        
            redirectUrl = ConfigurationManager.AppSettings["PAYPAL_REDIRECT_URL"] + "_ap-payment&paykey=" + Response.payKey;
        
        // The pay key, which is a token you use in other Adaptive Payment APIs 
        // (such as the Refund Method) to identify this payment. 
        // The pay key is valid for 3 hours; the payment must be approved while the 
        // pay key is valid. 
        responseValues.Add("Pay Key", Response.payKey);

        // The status of the payment. Possible values are:
        // CREATED – The payment request was received; funds will be transferred once the payment is approved
        // COMPLETED – The payment was successful
        // INCOMPLETE – Some transfers succeeded and some failed for a parallel payment or, for a delayed chained payment, secondary receivers have not been paid
        // ERROR – The payment failed and all attempted transfers failed or all completed transfers were successfully reversed
        // REVERSALERROR – One or more transfers failed when attempting to reverse a payment
        // PROCESSING – The payment is in progress
        // PENDING – The payment is awaiting processing
        responseValues.Add("Payment Execution Status", Response.paymentExecStatus);

        if (Response.defaultFundingPlan != null && Response.defaultFundingPlan.senderFees != null)
        
            // Fees to be paid by the sender
            responseValues.Add("Sender Fees", Response.defaultFundingPlan.senderFees.amount + Response.defaultFundingPlan.senderFees.code);
        
    

    foreach (ErrorData ed in Response.error)
    
        this.ErrorMessage += ed.message + " ";
    
    if (!string.IsNullOrWhiteSpace(this.ErrorMessage))
    
        new Tracker().sendToGenclikDev("PaypalAdaptiveGateway", this.ErrorMessage);
    

    responseValues.Add("Acknowledgement", Response.responseEnvelope.ack.ToString().Trim().ToUpper());

        return redirectUrl;

【问题讨论】:

【参考方案1】:

自 2017 年 1 月 13 日星期五以来,我们遇到了完全相同的问题。它似乎主要发生在第一次付款重定向请求上。如果您从 Paypal 主屏幕返回,使用浏览器的后退按钮并使用新令牌再次发布,它可以工作。

任何知道解决方案的人都会有很大帮助!

【讨论】:

这里是来自 paypal 的答案:我们的工程师仍在调查这个问题。我会尽快为您提供更新。谢谢你,祝你有美好的一天! 您有指向 paypal 上未决问题的链接吗?我们如何跟进?谢谢【参考方案2】:

我们也遇到了同样的问题,但通过做一个小改动就能解决。

您需要更改重定向网址:

来自: https://www.paypal.com/webscr&cmd=_ap-payment&paykey=XXXXXXXXXX

收件人: https://www.paypal.com/webscr?cmd=_ap-payment&paykey=XXXXXXXXXX

注意“webscr”后面的“?”。

【讨论】:

以上是关于302 url重定向到paypal主页的主要内容,如果未能解决你的问题,请参考以下文章

如何用 PHP 实现 302 重定向到其他 URL

302 登录重定向后被 IE 删除的 URL 片段

Magento 使用 302 重定向到基本 url,我如何让它使用 301

302 重定向到相对 URL 是有效的还是无效的?

302 重定向到相对 URL 是有效的还是无效的?

使用 php 获取 302 重定向 url