当前位置: 首页 > news >正文

paypal php 实现详细攻略

一、准备工作
登录 https://www.paypal.com/ 注册一个主账号(选择个人账号、企业账后都可)
申请完成后登录https://developer.paypal.com/ 在后台右侧菜地点击“Accounts”,可以看到系统自动给分配的两个沙箱环境的账号。类型为Personal是个人账号、类型为Business是商家账号。点进去可以看到密码
开启PDT设置同步回调地址(这步拿到at_token return回调使用)
用系统分配的卖家账号登录沙箱地址https://www.sandbox.paypal.com/

二: 调用接口,获取token,创建订单,生成支付链接,然后捕获订单确认付款,处理回调事件。

Developer Dashboard 切换测试模式和正式模式的链接

三:修改回调事件在选择的应用,点击进去后可以修改增加,捕获订单接口在回调的时候调用

参考链接: 【支付】PayPal支付通道 Java对接 (下单 付款 确认 退款 查询 回调)_java对接paypal-CSDN博客

php PayPal 支付/回调 - 加菲猫and大白 - 博客园

/*** 统一下单接口* @param $order* @param string $trade_type* @return array*/
function create_order_bak()
{$domain = $this->request->domain();$order['order_no'] = 10191;$arr = ['purchase_units' => [['custom_id' => 1,'reference_id' => $order['order_no'],//订单ID'amount' => ['currency_code' => 'USD','value' => 1]]],'intent' => 'CAPTURE','payment_source' => ['paypal' => ['experience_context' => ['payment_method_preference' => 'IMMEDIATE_PAYMENT_REQUIRED','payment_method_selected' => 'PAYPAL','brand_name' => 'TEST','landing_page' => 'GUEST_CHECKOUT',//直接付款'user_action' => 'PAY_NOW','return_url' => 'https://1688order.com',//付款后回调地址'cancel_url' => 'https://1688order.com'//取消付款后回调地址]]]];$result = $this->post(self::ONLINE_USEEPAY_SANDBOX_ENDPOINT.'/v2/checkout/orders',['Content-Type: application/json','Authorization: Bearer '.$this->getPaypalToken(),'PayPal-Request-Id: '.'TEST-'.$order['order_no']],json_encode($arr));// Log::write('创建订单返回信息:'.var_export($result, true));if(isset($result['id'])){return array('code' => 1, 'msg' => '创建订单成功', 'data' => $result);}else{//   return array('code' => 0, 'data' => $result['message']);}}/*** id 是下单的时候生成的订单的ID* paypal 回调后 捕获订单付款*/
function paypalOrderCapture($id){$result = $this->post(self::ONLINE_USEEPAY_SANDBOX_ENDPOINT.'/v2/checkout/orders/'.$id.'/capture',['Content-Type: application/json','Authorization: Bearer '.$this->getPaypalToken(),'PayPal-Request-Id: '.'TEST-'.$id]);return $result['status'] == 'COMPLETED' ? $result : false;}

/*** 获取token,一般返回来的access token有效时是9个小时**/
function getPaypalToken(){$paypal_token_config = cache("paypal-token-new");$end_time = time();if($paypal_token_config){$result = $paypal_token_config;$results = json_decode($result, true);$end_time = $results['time'] + $results['expires_in'];}if($end_time - time() < 1800){ //更新access token$result = $this->post(self::ONLINE_USEEPAY_SANDBOX_ENDPOINT.'/v1/oauth2/token',['Content-Type: application/x-www-form-urlencoded','Authorization:Basic '.base64_encode(self::ONLINE_CLEINTID.":".self::ONLINE_CLIENTSECRET)],http_build_query(['grant_type' => 'client_credentials']));if(isset($result['app_id'])){$result['time'] = time();cache("paypal-token-new",json_encode($result),3600);}}return isset($results['access_token']) ? $results['access_token'] : false;
}

/*** 发起POST请求*/
public function post($url, $headers, $request = array())
{$header_res = [];$curl = curl_init($url);curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $request);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_HEADERFUNCTION,function ($curl, $header) use (&$header_res) {$len = strlen($header);$header = explode(':', $header, 2);if (count($header) < 2) // ignore invalid headersreturn $len;$header_res[strtolower(trim($header[0]))][] = trim($header[1]);return $len;});$response_data = curl_exec($curl);curl_close($curl);$result = json_decode($response_data, true);return $result;
}
//回调地址
public function notify_order(){Log::write('paypal 支付进来了');$payload = @file_get_contents('php://input');// 调用 record() 方法记录日志// Log::write('content'.var_export($payload, true));$ret = json_decode($payload, true);Log::write('数组格式返回:'.var_export($ret, true));// Log::write('id'.var_export($ret['resource']['id'], true));// Log::write('status'.var_export($ret['resource']['status'], true));$order_id = $ret['resource']['id'];$result = $this->paypalOrderCapture($order_id);Log::write('确认付款后返回结果:'.var_export($result, true));$captureId = $result['purchase_units'][0]['payments']['captures'][0]['id'];//捕获ID,在退款的时候使用Log::write('确认支付后的支付状态是:'.var_export($result['status'], true));Log::write('捕获ID是:'.var_export($captureId, true));$web_order_id = $result['purchase_units'][0]['reference_id'];//网站下单的订单IDLog::write('网站下单的订单ID:'.var_export($web_order_id, true));$buy_type = $result['purchase_units'][0]['payments']['captures'][0]['custom_id'];//下单类型Log::write('网站下单类型:'.var_export($buy_type, true));//如果确认支付成功if ($result['status'] == 'COMPLETED'){//调用修改订单状态后续逻辑$res =  PayNotifyLogic::handle('order_buy', $web_order_id, ['buy_type'=>$buy_type,'payment_intent_id'=>$captureId]);if ($res) {$this->success('success', url('/pc/user/order/detail', ['id' => $order_id]));}}else{Log::write('确认付款失败返回结果:'.var_export($result, true));}}

相关文章:

paypal php 实现详细攻略

一、准备工作 登录 https://www.paypal.com/ 注册一个主账号&#xff08;选择个人账号、企业账后都可&#xff09; 申请完成后登录https://developer.paypal.com/ 在后台右侧菜地点击“Accounts”&#xff0c;可以看到系统自动给分配的两个沙箱环境的账号。类型为Personal是个人…...

深入理解Dubbo原理鱼实现,提升职场竞争力

小熊学Java全能学习面试指南&#xff1a;https://www.javaxiaobear.cn 1、RPC RPC(Remote Procedure Call)远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务。 大白话理解就是&#xff1a;RPC让你用别人家的东西就像自己家的一样。 RPC两个作用&#xff1…...

自动化测试与敏捷开发的重要性

敏捷开发与自动化测试是现代软件开发中两个至关重要的实践&#xff0c;它们相互补充&#xff0c;共同促进了软件质量和开发效率的提升。 敏捷开发的重要性 敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调以下几个核心价值观和原则&#xff1a; 个体和交互…...

气膜:冰雪产业的创新解决方案—轻空间

随着冰雪运动的普及和发展&#xff0c;如何在不同季节和地区有效开展冰雪项目&#xff0c;成为了行业内的一个重要课题。气膜作为一种新兴的建筑形式&#xff0c;凭借其独特的优势&#xff0c;正在逐渐成为冰雪产业的创新解决方案。 优越的建筑特性 气膜建筑以其轻便、快速搭建…...

期货配资网/分仓多元化/配资系统服务商

提供期货配资服务的网络平台搭建服务。这些平台致力于为投资者提供高效、便捷的期货投资渠道&#xff0c;通过配资的方式放大投资者的资金杠杆&#xff0c;从而增加其盈利机会。期货配资网一般具有以下特点&#xff1a; 专业服务&#xff1a;提供期货交易、投资管理及信息咨询…...

「漏洞复现」百易云资产管理运营系统 ufile.api.php SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…...

Vue 3 和 Vue Router 使用 createWebHistory 配置

在 Vue 3 项目中&#xff0c;如果使用 Vue Router 并希望启用 HTML5 History 模式&#xff0c;需要在创建路由器实例时传入 createWebHistory 作为历史模式的配置。此外&#xff0c;还需要确保在生产环境中设置正确的基本路径&#xff08;base&#xff09;&#xff0c;这样才能…...

Nginx:rewrite指令之flag标志

Nginx 的 rewrite 指令用于根据正则表达式来匹配请求的 URI&#xff0c;并将其重写为新的 URI。rewrite 指令可以包含一个可选的 flag&#xff08;标志&#xff09;&#xff0c;该标志用于控制重写操作后的行为。 rewrite regex replacement [flag] 一. 常用四种 flag redir…...

C#从零开始学习(如何构建应用)

开始使用 C# 开发使用的软件Visual Studio 2019 文章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 创建一个控制台应用 打开Visual Studio 2019 创建项目 选择控制台应用程序 创建后点击运行,就可以在控制台打印Hello World 构建一个游戏(创建WPF项目…...

FCoE简介

数据中心融合网络的发展趋势 如图1所示&#xff0c;传统数据中心组网中&#xff0c;以太网LAN&#xff08;Local Area Network&#xff09;用于服务器与服务器、客户端与服务器之间通信&#xff0c;存储区域网络SAN&#xff08;Storage Area Network&#xff09;用于服务器与存…...

论文笔记:Template-Based Named Entity Recognition Using BART

论文来源&#xff1a;ACL 2021 Finding 论文链接&#xff1a;https://aclanthology.org/2021.findings-acl.161.pdf 论文代码&#xff1a;GitHub - Nealcly/templateNER: Source code for template-based NER 笔记仅供参考&#xff0c;撰写不易&#xff0c;请勿恶意转载抄袭…...

【Nestjs】从入门到精通(依赖注入)

NestJS 是一个基于 Node.js 的渐进式框架&#xff0c;构建在 Express 或 Fastify 之上&#xff0c;主要用于构建高效、可扩展的服务器端应用程序。它使用 TypeScript 并借鉴了 Angular 的设计理念&#xff0c;采用了依赖注入&#xff08;IoC, Inversion of Control&#xff09;…...

C语言函数

1.C语言函数的定义 C源程序是由函数组成的。最简单的程序有一个主函数main()&#xff0c;但实用程序往往由多个函数组成&#xff0c;由主函数调用其他函数&#xff0c;其他函数也可以互相调用。函数是C源程序的基本模块&#xff0c;程序的许多功能是通过对函数模块的调用来实现…...

FLINK SQLTable API 的基本概念及常用API

基本概念 SQL和Table API是Apache Flink提供的两个关系型API&#xff0c;它们被设计用于统一的流和批处理。以下是关于SQL和Table API的基本概念及常用API的详细介绍&#xff1a; 一、基本概念 Table API 定义&#xff1a;Table API是一个为Java、Scala和Python提供的语言集…...

Docker daemon.json配置参数及格式帮助信息

我们知道程序运行&#xff0c;通过修改命令参数或者配置文件配置项&#xff0c;对程序进行修改。Docker也不例外&#xff0c;通过docker.service 增加命令参数或者在/etc/docker/daemon.json中增加配置项均可。 推荐修改daemon.json对docker守护进程进行配置更改&#xff08;方…...

十月编程语言排行榜~

前言&#xff1a;TIOBE编程语言排行榜通过分析全球开发者的活动、代码搜索和问答社区的流量&#xff0c;提供了编程语言受欢迎度的动态图景。该指数是技术趋势的风向标&#xff0c;揭示了哪些编程语言在技术领域占据主导地位&#xff0c;哪些语言正在快速崛起或逐渐衰退。 ✨✨…...

十三、行为型(策略模式)

策略模式&#xff08;Strategy Pattern&#xff09; 概念 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;允许定义一系列算法&#xff0c;将每个算法封装在策略类中&#xff0c;并使它们可以互换使用。客户端可以根据需要动态选择不同的策…...

Vue环境安装以及配置

这里写目录标题 前言一、前置要求1.安装Node.js2. 安装VScode 二、创建全局安装目录和缓存日志目录三、配置环境变量四、权限五、npm换源六、vscode插件1. Vue-Offical2. Vue 3 Snippets3. Path Intellisense4. Auto Import5. Auto Close Tag6. Auto Rename Tag7.GitLens总结 前…...

Redis 数据类型hash(哈希)

目录 1 基本特性 2 主要操作命令 2.1 设置和获取字段 2.1.1 HSET key field value 2.1.2 HGET key field 2.1.3 HMSET key field1 value1 [field2 value2 ...] 2.1.4 HMGET key field1 [field2 ...] 2.2 检查字段是否存在 2.2.1 HEXISTS key field 2.3 获取所有字段…...

单一执行和循环执行的例行性工作

单一执行的例行性工作&#xff1a;只执行一次就结束 1.1at命令的工作过程 /etc/at.allow&#xff0c;写在该文件的人可以使用at命令 /etc/at.deny&#xff0c;黑名单 两个文件如果都不存在&#xff0c;只有root能使用 [rootlocalhost ~]# systemctl status atd [rootlocalh…...

小白也能懂!Meta-Llama-3-8B-Instruct快速上手全攻略

小白也能懂&#xff01;Meta-Llama-3-8B-Instruct快速上手全攻略 1. 为什么选择Meta-Llama-3-8B-Instruct Meta-Llama-3-8B-Instruct是Meta公司2024年4月开源的中等规模语言模型&#xff0c;特别适合想要体验高质量AI对话但硬件配置有限的开发者。这个80亿参数的模型在单张RT…...

【算法精解】CEC2021竞赛亚军算法-MadDE框架及代码实现(Matlab)

本文核心内容&#xff1a;  MadDE算法主要框架及该算法创新点  Matlab代码实现&#xff08;可免费获取&#xff0c;包括代码及原文献&#xff09; 不少同学改进算法有时缺乏可落地思路&#xff0c;或从文献获得灵感却苦于写不出代码。为此&#xff0c;KAU 推出【算法精解】…...

GLM-OCR系统资源优化:C盘清理与显存高效利用技巧

GLM-OCR系统资源优化&#xff1a;C盘清理与显存高效利用技巧 你是不是也遇到过这种情况&#xff1a;兴致勃勃地部署好GLM-OCR&#xff0c;准备大展身手&#xff0c;结果没跑几天&#xff0c;系统就弹窗提示“C盘空间不足”&#xff0c;或者程序运行越来越慢&#xff0c;甚至直…...

PyTorch 2.8镜像部署教程:RTX 4090D上量化Llama-3-8B至INT4推理实操

PyTorch 2.8镜像部署教程&#xff1a;RTX 4090D上量化Llama-3-8B至INT4推理实操 1. 环境准备与快速验证 在开始Llama-3-8B模型的量化部署前&#xff0c;我们需要先确认基础环境是否正常工作。这个PyTorch 2.8镜像已经为RTX 4090D显卡进行了深度优化&#xff0c;开箱即用。 1…...

Phi-4-reasoning-vision-15B实操手册:强约束提示词设计与错误行为规避

Phi-4-reasoning-vision-15B实操手册&#xff1a;强约束提示词设计与错误行为规避 1. 引言&#xff1a;当视觉模型“自作主张”时&#xff0c;我们该怎么办&#xff1f; 你上传了一张软件界面的截图&#xff0c;想问问某个按钮是干什么用的。结果模型没回答你的问题&#xff…...

Obsidian-skills日志系统:如何记录和分析AI技能使用情况

Obsidian-skills日志系统&#xff1a;如何记录和分析AI技能使用情况 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Markdown, Bases, JSON Canvas, and use the CLI. 项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-sk…...

开发环境搭建新选择:Python3.9镜像简化部署流程

开发环境搭建新选择&#xff1a;Python3.9镜像简化部署流程 你是不是也遇到过这样的场景&#xff1a;新接手一个项目&#xff0c;光是配环境就花了大半天&#xff0c;各种依赖冲突、版本不兼容&#xff0c;代码还没开始写&#xff0c;心态先崩了一半。或者&#xff0c;好不容易…...

智慧校园系统采购,如何平衡功能、价格与服务?

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

面试-Linear Attention的学习

Linear Attention 学习笔记 0. Linear Attention 的目的与背景 0.1 标准 Attention 的瓶颈 在 Transformer 的标准 Self-Attention 机制中,注意力分数的计算方式如下: Attention(Q,K,V)=softmax(QKTd)V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqr…...

模电学习难点解析与实战突破指南

1. 为什么模电让人如此头疼&#xff1f;作为一名在电子行业摸爬滚打多年的工程师&#xff0c;我完全理解大家学习模拟电路时的痛苦。记得我大学时第一次接触模电课&#xff0c;老师讲了三遍共射放大电路&#xff0c;我愣是没听懂。直到后来在实际项目中反复调试电路&#xff0c…...