paypalPHP并行支付时如何显示商品描述和收货地址?

How to display item description and shipping address during paypal PHP parallel payment?

我必须实现一个商家网站,客户通过 paypal 向卖家支付一些 material 商品和服务费,如图所示。

我知道我需要使用自适应支付(并行或链接)并且 REST API 尚不支持这些支付(如果我错了请纠正我)。

经典API(NVP/SOAP)的问题是,在网页将客户重定向到paypal时,paypal不显示任何项目名称或描述。另一个问题是,当客户登录时没有显示运输信息,并且在购买后没有向卖家发送送货地址。

感谢任何帮助。谢谢。

注意:照片是我网站上没有达到的效果。

注意2:我想使用he/she用户在设置paypal账户时使用的送货地址,而不是在我制作API 个电话来自 PHP

谢谢!

P.S。一些进行此类付款的网站在重定向 url 到 paypal 时有 https://www.paypal.com/us/cgi-bin/merchantpaymentweb?cmd=_flow&SESSION=.....

您可以在没有自适应支付 API 的情况下进行 并行支付 Express Checkout API 为您提供了添加多个收件人的选项。

如果您在 API 调用中使用 NVP 字符串,则可以执行以下操作以拥有 2 个接收器:

$nvpreq="METHOD=" . $METHOD //required
. "&VERSION=" . $VERSION  //required
. "&PWD=" . $PWD  //required
. "&USER=" . $USER  //required
. "&SIGNATURE=" . $SIGNATURE  //required
. "&RETURNURL=" . $RETURNURL  //required
. "&CANCELURL=" . $CANCELURL  //required    

. "&PAYMENTREQUEST_0_DESC=" . $OVERALLDESCRIPTION  //optional but best practices
. "&PAYMENTREQUEST_0_PAYMENTACTION=" . $PAYMENTACTION //optional but best practices
. "&PAYMENTREQUEST_0_AMT=" . $TOTALAMT //required = PAYMENTREQUEST_0_ITEMAMT + PAYMENTREQUEST_0_SHIPPINGAMT + PAYMENTREQUEST_0_TAXAMT + PAYMENTREQUEST_0_INURANCEAMT
. "&PAYMENTREQUEST_0_ITEMAMT=" . $TOTALITEMAMT  //optional but best practice = (L_PAYMENTREQUEST_0_AMT0 x L_PAYMENTREQUEST_0_QTY0) + (L_PAYMENTREQUEST_0_AMT1 x L_PAYMENTREQUEST_0_QTY1)
. "&PAYMENTREQUEST_0_SHIPPINGAMT=" . $SHIPPINGAMOUNT  //optional but best practices
. "&PAYMENTREQUEST_0_CURRENCYCODE=" . $CURRENCYCODE  //optional but best practices
. "&PAYMENTREQUEST_0_TAXAMT=" . $TAX  //optional but best practices

//1st seller information, specific to parallel payment
. "&PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID=" . $SELLER1
. "&PAYMENTREQUEST_0_PAYMENTREQUESTID=" . $UNIQUESELLERID1

. "&PAYMENTREQUEST_0_NOTIFYURL=" . $IPNURL  //optional but best practices

//Line items - (optional)
. "&L_PAYMENTREQUEST_0_NAME0=" . $DESCRIPTION1 //optional but best practices
. "&L_PAYMENTREQUEST_0_DESC0=" . $DESCRIPTION1 //optional but best practices
. "&L_PAYMENTREQUEST_0_AMT0=" . $PAYMENTREQUEST_AMT1 //optional but best practices
. "&L_PAYMENTREQUEST_0_QTY0=" . $PAYMENTQUANTITY1 //optional but best practices

. "&L_PAYMENTREQUEST_0_NAME1=" . $DESCRIPTION2 //optional but best practices
. "&L_PAYMENTREQUEST_0_DESC1=" . $DESCRIPTION2 //optional but best practices
. "&L_PAYMENTREQUEST_0_AMT1=" . $PAYMENTREQUEST_AMT2 //optional but best practices
. "&L_PAYMENTREQUEST_0_QTY1=" . $PAYMENTQUANTITY2 //optional but best practices

. "&L_PAYMENTREQUEST_0_NAME2=" . $DISCOUNTTXT //optional but best practices
. "&L_PAYMENTREQUEST_0_DESC2=" . $DISCOUNTTXT //optional but best practices
. "&L_PAYMENTREQUEST_0_AMT2=" . $DISCOUNTAMT //optional but best practices
. "&L_PAYMENTREQUEST_0_QTY2=" . $DISCOUNTQTY //optional but best practices

//Address information
. "&PAYMENTREQUEST_0_SHIPTONAME=" . $SHIPPINGNAME
. "&PAYMENTREQUEST_0_SHIPTOSTREET=" . $SHIPPINGSTREET
. "&PAYMENTREQUEST_0_SHIPTOSTREET2=" . $SHIPPINGSTREET2
. "&PAYMENTREQUEST_0_SHIPTOCITY=" . $SHIPPINGCITY
. "&PAYMENTREQUEST_0_SHIPTOSTATE=" . $SHIPPINGSTATE
. "&PAYMENTREQUEST_0_SHIPTOZIP=" . $SHIPPINGZIPCODE
. "&PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE=" . $SHIPPINGCOUNTRYCODE
. "&PAYMENTREQUEST_0_SHIPTOPHONENUM=" . $SHIPTOPHONENUM

//2nd seller information
. "&PAYMENTREQUEST_1_DESC=" . $DESCRIPTIONSELLER2
. "&PAYMENTREQUEST_1_PAYMENTACTION=" . $PAYMENTACTIONSELLER2
. "&PAYMENTREQUEST_1_AMT=" . $AMOUNTSELLER2
. "&PAYMENTREQUEST_1_ITEMAMT=" . $AMOUNTSELLER2
. "&PAYMENTREQUEST_1_CURRENCYCODE=" . $CURRENCYCODESELLER2
. "&PAYMENTREQUEST_1_SELLERPAYPALACCOUNTID=" . $SELLER2
. "&PAYMENTREQUEST_1_PAYMENTREQUESTID=" . $UNIQUESELLERID2

. "&L_PAYMENTREQUEST_1_NAME0=" . $DESCRIPTIONSELLER2
. "&L_PAYMENTREQUEST_1_DESC0=" . $DESCRIPTIONSELLER2
. "&L_PAYMENTREQUEST_1_AMT0=" . $AMOUNTSELLER2
. "&L_PAYMENTREQUEST_1_QTY0=" . $QUANTITYSELLER2
. "&L_PAYMENTREQUEST_1_ITEMCATEGORY0=Digital"


//Payment page settings
. "&ALLOWNOTE=" . $ALLOWNOTE
. "&ADDROVERRIDE=" . $ADDROVERRIDE
. "&NOSHIPPING=" . $NOSHIPPING
. "&LOCALECODE=" . $LOCALECODE
. "&LANDINGPAGE=" . $LANDINGPAGE;

如您所见,我们有两个接收器,但您可以添加更多。对于每个接收者,您可以添加将显示在付款页面上的行项目。

在这个例子中,我只为第一个接收者添加行项目。如果您想为第二个接收者添加行项目,只需将以下内容添加到 NVP 字符串:

. "&L_PAYMENTREQUEST_1_NAME0=" . $DESCRIPTION1 //optional but best practices
    . "&L_PAYMENTREQUEST_1_DESC0=" . $DESCRIPTION1 //optional but best practices
    . "&L_PAYMENTREQUEST_1_AMT0=" . $PAYMENTREQUEST_AMT1 //optional but best practices
    . "&L_PAYMENTREQUEST_1_QTY0=" . $PAYMENTQUANTITY1 //optional but best practices

一旦用户 return 返回您的网站 (return url),调用 GetExpressCheckout API 并将结果存储在变量中:

$nvpreq="USER=" . $_SESSION['USER'] 
. "&PWD=" . $_SESSION['PWD'] 
. "&SIGNATURE=" . $_SESSION['SIGNATURE']
. "&METHOD=GetExpressCheckoutDetails"
. "&VERSION=" . $_SESSION['VERSION']      
. "&TOKEN=" . $_SESSION['PP_TOKEN']
;
//Send the NVP string to the PayPal server, store the result in a variable.
$resultECD = ....

最终使用 GetExpressCheckout 结果构建 NVP 字符串并调用 DoExpressCheckoutPayment:

$nvpDoECReq="USER=" . $_SESSION['USER'] 
. "&PWD=" . $_SESSION['PWD'] 
. "&SIGNATURE=" . $_SESSION['SIGNATURE']
. "&METHOD=DoExpressCheckoutPayment"      
. "&PAYMENTREQUEST_0_PAYMENTACTION=" . $_SESSION['PAYMENT_ACTION'];     // payment type

//Build the DoExpressCheckout request
foreach ($resultECD as $i => $value) {  
//Ignore some elements of the GetExpressCheckoutDetails answer
    if ((!($i == "CHECKOUTSTATUS")) && (!($i == "TIMESTAMP")) && (!($i == "CORRELATIONID")) && (!($i == "ACK")) && (!($i == "BUILD"))) {
                    $nvpDoECReq = $nvpDoECReq . "&" . urldecode($i) . "=" . urldecode($value);
    }
}