Heim > Artikel > Backend-Entwicklung > Beispielcode-Freigabe für Paypal zur Implementierung der Funktion für wiederkehrende Abzüge (Abonnement).
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
UrsacheDas 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:
Erstellen Sie eine App über die Schnittstelle von REST Api (die aktuelle Mainstream-Schnittstelle);
Die Schnittstelle von NVP/SOAP-API-Apps (alte 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 APIDies 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 SchnittstelleSolange 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-APIEs 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
DebuggingEinmalige 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.
Nicht verwendet, ignorieren;
unterstützt die direkte Anmeldung auf Ihrer Website über Ihr Paypal-Konto und erhält relevante Informationen
Follow Relevant zum Einkaufszentrum, nicht genutzt, ignorieren;
Relevant für das Einkaufszentrum, nicht genutzt, ignoriert;
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;
Kreditkarteninformationen speichern
Nicht verwendet, ignorieren; Wichtig, aber nicht der Schwerpunkt dieses Artikels
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
Erstellen Sie einen Upgrade-Plan und aktivieren Sie ihn.
Lastschriftabrechnung erhalten
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
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:
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
WarteschlangeDas 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!