PayPal 결제와 PHP 도킹에 대한 자세한 설명

藏色散人
풀어 주다: 2023-04-09 19:02:02
앞으로
4489명이 탐색했습니다.

환경 준비

  • 페이팔 계정 등록
  • 페이팔 개발자 계정 등록
  • 페이팔 샌드박스 테스트 계정 만들기
  • 페이팔 애플리케이션 만들기
  • PHP SDK 다운로드
  • 결제 구현
  • 구현 결제 성공 callback
  • 환불 실현
  • 더 많은 API 코드 템플릿

페이팔 계정 등록

  • www.paypal.com 판매자 계정 등록
  • "Create Merchant User"를 선택하고 필요에 따라 정보를 입력하세요. , 등록이 완료됩니다. 이메일 활성화

페이팔 개발자 계정 등록developer.paypal.com 이전 단계에서 등록한 계정을 사용하여 로그인하세요

    왼쪽 탐색 표시줄에서 계정을 클릭하여 생성하세요. 2개의 샌드박스 계정과 1개의 개인 계정이 결제에 사용되며, 판매자 계정(비즈니스)은 기본적으로 2개를 생성하여 계정을 생성한 후 직접 생성할 수 있습니다. 후속 테스트를 위해 현재 계정에 잔액을 추가하는 것을 잊지 마십시오.

  • 방금 만든 테스트 계정으로 샌드박스 테스트 사이트에 로그인하여 금액과 거래정보를 확인하세요 www.sandbox.paypal.comPayPal 결제와 PHP 도킹에 대한 자세한 설명

샌드박스 앱 만들기계정 기본 애플리케이션에 의해 생성됩니다. 이를 보려면 클릭하여 저장하세요. 다음 인터페이스 호출에 사용됩니다(온라인으로 전환할 때 라이브 애플리케이션을 다시 생성하세요). SDK 다운로드


  • 저는 laravel 프레임워크를 사용하고, Composer를 사용하여 페이팔 패키지를 다운로드합니다. PayPal 결제와 PHP 도킹에 대한 자세한 설명

결제를 구현합니다.
  • 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());//错误提示
      }
  }
로그인 후 복사

다음은 결제 성공을 위한 콜백 코드입니다. 의사 코드 Code

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());
      }
  }
로그인 후 복사
  • PayPal 결제와 PHP 도킹에 대한 자세한 설명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 비디오 튜토리얼

  • 위 내용은 PayPal 결제와 PHP 도킹에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    php
    원천:learnku.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿