ホームページ  >  記事  >  バックエンド開発  >  PHPとPayPal決済のドッキングについて詳しく解説

PHPとPayPal決済のドッキングについて詳しく解説

藏色散人
藏色散人転載
2021-03-02 15:34:044482ブラウズ

環境準備

  • paypalアカウントの登録
  • paypal開発者アカウントの登録
  • paypalサンドボックステストアカウントの作成
  • Paypal アプリケーションの作成
  • PHP SDK のダウンロード
  • 支払いの実現
  • 支払い成功コールバックの実現
  • 返金の実現
  • その他の API コード テンプレート

paypal アカウントの登録

  • www.paypal.com 販売者アカウントの登録
  • 「販売者ユーザーの作成」を選択し、必要に応じて情報を入力し、登録後に有効化するためにメールアドレスに移動します。

Paypal 開発者アカウントを登録します

  • developer.paypal.com 前の手順で登録したアカウントを使用してログインします。
  • 左側のナビゲーション バーで [アカウント] をクリックして、2 つのサンドボックス アカウントと個人アカウント (個人) を作成します。支払いの場合、支払いの回収には販売アカウント (ビジネス) が使用されます。システムはデフォルトで 2 つ作成します。記憶を容易にするために、自分で 1 つ作成することを選択できます。アカウントを作成した後、現在のアカウントに残高を追加することを忘れないでください。その後のテスト。
    PHPとPayPal決済のドッキングについて詳しく解説
  • 作成したテスト アカウントを使用してサンドボックス テスト サイトにログインし、金額と取引情報を表示します www.sandbox.paypal.com

##サンドボックス アプリケーション APP の作成

    アカウントにはデフォルトで作成されたデフォルト アプリケーションがあります。クリックして表示し、ClientId と Secret を取得します。保存して使用します。後続のインターフェイス呼び出し; (オンラインになるときにライブ アプリケーションを再作成してください)

  • PHPとPayPal決済のドッキングについて詳しく解説

#SDK のダウンロード

私はlaravelフレームワークを使用し、composerを使用してpaypalパッケージをダウンロードします
  • composer require paypal/rest-api-sdk-php

実装支払い

##次は、支払いを生成するためのコード スニペット、疑似コードです。
    function createPayPal(){
          $shippingPrice = 2;
          $taxPrice = 0;
          $subTotal = 26;
          $item1 = new PayPal\Api\Item();
          $item1->setName("产品2")->setCurrency("USD")->setQuantity(1)->setPrice(10);
          $item2 = new PayPal\Api\Item();
          $item2->setName("产品1")->setCurrency("USD")->setQuantity(2)->setPrice(8);
    
          $itemList = new PayPal\Api\ItemList();
          $itemList->addItems([$item1,$item2]);
    
          // Set payment details
          $details = new PayPal\Api\Details();
          $details->setShipping($shippingPrice)->setTax($taxPrice)->setSubtotal($subTotal);
    
          // Set payment amount
          //注意,此处的subtotal,必须是产品数*产品价格,所有值必须是正确的,否则会报错
          $total = $shippingPrice + $subTotal + $taxPrice;
          $amount = new PayPal\Api\Amount();
          $amount->setCurrency("USD")->setTotal($total)->setDetails($details);
    
          // Set transaction object
          $transaction = new PayPal\Api\Transaction();
          $transaction->setAmount($amount)->setItemList($itemList)->setDescription("这是交易描述")
              ->setInvoiceNumber(uniqid());//setInvoiceNumber为支付唯一标识符,在使用时建议改成订单号
    
          $payer = new PayPal\Api\Payer();
          $payer->setPaymentMethod('paypal');//["credit_card", "paypal"]
          $redirectUrls = new PayPal\Api\RedirectUrls();
          $redirectUrl = "http://test.com/redirect/success";//支付成功跳转的回调
          $cancelUrl = "http://test.com/redirect/cancel";//取消支付的回调
          $redirectUrls->setReturnUrl($redirectUrl)->setCancelUrl($cancelUrl);
    
          // Create the full payment object
          $payment = new PayPal\Api\Payment();
          $payment->setIntent("sale")->setPayer($payer)->setRedirectUrls($redirectUrls)->addTransaction($transaction);
    
          try {
              $clientId = "xxxxxx";//上面应用的clientId和secret
              $secret = "XXXXXX";
              $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
              $apiContext =  new \PayPal\Rest\ApiContext($oAuth);
              if(env('APP_DEBUG') === false ){
                  $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox
              }
              $payment->create($apiContext);
              $approvalUrl = $payment->getApprovalLink();
              dd($approvalUrl);//这个是请求支付的链接,在浏览器中请求此链接就会跳转到支付页面
          } catch (\Exception $e) {
              dd($e->getMessage());//错误提示
          }
      }
  • PHPとPayPal決済のドッキングについて詳しく解説

    以下は、支払いが成功した場合のコールバック コード スニペット、疑似コードです。
  • #
    function payRedirect(Request $request)
      {
          $paymentID = $request->get('paymentId');
          $payerId = $request->get('PayerID');
    
          $clientId = "xxxxxx";//上面应用的clientId和secret
          $secret = "XXXXXX";
          $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
          $apiContext =  new \PayPal\Rest\ApiContext($oAuth);       
          if(env('APP_DEBUG') === false ){
              $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox
          }
          $payment = \PayPal\Api\Payment::get($paymentID, $apiContext);
    
          $execute = new \PayPal\Api\PaymentExecution();
          $execute->setPayerId($payerId);
    
          try{
              $payment = $payment->execute($execute, $apiContext);//执行,从paypal获取支付结果
              $paymentState = $payment->getState();//Possible values: created, approved, failed.
              $invoiceNum = $payment->getTransactions()[0]->getInvoiceNumber();
              $payNum = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getId();//这是支付的流水单号,必须保存,在退款时会使用到
              $total = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getAmount()->getTotal();//支付总金额
              $transactionState = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getState();//Possible values: completed, partially_refunded, pending, refunded, denied.
    
              if($paymentState == 'approved' && $transactionState == 'completed'){
                  //处理成功的逻辑,例如:判断支付金额与订单金额,更新订单状态等
                  return "success";//返回成功标识
              }else{
                  //paypal回调错误,paypal状态不正确
                  return "error";//返回错误标识
              }
          }catch(\Exception $e){
              dd($e->getMessage());
          }
      }
  • #Refund

    返金 正常にお支払いするには伝票番号が必要です

    • 1 つの伝票番号を複数の返金に使用できます

    • 返金成功後、口座番号は取引記録に反映されません。テスト中はテスト口座にログインし、残高の変化をご自身で記録して返金が成功したかどうかをご確認ください。

    • 販売アカウントの残高が減り、手数料 (処理手数料) が増加します (以前の支払いで手数料が過大請求されました)。ユーザー アカウントの残高は増加します

      function refundOrder()
        {
            try{
                $refundRequest = new \PayPal\Api\RefundRequest();
                $amount = new \PayPal\Api\Amount();
                $amount->setCurrency("USD")->setTotal(10);//退总金额
                $refundRequest->setAmount($amount);
                $refundRequest->setDescription("退款测试");
                $sale = new \PayPal\Api\Sale();
                $sale->setId("XXXXXXXXX");//支付单号,支付成功时保存的支付流水单号
                $clientId = "xxxxxx";//上面应用的clientId和secret
                $secret = "XXXXXX";
                $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
                $apiContext =  new \PayPal\Rest\ApiContext($oAuth);
                if(env('APP_DEBUG') === false ){
                    $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox
                }
                $detailedRefund = $sale->refundSale($refundRequest, $apiContext);//调接口
                $refundState = $detailedRefund->getState();//Possible values: pending, completed, cancelled, failed.
      
                //var_dump($refundedSale);
                if($refundState == 'completed'){
                    //退款成功,返回
                }else{
                    dd('paypal 退款失败, 状态不正确');
                }
            }catch (\Exception $exception){
                dd($exception->getMessage());//发生异常
            }
        }
    • その他のインターフェイス コード例

      http://paypal.github.io/PayPal-PHP-SDK/sample/

    • 推奨: 「

      PHP ビデオ チュートリアル

    以上がPHPとPayPal決済のドッキングについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。