- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试通过 this interactive tutorial page 中的示例找出 PHP SDK .我稍微修改了代码以适应我自己的应用程序的目的并包括我自己的 clientId 和 clientSecret,但不足以构成重大违规。您将在下面的注释代码中看到我所做的更改。
我的问题是 payment->create() 方法不接受我的凭据。它抛出一个 400 代码异常,消息为“无效凭证”。我做错了什么?
代码:(输出如下)
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
//I wrote the PayPalAutoloader and stored it in the PayPal folder.
//the autoloader uses the namespace data to parse the folder structure
//and loads the corresponding object or throws an Exception if the file
//is not found.
require_once 'PayPal-PHP-SDK/PayPalAutoloader.php';
//added my own INI file, where I can store API related values.
$ini = \parse_ini_file('libsec.ini', true);
$clientId = $ini['PayPal']['clientId'];
$clientSecret = $ini['PayPal']['clientSecret'];
//Step 1 of 5 from website
$sdkConfig = [ "mode" => "sandbox"];
$oauthCredential = new \PayPal\Auth\OAuthTokenCredential($clientId, $clientSecret, $sdkConfig);
$apiContext = new \PayPal\Rest\ApiContext($oauthCredential);
//end Step 1 of 5
//observation, apiContext is never actually used in Step 1 and is redefined in Step 2
//I found that to send the request I had to call getAccessToken (not mentioned in interactive tutorial)
$accessToken = $oauthCredential->getAccessToken($sdkConfig);
//peaking at the accessToken value
var_dump( $accessToken );
//Begin Step 2 of 5 from website
//reuse sdkConfig from Step 1, it is unchanged
$credentials = "Bearer {$accessToken}";
$apiContext = new \PayPal\Rest\ApiContext($credentials, 'Request' . time() );
$apiContext->setConfig($sdkConfig);
$payer = new \PayPal\Api\Payer();
$payer->setPaymentMethod("paypal");
$amount = new \PayPal\Api\Amount();
$amount->setCurrency("USD");
$amount->setTotal("483.00");
$transaction = new \PayPal\Api\Transaction();
$transaction->setDescription("Annual Dues");
$transaction->setAmount($amount);
//removed as $baseURL is not actually used by any of the code that follows.
//the results of the code are the same after commenting out the baseURL variable.
//$baseUrl = getBaseUrl();
$rootURL = $ini['General']['rootURL'];
$successfulTransactionURL = $rootURL . $ini['PayPal']['success_bill_pay'];
$cancelledTransactionURL = $rootURL . $ini['PayPal']['cancel_bill_pay'];
$redirectUrls = new \PayPal\Api\RedirectUrls();
$redirectUrls->setReturnUrl($successfulTransactionURL);
$redirectUrls->setCancelUrl($cancelledTransactionURL);
$payment = new \PayPal\Api\Payment();
$payment->setIntent("sale");
$payment->setPayer($payer);
$payment->setRedirectUrls($redirectUrls);
$payment->setTransactions($transaction);
//a var_dump is added in the create method to look at the payment formatted as JSON prior to the
//REST API call.
$result = $payment->create($apiContext);
//peaking at result
var_dump( $result );
?>
</body>
</html>
上面的输出是来自同一次程序运行的 3 个独立的输出实例。第一个字符串是 $accessToken 的 var_dump() 以验证是否正在检索 token 。每次运行都会成功检索此 token ,并且值会更改。
第二个输出是在 Payment::create() 方法中形成的 $json 对象的 var_dump。此 json 对象被传递到 API 系统,以通过 POST 方法对“/v1/payments/payment”的硬编码地址进行 REST 调用。
输出的第三部分是异常,它已传播到屏幕并阻止了 Payment::create() 方法的完成。
最佳答案
经进一步调查,问题出在指定行的 RestHandler 中。代码如下:
if ($credential == null || !($credential instanceof OAuthTokenCredential)) {
throw new PayPalInvalidCredentialException("Invalid credentials passed");
}
但是,当我转储 $credential 变量时,我有:
string 'Bearer A015kCDeXpDfAvtTj7dbRg7ldRk-OdKboQhPaY4EmYu-bRA' (length=54)
SDK 必须从编写教程时开始更新。不幸的是,从 PayPal 的 API 文档到这个交互式教程的链接仍然存在,但该链接已过时。
事实证明,当我在 OAuthTokenCredential 对象上调用“getAccessToken”时,它准备好在将来再次使用。我不需要存储结果并创建一个“Bearer”。 $ token 字符串。我再次使用相同的 OAuthTokenCredential,一切正常。
在寻找解决方案的过程中,我删除了我的代码并从网站上复制了代码,演示修复的工作代码如下:
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
//I wrote the PayPalAutoloader and stored it in the PayPal folder.
//the autoloader uses the namespace data to parse the folder structure
//and loads the corresponding object or throws an Exception if the file
//is not found.
require_once 'PayPal-PHP-SDK/PayPalAutoloader.php';
echo "<h2>Success</h2>";
//added my own INI file, where I can store API related values.
$sdkConfig = array(
"mode" => "sandbox"
);
$cred = new \PayPal\Auth\OAuthTokenCredential("AQkquBDf1zctJOWGKWUEtKXm6qVhueUEMvXO_-MCI4DQQ4-LWvkDLIN2fGsd", "EL1tVxAjhT7cJimnz5-Nsx9k2reTKSVfErNQF-CmrwJgxRtylkGTKlU4RvrX", $sdkConfig);
//storing the result is not needed, because the result automatically updates the same credential object.
//we will use the variable $cred as is and forget about the accessToken. We also will not set a "Bearer" string for the header"
$accessToken = $cred->getAccessToken($sdkConfig);
//peaking at the credential object to verify that the accessToken is listed.
var_dump( $cred );
//peaking at the accessToken value
var_dump($accessToken);
//Begin Step 2 of 5 from website
$sdkConfig = array(
"mode" => "sandbox"
);
//we comment out the redefinition of cred in Step2.... We will use the OAuthtokenCredential from Step 1,
//which is also stored in $cred at this point.
//$cred = "Bearer {$accessToken}";
$apiContext = new \PayPal\Rest\ApiContext($cred, 'Request' . time());
$apiContext->setConfig($sdkConfig);
$payer = new \PayPal\Api\Payer();
$payer->setPaymentMethod("paypal");
$amount = new \PayPal\Api\Amount();
$amount->setCurrency("USD");
$amount->setTotal("12");
$transaction = new \PayPal\Api\Transaction();
$transaction->setDescription("creating a payment");
$transaction->setAmount($amount);
$redirectUrls = new \PayPal\Api\RedirectUrls();
$redirectUrls->setReturnUrl("https://devtools-paypal.com/guide/pay_paypal/php?success=true");
$redirectUrls->setCancelUrl("https://devtools-paypal.com/guide/pay_paypal/php?cancel=true");
$payment = new \PayPal\Api\Payment();
$payment->setIntent("sale");
$payment->setPayer($payer);
$payment->setRedirectUrls($redirectUrls);
$payment->setTransactions(array($transaction));
var_dump( $payment->create($apiContext) );
//the payment object is successfully updated with the payment id.
?>
</body>
</html>
关于php - Paypal 拒绝网站教程中示例代码的凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513110/
我正在做一个关于代码学院的教程,我在这里收到一个错误,说“看起来你的函数没有返回‘唉,你没有资格获得信用卡。资本主义就是这样残酷。’”当收入参数为 75 时。”但是该字符串在控制台中返回(由于某种原因
我正在阅读 Go 的官方教程,但很难理解 Channel 和 Buffered Channels 之间的区别。教程的链接是 https://tour.golang.org/concurrency/2和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
作为 iOS 新手,有大量书籍可以满足学习基础知识的需求。现在,我想转向一些高级阅读,例如 OAuth 和 SQLite 以及动态 API 派生的 TableView 等。您可以推荐任何资源吗? 最佳
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制。在这种赛制下,我们战队会拿到一个或多个服务器。服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有
Memcached是一个自由开源的,高性能,分布式内存键值对缓存系统 Memcached 是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象),这些数据可以是数据库调用、A
Perl 又名实用报表提取语言, 是 Practical Extraction and Report Language 的缩写 Perl 是由 拉里·沃尔(Larry Wall)于19
WSDL 是 Web Services Description Language 的缩写,翻译成中文就是网络服务描述语言 WSDL 是一门基于 XML 的语言,用于描述 Web Services 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在寻找解释在 WPF 中创建自定义用户控件的教程。 我想要一个控件,它结合了一个文本 block 、一个文本框和一个启动通用文件打开对话框的按钮。我已经完成了布局,一切都连接好了。它有效,但它是三
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我接近 fourth page of the Django tutorial 的开始看着vote查看,最后是这样的: # Always return an HttpResponseRedirect a
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否有任何好的 Qt QSS 教程,或者在某个地方我可以看到样式小部件的示例?如果某处可用,我想要一些完整的引用。除了有关如何设置按钮或某些选项卡样式的小教程外,我找不到任何其他内容。 最佳答案 Qt
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!