Heim >Backend-Entwicklung >PHP-Tutorial >So implementieren Sie die Funktion für wiederkehrende Abzüge (Abonnement) in Paypal

So implementieren Sie die Funktion für wiederkehrende Abzüge (Abonnement) in Paypal

墨辰丷
墨辰丷Original
2018-05-24 16:18:482105Durchsuche

In diesem Artikel werden hauptsächlich die Ideen und Methoden von Paypal zur Implementierung wiederkehrender Abzüge (Abonnements) vorgestellt. Außerdem wird die Verwendung der Zahlungsschnittstelle von Paypal zusammengefasst, die einen guten Referenzwert hat.

Ursache

Das Unternehmen muss Paypal integrieren, um die wiederkehrende Abzugsfunktion zu realisieren. Baidu und GOOGLE haben sich jedoch umgesehen und außer der offiziellen Website keine relevanten Entwicklungs-Tutorials gefunden. Also musste ich mir Paypal ansehen, die erfolgreiche Integration dauerte zwei Tage. Hier ist eine Zusammenfassung, wie man die Zahlungsschnittstelle von Paypal nutzt.

Paypal hat jetzt mehrere Sockets:

  • Express Checkout wird über Braintree implementiert (wir werden später über Braintree sprechen); >

  • Erstellen Sie eine App über die Schnittstelle von REST Api (die aktuelle Mainstream-Schnittstelle);
  • Die Schnittstelle von NVP/SOAP-API-Apps (alte Schnittstelle);
Braintree-Schnittstelle

Braintree ist ein von Paypal übernommenes Unternehmen. Neben der Unterstützung von Paypal-Zahlungen bietet es auch Upgrade-Pläne, Kreditkarten und Kundeninformationen. usw. Eine vollständige Verwaltungsreihe, die bequemer zu verwenden ist. Der zweite Satz der REST-Schnittstelle von Paypal integriert tatsächlich die meisten dieser Funktionen, aber das Dashboard von Paypal kann diese Informationen nicht direkt verwalten, Braintree jedoch schon, daher bevorzuge ich die Verwendung von Braintree. Der Schlüssel liegt darin, dass das Backend-Framework, das ich verwende, Laravel ist und dessen Kassenlösung standardmäßig Braintee unterstützt, daher ist dieser Satz von Schnittstellen meine erste Wahl. Doch als ich alle Funktionen implementiert hatte, stieß ich auf ein schmerzhaftes Problem: Braintree wird in China nicht unterstützt. . . . . . Tod. . .

REST API

Dies ist ein Produkt, das sich an die Entwicklung der Zeit anpasst. Wenn Sie bereits OAuth 2.0 und REST API verwendet haben, sollte es keine Verwirrung geben Blick auf diese Schnittstellen.

Alte Schnittstelle

Solange die REST-API-Schnittstelle die Anforderungen, wie z. B. Richtlinieneinschränkungen, nicht erfüllen kann, wird ihre Verwendung nicht empfohlen. Die ganze Welt migriert auf die Authentifizierungsmethode OAuth 2.0 und die API-Nutzungsmethode der REST-API. Warum also gegen den Trend vorgehen? Wenn die REST-API das Problem lösen kann, habe ich daher keinen detaillierten Vergleich dieser Schnittstellen durchgeführt.

Einführung in die REST-API

Offizielles API-Referenzdokument https://developer.paypal.com/webapps/developer/docs/api/ für seine API und Verwendung Die Methode wird detaillierter vorgestellt, aber es ist immer noch sehr umständlich, diese APIs direkt anzupassen. Gleichzeitig möchten wir nur die Geschäftsanforderungen so schnell wie möglich erfüllen, anstatt uns eingehend mit der API zu befassen.

Wie fängt man also an? Es wird empfohlen, das offiziell bereitgestellte PayPal-PHP-SDK direkt zu installieren und dessen Wiki als Ausgangspunkt zu verwenden.

Bevor Sie das erste Beispiel ausfüllen, stellen Sie bitte sicher, dass Sie über ein Sandbox-Konto verfügen und dieses richtig konfigurieren:

    Client-ID
  • Client-Geheimnis
  • Webhook-API (muss mit https beginnen und Port 443 sein, lokales Debuggen wird empfohlen, um den Ngrok-Reverse-Proxy zum Generieren der Adresse zu verwenden)
  • Returnurl (Hinweise sind die gleichen wie oben)
  • Nachdem Sie das erste Beispiel im Wiki ausgefüllt haben, hilft Ihnen das Verständnis der Klassifizierung von Schnittstellen dabei, Ihre Geschäftsanforderungen zu erfüllen Klassifizierung unten. Bitte verstehen Sie http://paypal.github.io/PayPal-PHP-SDK/sample/#zahlungen mit Beispielen.

  • Zahlungen Einmalige Zahlungsschnittstelle, unterstützt keine wiederkehrenden Spenden. Zu den wichtigsten Zahlungsinhalten gehören die Unterstützung von Paypal-Zahlungen, Kreditkartenzahlungen und die Unterstützung durch gespeicherte Kreditkarten (erfordert die Verwendung der Vault-Schnittstelle, eine solche Schnittstelle ist hauptsächlich auf PCI-Anforderungen zurückzuführen, allgemeine Websites dürfen keine vertraulichen Kreditkarteninformationen sammeln), und unterstützt die Zahlung an Dritte.

  • Auszahlungen Nicht verwendet, ignorieren;

  • Autorisierung und Capture unterstützt die direkte Anmeldung auf Ihrer Website über Ihr Paypal-Konto und erhält relevante Informationen

  • Sale Follow Relevant zum Einkaufszentrum, nicht genutzt, ignorieren;

  • Bestellen Relevant für das Einkaufszentrum, nicht genutzt, ignoriert;

  • Abrechnungsplan und -vereinbarungen Upgrade-Pläne und Verträge, also Abonnementfunktionen, müssen Sie die Funktionen hier nutzen, um wiederkehrende Abzüge zu erzielen, was hier im Mittelpunkt steht Artikel;

  • TresorKreditkarteninformationen speichern

  • Zahlung Erfahrung Nicht verwendet, ignorieren; Wichtig, aber nicht der Schwerpunkt dieses Artikels

  • Rechnung Rechnungsverarbeitung; Identität

  • Authentifizierungsverarbeitung, Realisierung der OAuth 2.0-Anmeldung und Erhalt des entsprechenden Tokens zum Anfordern anderer APIs bereits implementiert und wird in diesem Artikel nicht behandelt.
  • So implementieren Sie wiederkehrende Abzüge

  • Vier Schritte:
  • Erstellen Sie einen Upgrade-Plan und aktivieren;

  • Erstellen Sie ein Abonnement (Vereinbarung erstellen) und gehen Sie dann zur Paypal-Website, um auf die Zustimmung des Benutzers zu warten.

  • Nachdem der Benutzer zugestimmt hat, führen Sie das Abonnement aus

  • Lastschriftabrechnung erhalten

  • 1. Erstellen Sie einen Upgrade-Plan

    Upgrade-Plan Entspricht der Plan-Klasse. In diesem Schritt sind mehrere Punkte zu beachten:

    • Nachdem der Upgrade-Plan erstellt wurde, befindet er sich im Status ERSTELLT und muss in AKTIV geändert werden, bevor er normal verwendet werden kann.

    • Der Plan verfügt über zwei Objekte, PaymentDefinition und MerchantPreferences, die beide nicht leer sein dürfen.

    • Wenn Sie einen Plan vom Typ TRIAL erstellen möchten, Der Plan muss auch eine passende REGULAR-Zahlungsdefinition haben, andernfalls wird ein Fehler gemeldet.

    • Wenn man sich den Code ansieht, wird eine setSetupFee-Methode (sehr, sehr, sehr wichtig) aufgerufen, die legt die Gebühr für die erste Abbuchung danach fest, während die wiederkehrende Abzugsmethode des Vertragsobjekts die Gebühr zu Beginn der zweiten Abbuchung festlegt.

    Nehmen Sie als Beispiel die Erstellung eines Standardplans. Seine Parameter lauten wie folgt:

    $param = [
     "name" => "standard_monthly",
     "display_name" => "Standard Plan",
     "desc" => "standard Plan for one month",
     "type" => "REGULAR",
     "frequency" => "MONTH",
     "frequency_interval" => 1,
     "cycles" => 0,
     "amount" => 20,
     "currency" => "USD"
     ];

    Der zu erstellende Code und aktivieren Sie den Plan wie folgt:

     //上面的$param例子是个数组,我的实际应用传入的实际是个对象,用户理解下就好。
     public function createPlan($param)
     {
     $apiContext = $this->getApiContext();
     $plan = new Plan();
     // # Basic Information
     // Fill up the basic information that is required for the plan
     $plan->setName($param->name)
     ->setDescription($param->desc)
     ->setType('INFINITE');//例子总是设置为无限循环
     // # Payment definitions for this billing plan.
     $paymentDefinition = new PaymentDefinition();
     // The possible values for such setters are mentioned in the setter method documentation.
     // Just open the class file. e.g. lib/PayPal/Api/PaymentDefinition.php and look for setFrequency method.
     // You should be able to see the acceptable values in the comments.
     $paymentDefinition->setName($param->name)
     ->setType($param->type)
     ->setFrequency($param->frequency)
     ->setFrequencyInterval((string)$param->frequency_interval)
     ->setCycles((string)$param->cycles)
     ->setAmount(new Currency(array('value' => $param->amount, 'currency' => $param->currency)));
     // Charge Models
     $chargeModel = new ChargeModel();
     $chargeModel->setType('TAX')
     ->setAmount(new Currency(array('value' => 0, 'currency' => $param->currency)));
     $returnUrl = config('payment.returnurl');
     $merchantPreferences = new MerchantPreferences();
     $merchantPreferences->setReturnUrl("$returnUrl?success=true")
     ->setCancelUrl("$returnUrl?success=false")
     ->setAutoBillAmount("yes")
     ->setInitialFailAmountAction("CONTINUE")
     ->setMaxFailAttempts("0")
     ->setSetupFee(new Currency(array('value' => $param->amount, 'currency' => 'USD')));
     $plan->setPaymentDefinitions(array($paymentDefinition));
     $plan->setMerchantPreferences($merchantPreferences);
     // For Sample Purposes Only.
     $request = clone $plan;
     // ### Create Plan
     try {
     $output = $plan->create($apiContext);
     } catch (Exception $ex) {
     return false;
     }
     $patch = new Patch();
     $value = new PayPalModel('{"state":"ACTIVE"}');
     $patch->setOp('replace')
     ->setPath('/')
     ->setValue($value);
     $patchRequest = new PatchRequest();
     $patchRequest->addPatch($patch);
     $output->update($patchRequest, $apiContext);
     return $output;
     }

    2. Erstellen Sie ein Abonnement (Erstellen Sie eine Vereinbarung) und gehen Sie dann zur Paypal-Website Warten Sie auf die Zustimmung des Benutzers

    Wie können Sie Benutzer nach der Erstellung des Plans abonnieren? In Bezug auf die Vereinbarung sind folgende Punkte zu beachten:

    • Wie bereits erwähnt, legt die Methode setSetupFee des Objekts Plan die Gebühr für den ersten Abzug nach Abschluss des Abonnements fest, während die Methode des zyklischen Abzugs des Objekts Agreement die Gebühr für den zweiten festlegt Start.

    • Die setStartDate-Methode legt die Zeit für den zweiten Abzug fest. Wenn Sie also monatlich wechseln, sollte es sich um die aktuelle Zeit plus einen Monat handeln. Gleichzeitig erfordert diese Methode Dass das Zeitformat das ISO8601-Format ist, kann mit der Carbon-Bibliothek leicht gelöst werden.

    • Bei der Erstellung der Vereinbarung war die eindeutige ID noch nicht generiert, daher stieß ich auf eine kleine Schwierigkeit: Wenn also der Benutzer das Abonnement abschließt, woher weiß ich, zu welchem ​​Benutzer dieses Abonnement gehört? Das Token in der URL, das über die getApprovalLink-Methode von Agreement erhalten wird, ist eindeutig. Ich extrahiere das Token als Identifikationsmethode und ersetze es durch die echte ID, nachdem der Benutzer das Abonnement abgeschlossen hat.

    Die Beispielparameter lauten wie folgt:

    $param = [
     'id' => 'P-26T36113JT475352643KGIHY',//上一步创建Plan时生成的ID
     'name' => 'Standard', 
     'desc' => 'Standard Plan for one month'
    ];

    Der Code lautet wie folgt:

     public function createPayment($param)
     {
     $apiContext = $this->getApiContext();
     $agreement = new Agreement();
     $agreement->setName($param['name'])
     ->setDescription($param['desc'])
     ->setStartDate(Carbon::now()->addMonths(1)->toIso8601String());
     // Add Plan ID
     // Please note that the plan Id should be only set in this case.
     $plan = new Plan();
     $plan->setId($param['id']);
     $agreement->setPlan($plan);
     // Add Payer
     $payer = new Payer();
     $payer->setPaymentMethod('paypal');
     $agreement->setPayer($payer);
     // For Sample Purposes Only.
     $request = clone $agreement;
     // ### Create Agreement
     try {
     // Please note that as the agreement has not yet activated, we wont be receiving the ID just yet.
     $agreement = $agreement->create($apiContext);
     // ### Get redirect url
     // The API response provides the url that you must redirect
     // the buyer to. Retrieve the url from the $agreement->getApprovalLink()
     // method
     $approvalUrl = $agreement->getApprovalLink();
     } catch (Exception $ex) {
     return "create payment failed, please retry or contact the merchant.";
     }
     return $approvalUrl;//跳转到$approvalUrl,等待用户同意
     }

    Nachdem die Funktion ausgeführt wurde, wird $approvalUrl zurückgegeben. Denken Sie daran, über Redirect($approvalUrl) zur Paypal-Website zu springen und auf die Zahlung des Benutzers zu warten.

    Nachdem der Benutzer zustimmt, führen Sie das Abonnement aus

    Nachdem der Benutzer zustimmt, wurde das Abonnement nicht abgeschlossen und die Ausführungsmethode der Vereinbarung wird verwendet muss ausgeführt werden, um das Abonnement wirklich abzuschließen. Bei diesem Schritt ist Folgendes zu beachten:

    • Nach Abschluss des Abonnements bedeutet dies nicht, dass die Zahlung abgebucht wird, sondern kann sich um einige Minuten verzögern

    • Wenn im ersten Schritt die setSetupFee-Gebühr auf 0 gesetzt ist, wird die Bestellung erst generiert, wenn die wiederkehrende Abzugszeit abgelaufen ist.

    Die Der Codeausschnitt lautet wie folgt:

     public function onPay($request)
     {
     $apiContext = $this->getApiContext();
     if ($request->has('success') && $request->success == 'true') {
     $token = $request->token;
     $agreement = new \PayPal\Api\Agreement();
     try {
     $agreement->execute($token, $apiContext);
     } catch(\Exception $e) {
     return ull;
     return $agreement;
     }
     return null;
     }

    Transaktionsdatensätze abrufen

    Nach dem Abonnieren wird der Der Transaktionsdatensatz für den Transaktionsabzug wird möglicherweise nicht sofort generiert. Wenn er leer ist, wird er nach einigen Minuten wiederholt. Hinweise zu diesem Schritt:

    • start_date und end_date dürfen nicht leer sein

    • Während des eigentlichen Tests kann das von dieser Funktion zurückgegebene Objekt nicht immer leeres JSON zurückgeben Objekt. Wenn Sie also JSON ausgeben müssen, extrahieren Sie bitte manuell die entsprechenden Parameter gemäß der API-Beschreibung von AgreementTransactions.

     /** 获取交易记录
     * @param $id subscription payment_id
     * @warning 总是获取该subscription的所有记录
     */
     public function transactions($id)
     {
     $apiContext = $this->getApiContext();
     $params = ['start_date' => date('Y-m-d', strtotime('-15 years')), 'end_date' => date('Y-m-d', strtotime('+5 days'))];
     try {
     $result = Agreement::searchTransactions($id, $params, $apiContext);
     } catch(\Exception $e) {
     Log::error("get transactions failed" . $e->getMessage());
     return null;
     }
     return $result->getAgreementTransactionList() ;
     }

    Schließlich gibt es bei Paypal natürlich auch ein entsprechendes offizielles Tutorial, allerdings ruft es die native Schnittstelle auf, die sich vom Ablauf unterscheidet Oben werden nur die ersten drei Schritte als Referenz erwähnt: https://developer.paypal.com/docs/integration/direct/billing-plans-and-agreements/.

    Probleme, die berücksichtigt werden müssen

    Die Funktion wurde implementiert, es gibt jedoch auch viele Einschränkungen:

    • Inland Verwendung von Sandbox Die Verbindung war während des Tests extrem langsam, was häufig zu Zeitüberschreitungen oder Fehlern führte. Daher muss besonders auf die Situation geachtet werden, in der der Benutzer die Seite während der Ausführung schließt Stellen Sie sicher, dass Sie Webhook implementieren. Andernfalls wird Ihre Website nicht benachrichtigt, wenn der Benutzer das Abonnement in Paypal kündigt.

    • Sobald ein Abonnement (Vereinbarung) erstellt wurde, bleibt es in Kraft, sofern es nicht gekündigt wird proaktiv. Wenn Ihre Website daher mit mehreren Upgrade-Plänen ausgestattet ist (z. B. Basic, Standard, Advanced), muss der vorherige Upgrade-Plan während der Entwicklung gekündigt werden, wenn ein Benutzer einen Plan abonniert hat und zu einem Upgrade-Plan wechselt 🎜>

      Der Benutzer stimmt dem Abonnieren zu – (das alte Abonnement kündigen – die Unterzeichnung des neuen Abonnements abschließen – die Benutzerinformationen auf das neue Abonnement ändern), der gesamte Klammerungsprozess sollte ein atomarer Vorgang sein, und Es ist zeitaufwändig und langwierig und sollte daher in die Warteschlange gestellt werden, bis es erfolgreich ausgeführt wird, um ein besseres Erlebnis zu erzielen.
    • Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird.

    Verwandte Empfehlungen:

    PaypalBeispielcode-Sharing zur Implementierung der wiederkehrenden Abzugsfunktion (Abonnement)

    Zen Cart implementiert das Hinzufügen von Paypal-Reservierungen zu Bestellungen. Telefonmethode

    Paypal Das einfachste PHP-Online-Zahlungs-SDK

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Funktion für wiederkehrende Abzüge (Abonnement) in Paypal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn