Есть ли способ позволить нашим пользователям легко находить транзакцию по ее идентификатору с другого веб-сайта, такого как Salesforce, Oracle CX?

Было бы здорово, если бы следующая ссылка позволяла просроченным сеансам входить в систему, а затем переходить на страницу сведений о транзакции или если они уже вошли в систему, если это может привести пользователя прямо к экрану сведений о транзакции

Просмотреть изображение

https://live.sagepay.com/mysagepay/login.msp?returnUrl=/transactiondetail.msp?transactionID=68D131EF-3C83-489F-B235-0763752CBDE5

Я настроил кнопку в Salesforce для автоматического добавления идентификатора транзакции в конец URL-адреса, чтобы наши внешние пользователи могли легко просматривать плату в SagePay, однако, если они еще не вошли в систему, она перенаправит на экран входа в систему и затем после входа в систему он не переходит на returnUrl, как многие веб-сайты после входа в систему.

Пока URL-адрес дезинфицирован, он не должен представлять риска для URL-адреса. Разрешение только относительных путей должно помочь, но некоторый код на стороне сервера в части SagePays может потребоваться для синтаксического анализа незаконных запросов от попыток перенаправления в другое место.

Просмотреть пример


person Darren Williams    schedule 11.12.2019    source источник


Ответы (1)


Почему бы Salesforce не вызвать ReportingAPI, а затем заполнить экран возвращенными сведениями (которые в любом случае содержат всю информацию с этого экрана).

Тогда вашим пользователям вообще не нужно переходить на MSP.

В приведенном ниже примере кода будет возвращен список всех транзакций - я уверен, что вы могли бы адаптировать его для использования getTransactionDetail:

public class Tools {

    public static void getTransactions() {
        Tools.getTransactionListXML(Tools.executeCommand('getTransactionList',  '<startdate>' + Tools.getLastCheckedTime() +'</startdate><enddate>' + Tools.getEndDate() + '</enddate>'));
    }


    public static String executeCommand(String command, String data) { 

     GlobalData__c gd = new GlobalData__c(); 
       gd = [SELECT Vendor__c, MSPUsername__c, MSPPassword__c, URL__c FROM GlobalData__c LIMIT 1]; 

        String call='<command>' + command +  '</command><vendor>' +  gd.Vendor__c  + '</vendor><user>' + gd.MSPUsername__c + '</user>' + data;
        String HashXML= call + '<password>' + gd.MSPPassword__c + '</password>';       

        Blob bPrehash = Blob.valueOf(HashXML);  
        Blob bsig = Crypto.generateDigest('MD5', bPrehash); 
        String signature = EncodingUtil.convertToHex(bsig); 
        String xml = '<vspaccess>' + call  +  '<signature>' + signature + '</signature>' + '</vspaccess>'  ;            
        Http h = new Http(); 
        HttpRequest req = new HttpRequest(); 
        req.setTimeout(120000);
        req.setBody('XML=' +xml);
        req.setMethod('GET'); 
        req.setHeader('Accept', 'application/xml');
        req.setEndpoint(gd.URL__c );
        HttpResponse res = h.send(req); 
        return res.getBody(); 
    } 

    public static String getLastCheckedTime() {        
 GlobalData__c gd = new GlobalData__c(); 
 gd = [SELECT TransactionListLastChecked__c FROM GlobalData__c LIMIT 1];       
System.debug (gd.TransactionListLastChecked__c);
    return (gd.TransactionListLastChecked__c)  ;  
    }

    public static String getEndDate() {

        //returns day+1 as end date
      DateTime myDateTime = DateTime.Now().AddDays(1); 
       String out = myDateTime.formatLong();
         out = out.replace(' GMT', ''); 
        return(out);
    }

    Public static void getTransactionListXML(String xmlfile)   {

       //update last checked time
        Datetime myDateTime = Datetime.now(); 
       String out = myDateTime.formatLong();
         out = out.replace(' GMT', ''); 

       GlobalData__c gd = new GlobalData__c(); 
       gd = [SELECT TransactionListLastChecked__c FROM GlobalData__c LIMIT 1]; 
        gd.TransactionListLastChecked__c = out; 
        update gd;



        DOM.Document xmlDOC = new DOM.Document();
        xmlDOC.load(xmlfile);
        DOM.XMLNode rootElement = xmlDOC.getRootElement();

        Dom.XMLNode vspaccess = xmlDOC.getRootElement();
        String errorcode = vspaccess.getChildElement('errorcode', null).getText();
        System.debug(errorcode);        



        Dom.XMLNode transactionsElement = vspaccess.getChildElement('transactions', null);

        try{
        String totalrows = transactionsElement.getChildElement('totalrows', null).getText();
        System.debug(totalrows); 
        } catch(Exception e) { 
        System.debug('No rows found.'); 
        return;
         } 


        xmlfile = '<transactions>' + xmlfile.substringBetween('</totalrows>','<timestamp>');


        DOM.Document xml2 = new DOM.Document();
        xml2.load(xmlfile);

        String vpstxid='';
        String last4digits = '';
        String cardtype='';
        String amount='';
        String accounttype='';  
        String authprocessor = '';
        String systemused='';
        String transactiontype='';       
        String t3maction='' ;     
        String repeated='';
        String vendordata='';       
        String website='';        
        String addressresult='';     
        String vspauthcode='';
        String result='';
        String vendorTxCode=''; 
        String curr='';       
        String bankauthcode='';         
        String cv2result='';  
        String threedresult='';     
        String postcoderesult='';       
        String cardholder='';       
        String batchid=''; 
        String refunded='';   
        String started=''; 

        for(DOM.XMLNode xmlNodeObj:xml2.getRootElement().getChildElements()){

            for(DOM.XMLNode xmlNodeObjChild:xmlNodeObj.getChildren())
            {

                if(xmlNodeObjChild.getName()=='vpstxid') 
                    vpstxid = xmlNodeObjChild.getText();



                  if(xmlNodeObjChild.getName()=='started')
                    started = xmlNodeObjChild.getText();
                  if(xmlNodeObjChild.getName()=='last4digits')
                    last4digits = xmlNodeObjChild.getText();
                if(xmlNodeObjChild.getName()=='paymentsystem')
                    cardtype = xmlNodeObjChild.getText();
               if(xmlNodeObjChild.getName()=='amount')
                    amount = xmlNodeObjChild.getText();
              if(xmlNodeObjChild.getName()=='accounttype')
                    accounttype = xmlNodeObjChild.getText();
               if(xmlNodeObjChild.getName()=='authprocessor')
                    authprocessor = xmlNodeObjChild.getText();
                if(xmlNodeObjChild.getName()=='transactiontype')
                    transactiontype = xmlNodeObjChild.getText();    
                if(xmlNodeObjChild.getName()=='systemused')
                    systemused = xmlNodeObjChild.getText();      
                if(xmlNodeObjChild.getName()=='t3maction')
                    t3maction = xmlNodeObjChild.getText();   
                if(xmlNodeObjChild.getName()=='repeated')
                    repeated = xmlNodeObjChild.getText();   
                if(xmlNodeObjChild.getName()=='vendordata')
                    vendordata = xmlNodeObjChild.getText();          
                if(xmlNodeObjChild.getName()=='website')
                    website = xmlNodeObjChild.getText();      
                if(xmlNodeObjChild.getName()=='addressresult')
                    addressresult = xmlNodeObjChild.getText();                 
                if(xmlNodeObjChild.getName()=='vspauthcode')
                    vspauthcode = xmlNodeObjChild.getText();                     
                if(xmlNodeObjChild.getName()=='result')
                    result = xmlNodeObjChild.getText();                    
                if(xmlNodeObjChild.getName()=='vendorTxCode') 
                    vendorTxCode = xmlNodeObjChild.getText();                
                if(xmlNodeObjChild.getName()=='currency')
                    curr = xmlNodeObjChild.getText();
                if(xmlNodeObjChild.getName()=='bankauthcode')
                    bankauthcode = xmlNodeObjChild.getText(); 
                if(xmlNodeObjChild.getName()=='cv2result')  
                    cv2result = xmlNodeObjChild.getText();
                if(xmlNodeObjChild.getName()=='threedresult')
                    threedresult = xmlNodeObjChild.getText();      
                if(xmlNodeObjChild.getName()=='postcoderesult')
                    postcoderesult = xmlNodeObjChild.getText();
                if(xmlNodeObjChild.getName()=='cardholder')
                    cardholder = xmlNodeObjChild.getText();             
                if(xmlNodeObjChild.getName()=='batchid')
                    batchid = xmlNodeObjChild.getText();
                if(xmlNodeObjChild.getName()=='refunded')   
                    refunded = xmlNodeObjChild.getText();

                /*       








*/
            }


            Transactions__c checkTransaction = new Transactions__c ();
            Integer cT = [SELECT COUNT() FROM Transactions__c WHERE TransactionID__c=: vpstxid];    
            System.debug(cT);     

            Transactions__c newTransaction = new Transactions__c ();


            newTransaction.Name = cardholder + ' ' + vendortxcode;
            newTransaction.TransactionID__c = vpstxid;
            newTransaction.Last4Digits__c = last4digits;
             newTransaction.Started__c =  started;
            newTransaction.Card_Type__c =  cardtype;
            newTransaction.Amount__c    =amount;
            newTransaction.AccountType__c= accounttype;
            newTransaction.AuthProcessor__c = authprocessor;
            newTransaction.TransactionType__c = transactiontype;
            newTransaction.SystemUsed__c = systemused;
            newTransaction.T3maction__c=t3maction;
         newTransaction.Repeated__c=repeated;
         newTransaction.VendorData__c=vendordata;
         newTransaction.Website__c=website;
     newTransaction.AddressResult__c=addressresult;
     newTransaction.VSPAuthcode__c=vspauthcode;
         newTransaction.Result__c=result;
    newTransaction.VendorTxCode__c=vendortxcode; 
         newTransaction.Currency__c=curr;    
         newTransaction.BankAuthCode__c=bankauthcode;
               newTransaction.CV2Result__c=cv2result;  
      newTransaction.X3DResult__c=threedresult;
     newTransaction.PostcodeResult__c=postcoderesult;
     newTransaction.CardHolder__c=cardholder;
     newTransaction.BatchID__c=batchid;
     newTransaction.Refunded__c=refunded;   


             if(cT<1)
            insert newTransaction;
            else
             System.debug('Record exists');


        }
    }   
}
person Rik Blacow    schedule 07.02.2020