PayPal JavaScript SDK 客户端不发布到服务器

Posted

技术标签:

【中文标题】PayPal JavaScript SDK 客户端不发布到服务器【英文标题】:PayPal JavaScript SDK client side does not post to server 【发布时间】:2019-07-29 15:45:44 【问题描述】:

我应该如何使用 paypal SDK 将 orderID 发布到服务器?示例代码在 localhost 和远程主机上都不起作用。我提交 PayPal 按钮后,帖子为空。

据此, https://developer.paypal.com/docs/checkout/integrate/#6-verify-the-transaction

PayBundle\Resources\actions\ppal\ppalAction_brt_stkovr.php

<?php

use PayBundle\actions\Order;  

echo "<br><br> POST ="; print_r($_POST);  
file_put_contents( PHP_EOL . PHP_EOL . __DIR__ .'/out.php', json_encode( $_POST ) .' from '.__FILE__, FILE_APPEND );

include_once ( PATH_ACTIONS_PAY . '/ppal/__init.php' );
include_once ( PATH_ACTIONS_PAY . '/ppal/__payAInit.php' );

require_once PATH_VENDOR . '/braintree/braintree_php/lib/Braintree.php';

use Sample\PayPalClient; 
use PayPalCheckoutSdk\Orders\OrdersGetRequest;

Braintree_Configuration::environment( 'sandbox' );
Braintree_Configuration::merchantId( 'x' );
Braintree_Configuration::publicKey( 'y' );
Braintree_Configuration::privateKey( 'z' );


if( isset($_POST['payPp'] ) )   

    include_once ( PATH_ACTIONS_PAY . '/ppal/pay/'.$this->vdArr['lang'].'/__Bk.php' ); 
    echo "<br> from ppalAction orderID = "; print_r($this->vdArr['orderID']);

    if ( !count(debug_backtrace()) ) 
        $ppalOrder = new GetOrder();
        $ppalOrder->getOrder( $this->vdArr['orderID'], true);
     // if ( !count(debug_backtrace())  

 // if( isset($_POST['paypalA'] ) ) 

else 
    $this->vdArr['tokenPpal'] = Braintree_ClientToken::generate(); 

客户端代码:

<script type='text/javascript'  >

window.onload = function() 

    paypal.Buttons(

        createOrder: function(data, actions) 
          return actions.order.create(
            purchase_units: [
              amount: 
                value: '0.01'
              
            ]
          );  
        ,

        onApprove: function( data, actions ) 
            return actions.order.capture().then( function(details) 
                //alert('Transaction completed by ' + details.payer.name.given_name);
                // Call your server to save the transaction
                //console.log('Transaction completed' ); alert(details); 
                console.log( 'data.orderID = ' + data.orderID ); 
                document.getElementById('orderID').value = data.orderID;
                console.log('data'); console.log(data); 
                console.log('Transaction completed by ' + details.payer.name.given_name );
                //return fetch('/paypal-transaction-complete', 
                return fetch( 'https://typejoy.biz/pay/ppal_1025/EN/pay', 
                    method: 'POST',
                    body: JSON.stringify(
                        orderID: data.orderID,
                        payPp: 1
                    )
                ); // return fetch( 'https://typejoy.biz/pay/ppal_1025/EN/pay
            ); // return actions.order.capture().then( function(details
         // onApprove: function(data, actions

      ).render('#payPp');  

 // window.onload = function() 
</script>

在 clinet 端控制台中,我可以记录 orderID,但我不明白如何将其传递到服务器端。获取功能如何工作?我应该使用其他类型的功能吗?如何以正确的方式做到这一点?

【问题讨论】:

【参考方案1】:

问题似乎是我的服务器端既不处理 JSON 请求,也不生成 JSON 响应。官方文档提供了fetch 的示例。

有两种解决方案 - 为 fetch 制作适当的后端或使用不同的方法,如下所示:

paypal.Buttons(

createOrder: function( data, actions ) 
  return actions.order.create(
    purchase_units: [
      amount: 
        value: '0.01'
      
    ]
  );  
,

onApprove: function( data, actions ) 
    return actions.order.capture().then( function(details) 
        //alert('Transaction completed by ' + details.payer.name.given_name);
        // Call your server to save the transaction
        //console.log('Transaction completed' ); alert(details); 
        console.log( 'data.orderID = ' + data.orderID ); 
        document.getElementById('orderID').value = data.orderID;
        console.log('data'); console.log(data); 
        console.log('Transaction completed by ' + details.payer.name.given_name );

        var form = document.getElementById('ppalForm'); // $("#paymentForm"); 
        var btn = document.createElement("input");
        btn.type = "submit";
        btn.id = "submitPp";
        btn.value= 1;
        form.appendChild(btn); // container.appendChild(input);
        //form.append("<input hidden id='payPp' name='payPp' value='1' />");
        console.log('form ='); console.log(form); 
        form.submit();

     ); // return actions.order.capture().then( function(details
 // onApprove: function(data, actions

).render('#payPp');

main_view.php

<form  id='ppalForm' method='POST' action='<?php echo $payPpFrmAction; ?>' >
<div id='payPp' >
//.. here goes form fields

</form>

action.php

use PayBundle\actions\Order;  

if( isset($_POST['payPp'] ) ) 

    //if ( !count(debug_backtrace()) ) 
        $ppalOrder = new GetOrder();
        $ppalOrder->getOrder( $this->vdArr['orderID'], true);
    // // if ( !count(debug_backtrace())  

 else 
  $tokenPpal = Braintree_ClientToken::generate();

//传递给查看表单,在客户端获取

【讨论】:

【参考方案2】:

.fetch 方法返回一个承诺。

你得到“什么都没有”,因为它是一个异步方法,你需要以不同的方式处理它。

您的服务器 POST 的响应已返回,但位置和方式不同。

有一个 PayPal 页面记录了这一点:https://developer.paypal.com/docs/checkout/reference/upgrade-integration/

但让我给你举个例子。

假设您的 POST 响应返回一个 JSON 对象:

POST https://mystore.com/api/paypal/set-express-checkout

  foo: "bar"
  bar: "baz"

您的 PayPal 自定义 Javascript 代码可能如下所示:

paypal.Buttons(
  createOrder: function() 
    var SETEC_URL = 'https://mystore.com/api/paypal/set-express-checkout';

    return fetch(SETEC_URL, 
      method: 'post',
      headers: 
        'content-type': 'application/json'
      
    ).then(function(res) 
      //basic response metadata is here
      //res.ok
      //res.redirected
      //res.status
      //res.type
      //res.statusText
      return res.json();
    ).then(function(data) 
      //your whole POST response is available as `data` attribute here
      //data.foo
      //data.bar
      return data.token;
    );
  
).render('#paypal-button-container');

【讨论】:

以上是关于PayPal JavaScript SDK 客户端不发布到服务器的主要内容,如果未能解决你的问题,请参考以下文章

PayPal JavaScript SDK - 了解客户端的安全问题

错误:使用 intent=capture 来使用客户端捕获 [Paypal Javascript SDK]

Paypal javascript sdk - 送货地址

如何使用 PayPal 的 SDK(Java 或 JavaScript)实现两步或更少步完成订单?

paypal rest sdk - 取消付款只提供令牌

为凭证 IOS SDK 2.1.6 设置 Paypal 客户端 ID