Maison >cadre php >Laravel >Explication détaillée de l'accès Laravel au paiement Paypal

Explication détaillée de l'accès Laravel au paiement Paypal

藏色散人
藏色散人avant
2020-06-15 12:02:574822parcourir

PayPal

PayPal, un outil de paiement commercial international utilisé par de nombreux utilisateurs à travers le monde, peut facilement effectuer la collecte et le paiement à l'étranger ! Un compte est universel et en devenant marchand PayPal, vous pouvez accepter davantage de méthodes de paiement partout.

Téléchargez Paypal sdk

Ajoutez "paypal/rest-api-sdk-php": "1.7.4" à composer.json, comme indiqué dans l'image :

Explication détaillée de laccès Laravel au paiement Paypal

Exécutercomposer update

Enregistrer un compte développeur, créer une application de test, tester un compte

Adresse :

https://developer.paypal.com

Créer un compte test sandbox

Backend du compte (vous pouvez voir vos enregistrements de consommation) :

https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F

Créer une application

Explication détaillée de laccès Laravel au paiement Paypal

Afficher la configuration de l'application

Cliquez sur l'application créée pour afficher la configuration ID Client, Secret, qui sera utilisé ultérieurement pour l'interface de requête. Sandbox est l'environnement de test et live est la ligne

Explication détaillée de laccès Laravel au paiement Paypal

Créer un nouveau compte de test

Le montant et le mot de passe peuvent être utilisés. être défini

Explication détaillée de laccès Laravel au paiement Paypal

Code d'accès

Logique de commande

<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use PayPal\Api\Payer;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Details;
use PayPal\Api\Amount;
use PayPal\Api\Transaction;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Payment;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Exception\PayPalConnectionException;
use PayPal\Rest\ApiContext;
use PayPal\Api\PaymentExecution;
class paypalController extends Controller
{
    const clientId = &#39;xxxxxxxxx&#39;;//应用Client ID
    const clientSecret = &#39;xxxxxxxx&#39;;//Secret
    const accept_url = &#39;http://xxx.laravel.com/Api/paypal/Callback&#39;; //支付成功和取消交易的跳转地址
    const Currency = &#39;USD&#39;;//货币单位
    protected $PayPal;
    public function __construct()
    {
        $this->PayPal = new ApiContext(
            new OAuthTokenCredential(
                self::clientId,
                self::clientSecret
            )
        );
 //如果是沙盒测试环境不设置,请注释掉
//        $this->PayPal->setConfig(
//            array(
//                &#39;mode&#39; => &#39;live&#39;,
//            )
//        );
    }
    /**
     * @param
     * $product 商品
     * $price 价钱
     * $shipping 运费
     * $description 描述内容
     */
    public function pay()
    {
        $product = &#39;1123&#39;;
        $price = 1;
        $shipping = 0;
        $description = &#39;1123123&#39;;
        $paypal = $this->PayPal;
        $total = $price + $shipping;//总价
        $payer = new Payer();
        $payer->setPaymentMethod(&#39;paypal&#39;);
        $item = new Item();
        $item->setName($product)->setCurrency(self::Currency)->setQuantity(1)->setPrice($price); 
        $itemList = new ItemList();
        $itemList->setItems([$item]);
        $details = new Details();
        $details->setShipping($shipping)->setSubtotal($price);
        $amount = new Amount();
        $amount->setCurrency(self::Currency)->setTotal($total)->setDetails($details);
        $transaction = new Transaction();
        $transaction->setAmount($amount)->setItemList($itemList)->setDescription($description)->setInvoiceNumber(uniqid());
        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl(self::accept_url . &#39;?success=true&#39;)->setCancelUrl(self::accept_url . &#39;/?success=false&#39;);
        $payment = new Payment();
        $payment->setIntent(&#39;sale&#39;)->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);
        try {
            $payment->create($paypal);
        } catch (PayPalConnectionException $e) {
            echo $e->getData();
            die();
        }
        $approvalUrl = $payment->getApprovalLink();
        header("Location: {$approvalUrl}");
    }

Après avoir terminé la commande Logiquement, vous accéderez à la page de paiement Paypal. Pour la première fois, vous devez saisir le mot de passe du compte, comme indiqué sur l'image :

Explication détaillée de laccès Laravel au paiement Paypal

Entrez dans la page de paiement, sélectionnez Paiement du solde Paypal, le paiement est terminé ou la transaction est annulée, il passera automatiquement au saut que vous avez envoyé lors du passage de l'adresse de commande et transmettra deux paramètres paymentId (numéro de commande paypal) et PayerID (identifiant d'utilisateur que vous pouvez). écrivez la logique correspondante en fonction de votre logique métier. Généralement, le rappel synchrone confirme si l'utilisateur paie, et le rappel asynchrone gère la logique métier

Rappel synchrone

 /**
     * 回调
     */
    public function Callback()
    {
        $success = trim($_GET[&#39;success&#39;]);
        if ($success == &#39;false&#39; && !isset($_GET[&#39;paymentId&#39;]) && !isset($_GET[&#39;PayerID&#39;])) {
            echo &#39;取消付款&#39;;die;
        }
        $paymentId = trim($_GET[&#39;paymentId&#39;]);
        $PayerID = trim($_GET[&#39;PayerID&#39;]);
        if (!isset($success, $paymentId, $PayerID)) {
            echo &#39;支付失败&#39;;die;
        }
        if ((bool)$_GET[&#39;success&#39;] === &#39;false&#39;) {
            echo  &#39;支付失败,支付ID【&#39; . $paymentId . &#39;】,支付人ID【&#39; . $PayerID . &#39;】&#39;;die;
        }
        $payment = Payment::get($paymentId, $this->PayPal);
        $execute = new PaymentExecution();
        $execute->setPayerId($PayerID);
        try {
            $payment->execute($execute, $this->PayPal);
        } catch (Exception $e) {
            echo &#39;,支付失败,支付ID【&#39; . $paymentId . &#39;】,支付人ID【&#39; . $PayerID . &#39;】&#39;;die;
        }
        echo &#39;支付成功,支付ID【&#39; . $paymentId . &#39;】,支付人ID【&#39; . $PayerID . &#39;】&#39;;die;
    }

Rappel asynchrone

L'adresse de rappel est configurée en arrière-plan. L'adresse doit commencer par https. Le réglage met généralement un certain temps à prendre effet (j'ai postulé dans l'après-midi et il a pris effet le lendemain matin. , comme le montre l'image :

Explication détaillée de laccès Laravel au paiement Paypal

Vous pouvez vérifier de nombreux événements pour envoyer des notifications, mais le plus important est que le paiement soit effectué (Paiement vente terminé) et paiement vente remboursé

Paiement terminé

public function notify(){
        //获取回调结果
        $json_data = $this->get_JsonData();
        if(!empty($json_data)){
             Log::debug("paypal notify info:\r\n".json_encode($json_data));
        }else{
            Log::debug("paypal notify fail:参加为空");
        }
          //自己打印$json_data的值看有那些是你业务上用到的
          //比如我用到
          $data[&#39;invoice&#39;] = $json_data[&#39;resource&#39;][&#39;invoice_number&#39;];
          $data[&#39;txn_id&#39;] = $json_data[&#39;resource&#39;][&#39;id&#39;];
          $data[&#39;total&#39;] = $json_data[&#39;resource&#39;][&#39;amount&#39;][&#39;total&#39;];
          $data[&#39;status&#39;] = isset($json_data[&#39;status&#39;])?$json_data[&#39;status&#39;]:&#39;&#39;;
          $data[&#39;state&#39;] = $json_data[&#39;resource&#39;][&#39;state&#39;];
        try {
                 //处理相关业务
        } catch (\Exception $e) {
            //记录错误日志
            Log::error("paypal notify fail:".$e->getMessage());
            return "fail";
        }
        return "success";
    }
    public function get_JsonData(){
        $json = file_get_contents(&#39;php://input&#39;);
        if ($json) {
            $json = str_replace("&#39;", &#39;&#39;, $json);
            $json = json_decode($json,true);
        }
        return $json;
    }

Traitement du remboursement

public function returnMoney()
    {
        try {
            $txn_id = "xxxxxxx";  //异步加调中拿到的id
            $amt = new Amount();
            $amt->setCurrency(&#39;USD&#39;)
                ->setTotal(&#39;99&#39;);  // 退款的费用
            $refund = new Refund();
            $refund->setAmount($amt);
            $sale = new Sale();
            $sale->setId($txn_id);
            $refundedSale = $sale->refund($refund, $this->PayPal);
        } catch (\Exception $e) {
            // PayPal无效退款
            return json_decode(json_encode([&#39;message&#39; => $e->getMessage(), &#39;code&#39; => $e->getCode(), &#39;state&#39; => $e->getMessage()]));  // to object
        }
        // 退款完成
        return $refundedSale; 
    }

Afficher le flux associé

Explication détaillée de laccès Laravel au paiement Paypal

Résumé

Paypal est toujours très utile pour développer les activités de paiement à l'étranger, il prend en charge Plusieurs devises peuvent être liées à diverses cartes de crédit et cartes bancaires. L'inconvénient est qu'il n'y aura pas de techniciens Paypal pour vous contacter lors de l'accès. De toute façon, je n'ai contacté la personne chargée de la connexion Paypal qu'une fois l'accès terminé. Heureusement, l'accès n'est pas grand. en ligne. J'espère que cet article pourra vous aider. Si vous êtes intéressé par le paiement à l'étranger, vous pouvez en discuter avec moi.

Tutoriels associés recommandés : "laravel"

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