贝宝服务器端确认

Posted

技术标签:

【中文标题】贝宝服务器端确认【英文标题】:PayPal server side confirmation 【发布时间】:2015-01-16 10:08:02 【问题描述】:

这部分对我来说有点新鲜,所以这可能是一个非常明显的答案。我在我的 android 应用程序中使用了 PayPal MPL,在 php 的服务器端我使用它来验证付款:

function verify_paypal($payKey, $appID)

  global $payPalUser_Id, $payPalPassword, $payPalSig, $amount, $currency;
$headerArray = array(
'X-PAYPAL-SECURITY-USERID:'.$payPalUser_Id,
'X-PAYPAL-SECURITY-PASSWORD:'.$payPalPassword,
'X-PAYPAL-SECURITY-SIGNATURE:'.$payPalSig,
'X-PAYPAL-APPLICATION-ID:'.$appID,
'X-PAYPAL-REQUEST-DATA-FORMAT:NV',
'X-PAYPAL-RESPONSE-DATA-FORMAT:XML'
);

$url="https://svcs.paypal.com/AdaptivePayments/PaymentDetails?payKey=$payKey&requestEnvelope.errorLanguage=en_US";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);

$adaptiveResponse = curl_exec($ch);
curl_close($ch);

if (!is_null($adaptiveResponse))

  //check result
  $dom_document = new DOMDocument();
  $dom_document->loadXML($adaptiveResponse);
  $searchNode = $dom_document->getElementsByTagName("responseEnvelope"); 

foreach( $searchNode as $searchNode ) 
 
    $xmlResponse = $searchNode->getElementsByTagName( "ack" ); 
    $valueResponse = $xmlResponse->item(0)->nodeValue; 
 

if (strtolower($valueResponse) =="failure")
      return false;
    

$xml=simplexml_load_string($adaptiveResponse);
$valueCurrency=$xml->currencyCode;
$valueStatus=$xml->status;

$searchNode = $dom_document->getElementsByTagName("receiver"); 

foreach( $searchNode as $searchNode ) 
 
    $xmlAmount = $searchNode->getElementsByTagName( "amount" ); 
    $valueAmount = $xmlAmount->item(0)->nodeValue; 

    $xmlEmail = $searchNode->getElementsByTagName( "email" ); 
    $valueEmail = $xmlEmail->item(0)->nodeValue; 
 

$searchNode = $dom_document->getElementsByTagName("paymentInfo"); 

foreach( $searchNode as $searchNode ) 
 
    $xmlSenderStatus = $searchNode->getElementsByTagName( "senderTransactionStatus" ); 
    $valueSenderStatus = $xmlSenderStatus->item(0)->nodeValue;  
 

if ((strtolower($valueStatus) =="completed")&&(strtolower($valueSenderStatus) =="completed")&&(strtolower($valueEmail) =="mymail@paypal.com")&&($valueAmount==$amount)&&($valueCurrency==$currency))
  return true;
 else 
  return false;


return false;
;

但是使用新的 Android SDK 我得到了一个 PaymentConfirmation 对象:

PaymentConfirmation confirm = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);

我应该如何从确认中获取 $payKey,或者我应该以不同的方式验证付款?

【问题讨论】:

【参考方案1】:

根据您使用的 MSDK 的版本,您可能需要像您使用的那样使用自适应支付或 REST API。请查看此页面以了解如何验证付款https://developer.paypal.com/docs/integration/mobile/verify-mobile-payment/

【讨论】:

好的 - 看起来我需要使用这个:confirm.getProofOfPayment().getPaymentId(); @Diego 通常你会发送到你的服务器 confirm.toJson() 对象,并根据环境的属性获取 payment_id ,然后对 PayPal 服务器执行验证码参见此处的 onActivityResult 示例github.com/paypal/PayPal-Android-SDK/blob/master/docs/…

以上是关于贝宝服务器端确认的主要内容,如果未能解决你的问题,请参考以下文章

贝宝 checkout.js。在哪些情况下选择客户端、服务器端或混合集成?

老男孩教育每日一题-2017年5月8日-请根据以下数字信息,确认相应的端口号,端口号对应的服务名称

练习——网络编程

在后端处理贝宝付款

负载均衡及网络原理

Meteor + React:服务器端路由?