Question

I'm trying to get delayed chained payments working through PayPal's Adaptive Payments API in C#. The error I'm getting doesn't make any sense and I can't find anything on the .NET to resolve the issue.

The error message is: Invalid request: More than one field cannot be used to specify a receiver

Here's the request I'm sending:

    requestEnvelope.errorLanguage=en_US
    &actionType=PAY_PRIMARY
    &cancelUrl=http%3a%2f%2flocalhost%2fccc%2fProgramsandServices%2fCommunityFundingInitiative%2fOopsSome        thingWentWrong!.aspx ¤cyCode=USD
    &feesPayer=EACHRECEIVER
    &ipnNotificationUrl=http%3a%2f%2flocalhost%2fccc%2fdesktopmodules%2fUCU_ProjectManagement%2fPayPalIPN.aspx
    &receiverList.receiver(0).amount=10.00
    &receiverList.receiver(0).email=A_VALID_SANDBOX_EMAIL_ACCOUNT_ADDRESS_FOR_BUSINESS_OWNER
    &receiverList.receiver(0).phone.countryCode=001
    &receiverList.receiver(0).phone.phoneNumber=VALID_PHONE_NUMBER
    &receiverList.receiver(0).primary=true
    &receiverList.receiver(0).invoiceId=51%7c1%7c6%2f16%2f2013+4%3a35%3a56+PM
    &receiverList.receiver(0).paymentType=GOODS

    &receiverList.receiver(1).amount=9.5000
    &receiverList.receiver(1).email=A_VALID_SANDBOX_EMAIL_ACCOUNT_ADDRESS
    &receiverList.receiver(1).phone.countryCode=001
    &receiverList.receiver(1).phone.phoneNumber=VALID_PHONE_NUMBER
    &receiverList.receiver(1).primary=false
    &receiverList.receiver(1).invoiceId=51%7c1%7c6%2f16%2f2013+4%3a35%3a56+PM
    &receiverList.receiver(1).paymentType=GOODS
    &reverseAllParallelPaymentsOnError=false
    &senderEmail=A_VALID_SANDBOX_PERSONAL_EMAIL_ACCOUNT
    &returnUrl=http%3a%2f%2flocalhost%2fccc%2fProgramsandServices%2fCommunityFundingInitiative%2fThankYouforYourDonation.aspx
    &trackingId=51%7c0%7c6%2f16%2f2013+4%3a35%3a56+PM&

I specified two receivers, one is Primary other is not.
What am I missing? I've tried both PAY and PAY_PRIMARY as the action types. Same results for either one. If I only use ONE reciever, it works.

Here's the code:

    WebClient webClient = new WebClient();

        // Receivers
        ReceiverList receiverList = new ReceiverList();

        // Primary Receiver
        Receiver receiver = new Receiver();
        receiver.accountId = null;
        receiver.amount = Convert.ToDecimal(txtPledgeAmount.Text.Trim());
        receiver.invoiceId = Convert.ToString(SelectedProjectId) + "|" + Convert.ToString(PortalSettings.AdministratorId) + "|" + Convert.ToString(DateTime.Now.ToUniversalTime());
        //receiver.paymentSubType = null;
        receiver.paymentType = "GOODS";
        receiver.primary = true;

        if (!String.IsNullOrEmpty(PRIMARY_RECEIVER_PHONE_NUMBER))
        {
            receiver.phone = new PhoneNumberType();new PhoneNumberType("001",PRIMARY_RECEIVER_PHONE_NUMBER);
        }
        if (!String.IsNullOrEmpty(PRIMARY_RECEIVER_EMAIL_ADDRESS))
        {
            receiver.email = PRIMARY_RECEIVER_EMAIL_ADDRESS;
        }

        receiverList.receiver.Add(receiver);

        // Secondary Receiver
        string receiverEmail = "";
        string receiverPhone = VALID_PHONE_NUMBER;
        String receiverUserName = MembershipServices.Business.SharedFunctions.GetUserNameEmail(PortalId, SelectedProject.ProjectOwnerID, MembershipServices.SharedEnums.DisplayNameFormat_Type.FullName, ref receiverEmail);
        Receiver receiver2 = new Receiver(Decimal.Parse(this.txtPledgeAmount.Text.Trim()) * SECONDARY_RECEIVER_PERCENTAGE);
        if (!String.IsNullOrEmpty(receiverPhone))
        {
            receiver2.phone = receiver.phone = new PhoneNumberType("001", receiverPhone);
        }
        if (!String.IsNullOrEmpty(receiverEmail))
        {
            receiver2.email = receiverEmail;
        }
        receiver2.primary = Boolean.Parse("false");
        receiver2.invoiceId = Convert.ToString(SelectedProjectId) + "|" + Convert.ToString(SelectedProject.ProjectOwnerID) + "|" + Convert.ToString(DateTime.Now.ToUniversalTime()); ;
        receiver2.paymentType = "GOODS";

        receiverList.receiver.Add(receiver2);

        String PortalAlias = PortalSettings.PortalAlias.HTTPAlias;
        if (!PortalAlias.EndsWith("/"))
        {
            PortalAlias = PortalAlias + "/";
        }

        if (Request.IsSecureConnection)
        {
            PortalAlias = @"https://" + PortalAlias;
        }
        else
        {
            PortalAlias =  @"http://" + PortalAlias;
        }

        string actionType = "PAY_PRIMARY";

        PayRequest req = new PayRequest(new RequestEnvelope("en_US"), actionType,
                            PortalAlias + CANCEL_URL, SharedEnums.CurrencyCode_Type.USD.ToString(),
                            receiverList, PortalAlias + RETURN_URL);

        req.ipnNotificationUrl = PortalAlias + IPN_NOTIFICATION_URL;

        //(Optional) A note associated with the payment (text, not HTML). 
        // Maximum length: 1000 characters, including newline characters 
        if (!String.IsNullOrEmpty(txtPledgeMessage.Text.Trim()))
        {
            req.memo = txtPledgeMessage.Text.Trim();
        }
        else
        {
            req.memo = null;
        }


        // set optional parameters
        //(Optional) Whether to reverse parallel payments if an error occurs with a payment. 
        //Allowable values are:
        //true – Each parallel payment is reversed if an error occurs
        //false – Only incomplete payments are reversed (default)
        req.reverseAllParallelPaymentsOnError = false;

        req.feesPayer = "EACHRECEIVER";

        // Sender's email address 
        =req.senderEmail = SENDER_EMAIL_ADDRESS;

        //(Optional) A unique ID that you specify to track the payment.
        //Note: You are responsible for ensuring that the ID is unique.
        //Maximum length: 127 characters 
        string trackingId = Convert.ToString(SelectedProjectId + "|" + Convert.ToString(SelectedUserId) + "|" + Convert.ToString(DateTime.Now.ToUniversalTime()));
        req.trackingId = trackingId;


        // All set. Fire the request            
        AdaptivePaymentsService service = new AdaptivePaymentsService();
        PayResponse resp = null;
        try
        {
            resp = service.Pay(req);
        }
        catch (System.Exception e)
        {
            Response.Write(e.Message);
            return;
        }

If you've worked through this or can spot the error, please let me know! Thanks.

Was it helpful?

Solution

Removing the phone number fields returns a successful response. I'm not certain if phone number fields are not supposed to be available in a Delayed Chained Payment transaction. I'm going to have to reach out to the product team for Adaptive Payments and find out from them.

Edit: The phone number has to be a confirmed mobile one. The error you're getting is because the phone number field can also be used to define the receiver so you're actually attempting to define the receivers twice.

The request I tested with (the same as yours but has Sandbox e-mail addresses set) -

requestEnvelope.errorLanguage=en_US
actionType=PAY_PRIMARY
cancelUrl=http://localhost/ccc/ProgramsandServices/CommunityFundingInitiative/OopsSomethingWentWrong!.aspx
currencyCode=USD
feesPayer=EACHRECEIVER
ipnNotificationUrl=http://localhost/ccc/desktopmodules/UCU_ProjectManagement/PayPalIPN.aspx
receiverList.receiver(0).amount=10.00
receiverList.receiver(0).email=bending@bender.com
receiverList.receiver(0).primary=true
receiverList.receiver(0).invoiceId=51|1|6/16/2013 4:35:56 PM
receiverList.receiver(0).paymentType=GOODS
receiverList.receiver(1).amount=9.50
receiverList.receiver(1).email=stuff@stuffers.com
receiverList.receiver(1).primary=false
receiverList.receiver(1).invoiceId=51|1|6/16/2013 4:35:56 PM
receiverList.receiver(1).paymentType=GOODS
reverseAllParallelPaymentsOnError=false
senderEmail=testingAccess8x@paypal.com
returnUrl=http://localhost/ccc/ProgramsandServices/CommunityFundingInitiative/ThankYouforYourDonation.aspx
trackingId=51|0|6/16/2013 4:35:56 PM
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top