- 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/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!