ThinkPHP接入PayPal支付

ThinkPHP 5接入PayPal 支付,PayPal的流程是服務器請求Paypal的接口下單(需要傳訂單id/支付成功的重定向地址/支付失敗的重定向地址),接會返回一個支付地址,項目服務器把地址返給用戶,用戶打開鏈接登錄Paypal完成付款,然后Paypal給重定向到指定地址。

在paypal官網開通商戶號,設置通知地址。

開通沙箱模式用于測試,后臺會給沙箱模式生成商戶賬號和用戶賬號,請注意區分。

申請和開通網上有教程不在贅述。

具體實現步驟如下

1.安裝包

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

2.具體實現代碼

<?phpnamespace app\api\controller;use app\common\controller\Api;
use app\common\model\ShopOrder;
use PayPal\Api\Amount;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\Transaction;
use PayPal\Api\PaymentExecution;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;
use PayPal\Api\RedirectUrls;
use think\Log;
class Paypal extends Api
{protected $noNeedLogin = ['*'];protected $noNeedRight = ['*'];private $apiContext;public function __construct(){parent::__construct();// 初始化PayPal API上下文$this->apiContext = new ApiContext(new OAuthTokenCredential('AV8d**************************N-jbpRvV-K0_dLuEA5d8uodUowab6jdWtM',     // 客戶端ID'EByrRAncAi*****************************RSqIRA'         // 客戶端密鑰));$this->apiContext->setConfig(['mode' => 'sandbox',      // 或者 'live'// 其他配置...]);}/*** 下單接口* @return \think\response\Json|void* @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException*/public function createPaypalPaymentUrl(){// 獲取前端傳遞的order_Id$orderId = input('post.order_id');// 查詢訂單信息(這里你需要根據自己的數據庫結構進行查詢)// 假設我們得到了一個包含訂單詳情的數組$orderInfo$orderInfo = ShopOrder::where('id', $orderId)->where('status', '1')->find();if (empty($orderInfo)) {$this->error('訂單不存在或不是待支付狀態');}// 設置Payer信息,表明付款人是通過PayPal付款$payer = new Payer();$payer->setPaymentMethod("paypal");// 設置交易金額$amount = new Amount();$amount->setCurrency("AUD")->setTotal(number_format($orderInfo['actual_money'], 2, '.', ''));// 創建Transaction對象,并使用訂單ID作為發票號$transaction = new Transaction();$transaction->setAmount($amount)->setDescription("Slem order pay")  // 描述可選->setInvoiceNumber($orderInfo->order_num);  // 使用訂單order_num作為發票號// 創建RedirectUrls對象$redirectUrls = new RedirectUrls();$redirectUrls->setReturnUrl("https://*******.cn/api/paypal/paymentSuccess")  // 支付成功后的回調地址->setCancelUrl("https://********/api/paypal/paymentCancel");  // 用戶取消支付后的回調地址// 創建Payment對象$payment = new Payment();$payment->setIntent("sale")->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);try {// 創建支付請求$payment->create($this->apiContext);// 獲取approval_url,這是用戶需要訪問來完成支付的URLforeach ($payment->getLinks() as $link) {if ($link->getRel() == 'approval_url') {// 返回支付鏈接給客戶端return json(['code' => 1, 'data' => $link->getHref()]);
//                    $data = ['status' => 'success', 'approval_url' => $link->getHref()];
//                    $this->success(__('SUccess'),$data);}}} catch (\Exception $ex) {// 輸出詳細的錯誤信息return json(['status' => 'error','message' => 'Error creating PayPal payment: ' . $ex->getMessage(),'details' => $ex->getTraceAsString(),'response' => $payment->toArray()]);}}/*** 支付成功跳轉的頁面* 建議前端出個html后臺做渲染,本方法只為展示流程* @return \think\response\Json*/public function paymentSuccess(){// 獲取PayPal傳遞過來的參數$paymentId = input('get.paymentId');$payerId = input('get.PayerID');if (empty($paymentId) || empty($payerId)) {return json(['status' => 'error', 'message' => 'Missing payment ID or payer ID']);}try {// 獲取支付信息$payment = Payment::get($paymentId, $this->apiContext);// 創建PaymentExecution對象并設置payer_id$execution = new PaymentExecution();$execution->setPayerId($payerId);// 執行支付請求$result = $payment->execute($execution, $this->apiContext);// 檢查支付狀態if ($result->getState() === 'approved') {// 使用發票號(即訂單ID)來查找訂單$invoiceNumber = $payment->getTransactions()[0]->getInvoiceNumber();$order = ShopOrder::where('order_num', $invoiceNumber)->find();if (!empty($order)) {// 更新訂單狀態為已支付$order->payment = 'paypal';$order->status = '2';$order->save();// 你可以在這里添加更多的業務邏輯,比如發送確認郵件等// 返回成功信息給前端return json(['status' => 'success', 'message' => 'Payment successful']);} else {return json(['status' => 'error', 'message' => 'Order not found']);}} else {return json(['status' => 'error', 'message' => 'Payment not approved']);}} catch (\Exception $ex) {// 錯誤處理Log::error('PayPal Error: ' . $ex->getMessage());return json(['status' => 'error','message' => 'Error executing payment: ' . $ex->getMessage(),'details' => $ex->getTraceAsString()]);}}/*** 支付取消跳轉的頁面* @return \think\response\Json*/public function paymentCancel(){// 獲取訂單ID或其他相關信息(如果需要)$orderId = input('get.order_id'); // 如果PayPal回調包含order_idif (!empty($orderId)) {try {// 根據訂單ID查找訂單信息$order = ShopOrder::where('id', $orderId)->find();if (!empty($order)) {// 你可以在這里添加更多的業務邏輯,比如記錄取消原因、發送通知等// 更新訂單狀態為已取消或保持不變,視業務需求而定// 這里假設我們不改變訂單狀態,僅記錄取消事件Log::info("Payment cancelled for order ID: " . $orderId);// 返回取消信息給前端return json(['status' => 'info', 'message' => 'Payment cancelled.']);} else {return json(['status' => 'error', 'message' => 'Order not found.']);}} catch (\Exception $ex) {// 錯誤處理Log::error('Error handling payment cancellation: ' . $ex->getMessage());return json(['status' => 'error','message' => 'An error occurred while processing your request.','details' => $ex->getTraceAsString()]);}} else {// 如果沒有提供訂單ID,則簡單地告知用戶支付已被取消return json(['status' => 'info', 'message' => 'Payment cancelled.']);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64080.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stream流的toMap

假設有這么一個類: import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors;public class Student {private int id;private String name;public Student(int id, String name) {this.id id;…

html + css 淘寶網實戰

之前有小伙伴說&#xff0c;淘寶那么牛逼你會寫代碼&#xff0c;能幫我做一個一樣的淘寶網站嗎&#xff0c;好呀&#xff0c;看我接下來如何給你做一個淘寶首頁。hahh,開個玩笑。。。學習而已。 在進行html css編寫之前 先了解下網頁的組成和網頁元素的尺寸吧 1.網頁的組成 …

神經網絡、深度學習、卷積神經網絡

好的&#xff01;我會盡量詳細且易懂地為你解釋這些概念&#xff0c;并在最后用簡單直白的語言總結一下。 1. 神經網絡思想 神經網絡是靈感來自于生物大腦神經元的工作原理&#xff0c;是一種模仿人類大腦處理信息的方式來設計的數學模型。我們的大腦由億萬個神經元組成&…

設計模式01:創建型設計模式之單例、簡單工廠的使用情景及其基礎Demo

一、單例模式 1.情景 連接字符串管理 2.好處 代碼簡潔&#xff1a;可全局訪問連接字符串。性能優化&#xff1a;一個程序一個連接實例&#xff0c;避免反復創建對象&#xff08;連接&#xff09;和銷毀對象&#xff08;連接&#xff09;。線程安全&#xff1a;連接對象不會…

【不太正常的題】LeetCode.232:用棧的函數接口實現隊列

&#x1f381;個人主頁&#xff1a;我們的五年 &#x1f50d;系列專欄&#xff1a;初階數據結構刷題 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 &#x1f697; 1.問題描述&#xff1a; 題目中說了只能使用兩個棧實現隊列&#xff0c;并且只能使用…

Linux搭建text-generation-webui框架,安裝通義千問大模型,開放對外api,voxta測試對話圖文教程

目錄 text-generation-webui部分 開放對外API 通義千問部分 遠程API對話測試部分 text-generation-webui部分 本來不想發這個文章的&#xff0c;但是自己部署的時候看了挺多人的帖子&#xff0c;很多發的不全面&#xff0c;要么就是跟著他們流程走有些小問題啥的&#xff…

QT程序發布后,mysql在其它電腦設備無法連接數據庫

QT程序發布后&#xff0c;mysql在其它電腦設備無法連接數據庫 D:\mysql-5.7.24-winx64\lib, mysql-5.7.24-winx64是一個壓縮包&#xff0c;用于啟動mysql服務&#xff0c;創建數據庫 壓縮包 解決方法&#xff1a; 拷貝庫到exe的相同目錄&#xff0c;libmysql.dll,libmysql.li…

ElasticSearch 的核心功能

要深入理解 ElasticSearch 的核心功能&#xff0c;需要全面掌握其 全文搜索、分析、聚合 和 索引生命周期管理&#xff08;ILM&#xff09; 的設計原理和實際應用。 1. 全文搜索 ElasticSearch 的全文搜索是其核心功能之一&#xff0c;依賴于倒排索引和強大的分詞、相關性評分…

在Nginx部署Web應用,如何保障后端API的安全

1. 使用HTTPS和http2.0 參考&#xff1a;Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客 2. 設置嚴格的CORS策略 通過add_header指令設置CORS頭。 只允許來自https://frontend.yourdomain.com的請求訪問API location /api/ {if ($http_origin ~* (https://frontend\.yourdomai…

Nginx單向鏈表 ngx_list_t

目錄 基本概述 數據結構 接口描述 具體實現 ngx_list_create ngx_list_init ngx_list_push 使用案例 整理自 nginx 1.9.2 源碼 和 《深入理解 Nginx&#xff1a;模塊開發與架構解析》 基本概述 Nginx 中的 ngx_list_t 是一個單向鏈表容器&#xff0c;鏈表中的每一個節…

es快速掃描

介紹 Elasticsearch簡稱es&#xff0c;一款開源的分布式全文檢索引擎 可組建一套上百臺的服務器集群&#xff0c;處理PB級別數據 可滿足近實時的存儲和檢索 倒排索引 跟正排索引相對&#xff0c;正排索引是根據id進行索引&#xff0c;所以查詢效率非常高&#xff0c;但是模糊…

軟件需求建模方法

軟件需求建模是一個涉及多個學科的領域&#xff0c;其研究方向廣泛且多樣。以下是一些主要的研究方向&#xff1a; 1. 需求工程方法&#xff1a;研究如何更有效地收集、分析、規格化和驗證軟件需求。這包括新的需求工程方法論和工具的開發。 2. 需求管理&#xff1a;關注需求…

軟件項目需求分析的實踐探索(1)

一、項目啟動與規劃 組建團隊 包括項目經理、系統分析師、業務分析師以及可能涉及的最終用戶代表和領域專家等。例如&#xff0c;開發一個醫療管理軟件&#xff0c;就需要有醫療行業的專家參與&#xff0c;確保對醫療業務流程有深入理解。明確各成員的職責&#xff0c;如系統分…

wordpres當前分類調用父分類的名稱和鏈接

在WordPress中&#xff0c;如果你想在當前分類頁面調用并顯示父分類的名稱和鏈接&#xff0c;你可以使用以下代碼片段&#xff1a; <?php // 獲取當前分類的ID $cat_id get_queried_object_id();// 獲取當前分類的父分類ID $parent_id get_term($cat_id, category)->…

前端Python應用指南(三)Django vs Flask:哪種框架適合構建你的下一個Web應用?

《寫給前端的python應用指南》系列&#xff1a; &#xff08;一&#xff09;快速構建 Web 服務器 - Flask vs Node.js 對比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的應用結構與模塊化設計 在上一篇博文中&#xff0c;我們深入探討了Flask框架&#xff0c;…

網絡管理-期末項目(附源碼)

環境&#xff1a;網絡管理 主機資源監控系統項目搭建 &#xff08;保姆級教程 建議點贊 收藏&#xff09;_搭建網絡版信息管理系統-CSDN博客 效果圖 下面3個文件的項目目錄(python3.8.8的虛擬環境) D:\py_siqintu\myproject5\Scripts\mytest.py D:\py_siqintu\myproject5\Sc…

MySQL 常用程序介紹

以下是一些常用的MySQL程序&#xff1a; 程序名作?mysqldMySQL的守護進程即 MySQL 服務器&#xff0c;要使?MySQL 服務器 mysqld必須正在運?狀態mysql MySQL客?端程序&#xff0c;?于交互式輸? SQL 語句或以批處理模式從?件執?SQL的命令??具 mysqlcheck?于檢查、修…

Redis篇--常見問題篇4--大Key(Big Key,什么是大Key,影響及使用建議)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的長度非常大&#xff0c;實際上鍵&#xff08;Key&#xff09;長度很大也算。通常來說&#xff0c;鍵本身不會很長&#xff0c;占用的內存較少&#xff0c;因此判斷一個鍵是否為bigKey主要看它對應的值的大…

云手機+YouTube:改變通信世界的劃時代技術

隨著科技的不斷進步&#xff0c;手機作為人們生活中不可或缺的工具&#xff0c;也在不斷地更新換代。近年來&#xff0c;一個名為“油管云手機”的全新產品正在引起廣泛的關注和討論。作為一個運用最新科技實現的新型手機&#xff0c;它在通信領域帶來了全新的體驗和革命性的變…

ModbusTCP從站轉Profinet主站案例

一. 案例背景 在復雜的工業自動化場景中&#xff0c;企業常常會采用不同品牌的設備來構建生產系統。西門子SINAMICS G120變頻器以其高性能、高精度的速度和轉矩控制功能&#xff0c;在電機驅動領域應用廣泛。施耐德M580可編程邏輯控制器則以強大的邏輯控制和數據處理能力著稱&…