Sample code for 30+ languages & platforms
Delphi ActiveX Requires Chilkat v11.0.0+

PayPal: Start a PayPal wallet checkout

See more PayPal Examples

Buyer interaction. Your application uses a browser for buyer approval or authentication when PayPal requests it. Configure the merchant return and cancel URLs for this flow.

Create a USD 30 digital order from a trusted cart. Store the order ID and redirect the buyer to the payer-action link. After approval, capture this same order from your merchant application.

PayPal documentation

Chilkat Delphi ActiveX Downloads

Delphi ActiveX
var
success: Integer;
http: TChilkatHttp;
resp: TChilkatHttpResponse;
crypt: TChilkatCrypt2;
requestId: WideString;
body: TChilkatJsonObject;
errorInfo: TChilkatJsonObject;
result: TChilkatJsonObject;
parsed: Integer;
linkIndex: Integer;

begin
success := 0;

//  See Unlock Chilkat before making requests.
//  For the merchant's internal backoffice application. Load the sandbox token
//  from the merchant's credential store. Keep it out of publicly distributed apps.
//  See Get a PayPal access token.
http := TChilkatHttp.Create(Self);
http.AuthToken := 'SANDBOX_ACCESS_TOKEN';
resp := TChilkatHttpResponse.Create(Self);

//  Replace the two callback URLs with routes on your site. This order contains no
//  physical shipment.
//  Create and persist this key once per business operation. On a timeout,
//  retry the same request with its saved key, not a newly generated one.
crypt := TChilkatCrypt2.Create(Self);
requestId := crypt.GenerateUuid();
http.SetRequestHeader('PayPal-Request-Id',requestId);
http.SetRequestHeader('Prefer','return=representation');
body := TChilkatJsonObject.Create(Self);
body.UpdateString('intent','CAPTURE');
body.UpdateString('purchase_units[0].amount.currency_code','USD');
body.UpdateString('purchase_units[0].amount.value','30.00');
body.UpdateString('payment_source.paypal.experience_context.return_url','https://merchant.example/paypal/return');
body.UpdateString('payment_source.paypal.experience_context.cancel_url','https://merchant.example/paypal/cancel');
body.UpdateString('payment_source.paypal.experience_context.shipping_preference','NO_SHIPPING');

success := http.HttpJson('POST','https://api-m.sandbox.paypal.com/v2/checkout/orders',body.ControlInterface,'application/json',resp.ControlInterface);
if (success <> 1) then
  begin
    Memo1.Lines.Add('No HTTP response: ' + http.LastErrorText);
    Exit;
  end;
if ((resp.StatusCode < 200) or (resp.StatusCode >= 300)) then
  begin
    errorInfo := TChilkatJsonObject.Create(Self);
    errorInfo.Load(resp.BodyStr);
    Memo1.Lines.Add('HTTP ' + IntToStr(resp.StatusCode) + ' ' + errorInfo.StringOf('name') + ' ' + errorInfo.StringOf('details[0].issue'));
    Memo1.Lines.Add('PayPal debug ID: ' + errorInfo.StringOf('debug_id'));
    Exit;
  end;

result := TChilkatJsonObject.Create(Self);
parsed := result.Load(resp.BodyStr);
if (parsed <> 1) then
  begin
    Memo1.Lines.Add('Expected a JSON response; HTTP ' + IntToStr(resp.StatusCode));
    Exit;
  end;
Memo1.Lines.Add('ID: ' + result.StringOf('id'));
Memo1.Lines.Add('Status: ' + result.StringOf('status'));
//  Link order is not fixed. Send the buyer to the matching URL in a browser.
linkIndex := 0;
while (linkIndex < result.SizeOfArray('links')) do
  begin
    result.I := linkIndex;
    if (result.StringOfEquals('links[i].rel','payer-action',1)) then
      begin
        Memo1.Lines.Add('Approval URL: ' + result.StringOf('links[i].href'));
      end;
    linkIndex := linkIndex + 1;
  end;