Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon de connecter PHP au paiement Paypal

Explication détaillée de la façon de connecter PHP au paiement Paypal

藏色散人
藏色散人avant
2020-10-30 15:05:038840parcourir

Recommandé : "Tutoriel vidéo PHP"

Préparation de l'environnement

  • Enregistrer un compte Paypal
  • Enregistrer un compte développeur Paypal
  • Créer un compte test Paypal sandbox
  • Créer une application Paypal
  • Télécharger le SDK PHP
  • Réaliser le paiement
  • Réaliser le rappel de réussite du paiement
  • Réaliser le remboursement
  • Plus de modèles de code API

Enregistrez un compte Paypal

  • www.paypal.com Enregistrez un compte marchand
  • Sélectionnez "Créer un utilisateur marchand", remplissez les informations requises et accédez à votre email pour l'activer après l'inscription

Enregistrer un compte développeur paypal

  • developer.paypal.com Connectez-vous en utilisant le compte enregistré à l'étape précédente
  • Cliquez sur Comptes dans la barre de navigation de gauche et créez deux comptes sandbox, un compte personnel (personnel) pour le paiement et un compte marchand (professionnel) pour l'encaissement. Le système en a créé deux par défaut. . Vous pouvez choisir d'en créer un vous-même. Facile à retenir ; après avoir créé un compte, pensez à ajouter un solde au compte courant pour des tests ultérieurs.
    Explication détaillée de la façon de connecter PHP au paiement Paypal
  • Utilisez le compte test que vous venez de créer pour vous connecter au site de test sandbox et afficher le montant et les informations de transaction www.sandbox.paypal.com

Créer une application sandbox

  • Une application par défaut est créée par défaut pour le compte Cliquez pour afficher pour obtenir le ClientId et le Secret, enregistrez-les ; utilisez-les lors des appels d'interface ultérieurs ; (Veuillez recréer une application Live lorsque vous vous connectez)
    Explication détaillée de la façon de connecter PHP au paiement Paypal

Téléchargez le SDK

  • Pour mon propre usage du framework Laravel, utilisez composer pour télécharger le package paypal
  • composer require paypal/rest-api-sdk-php

pour mettre en œuvre le paiement

  • Ce qui suit est un extrait de code pour générer le paiement, pseudocode

    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());//错误提示
          }
      }

    Explication détaillée de la façon de connecter PHP au paiement Paypal

  • Ce qui suit est un extrait de code de rappel pour un paiement réussi, pseudocode

    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());
          }
      }

Remboursement

  • Le remboursement doit avoir un numéro de bulletin de versement réussi

  • Un numéro de série peut être utilisé pour plusieurs remboursements

  • Après un remboursement réussi, il ne sera pas reflété dans l'enregistrement des transactions du compte. Veuillez vous connecter au compte test lors du test. Enregistrez les modifications du solde pour déterminer si le remboursement est réussi

  • Le compte marchand réduira le montant. solde et augmenter les frais de traitement (les frais de traitement sont le supplément du paiement précédent), et le compte utilisateur augmentera le solde

    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());//发生异常
          }
      }

    Plus d'exemples de code d'interface

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer