Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Php site koppelen met interne database

Pagina: 1
Acties:
  • 1.045 views sinds 30-01-2008
  • Reageer

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 08:06
Hierbij wilde ik jullie eens om een technisch advies vragen. De afgelopen jaren heb ik voor een kennis van mij een aantal zaken ontwikkeld.

-Ik heb ooit hun Php website gemaakt met een onderliggende MySQL database. Hierop kunnen klanten bestellingen doorvoeren etc etc. Dit staat bij een hosting partij waarbij de geplaatste bestellingen in de database komen te staan en per email naar het bedrijfs netwerk worden gestuurd om daar verwerkt te worden.

-Ik heb ook een intern programma gemaakt om klanten bij te houden en offertes, bevestigingen, etc etc te kunnen maken. Het programma is gemaakt in .NET 1.1 en in de loop der tijd aangekomen op .NET 3.5. Hieronder zit een SQL Server 2005 database. Hierop werken ondertussen alle medewerkers ( 6 man) en begint het meer op een custom CRM te lijken.

Als er nu door een nieuwe klant een bestelling gedaan word( in de website), krijgt de medewerker een mailtje metdaarin de bestelling. Hieruit haalt hij de bedrijf gegevens en contactpersoon en voert deze in het lokale programma (indirect dus in de SQL Server database). Dan word er een de offerte gegenereerd op basis van de ingevoerde NAW gegevens en word de bestelling daarin gezet. Dit is natuurlijk ontzettend dubbel werk en tegen ieders IT hart in. Daarvoor zoeken we nu een oplossing om dit deel te automatiseren. Het eerste doel is om te zorgen dat nieuwe klanten die een bestelling doen in de website, in de SQ Server 2005 database komen die lokaal op het netwerk staat.

!De beide database hebben alleen localhost toegang en zijn niet vanaf extern te benaderen.

Nu heb ik zitten denken en zijn er de volgende oplossingen:
1)Een .NET webservice maken en deze vanuit de Php kan aanroepen. Nadeel is alleen dat ik het niet werkend krijg om een WCF 3.5 webservice op een veilige manier kan aanroepen vanuit php (Pushing manier)

Ik heb de Php library NuSoap geprobeerd maar die kan volgens mij alleen met basicHttpBinding overweg. Met basicHttpBinding kan ik volgens mij geen authenticatie meegeven.
Ik heb ook de wsf-php libary bekeken maar daarvoor moeten er dll op de hosting gezet worden en de php.ini aangepast. Dat zal een hosting partij niet gaan doen voor me.

2)Gaan werken met temp bestandjes en deze periodiek uit te lezen vanaf het lokale netwerk (Polling manier) Hier ben ik niet echt een voorstander van.

Heeft iemand anders nog goede ideen of een secure connection kunnen leggen tussen een PHP websevice en een WCF webservice?

Bedankt!

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Je hoeft natuurlijk niet meteen met SOAP te gaan werken. Je kan ook kiezen voor REST dit is meestal een stuk eenvoudiger. In jouw geval: Stel je XML op in PHP, verstuur met Curl naar ASP. Parse de XML en start je bestel procedure.

On track


  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Alternatief: het mailtje automatisch verwerken. Ik neem aan dat dat mailtje automatisch verwerkt kan worden door de gestructuurde opzet van het mailtje. Je kan dan het mailtje uitlezen en de informatie erin automatisch toevoegen aan de database.

Hoe dat moet is afhankelijk van de mailserver en/of het gebruikte mailprogramma. BV met outlook en VBA:
How to create a custom rule in Outlook 2000 by using Visual Basic for Applications

  • martijnve
  • Registratie: December 2004
  • Laatst online: 20-11 14:01
Ik neem aan dat het niet erg is als de bestellingen alleen overgenomen worden als er een client draait.
In dat geval is het misschien handiger om gewoon een php pagina te maken die versleutelde xml data toont van de laatste bestellingen. Als je dan op je locale server (of in de clients) iets inbouwt wal elke x minuten ff die pagina opvraagt en nieuwe bestellingen in de sql server db stopt ben je klaar.

Daarna kun je evt een versleuteld bericht naar de php server sturen om de bestelling als overgenomen te markeren.

[ Voor 12% gewijzigd door martijnve op 21-01-2008 17:17 ]

Mini-ITX GamePC: Core i5 3470 | 16GB DDR3 | GTX 970 4GB | Samsung 830 128GB | Dell u2711 (27", IPS,1440p), 2343BW


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 08:06
WouZz schreef op maandag 21 januari 2008 @ 16:33:
Je hoeft natuurlijk niet meteen met SOAP te gaan werken. Je kan ook kiezen voor REST dit is meestal een stuk eenvoudiger. In jouw geval: Stel je XML op in PHP, verstuur met Curl naar ASP. Parse de XML en start je bestel procedure.
Kan ik met Curl er wel voor zorgen dat die XML veilig overgestuurd word? Kun je er met Curl voor zorgen dat niet iedereen daar zo maar bestandjes heen kan sturen? Bijvoorbeeld met Username/Password,

EDIT: Helaas word er pas authenticatie ondersteund vanaf Php 5.0. Zie http://nl3.php.net/curl_setopt onder het kopje CURLOPT_HTTPAUTH. De webserver draait Php 4.4.7-0.dotdeb.0 en libcurl 7.13.2
rutgerw schreef op maandag 21 januari 2008 @ 17:10:
Alternatief: het mailtje automatisch verwerken. Ik neem aan dat dat mailtje automatisch verwerkt kan worden door de gestructuurde opzet van het mailtje. Je kan dan het mailtje uitlezen en de informatie erin automatisch toevoegen aan de database.

Hoe dat moet is afhankelijk van de mailserver en/of het gebruikte mailprogramma. BV met outlook en VBA:
How to create a custom rule in Outlook 2000 by using Visual Basic for Applications
Ze maken gebruik van Exchange Sbs 2003. Ik neem aan dat die regels die je aanmaakt op de client worden uitgevoerd. Dat is wel een probleem, die pc's daar gaan namelijk elke avond en weekend netjes uit.
Al zou ik op de server ook outlouk kunnen installeren en die altijd open laten staan. Maar mijn eigen ervaring met Outlook is wel dat die het net niet fijn gaat vinden om dagen lang achter elkaar aan te blijven staan.
Op mijn werk laptop vreet dat proces al bakken met geheugen.
martijnve schreef op maandag 21 januari 2008 @ 17:16:
Ik neem aan dat het niet erg is als de bestellingen alleen overgenomen worden als er een client draait.
In dat geval is het misschien handiger om gewoon een php pagina te maken die versleutelde xml data toont van de laatste bestellingen. Als je dan op je locale server (of in de clients) iets inbouwt wal elke x minuten ff die pagina opvraagt en nieuwe bestellingen in de sql server db stopt ben je klaar.

Daarna kun je evt een versleuteld bericht naar de php server sturen om de bestelling als overgenomen te markeren.
Goed punt, maar vooral dat laatste is een probleem. Anders had ik ook direct de gegevens uitkunnen lezen i.p.v. aan het einde alleen het bitje veranderen.


Bedankt voor jullie punten, het idee van WouZz komt nog het dichtst bij mijn belevenis alleen heb ik nooit iets met Curl etc gedaan. Ik zal eens gaan zoeken naar manieren om een XML bestand
veilig aan de andere kant te krijgen.

[ Voor 9% gewijzigd door GAEvakYD op 21-01-2008 20:14 ]

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Met basicHttpBinding kun je gewoon doen wat je wilt hoor :).
Ik ken die library niet, maar als die aan de standaard voldoet dan kun je iig in de header dingen meesturen.
In dat geval kun je met x509 certificaten te werken. Enigste wat je daarvoor moet doen (kwa extra code) is bij de aanroepende kant een x509 certificaat mee te sturen in de header.
Vervolgens zorg je dat dit certificaat geinstalleerd is aan de server kant (zie documentatie daarover, google ftw). En je bent klaar.
Enigste client die dan met jou webservice kan verbinding is er eentje die dat certificaat heeft. Veilig genoeg in jou situatie neem ik aan ;)

*lookup*

Heb ff gekeken en het volgende gevonden:
Hi, I have 2 questions.

1. How do I access a webservice that requires X.509 authentication with nusoap.


Thanks!
-----------------------
1. NuSOAP does not do this for you. You will have to create the XML that belongs in the SOAP Header and provide it as the $header parameter in the call() method.

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

GAEvakYD schreef op maandag 21 januari 2008 @ 18:33:
[...]

Kan ik met Curl er wel voor zorgen dat die XML veilig overgestuurd word? Kun je er met Curl voor zorgen dat niet iedereen daar zo maar bestandjes heen kan sturen? Bijvoorbeeld met Username/Password,

EDIT: Helaas word er pas authenticatie ondersteund vanaf Php 5.0. Zie http://nl3.php.net/curl_setopt onder het kopje CURLOPT_HTTPAUTH. De webserver draait Php 4.4.7-0.dotdeb.0 en libcurl 7.13.2
check
CURLOPT_USERPWD A username and password formatted as "[username]:[password]" to use for the connection.
Verder kan username en password natuurlijk ook als get parameter meegeven.

Om de data te versturen heb je CURLOPT_POST en CURLOPT_POSTFIELDS nodig.

On track


  • Kalentum
  • Registratie: Juni 2004
  • Nu online
GAEvakYD schreef op maandag 21 januari 2008 @ 18:33:
[...]


Ze maken gebruik van Exchange Sbs 2003. Ik neem aan dat die regels die je aanmaakt op de client worden uitgevoerd. Dat is wel een probleem, die pc's daar gaan namelijk elke avond en weekend netjes uit.
[...]
Kan ook serverside met Exchange.

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 08:06
D-Raven schreef op dinsdag 22 januari 2008 @ 09:30:
Met basicHttpBinding kun je gewoon doen wat je wilt hoor :).
Ik ken die library niet, maar als die aan de standaard voldoet dan kun je iig in de header dingen meesturen.
In dat geval kun je met x509 certificaten te werken. Enigste wat je daarvoor moet doen (kwa extra code) is bij de aanroepende kant een x509 certificaat mee te sturen in de header.
Vervolgens zorg je dat dit certificaat geinstalleerd is aan de server kant (zie documentatie daarover, google ftw). En je bent klaar.
Enigste client die dan met jou webservice kan verbinding is er eentje die dat certificaat heeft. Veilig genoeg in jou situatie neem ik aan ;)

*lookup*

Heb ff gekeken en het volgende gevonden:

[...]
Bedankt voor je tip, ik heb eigenlijk nog nooit echt aan de serverkant gewerkt met certificaten. Wel om webservices aan te roepen die een client certificaat vereiste.
Zou je me een hint kunnen geven wat voor soort certificaat ik nodig heb en waar op de server ik deze dien te installeren als ik gebruik maak van een WCF service
gehost in een managed Windows Service. http://msdn2.microsoft.co...rary/ms733069(VS.85).aspx. Ik weet dan niet waar ik kan aangeven welk certificaat hij
moet pakken om het HTTPS kanaal te bouwen. De configuratie moet er volgens mij dan als volgt uit zien alleen weet ik dus niet waar ik het certificaat dien op te geven.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="secureHttpBinding">          
              <security mode="TransportWithMessageCredential">
                <message clientCredentialType ="Certificate" />
              </security>
            </binding>
          </basicHttpBinding>      
        </bindings>
        <services>
          <service name="Bosvlaggen.KlantenWindowsService.KlantenService" behaviorConfiguration="Bosvlaggen.KlantenWindowsServiceBehavior">
            <host>
              <baseAddresses>
                <add baseAddress="https://localhost:8000/KlantenService"/>
              </baseAddresses>
            </host>        
            <endpoint address=""
                      binding="basicHttpBinding"
                      bindingConfiguration="secureHttpBinding"
                      name="BasicEndpoint"
                      contract="Bosvlaggen.KlantenWindowsService.IKlantenService" />        
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>   
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="Bosvlaggen.KlantenWindowsServiceBehavior">          
              <serviceMetadata httpGetEnabled="true"/><!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>    
      </system.serviceModel>


Ik moet nog even zien uit te zoeken of die NuSoap library ook in UTF-8 requests kan sturen. Als ik nu mijn basicHttpBnding benader krijg ik een error dat de encoding
anders is. NuSoap verstuurd het verzoek in 'ISO-8859-1' en de webservice verwacht UTF-8. Ik zie nog nergens een mogelijkheid om in NuSoap een andere characterset op te
kunnen geven.
code:
1
2
    Error
    HTTP Error: Unsupported HTTP response status 415 Cannot process the message because the content type 'text/xml; charset=ISO-8859-1' was not the expected type 'text/xml; charset=utf-8'. (soapclient->response has contents of the response)



EDIT: Net na wat speurwerk de volgende URL gevonden. Ik zie dat je dan niet vanuit code het certificaat kunt opgeven. Ik dacht het zo te gaan doen maar blijkbaar werk dat niet bij een zelf hosted service:
code:
1
2
3
4
5
serviceHostCalculator.Credentials.ServiceCertificate.SetCertificate(
                StoreLocation.LocalMachine,
                StoreName.My,
                X509FindType.FindBySubjectName,
                "NAAM");


Toch maar eens gaan kijken of het hosten in IIS dan toch niet makkelijk is.

[ Voor 6% gewijzigd door GAEvakYD op 22-01-2008 14:21 ]

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Ik begon net te twijfelen over mij eigen post, en heb nog even iets opgezocht. Ik zei dat de client een certificaat verstuurd (en zich als dusdanig authenticeerd) maar met transport security *waar ik het dus eigenlijk over had* werkt het net andersom..

Ik zie dat je in jou post al "TransportWithMessageCredential" gebruikt. Dit is inderdaad wat je wilt.
Helaas heb ik nog helemaal niks met dit type gedaan. Dus ik kan er nog niet veel over zeggen.

Wat ik wel weet is dat deze security setting de WS Extensies gebruikt (deze zijn ingebakken in WCF waardoor je er direct niks van ziet). Probleem daarmee is dat NuSoap dit waarschijnlijk niet ondersteund. Ik heb er in ieder geval niks over kunnen vinden.

Ik weet niet precies hoe de SOAP envelop eruit ziet als deze extensies gebruikt worden maar je zou een WCF client op kunnen zetten. Welke via (s)http verbinding maakt met je service, en dan de soap messages welke heen en weer worden gegooid loggen. Zodat je vervolgens kunt kijken of je de headers die gegenereerd worden kwa structuur kunt reproduceren en aan de $header var van NuSoap mee geven.

Maargoed dit is allemaal nogal wat werk. Misschien zijn er betere Soap library's voor php waarmee je deze dingen wel kunt doen?
Een andere mogelijkheid zou kunnen zijn om lokaal een wcf service (http of tcp) te draaien op de php machine, welke alleen connecties van de lokale machine accepteert (van php dus). En dan die service als agent gebruiken om met je WCF Service aan de andere kant te communiceren.

offtopic:
Communiceren met een WCF service vanaf een non WCF/.net client is niet zo makkelijk als dat ze daar bij MS verkondigen. Normale, relatief eenvoudige dingen gaat nog. Maar zodra je met beveiliging dingen aan de slag moet zie je door de vele XML tags vaak het bos niet meer :P.

En zet je DM's eens aan :P

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 08:06
D-Raven schreef op dinsdag 22 januari 2008 @ 19:15:
Ik begon net te twijfelen over mij eigen post, en heb nog even iets opgezocht. Ik zei dat de client een certificaat verstuurd (en zich als dusdanig authenticeerd) maar met transport security *waar ik het dus eigenlijk over had* werkt het net andersom..
......
Hmmm ik heb het nu aan de gang om zonder security de webservice te kunnen aanroepen. Door wat instellingen te wijzigen in de NuSoap library doet die nu een aanroep en krijg ik antwoord, helaas
wel een exception maar dat heeft een andere reden. Ik zal de komende tijd eens goed in WCF gaan duiken met de nodige mogelijkheden. Ik heb bijvoorbeeld dit boek maar eens bestel:
http://www.oreilly.com/catalog/9780596101626/

Helaas heb ik voor Php maar twee libraries gevonden, NuSoap en WSF. Met WSF zou je idd meer kunnen wat betreft WS-* mogelijkehden. Helaas moet je hiervoor libraries gaan installeren op de
webserver en de PHP configuratie aanpassen. Dat is dus not done bij een hosting partij.

Ik ben met je eens dat ht moeilijkste nu pas begint, om die security mogelijkheden te kunnen gebruiken. Ik houd jullie / jou op de hoogte.

offtopic:
Owja, ik heb mijn DM aangezet.

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom moet er perse met soap worden gewerkt? Daarbij gaan de gegevens de de MySQL database (website) naar de MSSQL2005 database (lokaal). Je kunt in principe gewoon een url aanroepen als /sync/orders.php?timestamp=20080123150000 waarbij timestamp het tijdstip van je laatste synchronisatie is. orders.php geeft gewoon een simpel XML document terug. Daarnaast zul je waarschijnlijk ook een customers.php en misschien een paymentstatus.php. Vervolgens kun je in apache de directory 'sync' beveiligen middels username/password en misschien zelfs op IP.

Vervolgens kun je een windows service schrijven welke regelmatig de verschillende url's aanroept de de resultaten naar de MSSQL2005 database schrijft. Je zou zelfs de mailbox in de gaten kunnen houden en op basis daarvan de gegevens van een bestelling ophalen (dus order en customer gezamelijk).

Het is inmiddels als weer een flinke tijd geleden dat ik met php en MySQL hebt gewerkt, maar het zou mij niet verbazen als er al een 'query 2 xml' class bestaat voor PHP.

If it isn't broken, fix it until it is..


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 08:06
hmmm misschien kan het makkelijker maar ik zie dit ook een beetje als een uitdaging en leerprojectje. Mocht dit nu niet gaan lukken uiteindelijk, dan zal ik jou manier zeker bekijken. Thanks.

Ik heb het ondertussen aan de gang om de WCF service met SLL te kunnen hosten. Dat was wel heel wat uitzoekwerk met al die certificaten en de rechten erop.

Ik test nu vanaf de php client op de webservice nog zonder de certificaten. Dit omdat het aanroepen opzicht nog niet goed gaat. Ik mag de webservice nu wel aanroepen maar ik krijg een verkeerd resultaat terug. Ik heb een methode (KlantBestaat) die een boolean teruggeeft. Vanuit een Windows applicatie met een refrence daarheen krijg ik netjes de waarde TRUE terug als ik een bestaande klant opgeef. Als ik dezelfde call vanuit PHP uitvoer krijg ik false terug. Ik heb nog niet kunnen vinden waar het probleem nu zit.

Zie hier voor de uitvoer van de trace bestanden van beide aanroepen. Hopenlijk ziet iemand van jullie wat er aan de hand is. Ik heb kan het maar niet uit die log halen.

www.ordelman.org/temp/messages_windows2.svclog
www.ordelman.org/temp/messages_php.svclog

Het valt me wel op dat de PHP kant een GET operatie doet en de Windows client een POST. Met SvcTraceViewer zie ik in het parameters ook niet staan bij de PHP verzoek en bij de andere zie ik netjes welke paramaters er binnen gekomen zijn.


EDIT:
Net een extra methode gemaakt die een string als parameter heeft en een string retouneert. Die string is een vaste rekst plus de parameter. Als ik de methode aanroep via NuSoap krijg ik alleen het constante deel terug. Blijkbaar komen de parameters dus gewoon niet door.


Ik zal dit topic voortzetten onder een specifiek NuSoap topic. Zie:
[NuSoap] WCF webservice benaderen met NuSoap (PHP)

Bedankt voor al jullie adviezen.

[ Voor 19% gewijzigd door GAEvakYD op 24-01-2008 13:51 ]

Lekker duurzaam. Skoda Enyaq EV - First edtion, Alpha Innotec Brine warmtepomp (MSW2-6S), Totaal 12135 Wp aan Zonnepanelen geïnstalleerd.

Pagina: 1