Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielcode-Freigabe für Paypal zur Implementierung der Funktion für wiederkehrende Abzüge (Abonnement).

Beispielcode-Freigabe für Paypal zur Implementierung der Funktion für wiederkehrende Abzüge (Abonnement).

黄舟
黄舟Original
2017-03-24 09:26:063010Durchsuche

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. Werfen wir einen Blick darauf mit dem Editor unten

Ursache

Das Unternehmen muss Paypal integrieren, um die Funktion für wiederkehrende Abzüge zu realisieren. Baidu und GOOGLE haben jedoch einen Umweg gemacht , außer der offiziellen Website Außerdem konnte ich keine relevanten Entwicklungs-Tutorials finden, also musste ich mir Paypal ansehen. Nach zwei Tagen war die Integration erfolgreich. 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 zu OAuth 2.0-Authentifizierungsmethoden und REST-API-API-Nutzungsmethoden. 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

Es ist immer noch sehr umständlich, diese APIs direkt anzupassen. Gleichzeitig möchten wir die Geschäftsanforderungen so schnell wie möglich erfüllen anstatt sich 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 es richtig konfigurieren:

Client-ID

  • Client-Geheimnis

  • Webhook-API (muss mit https beginnen und Port 443 sein, lokal

    Debugging
  • wird empfohlen, um die Adresse in Kombination mit dem Ngrok-Reverse-Proxy zu generieren)
  • Returnurl (beachten Sie dasselbe wie oben)

  • Zahlungen
  • Einmalige Zahlungsschnittstelle, funktioniert Wiederkehrende Spenden werden nicht unterstützt. 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;

  • Tresor
  • Kreditkarteninformationen 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

  • In vier Schritten:
  • Erstellen Sie einen Upgrade-Plan und aktivieren Sie ihn.

  • Erstellen Sie ein Abonnement (Erstellung einer Vereinbarung) und gehen Sie dann zur Website von Paypal, um auf die Genehmigung des Benutzers zu warten
Nachdem der Benutzer zustimmt, führen Sie das Abonnement aus

    Lastschriftabrechnung erhalten

    1. 1. Erstellen Sie ein Upgrade planen

    2. Der 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 Code zum Erstellen und Aktivieren des Plans lautet 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 (Vereinbarung erstellen) und gehen Sie dann zur Paypal-Website, um auf die Zustimmung des Benutzers zu warten

    Nachdem der Plan vorliegt erstellt, wie lassen Sie Benutzer abonnieren? In Bezug auf die Vereinbarung sind folgende Punkte zu beachten:

    • Wie bereits erwähnt, ist die setSetupFee-Methode der Das Planobjekt legt die Gebühr für den ersten Abzug nach Abschluss des Abonnements fest, und das Vertragsobjekt. Die wiederkehrende Abzugsmethode legt die Kosten zu Beginn des zweiten Mals fest.

    • 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,等待用户同意
     }

    Die Funktion gibt nach der Ausführung $approvalUrl zurück. 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 Transaktionsdatensatz des Transaktionsabzugs möglicherweise nicht sofort generiert . Wenn es leer ist, versuchen Sie es nach ein paar Minuten erneut. Hinweise zu diesem Schritt:

     /** 获取交易记录
     * @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() ;
     }
    Abschließend gibt es bei Paypal natürlich auch ein entsprechendes offizielles Tutorial, das jedoch die native Schnittstelle aufruft. Der Unterschied zum obigen Prozess besteht darin, dass nur auf die ersten drei Schritte eingegangen wird

    Probleme, die berücksichtigt werden müssen

    Die Funktion wurde implementiert, aber es wurden auch viele Punkte gefunden, die Aufmerksamkeit erregen:

    • Bei Verwendung von Sandbox zum Testen in China ist die Verbindung besonders langsam und führt häufig zu Zeitüberschreitungen oder Fehlern. 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 erhält Ihre Website keine Benachrichtigung, wenn der Benutzer das Abonnement in Paypal kündigt.

    • Sobald das Abonnement (Vereinbarung) erstellt wurde, wird dies der Fall sein bleiben in Kraft, sofern sie nicht aktiv aufgehoben werden. Wenn Ihre Website daher mit mehreren Upgrade-Plänen (z. B. Basic, Standard, Advanced) ausgestattet ist und ein Benutzer einen bestimmten Plan abonniert hat und zu einem Upgrade-Plan wechselt, muss die Entwicklung den vorherigen Upgrade-Plan kündigen

    • Der Benutzer stimmt dem Abonnement zu – (das alte Abonnement kündigen – die Unterzeichnung des neuen Abonnements abschließen –
    • die Benutzerinformationen ändern

      auf das neue Abonnement), der gesamte Prozess sollte abgeschlossen sein Es handelt sich um eine atomare Operation, die zeitaufwändig und langwierig ist. Daher sollte sie in die

      Warteschlange
    • gestellt und ausgeführt werden, bis sie erfolgreich ist, was für ein besseres Erlebnis sorgt.

    Das obige ist der detaillierte Inhalt vonBeispielcode-Freigabe für Paypal zur Implementierung der Funktion für wiederkehrende Abzüge (Abonnement).. 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