一.下载依赖包

composer require "paypal/rest-api-sdk-php:*"

二.发起支付

<?php
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 Paypal{const clientId = 'xxxxxxxxx';const clientSecret = 'xxxxxxxx';const succee = 'http://xxx.com/Callback?success=true';//发起支付成功同步回调地址const fail= 'http://xxx.com/Callback/?success=false';//发起支付成功同步回调地址protected $PayPal;public function __construct(){$this->PayPal = new ApiContext(new OAuthTokenCredential(self::clientId,self::clientSecret));//设置支付模式:沙盒模式(sandbox) 和 正式(live)$this->PayPal->setConfig(
//            array(
//                'mode' => 'sandbox',
//                'log.LogEnabled' => true,
//                'log.FileName' => '../PayPal.log',
//                'log.LogLevel' => 'DEBUG',
//                'cache.enabled' => true
//            )array('mode' => 'live','log.LogEnabled' => true,'log.FileName' => '../PayPal.log','log.LogLevel' => 'FINE','cache.enabled' => true));public function pay() {$product = '商品';$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('USD')->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::succee)->setCancelUrl(self::fail);$payment = new Payment();$payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);try {$payment->create($paypal);} catch (PayPalConnectionException $e) {echo $e->getData();}$approvalUrl = $payment->getApprovalLink();header("Location: {$approvalUrl}");}

三.同步回调

    /*** 回调*/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.'】';}echo '支付成功,支付ID【'.$paymentId.'】,支付人ID【'.$PayerID .'】';}

四.异步回调

  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;}

五.退款

   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; }

原文链接:https://learnku.com/articles/26282

Paypal支付/回调/退款相关推荐

  1. paypal php 返回_接入 paypal PHP-sdk 支付 / 回调 / 退款全流程

    记录一下接入paypal 全过程 因项目的原因要用到国外的支付和国外的信用卡,查了一下paypal就内置了信用卡付款方式,所以只需要接入paypal就能基本满足项目海外支付的需求. 查了一下文档发现w ...

  2. paypal支付与退款

    官方提供的apihttps://developer.paypal.com/docs/?countries=C2 PayPal有v1.v2两个版本的SDK v1支付请求步骤 1 请求三方paypal接口 ...

  3. Paypal支付的退款refund之getAccessToken

    这里仅赘述Paypal的Restful API curl方式的php 代码: 下面这段是PayPal官方给出的命令行下的获取access_token的curl方式: curl https://api. ...

  4. paypal支付、paypal回调(java后端)

    最近项目引入了paypal支付,在此做个记录 一.申请账号 首先到下面的网址申请个paypal账号(个人账号即可) https://www.paypal.com/c2/home 二.开发者页面登录 h ...

  5. c# .net core 微信、支付宝H5支付链接获取,支付回调方法,退款方法小计

    支付链接获取 //隐藏代码:获取一个订单model实体,并判断此订单是否发起过支付链接吊起,如发起过且链接没过期,则直接返回支付链接(仅限微信)if (//隐藏代码:判断是否为待付款){switch ...

  6. java微信支付v3系列——8.微信支付之退款成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  7. Asp.net core MVC paypal支付、回调——app支付

    最近刚加入了一家跨境物联网公司,刚来接到的需求就是微信支付和paypal支付,微信支付做的人很多了,没什么大的难点,之前的随笔提到过,今天主要来谈谈paypal支付. 首先应该申请一个沙箱环境的支付账 ...

  8. paypal支付接口开发笔记--Java版

    接入流程文档见:https://blog.csdn.net/change_on/article/details/73881791 支付回调文档见:https://www.freesion.com/ar ...

  9. java对接PayPal支付(v2)

    java对接PayPal支付 我们公司最近开通了网上支付功能,国内选择对接支付宝和微信,国外选择对接paypal, 今天我先将paypal对接方式记录下来,后面会记录微信和支付宝(本人比较懒,微信和支 ...

最新文章

  1. python判断括号有效,在Python中检查括号是否平衡
  2. bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp
  3. 网页出现不河蟹弹窗?那是被劫持了!
  4. java反射学习(2):反射与代理模式
  5. noip2014到2017初赛提高组看程序写结果、完善程序
  6. 计算机网络中seq,计算机网络A卷及参考答案
  7. 在Oracle中写出性能优良的SQL语句
  8. 基于机器视觉的洋葱霜霉病症状自动检测
  9. linux /home recovering journal,Ubuntu启动之后显示Recovering journal ,clean block。。。。问题`...
  10. python网络编程01/网络协议
  11. js/a标签下载文件方法
  12. 2024考研《艺术学概论》彭吉象|复习笔记(上篇)(1-6章)
  13. 2018NOIp爆零记
  14. 【原理图专题】OrCAD Capture CIS中元件产生A,B属性解决办法
  15. 教程 | 用安卓手机搭建 web 服务器(三)—— 内网穿透
  16. 【算法】剑指offer-删除链表中重复的节点最小栈
  17. Android9 HWbinder使用-注册service流程解析
  18. sql trim函数_SQL TRIM函数
  19. win10“任务栏图标取消固定,重启后又出现”解决办法
  20. S32K344休眠与唤醒配置的一种方法

热门文章

  1. Android开发替换字体
  2. 痞子衡嵌入式:ARM Cortex-M内核那些事(5)- 一表搜罗指令集
  3. LoRa 扩频因子和码片
  4. 中国松针油市场趋势报告、技术动态创新及市场预测
  5. 微信开发者工具关联gitee
  6. ajax初始化 ztree v3,zTree_v3
  7. 【T+】去掉畅捷通T+左边那些不用的云应用
  8. iOS 实现 WiFi 局域网传输文件到 App
  9. 用设计模式解决电商项目的更新库存业务
  10. 机器学习领域权威会议与期刊整理