2016-09-29 12 views
1

PHPを使用してExpress Checkoutを統合するにはどうすればよいですか? Paypalのドキュメントはこの件に関して非常に貧弱です。PHPとPayPal Express Checkoutの統合

+0

ここにsdkと例があります:https://developer.paypal.com/docs/classic/api/nvpsoap-sdks/ – CCamilo

答えて

2

HTMLファイル - 販売者IDを交換してください。また、私はuseraction = commitを追加して、paypalのポップアップが支払いを見直すためにサイトに戻るというメッセージではなく、payを表示するようにしました。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> 
<script src="https://www.paypalobjects.com/api/checkout.js" async></script> 

<input id="amount"> 
<button id="paypal">Pay by PayPal</i></button> 

<script> 
    window.paypalCheckoutReady = function() { 
     paypal.checkout.setup('REPLACE WITH MERCHANT ID', { 
      environment: 'sandbox', # or production 
      container: '#paypal' 
     }) 

     $('#paypal').click(function() { 
      var amount = $('#amount').val() 
      if (amount) { 
       paypal.checkout.initXO(); 

       var action = $.post('/paypal.php', {amount: amount}); 

       action.done(function (data) { 
        paypal.checkout.startFlow('https://www.paypal.com/checkoutnow?useraction=commit&token='+data.TOKEN); 
       }); 

       action.fail(function() { 
        paypal.checkout.closeFlow(); 
       }); 
      } 
      else 
       alert('Please enter an amount') 
     }) 
    } 
</script> 
</body> 
</html> 

Class.phpと - ペイパルアカウントの詳細と設定を置き換えてください - これは、PayPalのAPIを実行するためのクラスが

<?php 

class PayPal 
{ 
    private $config; 

    private $urls = array(
     "sandbox" => array(
      "api" => "https://api-3t.sandbox.paypal.com/nvp", 
      "redirect" => "https://www.sandbox.paypal.com/webscr", 
     ), 
     "live" => array(
      "api" => "https://api-3t.paypal.com/nvp", 
      "redirect" => "https://www.paypal.com/webscr", 
     ) 
    ); 

    public function __construct($config) 
    { 
     $this->config = $config; 
    } 

    public function call($options = []) 
    { 
     $options = array_merge($options, $this->config); 
     return $this->_curl($this->api_url(), $options); 
    } 

    public function redirect($response) 
    { 
     $redirect_url = sprintf("%s?cmd=_express-checkout&token=%s", $this->redirect_url(), $response["TOKEN"]); 
     header("Location: $redirect_url"); 
    } 

    private function redirect_url() 
    { 
     return $this->urls[$this->config["environment"]]["redirect"]; 
    } 

    private function api_url() 
    { 
     return $this->urls[$this->config["environment"]]["api"]; 
    } 

    private function _curl($url, $values) 
    { 
     $curl = curl_init($url); 

     $options = array(
      CURLOPT_VERBOSE => true, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_POSTFIELDS => http_build_query($values), 
      CURLOPT_CUSTOMREQUEST => "POST", 
      CURLOPT_TIMEOUT => 10, 
      //CURLOPT_SSL_VERIFYPEER => false //for dev 
     ); 

     curl_setopt_array($curl, $options); 
     $rep = curl_exec($curl); 

     parse_str($rep, $response); 
     curl_close($curl); 

     return $response; 
    } 
} 

paypal.phpを呼び出すです。また、例では、cancel.php処理するために、任意のコードが含まれていません - アクセスされたファイルをユーザーが

<?php 

include('class.php'); 

$config = array(
    "environment" => "sandbox", # or live 
    "user" => "REPLACE WITH PAYPAL USER", 
    "pwd" => "REPLACE WITH PAYPAL PASSWORD", 
    "signature" => "REPLACE WITH PAYPAL SIGNATURE", 
    "version" => 113 
); 

$paypal = new PayPal($config); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    $result = $paypal->call(array(
     'method' => 'SetExpressCheckout', 
     'paymentrequest_0_paymentaction' => 'sale', 
     'paymentrequest_0_amt' => $_POST['amount'], 
     'paymentrequest_0_currencycode' => 'USD', 
     'returnurl' => 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . 'paypal.php?amount=' . $_POST['amount'], 
     'cancelurl' => 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . 'cancel.php?amount=' . $_POST['amount'] 
    )); 
    if ($result['ACK'] == 'Success') { 
     header("Access-Control-Allow-Origin: *"); 
     header('Content-Type: application/json'); 
     echo json_encode($result); 
    } else { 
     echo 'Handle the payment creation failure <br>'; 
    } 
} else { 
    $result = $paypal->call(array(
     'method' => 'DoExpressCheckoutPayment', 
     'token' => $_GET['token'], 
     'payerid' => $_GET['PayerID'], 
     'paymentrequest_0_paymentaction' => 'sale', 
     'paymentrequest_0_amt' => $_GET['amount'], 
     'paymentrequest_0_currencycode' => 'USD' 
    )); 
    if ($result['PAYMENTINFO_0_PAYMENTSTATUS'] == 'Completed') { 

     $result = $paypal->call(array(
      'method' => 'GetExpressCheckoutDetails', 
      'token' => $_GET['token'], 
     )); 

     //$result now contains customer information 

     } else { 
     echo 'Payment error'; 
    } 
} 

幸運を支払うことなく、ポップアップを閉じたときに!

関連する問題