Explication détaillée de l'amarrage PHP avec paiement PayPal

藏色散人
Libérer: 2023-04-09 19:02:02
avant
4485 Les gens l'ont consulté

Préparation de l'environnement

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

Enregistrer un compte Paypal

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

Enregistrer un développeur Paypal compte

  • 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 pour créer deux comptes sandbox et un compte personnel (personnel) pour le paiement, un compte marchand (professionnel) est utilisé pour encaisser les paiements. Le système en a créé deux par défaut. Vous pouvez choisir d'en créer un par vous-même pour faciliter la mémoire après avoir créé le compte, pensez à ajouter un solde au compte. compte courant pour des tests ultérieurs.
    Explication détaillée de lamarrage PHP avec 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 lamarrage PHP avec 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());//错误提示
          }
      }
    Copier après la connexion

    Explication détaillée de lamarrage PHP avec 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());
          }
      }
    Copier après la connexion

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());//发生异常
          }
      }
    Copier après la connexion

    Plus d'exemples de code d'interface

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

Recommandé : "Tutoriel vidéo PHP"

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!

Étiquettes associées:
php
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal