详解PHP 如何对接 paypal 支付
推荐:《PHP视频教程》
环境准备
- 注册paypal账号
- 注册paypal开发者账号
- 创建paypal沙盒测试账户
- 创建paypal应用
- 下载PHP SDK
- 实现支付
- 实现支付成功回调
- 实现退款
- 更多API代码模板
注册paypal账号
- www.paypal.com 注册商家账户
- 选择,”创建商家用户”,根据要求填写信息,注册完得去邮箱激活
注册paypal开发者账号
- developer.paypal.com 使用上一步注册的账号登录
- 在左侧导航栏点击Accounts,创建两个sandbox账号,一个个人账号(personal)用于付款,一个商家账号(business)用于收款,系统已经默认创建了两个,可以自己选择创建,方便记忆; 创建账号后记得给当前账号添加余额用于接下来的测试。
- 用刚才创建的测试账号登录沙盒测试站点,查看金额和交易信息www.sandbox.paypal.com
创建沙盒应用APP
- 账号默认给创建好了一个Default Application,点击查看获取 ClientId和Secret;保存起来,接下来接口调用会使用到;(上线时请重新创建一个Live的应用)
下载SDK
- 本人使用laravel框架,使用composer下载paypal包
composer require paypal/rest-api-sdk-php
实现支付
-
以下是生成支付的代码片段,伪代码
function createPayPal(){ $shippingPrice = 2; $taxPrice = 0; $subTotal = 26; $item1 = new PayPal\Api\Item(); $item1->setName("产品2")->setCurrency("USD")->setQuantity(1)->setPrice(10); $item2 = new PayPal\Api\Item(); $item2->setName("产品1")->setCurrency("USD")->setQuantity(2)->setPrice(8); $itemList = new PayPal\Api\ItemList(); $itemList->addItems([$item1,$item2]); // Set payment details $details = new PayPal\Api\Details(); $details->setShipping($shippingPrice)->setTax($taxPrice)->setSubtotal($subTotal); // Set payment amount //注意,此处的subtotal,必须是产品数*产品价格,所有值必须是正确的,否则会报错 $total = $shippingPrice + $subTotal + $taxPrice; $amount = new PayPal\Api\Amount(); $amount->setCurrency("USD")->setTotal($total)->setDetails($details); // Set transaction object $transaction = new PayPal\Api\Transaction(); $transaction->setAmount($amount)->setItemList($itemList)->setDescription("这是交易描述") ->setInvoiceNumber(uniqid());//setInvoiceNumber为支付唯一标识符,在使用时建议改成订单号 $payer = new PayPal\Api\Payer(); $payer->setPaymentMethod('paypal');//["credit_card", "paypal"] $redirectUrls = new PayPal\Api\RedirectUrls(); $redirectUrl = "http://test.com/redirect/success";//支付成功跳转的回调 $cancelUrl = "http://test.com/redirect/cancel";//取消支付的回调 $redirectUrls->setReturnUrl($redirectUrl)->setCancelUrl($cancelUrl); // Create the full payment object $payment = new PayPal\Api\Payment(); $payment->setIntent("sale")->setPayer($payer)->setRedirectUrls($redirectUrls)->addTransaction($transaction); try { $clientId = "xxxxxx";//上面应用的clientId和secret $secret = "XXXXXX"; $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret); $apiContext = new \PayPal\Rest\ApiContext($oAuth); if(env('APP_DEBUG') === false ){ $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox } $payment->create($apiContext); $approvalUrl = $payment->getApprovalLink(); dd($approvalUrl);//这个是请求支付的链接,在浏览器中请求此链接就会跳转到支付页面 } catch (\Exception $e) { dd($e->getMessage());//错误提示 } }
登录后复制 -
以下是支付成功的回调代码片段,伪代码
function payRedirect(Request $request) { $paymentID = $request->get('paymentId'); $payerId = $request->get('PayerID'); $clientId = "xxxxxx";//上面应用的clientId和secret $secret = "XXXXXX"; $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret); $apiContext = new \PayPal\Rest\ApiContext($oAuth); if(env('APP_DEBUG') === false ){ $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox } $payment = \PayPal\Api\Payment::get($paymentID, $apiContext); $execute = new \PayPal\Api\PaymentExecution(); $execute->setPayerId($payerId); try{ $payment = $payment->execute($execute, $apiContext);//执行,从paypal获取支付结果 $paymentState = $payment->getState();//Possible values: created, approved, failed. $invoiceNum = $payment->getTransactions()[0]->getInvoiceNumber(); $payNum = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getId();//这是支付的流水单号,必须保存,在退款时会使用到 $total = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getAmount()->getTotal();//支付总金额 $transactionState = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getState();//Possible values: completed, partially_refunded, pending, refunded, denied. if($paymentState == 'approved' && $transactionState == 'completed'){ //处理成功的逻辑,例如:判断支付金额与订单金额,更新订单状态等 return "success";//返回成功标识 }else{ //paypal回调错误,paypal状态不正确 return "error";//返回错误标识 } }catch(\Exception $e){ dd($e->getMessage()); } }
登录后复制
退款
退款必须要有支付成功的流水单号
一个流水单号可以进行多次退款
退款成功之后,在账号的交易记录中不体现,测试时请登录测试账号自己记录一下余额的变化情况,以确定退款是否成功
-
商家账号会减少余额并增加手续费(手续费是之前付款多收的),用户账号会增加余额
function refundOrder() { try{ $refundRequest = new \PayPal\Api\RefundRequest(); $amount = new \PayPal\Api\Amount(); $amount->setCurrency("USD")->setTotal(10);//退总金额 $refundRequest->setAmount($amount); $refundRequest->setDescription("退款测试"); $sale = new \PayPal\Api\Sale(); $sale->setId("XXXXXXXXX");//支付单号,支付成功时保存的支付流水单号 $clientId = "xxxxxx";//上面应用的clientId和secret $secret = "XXXXXX"; $oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret); $apiContext = new \PayPal\Rest\ApiContext($oAuth); if(env('APP_DEBUG') === false ){ $apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox } $detailedRefund = $sale->refundSale($refundRequest, $apiContext);//调接口 $refundState = $detailedRefund->getState();//Possible values: pending, completed, cancelled, failed. //var_dump($refundedSale); if($refundState == 'completed'){ //退款成功,返回 }else{ dd('paypal 退款失败, 状态不正确'); } }catch (\Exception $exception){ dd($exception->getMessage());//发生异常 } }
登录后复制更多接口代码示例
http://paypal.github.io/PayPal-PHP-SDK/sample/
以上是详解PHP 如何对接 paypal 支付的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。
