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¤cy_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:
Yazi icin tesekkuerler. Bazi web servislerde kullanmak zorunda kaldigimiz su before Execute olayindan da kurtulsak cok guzel olacak
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.
çok teşekkürler, yazilarin devamını bekliyoruz :)
Allah razı olsun. Güzel bir makale olmuş.
Yorum Gönder