PHP访问NetSuite REST Web Services

“同等看待欢乐和痛苦、得到和失去、胜利和失败、投入战斗。以此方式履行职责,你就不会招致任何罪恶。”

                                                                                                                                -Bhagavad Gita

为了帮助PHP开发者快速起步,以REST Web Services方式打通与NetSuite的接口,我们答应给一个样例。但是我是不懂PHP的,在经历了ChatGPT误导和帮助,调通了代码。心生欢喜,分享如下。

    <?php

    class NetSuiteRestAPI {
    
        // NetSuite Credentials
        const NETSUITE_ACCOUNT = '大写账号';
        const NETSUITE_CONSUMER_KEY = '你的参数';
        const NETSUITE_CONSUMER_SECRET = '你的参数';
        const NETSUITE_TOKEN_ID = '你的参数';
        const NETSUITE_TOKEN_SECRET = '你的参数'; 
    
        // Search a Employee record        
        public function searchEmployee($employeeId) {
            $url = "https://小写域名.suitetalk.api.netsuite.com/services/rest/record/v1/employee/$employeeId";
            return $this->callNetSuiteAPI($url, "GET", $employeeId);
        }
        
        // Create a new Employee record
        public function createEmployee($employeeData) {
            $url = "https://小写域名.suitetalk.api.netsuite.com/services/rest/record/v1/employee";
            return $this->callNetSuiteAPI($url, "POST", $employeeData);
        }
    
        // Call NetSuite API
        private function callNetSuiteAPI($url, $method, $payload = null) {
            $oauth_nonce = md5(mt_rand());
            $oauth_timestamp = time();
            $oauth_signature_method = 'HMAC-SHA256';
            $oauth_version = "1.0";
    
            // Generate Signature
            $baseString = $this->generateBaseString($method, $url, self::NETSUITE_CONSUMER_KEY, self::NETSUITE_TOKEN_ID, $oauth_nonce, $oauth_timestamp, $oauth_version, $oauth_signature_method, $payload);
            $key = rawurlencode(self::NETSUITE_CONSUMER_SECRET) . '&' . rawurlencode(self::NETSUITE_TOKEN_SECRET);
            $signature = base64_encode(hash_hmac('sha256', $baseString, $key, true));
    
            // Generate OAuth Header
            $headers = [
                'Authorization: OAuth '
                    . 'realm="' . self::NETSUITE_ACCOUNT . '", '
                    . 'oauth_consumer_key="' . self::NETSUITE_CONSUMER_KEY . '", '
                    . 'oauth_token="' . self::NETSUITE_TOKEN_ID . '", '
                    . 'oauth_nonce="' . $oauth_nonce . '", '
                    . 'oauth_timestamp="' . $oauth_timestamp . '", '
                    . 'oauth_signature_method="' . $oauth_signature_method . '", '
                    . 'oauth_version="' . $oauth_version . '", '
                    . 'oauth_signature="' . rawurlencode($signature) . '"',
                'Content-Type: application/json'
            ];
    
            // Call the API
            $curl = curl_init();
            curl_setopt_array($curl, [
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CUSTOMREQUEST => $method,
                CURLOPT_HTTPHEADER => $headers,
                CURLOPT_SSL_VERIFYHOST => false,
                CURLOPT_SSL_VERIFYPEER => false,
                //CURLOPT_VERBOSE =>true,
            ]);
    
            if ($payload) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($payload));
            }
    
            $response = curl_exec($curl);
            if ($response === false) {
                echo 'cURL Error: ' . curl_error($curl);
                return false;
            }
    
            curl_close($curl);
            return json_decode($response, true);
        }
    
        // Generate Base String
        private function generateBaseString($httpMethod, $url, $consumerKey, $tokenKey, $nonce, $timestamp, $version, $signatureMethod, $postParams = null) {
            $baseString = strtoupper($httpMethod) . '&' . rawurlencode($url) . '&';
        
            // Prepare OAuth parameters
            $params = [
                'oauth_consumer_key' => $consumerKey,
                'oauth_token' => $tokenKey,
                'oauth_nonce' => $nonce,
                'oauth_timestamp' => $timestamp,
                'oauth_signature_method' => $signatureMethod,
                'oauth_version' => $version,
            ];
        
     
            // Sort parameters by key
            ksort($params);
        
            // Encode and concatenate parameters
            $encodedParams = [];
            foreach ($params as $key => $value) {
                $encodedParams[] = rawurlencode($key) . '=' . rawurlencode($value);
            }
        
            $baseString .= rawurlencode(implode('&', $encodedParams));

            return $baseString;
        }
        
    }
    
    // Instantiate the API class
    $api = new NetSuiteRestAPI();


        // Call to search a Employee record
        $employeeData=员工InternalID;
        $response = $api->searchEmployee($employeeData);
    
        // Output the response
        if ($response) {
            echo "Response: " . json_encode($response, JSON_PRETTY_PRINT);
          }
    /*
    // Employee data to create
    $employeeData = [
        "firstname" => "R",
        "lastname" => "M"
    ];

    
    // Call to create a new Employee record
    $response = $api->createEmployee($employeeData);
    
    // Output the response
    if ($response) {
        echo "Response: " . json_encode($response, JSON_PRETTY_PRINT);
    } else {
        echo "Call Successfully.";
    }
        */
    
    ?>
    

如果有任何关于NetSuite的问题,欢迎来谈。邮箱:service@truston.group

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android OpenGLES2.0开发(八):Camera预览

严以律己&#xff0c;宽以待人 引言 终于到该章节了&#xff0c;还记得Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始章节说的吗&#xff1f;写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时&#xff0c;总是CtrlC、CtrlV从来没有研究…

独立站干货:WordPress主机推荐

WordPress作为全球最受欢迎的独立站建设平台&#xff0c;提供了灵活性和强大的功能&#xff0c;使得建站变得简单而高效。本文将为您详细介绍WordPress建站的流程&#xff0c;并推荐几款实测后觉得好用的主机商。 WordPress建站流程 域名注册 首先需要注册一个域名&#xff0c…

细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、DMA基础知识 1、DMA简介 (1)DMA控制器 (2)DMA流 (3)DMA请求 (4)仲裁器 (5)DMA传输属性 2、源地址和目标地址 3、DMA传输模式 4、传输数据量的大小 5、数据宽度 6、地址指针递增 7、DMA工作模式 8、DMA流的优先级别 9、FIFO或直接模式 10、单次传输或突…

基于Spring Boot+Vue的多媒体素材管理系统的设计与实现

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

如何禁用关闭奇安信天擎开机自启动教程

前言 公司要求我们员工每个电脑上都要安装奇安信防护软件&#xff0c;但是身为开发&#xff0c;这个软件占内存不说&#xff0c;还禁用我们电脑上todesk等远程软件&#xff0c;因为我们给客户部署的项目&#xff0c;部署的有软件服务&#xff0c;经常需要用到todesk等远程软件…

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一&#xff1a;Mysql 容器化安装 二&#xff1a;Redis 容器化安装 Redis 简介 Redis 容器创建 三&#xff1a;C容器制作 四&#xff1a;容器资源更新 常见问题 一&#xff1a;Mysql 容器化安装 进入 mysql 的镜像网站&#xff0c;查找 mysql 的镜像 mysql docker…

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因&#xff1a; &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 2、使用命令介绍&#xff1a; &#xff08;1&#xff09;SETNX SETNX …

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

【nginx】client timed out和send_timeout的大小设置

websocket连接会断开&#xff0c;抓包检查后发现是中间的代理服务器nginx断开的&#xff0c;同时将后端和浏览器都断开了。将nginx日志调到debug级别后&#xff0c;有下面的断开信息。 [info] 125923#125923: *34 client timed out (110: Connection timed out) while proxyin…

python视频编辑中的蒙版技术:创意与技术相结合

在数字视频编辑的世界里&#xff0c;蒙版技术是一种强大的工具&#xff0c;它允许我们在视频帧上进行精确的编辑和效果叠加。通过蒙版&#xff0c;我们可以控制哪些部分的视频内容被显示或隐藏&#xff0c;从而创造出各种视觉效果和过渡。在本文中&#xff0c;我们将探讨如何使…

前端算法:树(力扣144、94、145、100、104题)

目录 一、树&#xff08;Tree&#xff09; 1.介绍 2.特点 3.基本术语 4.种类 二、树之操作 1.遍历 前序遍历&#xff08;Pre-order Traversal&#xff09;&#xff1a;访问根节点 -> 遍历左子树 -> 遍历右子树。 中序遍历&#xff08;In-order Traversal&#xf…

【代码审计】常见漏洞专项审计-业务逻辑漏洞审计

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x01 漏洞介绍 1、 原理 业务逻辑漏洞是一类特殊的安全漏洞&#xff0c;业务逻辑漏洞属于设计漏洞而非实…

Spring Boot汽车资讯:数字化时代的驾驶

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

目录 一、缓存穿透 1.简介 2.解决方案 3.修改前的代码 4.修改过后的代码 二、缓存雪崩 1.简介 2.解决方案 三、缓存击穿 1.简介 2.解决方案 3.用代码来实现互斥锁来解决缓存击穿 4.用代码来实现逻辑过期解决缓存击穿 四、缓存穿透和缓存击穿的区别 一、缓存穿透 …

FPGA 第7讲 简单组合逻辑译码器

时间&#xff1a;2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程&#xff0c;在编码时&#xff0c;每一种二进制代码&#xff0c;都赋予了特定的含义&#xff0c;即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码&#xff0c;实现译码操…

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook&#xff0c;并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

Docker安装稳定版本nginx-1.26.2

Linux 安装稳定版本nginx-1.20.2 1、下载镜像、场景配置文件目录 [rootTseng ~]# docker pull nginx:1.26.2 1.26.2: Pulling from library/nginx 2d429b9e73a6: Pull complete 40a0d865309c: Pull complete a949b43e642c: Pull complete 8a756fb620a9: Pull complete 93…