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 :
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
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
Créer un nouveau compte de test
Le montant et le mot de passe peuvent être utilisés. être défini
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 = 'xxxxxxxxx';//应用Client ID const clientSecret = 'xxxxxxxx';//Secret const accept_url = 'http://xxx.laravel.com/Api/paypal/Callback'; //支付成功和取消交易的跳转地址 const Currency = 'USD';//货币单位 protected $PayPal; public function __construct() { $this->PayPal = new ApiContext( new OAuthTokenCredential( self::clientId, self::clientSecret ) ); //如果是沙盒测试环境不设置,请注释掉 // $this->PayPal->setConfig( // array( // 'mode' => 'live', // ) // ); } /** * @param * $product 商品 * $price 价钱 * $shipping 运费 * $description 描述内容 */ public function pay() { $product = '1123'; $price = 1; $shipping = 0; $description = '1123123'; $paypal = $this->PayPal; $total = $price + $shipping;//总价 $payer = new Payer(); $payer->setPaymentMethod('paypal'); $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 . '?success=true')->setCancelUrl(self::accept_url . '/?success=false'); $payment = new Payment(); $payment->setIntent('sale')->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 :
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['success']); if ($success == 'false' && !isset($_GET['paymentId']) && !isset($_GET['PayerID'])) { echo '取消付款';die; } $paymentId = trim($_GET['paymentId']); $PayerID = trim($_GET['PayerID']); if (!isset($success, $paymentId, $PayerID)) { echo '支付失败';die; } if ((bool)$_GET['success'] === 'false') { echo '支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; } $payment = Payment::get($paymentId, $this->PayPal); $execute = new PaymentExecution(); $execute->setPayerId($PayerID); try { $payment->execute($execute, $this->PayPal); } catch (Exception $e) { echo ',支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; } echo '支付成功,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';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 :
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['invoice'] = $json_data['resource']['invoice_number']; $data['txn_id'] = $json_data['resource']['id']; $data['total'] = $json_data['resource']['amount']['total']; $data['status'] = isset($json_data['status'])?$json_data['status']:''; $data['state'] = $json_data['resource']['state']; try { //处理相关业务 } catch (\Exception $e) { //记录错误日志 Log::error("paypal notify fail:".$e->getMessage()); return "fail"; } return "success"; } public function get_JsonData(){ $json = file_get_contents('php://input'); if ($json) { $json = str_replace("'", '', $json); $json = json_decode($json,true); } return $json; }
Traitement du remboursement
public function returnMoney() { try { $txn_id = "xxxxxxx"; //异步加调中拿到的id $amt = new Amount(); $amt->setCurrency('USD') ->setTotal('99'); // 退款的费用 $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(['message' => $e->getMessage(), 'code' => $e->getCode(), 'state' => $e->getMessage()])); // to object } // 退款完成 return $refundedSale; }
Afficher le flux associé
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!