Wednesday, August 27, 2014

Paypal Integration With Salesforce

1. Need to set up developer account in paypal
http://developer.paypal.com
nd create one account there. After creating, login there only. In the left menu you will find "Test Accounts" link. Click on that.
From the right side screen, you can create multiple test accounts.
For testing purpose generally you need two type of accounts. One is "Seller" and one is "Buyer". Its always better to create preconfigured accounts.

Page:
<apex:page controller="PaypalProcessor" />
<apex:form>
<apex:inputText value="{!firstName}"/>
<apex:inputText value="{!lastName}" />
<apex:inputText value="{!Addy1}" />
<apex:inputText value="{!Addy2}" />
<apex:inputText value="{!CardType}" />
<apex:inputText value="{!CardNo}" />
<apex:inputText value="{!expMo}" />
<apex:inputText value="{!expYe}" />
<apex:commandbutton value="submit" action="{!doDirectPayment}" />
</apex:form>

</apex:page>

Controller:
global class PaypalProcessor{

    public  string amount {set;get;}
    public  String result {set;get;}
    public  string FirstName{get; set; }
    public  string LastName{get; set; }
    public  string Addy1{get; set; }
    public  string Addy2{get; set; }
    public  string Country{get; set; }
    public  string CardType{get; set; }
    public  string CardNo{get; set; }
    public  string expMo{get; set; }
    public  string expYe{get; set; }
    public  string CVV{get; set; }
    public  string city{get; set; }
    public  string state{get; set; }
    public  string zip{get; set; }
    public  string payer{ get; set; }
    public  string transid {get; set;}
    public  string message {get; set; }
    public  string err {get; set; }
    public  string rawResponse {get; set; }
    public XmlStreamReader reader;

    public PaypalProcessor(){
      city = '';
      state = '';
      zip = '';
      CVV = '';
      expYe = '2019';//2019
      expMo = '04';//04
      CardNo = '4256541603152055'; //4256541603152055
      CardType = 'Visa'; //Visa
      FirstName = '';
      LastName = '';
      Country = 'US'; //US
      Addy1 = '';
      Addy2 = '';
      payer = '';
      err = '';
      message = '';
    }

    public String doDirectPayment()
    {
      //Use the username password credentials of your Paypal account
    // this below credentials will now work
        String url =https://api-3t.sandbox.paypal.com/2.0/;
        string un =ssanebina-ftator_api1.gmail.com ;
        string pw =13968266;
        string sig =An5nso7MWUdW4QKJi4-ALQdI5p2aNE1c5OKgKgV6zf5tPo3 ;
        Http h = new Http();
        HttpRequest req = new HttpRequest();
                req.setHeader('Host','api-aa.sandbox.paypal.com');}
              this host is for paypal production
               // req.setHeader('Host','api-aa.paypal.com');
             }
        }
        if(CardType == 'AMEX'){
            CardType='Amex';
        }
    String doDirectRequest;
      doDirectRequest =  '<soap:Envelope xmlns:soap=' + '\'' + 'http://schemas.xmlsoap.org/soap/envelope/'  + '\'' + ' xmlns:xsi=' + '\''+ 'http://www.w3.org/2001/XMLSchema-instance'  + '\'' + ' xmlns:xsd=' + '\''+ 'http://www.w3.org/2001/XMLSchema' + '\'' + '>';
      doDirectRequest += '<soap:Header><RequesterCredentials xmlns="urn:ebay:api:PayPalAPI"><Credentials xmlns="urn:ebay:apis:eBLBaseComponents">';
      doDirectRequest += '<Username>' + un + '</Username><ebl:Password xmlns:ebl="urn:ebay:apis:eBLBaseComponents">' + pw;
      doDirectRequest += '</ebl:Password><Signature>' + sig + '</Signature>';
      doDirectRequest += '</Credentials></RequesterCredentials></soap:Header><soap:Body><DoDirectPaymentReq xmlns="urn:ebay:api:PayPalAPI">';
      doDirectRequest += '<DoDirectPaymentRequest><Version xmlns="urn:ebay:apis:eBLBaseComponents">1.00</Version>';
      doDirectRequest += '<DoDirectPaymentRequestDetails xmlns="urn:ebay:apis:eBLBaseComponents">';
      doDirectRequest += '<PaymentAction>Authorization</PaymentAction><PaymentDetails><OrderTotal currencyID="USD">' + amount + '</OrderTotal>';
      doDirectRequest += '<ShipToAddress><Name>' + FirstName + ' ' + LastName + '</Name><Street1>' + Addy1 + '</Street1><Street2>' +Addy2 + '</Street2>';
      doDirectRequest += '<CityName>' + city + '</CityName><StateOrProvince>' + state + '</StateOrProvince><PostalCode>' + zip + '</PostalCode>';
      doDirectRequest += '<Country>' + country + '</Country></ShipToAddress>';
      doDirectRequest += '</PaymentDetails><CreditCard><CreditCardType>' + CardType + '</CreditCardType><CreditCardNumber>' + CardNo + '</CreditCardNumber>';
      doDirectRequest += '<ExpMonth>' + expMo + '</ExpMonth><ExpYear>' + expYe + '</ExpYear><CardOwner><PayerStatus>verified</PayerStatus>';
      doDirectRequest +=
       '<PayerName><FirstName>' + FirstName+ '</FirstName><LastName>' + LastName + '</LastName></PayerName><PayerCountry>' + country + '</PayerCountry>';
      doDirectRequest += '<Address><Street1>' + Addy1 + '</Street1><Street2>' + Addy2 + '</Street2><CityName>' + city + '</CityName>';
      doDirectRequest += '<StateOrProvince>' + state + '</StateOrProvince><Country>' + country + '</Country><PostalCode>' + zip + '</PostalCode></Address>';
      doDirectRequest += '</CardOwner><CVV2>' + CVV + '</CVV2></CreditCard></DoDirectPaymentRequestDetails>';
      doDirectRequest += '</DoDirectPaymentRequest></DoDirectPaymentReq></soap:Body></soap:Envelope>';
 
      System.debug('Request Value:'+doDirectRequest);
 
      req.setEndpoint(url);
      req.setMethod('POST');
      req.setHeader('Content-length', '1753' );
      req.setHeader('Content-Type', 'text/xml;charset=UTF-8');
      req.setHeader('SOAPAction','');
      req.setTimeout(120000);
 
      HttpResponse res = h.send(req);
      String xml = res.getBody();
      rawResponse = xml;
      system.debug('::' + rawResponse);
      reader = res.getXmlStreamReader();
      result = readXMLResponse(reader,'Ack');
      reader = res.getXmlStreamReader();
      err = readXMLResponse(reader, 'LongMessage');
 
      if (result == 'Success')
      {
        reader = res.getXmlStreamReader();
        transid = readXMLResponse(reader, 'TransactionID');
        if(transid == null){
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,err));
        }
      }
      else
      {
        result = err;
      }
      return result;
    }

    public String readXMLResponse(XmlStreamReader reader, String sxmltag)
    {
      string retValue; // Read through the XML
      while(reader.hasNext())
      {
        if (reader.getEventType() == XmlTag.START_ELEMENT)
        {
          if (reader.getLocalName() == sxmltag) {
            reader.next();
            if (reader.getEventType() == XmlTag.characters)
            {
              retValue = reader.getText();
            }
          }
        }
        reader.next();
      }
      return retValue;
    }

    /*public String processPayment(){
 
     message = doDirectPayment();
      if (message != 'Success'){
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Error,message));
      }
      return message;
    }*/

    webservice static String doVoidPayment(String objtransaction)
    {
         //Use the username password credentials of your Paypal account
        // this below credentials will now work

        String url =https://api-3t.sandbox.paypal.com/2.0/;
        string un =ssanebina-ftator_api1.gmail.com ;
        string pw =13968266;
        string sig =An5nso7MWUdW4QKJi4-ALQdI5p2aNE1c5OKgKgV6zf5tPo3 ;
   
        Http h = new Http();
        HttpRequest req = new HttpRequest();
             req.setHeader('Host','api-aa.sandbox.paypal.com');
               //This Host is for production
               // req.setHeader('Host','api-aa.paypal.com');
           
     String doVoidRequest='';
   
      doVoidRequest += '<soap:Envelope xmlns:soap=' + '\'' + 'http://schemas.xmlsoap.org/soap/envelope/'  + '\'' + ' xmlns:xsi=' + '\''+ 'http://www.w3.org/2001/XMLSchema-instance'  + '\'' + ' xmlns:xsd=' + '\''+ 'http://www.w3.org/2001/XMLSchema' + '\'' + '>';
      doVoidRequest += '<soap:Header><RequesterCredentials xmlns="urn:ebay:api:PayPalAPI"><Credentials xmlns="urn:ebay:apis:eBLBaseComponents">';
      doVoidRequest += '<Username>'+un+'</Username><ebl:Password xmlns:ebl="urn:ebay:apis:eBLBaseComponents">'+pw;
      doVoidRequest += '</ebl:Password><Signature>'+sig+'</Signature>';
      doVoidRequest += '</Credentials></RequesterCredentials></soap:Header><soap:Body><DoVoidReq xmlns="urn:ebay:api:PayPalAPI"><DoVoidRequest xmlns="urn:ebay:api:PayPalAPI"><Version xmlns="urn:ebay:apis:eBLBaseComponents">86.0</Version>';
      doVoidRequest += '<AuthorizationID>'+objtransaction+'</AuthorizationID></DoVoidRequest></DoVoidReq></soap:Body></soap:Envelope>';
     
      req.setBody(doVoidRequest);
     
 
      System.debug('Request Value:'+doVoidRequest);
      req.setEndpoint(url);
      req.setMethod('POST');
      req.setHeader('Content-length', '1753' );
      req.setHeader('Content-Type', 'text/xml;charset=UTF-8');
      req.setHeader('SOAPAction','');
      req.setTimeout(120000);
 
      HttpResponse res = h.send(req);
      String xml = res.getBody();
      System.XmlStreamReader reader = res.getXmlStreamReader();
      PaypalProcessor proc=new PaypalProcessor();
      String result = proc.readXMLResponse(reader,'Ack');
      system.debug(xml);
      return result;
    }

     webservice static String doRefundPayment(String objtransaction)
    {
   
      //Use the username password credentials of your Paypal account
    // this below credentials will now work
        String url =https://api-3t.sandbox.paypal.com/2.0/;
        string un =ssanebina-ftator_api1.gmail.com ;
        string pw =13968266;
        string sig =An5nso7MWUdW4QKJi4-ALQdI5p2aNE1c5OKgKgV6zf5tPo3 ;

        Http h = new Http();
        HttpRequest req = new HttpRequest();

             req.setHeader('Host','api-aa.sandbox.paypal.com');}
              // This host is for production
               // req.setHeader('Host','api-aa.paypal.com');
           
     String doReFundRequest;
   
      doReFundRequest =  '<soap:Envelope xmlns:soap=' + '\'' + 'http://schemas.xmlsoap.org/soap/envelope/'  + '\'' + ' xmlns:xsi=' + '\''+ 'http://www.w3.org/2001/XMLSchema-instance'  + '\'' + ' xmlns:xsd=' + '\''+ 'http://www.w3.org/2001/XMLSchema' + '\'' + '>';
      doReFundRequest += '<soap:Header><RequesterCredentials xmlns="urn:ebay:api:PayPalAPI"><Credentials xmlns="urn:ebay:apis:eBLBaseComponents">';
      doReFundRequest += '<Username>'+un+'</Username><ebl:Password xmlns:ebl="urn:ebay:apis:eBLBaseComponents">'+pw;
      doReFundRequest += '</ebl:Password><Signature>'+sig+'</Signature>';
      doReFundRequest += '</Credentials></RequesterCredentials></soap:Header><soap:Body><RefundTransactionReq xmlns="urn:ebay:api:PayPalAPI"><RefundTransactionRequest><Version xmlns="urn:ebay:apis:eBLBaseComponents">86.0</Version>';
      doReFundRequest += '<TransactionID>'+objtransaction+'</TransactionID><RefundType>Full</RefundType><Memo>customer requested refund.</Memo></RefundTransactionRequest></RefundTransactionReq></soap:Body></soap:Envelope>';
     
      req.setBody(doReFundRequest);
 
      System.debug('Request Value:'+doReFundRequest);
 
      req.setEndpoint(url);
      req.setMethod('POST');
      req.setHeader('Content-length', '1753' );
      req.setHeader('Content-Type', 'text/xml;charset=UTF-8');
      req.setHeader('SOAPAction','');
      req.setTimeout(120000);
 
      HttpResponse res = h.send(req);
      String xml = res.getBody();
      System.XmlStreamReader reader = res.getXmlStreamReader();
      PaypalProcessor proc=new PaypalProcessor();
      String result = proc.readXMLResponse(reader,'Ack');
      system.debug(xml);
      return result;              
    }
}

4 comments :

  1. Hi Suresh,
    I Tried this code, getting unauthorised Error 401

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. The article provided by you is very nice and it is very helpful to know the more information about salesforce paypal integration.keep update with your blogs.....
    salesforce integration

    ReplyDelete
  4. actually i want to integrate payu with salesforce.Please send me any SOURCE code

    ReplyDelete

Labels

visualforce page ( 13 ) apex integration ( 5 ) apex trigger ( 4 ) csv file from vf page ( 4 ) javascript ( 4 ) csv visualforce page ( 3 ) Too many ( 2 ) call out ( 2 ) integration ( 2 ) rest api ( 2 ) salesforce rest api ( 2 ) salesforce to salesforce integration ( 2 ) sfdc rest api ( 2 ) trigger ( 2 ) 15 digit to 18 digit ( 1 ) DML rows in Apex ( 1 ) Date Conversion ( 1 ) Date/Time conversion ( 1 ) Deploy ( 1 ) Objects to Future Annotated Methods ( 1 ) SFDC limits ( 1 ) Sobject to Future Annotated Methods ( 1 ) Test Class ( 1 ) TimeZone Conversion ( 1 ) Too many dml rows ( 1 ) Too many future calls ( 1 ) annotations ( 1 ) apex code ( 1 ) closed opportunities ( 1 ) commit ( 1 ) convert ( 1 ) create records ( 1 ) csv create records ( 1 ) custom setting ( 1 ) deployment ( 1 ) deployment changeset ( 1 ) disable apex class ( 1 ) disable apex trigger ( 1 ) disable in production ( 1 ) document ( 1 ) download ( 1 ) field name ( 1 ) formula fields ( 1 ) iframe ( 1 ) inactive ( 1 ) intellisense ( 1 ) jsforce ( 1 ) limits ( 1 ) matrix report in vf page ( 1 ) multi select ( 1 ) multi select salesforce ( 1 ) multiselect ( 1 ) paypal ( 1 ) picklist ( 1 ) record type ( 1 ) rollback ( 1 ) salesforce limits ( 1 ) salesforce list ( 1 ) salesforce map ( 1 ) salesforce rest ( 1 ) salesforce set ( 1 ) salesforce1 ( 1 ) sandbox deployment ( 1 ) sfdc collection ( 1 ) sfdc list ( 1 ) sfdc map ( 1 ) sfdc rest ( 1 ) sfdc set ( 1 ) uncommitted ( 1 ) updated field ( 1 ) user ( 1 ) validation rule opportunity ( 1 ) validation rules opportunities ( 1 ) vf page ( 1 )

Ad