>  기사  >  백엔드 개발  >  PHP를 PayPal 결제에 연결하는 방법에 대한 자세한 설명

PHP를 PayPal 결제에 연결하는 방법에 대한 자세한 설명

藏色散人
藏色散人앞으로
2020-10-30 15:05:038753검색

추천: "PHP 비디오 튜토리얼"

환경 준비

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

페이팔 계정 등록

  • www.paypal.com 판매자 계정 등록
  • 선택, "생성" " "가맹점 사용자" 필수 정보를 입력하고 등록 후 이메일로 가서 활성화

페이팔 개발자 계정을 등록하세요

  • developer.paypal.com 이전에 등록한 계정을 사용하세요 로그인 단계
  • 왼쪽 내비게이션 바 계정을 클릭하고 샌드박스 계정 2개를 생성하세요. 결제용 개인 계정(개인)과 수집용 판매자 계정(비즈니스)이 기본적으로 2개 생성됩니다. 쉽게 기억할 수 있도록 계정을 만들고, 다음 테스트를 위해 현재 계정에 잔액을 추가하세요.
    PHP를 PayPal 결제에 연결하는 방법에 대한 자세한 설명
  • 방금 만든 테스트 계정으로 샌드박스 테스트 사이트에 로그인하여 금액과 거래정보를 확인하세요 www.sandbox.paypal.com

샌드박스 앱 만들기

  • 계정 기본 애플리케이션에 의해 생성됩니다. 이를 보려면 클릭하여 저장하세요. 다음 인터페이스 호출에 사용됩니다(온라인으로 전환할 때 라이브 애플리케이션을 다시 생성하세요). SDK 다운로드
    PHP를 PayPal 결제에 연결하는 방법에 대한 자세한 설명
저는 laravel 프레임워크를 사용하고, Composer를 사용하여 페이팔 패키지를 다운로드합니다.

  • 결제를 구현합니다.
  • 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());
          }
      }

    PHP를 PayPal 결제에 연결하는 방법에 대한 자세한 설명

  • 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제