PayPal
世界中の多くのユーザーに利用されている国際貿易決済ツールPayPalなら、海外での集金・支払いも簡単に完了できます! 1 つのアカウントはユニバーサルであり、PayPal 加盟店になることで、どこでもより多くの支払い方法を受け入れることができます。
paypal sdk のダウンロード
図に示すように、「paypal/rest-api-sdk-php」:「1.7.4」をcomposer.jsonに追加します。
composer update を実行します
開発者アカウントを登録し、テスト アプリケーション、テスト アカウントを作成します
アドレス:
https://developer.paypal.com
サンドボックス テスト アカウントの作成
アカウントの背景 (自分の使用記録を確認できます):
https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F
アプリケーションの作成
アプリケーション構成の表示
作成したアプリケーションをクリックして、構成クライアント ID、シークレットを表示します。後続のリクエスト インターフェイス、サンドボックスはテスト環境、ライブはオンライン環境です
新しいテスト アカウントを作成します
金額とパスワードを設定できます
アクセスコード
注文ロジック
<?php namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use PayPal\Api\Payer; use PayPal\Api\Item; use PayPal\Api\ItemList; use PayPal\Api\Details; use PayPal\Api\Amount; use PayPal\Api\Transaction; use PayPal\Api\RedirectUrls; use PayPal\Api\Payment; use PayPal\Auth\OAuthTokenCredential; use PayPal\Exception\PayPalConnectionException; use PayPal\Rest\ApiContext; use PayPal\Api\PaymentExecution; class paypalController extends Controller { const clientId = 'xxxxxxxxx';//应用Client ID const clientSecret = 'xxxxxxxx';//Secret const accept_url = 'http://xxx.laravel.com/Api/paypal/Callback'; //支付成功和取消交易的跳转地址 const Currency = 'USD';//货币单位 protected $PayPal; public function __construct() { $this->PayPal = new ApiContext( new OAuthTokenCredential( self::clientId, self::clientSecret ) ); //如果是沙盒测试环境不设置,请注释掉 // $this->PayPal->setConfig( // array( // 'mode' => 'live', // ) // ); } /** * @param * $product 商品 * $price 价钱 * $shipping 运费 * $description 描述内容 */ public function pay() { $product = '1123'; $price = 1; $shipping = 0; $description = '1123123'; $paypal = $this->PayPal; $total = $price + $shipping;//总价 $payer = new Payer(); $payer->setPaymentMethod('paypal'); $item = new Item(); $item->setName($product)->setCurrency(self::Currency)->setQuantity(1)->setPrice($price); $itemList = new ItemList(); $itemList->setItems([$item]); $details = new Details(); $details->setShipping($shipping)->setSubtotal($price); $amount = new Amount(); $amount->setCurrency(self::Currency)->setTotal($total)->setDetails($details); $transaction = new Transaction(); $transaction->setAmount($amount)->setItemList($itemList)->setDescription($description)->setInvoiceNumber(uniqid()); $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl(self::accept_url . '?success=true')->setCancelUrl(self::accept_url . '/?success=false'); $payment = new Payment(); $payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]); try { $payment->create($paypal); } catch (PayPalConnectionException $e) { echo $e->getData(); die(); } $approvalUrl = $payment->getApprovalLink(); header("Location: {$approvalUrl}"); }
After注文ロジックを完了すると、Paypal 支払いページにジャンプします。図に示すように、初めてアカウントのパスワードを入力する必要があります:
支払いページに入る, Paypal 残高支払いを選択すると、支払いが完了するか取引がキャンセルされ、自動的に注文にジャンプします。ジャンプアドレスを渡すと、paymentId (Paypal 注文番号) と PayerID (ユーザー ID) の 2 つのパラメータが渡されます。ビジネス ロジックに応じて、対応するロジックを作成できます。一般に、同期コールバックはユーザーが支払うかどうかを確認し、非同期コールバックはビジネス ロジックを処理します。
同期コールバック
/** * 回调 */ public function Callback() { $success = trim($_GET['success']); if ($success == 'false' && !isset($_GET['paymentId']) && !isset($_GET['PayerID'])) { echo '取消付款';die; } $paymentId = trim($_GET['paymentId']); $PayerID = trim($_GET['PayerID']); if (!isset($success, $paymentId, $PayerID)) { echo '支付失败';die; } if ((bool)$_GET['success'] === 'false') { echo '支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; } $payment = Payment::get($paymentId, $this->PayPal); $execute = new PaymentExecution(); $execute->setPayerId($PayerID); try { $payment->execute($execute, $this->PayPal); } catch (Exception $e) { echo ',支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; } echo '支付成功,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; }
非同期コールバック
コールバックアドレスはバックグラウンドで設定されています。アドレスはhttpsで始まる必要があります。設定は通常完了しています。有効になるまでに時間がかかります(午後に申請しました)次の図に示すように、翌朝に有効になりました。
通知を送信するために多くのイベントを確認できますが、最も重要なことは、販売が完了して支払いが完了したことです。セールの返金
支払い完了
public function notify(){ //获取回调结果 $json_data = $this->get_JsonData(); if(!empty($json_data)){ Log::debug("paypal notify info:\r\n".json_encode($json_data)); }else{ Log::debug("paypal notify fail:参加为空"); } //自己打印$json_data的值看有那些是你业务上用到的 //比如我用到 $data['invoice'] = $json_data['resource']['invoice_number']; $data['txn_id'] = $json_data['resource']['id']; $data['total'] = $json_data['resource']['amount']['total']; $data['status'] = isset($json_data['status'])?$json_data['status']:''; $data['state'] = $json_data['resource']['state']; try { //处理相关业务 } catch (\Exception $e) { //记录错误日志 Log::error("paypal notify fail:".$e->getMessage()); return "fail"; } return "success"; } public function get_JsonData(){ $json = file_get_contents('php://input'); if ($json) { $json = str_replace("'", '', $json); $json = json_decode($json,true); } return $json; }
返金処理中
public function returnMoney() { try { $txn_id = "xxxxxxx"; //异步加调中拿到的id $amt = new Amount(); $amt->setCurrency('USD') ->setTotal('99'); // 退款的费用 $refund = new Refund(); $refund->setAmount($amt); $sale = new Sale(); $sale->setId($txn_id); $refundedSale = $sale->refund($refund, $this->PayPal); } catch (\Exception $e) { // PayPal无效退款 return json_decode(json_encode(['message' => $e->getMessage(), 'code' => $e->getCode(), 'state' => $e->getMessage()])); // to object } // 退款完成 return $refundedSale; }
関連フローを見る
##概要
Paypal は海外決済ビジネスの拡大に依然として非常に役立ちます。複数の通貨をサポートしており、さまざまなクレジット カードや銀行にバインドできるので便利です。欠点は、接続時に Paypal の技術者がいないことです。とにかく、Paypal の接続担当者に連絡したのは、接続が完了した後でした。幸いなことに、アクセスは難しくなく、オンラインでの情報が豊富にあります海外決済にご興味がございましたら、ぜひご相談ください。 関連チュートリアルの推奨事項: "以上がLaravelによるPayPal支払いへのアクセスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。