- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个集成到 PayPal 的 REST API 中的 PHP 应用程序。我已正确处理事务并将事务 ID 保存到 MySQL 数据库中。我现在正尝试退款,但无法让它停止给出“传入的 JSON 请求未映射到 API 请求”错误。有没有人对如何让它工作有任何建议?
我在代码中留下了我的一些尝试,并对它们的结果进行了评论。我对让这个工作的方向感到有点迷茫。任何帮助将不胜感激。
我一直在关注位于此处的文档: https://developer.paypal.com/docs/integration/direct/payments/refund-payment/
我可能很难将该请求适应 PHP。
我找到了这段代码: https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample/payments/RefundCapture.php
但它“需要”一棵文件树,对于一个简单的退款请求来说似乎有点过分。
<?php
require_once(dirname(__FILE__) . '/paypalSDK/autoload.php'); // require paypal files
require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/common.php'); // require paypal files
// call required stuff
use PayPal\Api\Address;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\ExecutePayment;
use PayPal\Api\FundingInstrument;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\PaymentCard;
use PayPal\Api\PaymentExecution;
use PayPal\Api\Transaction;
use PayPal\Api\Capture;
use PayPal\Api\Refund;
use PayPal\Api\RefundRequest;
use PayPal\Api\Sale;
$orderID = $_GET['order_id']; // order ID we wish to refund
// pull the details from the database so we have the transaction refund ID
$refQ = mysql_query("SELECT * FROM orders WHERE orders_ID = $orderID", $db);
$refC = mysql_num_rows($refQ);
if(!empty($refC)){
$refR = mysql_fetch_assoc($refQ);
$refNumber = $refR['orders_transaction_ref']; // paypal transaction ID
$FinalTotal = $refR['orders_order_total']; // order total
// paypal credentials
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
'abc',
'xyz'
)
);
$apiContext->setConfig(array('mode' => 'live',)); // live use, not sandbox
//$amount = new Amount(); // commenting these out seemingly has no effect
//$amount->setCurrency("USD") // commenting these out seemingly has no effect
// ->setTotal($FinalTotal); // commenting these out seemingly has no effect
$refund = new Refund(); // if I comment these 2 lines out, I get "refund cannot be null"
$refund->setAmount($FinalTotal); // if I comment these 2 lines out, I get "refund cannot be null"
$sale = new Capture(); // if I comment these 2 lines out, I get "Call to a member function refund() on a non-object"
$sale->setId($refNumber); // if I comment these 2 lines out, I get "Call to a member function refund() on a non-object"
$refundRequest = new RefundRequest(); // commenting these out seemingly has no effect
$refundRequest->setAmount($FinalTotal); // commenting these out seemingly has no effect
//$captureRefund = $sale->refundCapturedPayment($refundRequest, $apiContext); // failure, error 400
try {
$sale->refund($refund, $apiContext);
//$sale->refundCapturedPayment($refund, $apiContext); // failure, error 400
} catch (Exception $ex) {
echo '<pre style="font-size:16px;">';
var_dump($ex);
echo '</pre>';
exit();
die;
}
}
2017 年 3 月 8 日下午 12:23 更新
我似乎取得了“一些”进步,尽管我不严格地使用这个词。状态返回为“已完成”,但退款实际上并未发生。它也不会像示例所示那样返回父支付 ID。对此有什么想法吗?我仍在努力让它发挥作用。
这是我目前从 PayPal 获得的结果:
object(PayPal\Api\Refund)#3 (1) {
["_propMap":"PayPal\Common\PayPalModel":private]=>
array(5) {
["id"]=>
string(17) "123456789123456789"
["create_time"]=>
string(20) "2017-03-06T20:56:32Z"
["state"]=>
string(9) "completed"
["amount"]=>
object(PayPal\Api\Amount)#9 (1) {
["_propMap":"PayPal\Common\PayPalModel":private]=>
array(3) {
["total"]=>
string(4) "0.02"
["currency"]=>
string(3) "USD"
["details"]=>
object(PayPal\Api\Details)#13 (1) {
["_propMap":"PayPal\Common\PayPalModel":private]=>
array(1) {
["subtotal"]=>
string(4) "0.02"
}
}
}
}
["links"]=>
array(1) {
[0]=>
object(PayPal\Api\Links)#17 (1) {
["_propMap":"PayPal\Common\PayPalModel":private]=>
array(3) {
["href"]=>
string(59) "https://api.paypal.com/v1/payments/refund/123456789123456789"
["rel"]=>
string(4) "self"
["method"]=>
string(3) "GET"
}
}
}
}
}
下面是目前返回上述响应的代码...
require_once(dirname(__FILE__) . '/paypalSDK/autoload.php'); // require paypal files
require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/bootstrap.php'); // require paypal files
require_once(dirname(__FILE__) . '/paypalSDK/paypal/rest-api-sdk-php/sample/common.php'); // require paypal files
// call required stuff
use PayPal\Api\Address;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\ExecutePayment;
use PayPal\Api\FundingInstrument;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\PaymentCard;
use PayPal\Api\PaymentExecution;
use PayPal\Api\Transaction;
use PayPal\Api\Capture;
use PayPal\Api\Refund;
use PayPal\Api\RefundRequest;
use PayPal\Api\Sale;
$orderID = $_GET['order_id']; // internal order ID we wish to refund
// pull the details from database so we have the PayPal transction ID
$refQ = mysql_query("SELECT * FROM orders WHERE orders_ID = $orderID", $db);
$refC = mysql_num_rows($refQ);
if(!empty($refC)){
$refR = mysql_fetch_assoc($refQ);
$refNumber = $refR['orders_transaction_ref']; // PayPal transaction ID
// attempted 'PAY-' ID, results in "Requested resource ID was not found."
// $refNumber = $refR['orders_payment_ref']; // ex. PAY-123456789012345678901234
$FinalTotal = $refR['orders_order_total']; // order total
// paypal credentials
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
'abc',
'xyz'
)
);
$apiContext->setConfig(array('mode' => 'live',)); // live use, not sandbox
//$amount = new Amount(); // commenting these out seemingly has no effect
//$amount->setCurrency("USD") // commenting these out seemingly has no effect
// ->setTotal($FinalTotal); // commenting these out seemingly has no effect
/*
// attempted code
// ### Refund object
$refund = new Refund();
//$refund = new RefundRequest();
$refund->setAmount($FinalTotal);
*/
$refund = new Refund();
$refund->setId($refNumber);
$refund->setSaleId($refNumber);
$refund->setAmount($FinalTotal);
$refund->setReason("Testing refund code");
//$refund->get($refNumber, $apiContext);
// Attempted code, didn't work
// https://stackoverflow.com/questions/18927591/paypal-api-how-to-get-sale-id-and-refund-payment-made-via-paypal
// Fatal error: Uncaught exception 'InvalidArgumentException' with message 'paymentId cannot be null' in /home/cartridgeworkspl/public_html/cfx_controllers/paypalSDK/paypal/rest-api-sdk-php/lib/PayPal/Validation/ArgumentValidator.php:25 Stack trace: #0
// $payments = Payment::get($refNumber, $apiContext);
// $payments->getTransactions();
// $obj = $payments->toJSON();//I wanted to look into the object
// $paypal_obj = json_decode($obj);//I wanted to look into the object
// $transaction_id = $paypal_obj->transactions[0]->related_resources[0]->sale->id;
// $this->refund($transaction_id);//Call your custom refund method
try {
//var_dump($refund);
$refundResponse = Refund::get($refNumber, $apiContext);
echo '<pre>';
var_dump($refundResponse);
echo '</pre>';
echo $refundResponse->getState();
echo $refundResponse->getReasonCode();
} catch (Exception $ex) {
// NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
ResultPrinter::printError("Get Payment", "Payment", null, null, $ex);
exit(1);
}
}
如有任何帮助,我们将不胜感激。
最佳答案
文档:https://developer.paypal.com/docs/api/quickstart/refund-payment/#set-the-refund-object
要进行付款和退款,请使用:paypal/rest-api-sdk-php
首先,您付款时,必须是“sale”。
[...]
$payment = new Payment();
$payment->setIntent('sale')
->setPayer($payer)
->setRedirectUrls($redirect_urls)
->setTransactions(array($transaction));
[...]
PayPal 将返回带有“paymentId”值的付款,您需要保存它。
退款示例。
//Previosly saved payments ID.
$paymentId = 'PI_Fv54vfd45';
//Create API connection
$apiContext = new ApiContext(new OAuthTokenCredential($paypalConf['client_id'], $paypalConf['secret']));
$apiContext->setConfig($paypalConf['settings']);
//Get sale from payment
$paypalPayment = new Payment();
$paymentInfo = $paypalPayment->get($paymentId, $apiContext);
$transactions = $paymentInfo->getTransactions();
if(empty($transactions[0])){
return false;
}
$relatedResources = $transactions[0]->getRelatedResources();
if(empty($relatedResources[0])){
return false;
}
$sale = $relatedResources[0]->getSale();
$refund = new Refund();
$amt = (new Amount())->setTotal(100)->setCurrency('EUR');
$refund->setAmount($amt);
$refund->setReason('Sale refund');
$refundedSale = $sale->refund($refund, $apiContext);
return ($refundedSale->getState() === 'completed');
关于php - 使用 PHP PayPal REST API 退款?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42588772/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!