24 Şubat 2013 Pazar

Delphi PayPal Entegrasyonu ve Faizsiz Web Kartları


Malum PayPal web servisleri hazırladı. Bunlar için yüzlerce dökümanı sitesine koydu. Ebay ile işbirliği içinde olan PayPal'ın amacı programcılara web servisleri ile kolaylık sağlamak.  Bu yazımın girişimcilik ruhu yüksek Delphi Programcıları için faydalı olacağını düşünüyorum . Piyasaya yeni atılmış meslek erbapları, özellikle shareware mantığı ile program satmak isteyenler ya da remote worker olarak çalışmak isteyenler için kredi kartı kullanmak kaçınılmaz oldu. Çünkü sadece tüketici olarak internetten alışveriş değil, üretici olarak  e-iş yapmak için de 3D secure özelliği kredi kartları gerekiyor. Günümüzde bildiğimiz klasik faizli kredi kartları artık herkese verilmiyor ya da herkes bunları kullanmak istemiyor.  Piyasada bu açığı görmüş girişimci ruhlu bankalar piyasaya faizsiz kredi sundular.  Banklardan kredi kartı almak da zor, bu yüzden yeni piyasaya atılacak programcılara yeni çıkmış ve de pek te tanımayan, kullanıcının güvence verdiği için herkese kolaylıkla verilen faizsiz kartları tavsiye ediyorum.
Faizsiz kredi kartının temeli rehin akçesine dayanmaktadır.  Kolumuzdaki bilezik ya da yastık altındaki altının fiilen bankaya verilmesi  ya  da cebimizdeki  2.000-3.000 TL nin bankaya verilmesi karşılığında belirlenen süre içinde sadece verdiğimiz rehin akçesinin  bedeline karşı  düşen paranın kredi kartı kullanılmasıdır.  Yani bir nevi kumbarada biriktirdiğimiz parayı kendi kendimize kredi vererek internette kullanıyoruz. Bazı ülkelerde bu tip kredi kartları artık kredi kartı olmaktan çıkıp tamamen para garantisi sağladığı için  webcard  adı altında piyasaya çıkmıştır. 3D secure özelliği olan visa ve mastercard bu diğerleri de bu kart tipini destekliyor. Burada firma ismi vermem yakışık almaz ama siz googledan falan bulursunuz ve bu hizmeti verdiğini düşündüğünüz firmanın şartnamesini iyi okuyun. Darısı ülkemizdeki bankaların başına İnşaAllah..
Öncelikle Paypalda hesabınız yoksa bir paypal (merchant tüccar hesabı) hesabı açın. Paypal alışveriş ödemeleri için web servisleri kurmuş ve bunların dökümantasyonunu
http://www.x.com/ dan bulabilirsiniz. Bu siteye geliştirici olarak kayıt olun. Ve denemelerinize başlamak için öncelikle deneme hesabı almak için https://developer.paypal.com/ gidip kendinize hesab açın.
https://developer.paypal.com/cgi-bin/devscr?cmd=_login-done&login_access=0 adresinden kendinize test account ı açın. Ve bu bilgileri saklayın.

Paypal  ödemeleri kolaylaştırmak için bir takım uzaktan çağırılabilen fonksiyonlar sunmuştur. Öncelikle Paypal’ın API lerine kullanmak ve denemeler yapmak için Paypal’ın sitesinde bir hesap açmalısınız.
Program satışı dijital satışlara girdiği için Basic Digital Goods Payment sistemini seçiyoruz. Aşağıdaki adresten ilgili bilgilere ulaşabilirsiniz.

Bu adresteden yapmanız gerekenler adım adım anlatılmış.



Paypal  Geliştirici hesabıyla yapılanlara sandbox demiş. Sandbox kelimesine alışın dökümantasyonda sık sık kullanılacak.

Gelelim işin Delphi tarafına normal bir VCL projesş açın. File ->New->Other dan şekil 1 deki gibi WSDL importer seçeneğini seçin.





Gelen pencerenin .. Location of WSDL File or URLbsşlıklı yazım kutusuna şekil 2 deki gibi https://www.sandbox.paypal.com/wsdl/PayPalSvc.wsdl  yazıp çıkan pencerelerde hep “Next”  butonlarına basıp Finish butonuyla bitirin.

Ana formmuza bir HTTPRIO componenti ekliyoruz. Bir buton ekliyoruz. Butonun click eventine aşağıdaki kodları yazıyoruz.

procedure TForm5.BitBtnPayPalClick(Sender: TObject);
var
Yolla:SetExpressCheckoutReq;
mik:BasicAmountType;
Gel:String;//SetExpressCheckoutResponse;
bamtyp:BasicAmountType;
begin

(*
   When testing in the sandbox, you need to be logged in at
   https://developer.paypal.com and maintain an active session.

   Bu programı çalıştırmadan ya gerçek hesabınızla ya da aldığınız geliştirici
   hesabıyla https://developer.paypal.com adresinde sisteme login olmanız gerekiyor.
   bunu dikkat edin yoksa login olmuyor
 *)
  APIUserName:=EditUser.Text;(*
   bu bizim deneme için aldığımız  kullanıcı adınız 'paypaldenemeadresim.hotmail.com' ile
   Lütfen bunu değitirin
   *)
  APIPassword:=EditPassword.Text;// '1355702278';
  APISig:=EditSignature.Text;//'A5ukx6CEG1S67x9TjnhSTaBwirQ.A-VWD0w9qj-1zih0LLHq2uzDUMC9';
  EndPointURL:='https://api-3t.sandbox.paypal.com/2.0/';  //https://api-3t.sandbox.paypal.com/2.0/
  APIemail:=EditSeller.Text;   //Paypaladresim@gmail.com bu bizim Paypal email adresimiz
  APILocalCode:='tr_TR';
  APIDoviz:='TRY';
  //USD diğer kodLAR https://www.x.com/developers/paypal/documentation-tools/api/currency-codes SAYFASINDA
  //Buna göreDÖVİZ KODLARINI combobox a koyabilirsiniz

      HTTPRIOSetC.HTTPWebNode.UserName:=APIUserName;
      HTTPRIOSetC.HTTPWebNode.Password:=APIPassword;
      HTTPRIOSetC.URL:=EndPointURL;

 mik:=BasicAmountType.Create;


  try
   Yolla:=SetExpressCheckoutReq.Create;
   mik.CurrencyID:=CUrrencyCodeType.TRY_;
   mik.Text:='7.0';
      try
      (HTTPRIOSetC as PayPalAPIAAInterface).SetExpressCheckout(Yolla);
       except
         on E: Exception do
         showmessage('Hata Soap SetExpressCheckoutReq func. POST: ' + E.Message);
       end;

   finally
   Yolla.Free;
   end;


if TOKENReturned<>'' then begin  //başarılı dönüşte kod dolu çıkar

  shellexecute(0,'open',PWideChar('https://www.sandbox.paypal.com/webscr&cmd=_express-checkout&token='+TOKENReturned+'&useraction=continue'),
  '','',sw_maximize);

end;
end;
HTTPRIO componentinin onBeforeExecute eventine aşağıdaki kodu yazıyoruz.
Böylelikle PayPal web servisine gerekli olan bilgileri yolluyoruz.
procedure TForm5.HTTPRIOSetCBeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
  StrList1: TStringList;
begin

  StrList1 := TStringList.Create;
  try
    SOAPRequest.Position := 0;
    StrList1.LoadFromStream(SOAPRequest);
    if MethodName = 'SetExpressCheckout' then
    begin
      StrList1.Clear;
        StrList1.Add('<?xml version="1.0" encoding="UTF-8"?>');
        StrList1.Add('<SOAP-ENV:Envelope xmlns:xsi= "  http://www.w3.org/2001/XMLSchema-instance"');
                  StrList1.Add('xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"');
                  StrList1.Add('xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"');
                  StrList1.Add('xmlns:xsd="http://www.w3.org/2001/XMLSchema"');
                  StrList1.Add('SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">');

  //**************header****
      StrList1.Add('<SOAP-ENV:Header>');
                StrList1.Add('<RequesterCredentials xmlns="urn:ebay:api:PayPalAPI" xsi:type="ebl:CustomSecurityHeaderType">');
                        StrList1.Add('<Credentials xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:UserIdPasswordType">');
                                   StrList1.Add('<Username>'+APIUserName+'</Username>');
                                   StrList1.Add('<Password>'+APIPassword+'</Password>');
                                   StrList1.Add('<Signature>'+APISig+'</Signature>');
                                   StrList1.Add('<Subject>'+APIemail+'</Subject>');
                        StrList1.Add('</Credentials>');
              StrList1.Add('</RequesterCredentials>');
      StrList1.Add('</SOAP-ENV:Header>');
  //**************header****

      StrList1.Add('<SOAP-ENV:Body>');
      StrList1.Add('<SetExpressCheckoutReq xmlns="urn:ebay:api:PayPalAPI">');
            StrList1.Add('<SetExpressCheckoutRequest>');
                StrList1.Add('<Version xmlns="urn:ebay:apis:eBLBaseComponents">87.0</Version>');
                StrList1.Add('<SetExpressCheckoutRequestDetails xmlns="urn:ebay:apis:eBLBaseComponents">');

                   StrList1.Add('<ReturnURL>http://localhost/PerksXpress/Order/Summary.aspx</ReturnURL>');
                  //  Kullanıcı kullanıcı ok derse retun adresine geliyor cancel ettiğinde cancel adresine geliyor
                    StrList1.Add('<CancelURL>http://localhost/PerksXpress/Order/Details.aspx</CancelURL>');
                    StrList1.Add('<NoShipping>0</NoShipping>');
                    StrList1.Add('<LocaleCode>'+APILocalCode+'</LocaleCode>');
                    StrList1.Add('<PaymentAction>Sale</PaymentAction>');
                    StrList1.Add('<PaymentDetails>');
                  // bunu buraya ekleyince detail göstermedi  StrList1.Add('<LocaleCode>tr_TR</LocaleCode>');
                   StrList1.Add('<OrderTotal currencyID="'+APIDoviz+'">1.0</OrderTotal>');
                   StrList1.Add('<ItemTotal currencyID="'+APIDoviz+'">1.0</ItemTotal>');


      StrList1.Add('<PaymentDetailsItem> <Name>Aydiem Ticari Program</Name>');

      StrList1.Add('<Quantity>1</Quantity>');
      StrList1.Add('<Tax currencyID="'+APIDoviz+'">0.0</Tax>');
      StrList1.Add('<Amount currencyID="'+APIDoviz+'">1.0</Amount>');
      StrList1.Add('<Description>program</Description>');
      StrList1.Add('</PaymentDetailsItem>');
                         //gerekirse bu bilgilerde yollanır.
                        //StrList1.Add('<ShippingTotal currencyID="'+APIDoviz+'">0</ShippingTotal>');
                        //StrList1.Add('<HandlingTotal currencyID=""'+APIDoviz+'">1.75</HandlingTotal>');
                      //  StrList1.Add('<TaxTotal currencyID="'+APIDoviz+'">0</TaxTotal>');
                    //    StrList1.Add('<InvoiceID>00000000000000000000000000000000</InvoiceID>');
                      //  StrList1.Add('<InsuranceTotal currencyID="'+APIDoviz+'"0</InsuranceTotal>');
                      //  StrList1.Add('<ShippingDiscount currencyID=""'+APIDoviz+'">0</ShippingDiscount>');
                    StrList1.Add('</PaymentDetails>');
                StrList1.Add('</SetExpressCheckoutRequestDetails>');
            StrList1.Add('</SetExpressCheckoutRequest>');
        StrList1.Add('</SetExpressCheckoutReq>');

      StrList1.Add('</SOAP-ENV:Body>');
      StrList1.Add('</SOAP-ENV:Envelope>');

    end;

    SOAPRequest.Position := 0;
    StrList1.SaveToStream(SOAPRequest);
   // Memo2.Lines.Clear;       Memo2.Lines.AddStrings(StrList1);   Memo2.Lines.SaveToFile('soapyolla.xml');
  finally
    StrList1.Free;
  end;
end;

HTTPRIO componentinin onAfterExecute eventine aşağıdaki kodu yazıyoruz. Böylelikle Paypal servisinden gelen cevabı almış oluyoruz.
procedure TForm5.HTTPRIOSetCAfterExecute(const MethodName: string;
  SOAPResponse: TStream);
var
  StrList1: TStringList;
  AraSonuc,FailureOrSucces:AnsiString;
begin
  inherited;
  StrList1 := TStringList.Create;
  try
    SOAPResponse.Position := 0;
    StrList1.LoadFromStream(SOAPResponse);

    FailureOrSucces:=FindTagSoapStream(SOAPResponse,
   '<Ack xmlns="urn:ebay:apis:eBLBaseComponents">','</Ack>' );
     // SuccessWithWarning bu da var FailureWithWarning bu da
  if FailureOrSucces='Success' then begin
     AraSonuc:=FindTagSoapStream(SOAPResponse,
     '<Token xsi:type="ebl:ExpressCheckoutTokenType">',  //dikkaT  xsi:type="ebl:ExpressCheckoutTokenType KISIMLARI İÇİN > Lİ ifadeden sonrasını alamayı içieren bir önlem alabilrsin bı string değişirse problem olmasın
     '</Token>' );
       TOKENReturned:=AraSonuc;  //EC-0VW01016X17611820 2.EC-6MF036896Y5259617 token her seferinde değişiyor
       Edit1.Text:=TOKENReturned;
     end else Edit1.Text:='Ödeme Yapılamaz.'

 //    showMessage(TOKENReturned);
  finally
    StrList1.Free;
  end;

Function TForm5.FindTagSoapStream(const strName: TStream; tagBas: Ansistring; tagSon: Ansistring):Ansistring;
var
  fs: TStringStream;
  S,cevap: Ansistring;
  SonucBas,SonucSon,VarAy,VarOlm,jj:Longint;
begin

  try
  fs := TStringStream.Create;
  fs.LoadFromStream(strName);
    SetLength(S, fs.Size);
    fs.ReadBuffer(S[1], fs.Size);
  finally
    fs.Free;
  end;


  SonucBas:=-1;
  SonucSon:=-1;
SonucBas:=Pos(tagBas,s);
SonucSon:=Pos(tagSon,s);

cevap:=Copy(s,SonucBas+Length(tagBas), SonucSon-(SonucBas+Length(tagBas)));
//Showmessage(cevap+' '+InttoStr(SonucBas)+' '+InttoStr(SonucSon) + ' taguzun'+IntToStr(Length(tagBas)));
Result:=cevap;
end;

Paypalden hesabınıza bağış yapılmasını istiyorsanız aşağıdaki kodu kendi adresinizle değşitirip kullanın.

procedure TForm5.BtnBagisClick(Sender: TObject);
var
donationAddress:String;
begin
donationAddress :=
    'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=ayse93'+
    '%40hotmail%2ecom%2etr&item_name=Makaleler&no_shipping=0&no_note=1'+
    '&tax=0&currency_code=USD&lc=TR&bn=PP%2dDonationsBF&charset=UTF%2d8';
     ShellExecute(0,'open',PWideChar(donationAddress), NIL, NIL, SW_SHOWNORMAL);
end;
Kodlar için  (DelphiPayPal.rar) tıklayınızİnşaAllah işinize yarar. Faydalı Soru ve Yorumlarınızı bekliyorum.


4 yorum:

Sadettin POLAT dedi ki...

Yazi icin tesekkuerler. Bazi web servislerde kullanmak zorunda kaldigimiz su before Execute olayindan da kurtulsak cok guzel olacak

aysenlik dedi ki...

Kodları önce BeforeExecute kullanmadan Paypal'in API lerde tanımladığı nesnelere değer atayarak yapmaya çalıştım. Epeyce bir uğraştım fakat biz Delphicilerin sevmediği access violation hatası veriyordu. Bu yöntemle hatasız çalıştı. Aslında bu konuyu PayPal e yazsak daha iyi olacak. Siz de yazın biz de yazalım. Böylelikle PayPal bu istenen bir şey diye API lerine düzeltir.
Delphi'de yazılmış web servislerinde beforeexecuteye gerek kalmıyor. Ama bu da bir esneklik. Webe servisinin yüklü bulunduğu server linux server olabilir, web servis java da yazılmış olabilir. Yani platformlar arası olası hatayı bastırmada beforeexecute büyük nimet.

mehmet dedi ki...

çok teşekkürler, yazilarin devamını bekliyoruz :)

Fatih B. dedi ki...

Allah razı olsun. Güzel bir makale olmuş.

ALLAH GÜZEL İSİMLERİ(ESMAÜL HÜSNA) VE KAİNAT VE KORONA VİRÜSÜNÜN HAYIRLI TARAFLARI

Kuranı kerimde Bakara 180 de"En güzel isimler Allah’ındır; bu güzel isimlerle O’na dua edin, O’nun isimleri hakkında doğru inançtan sap...