PayPal:MALFORMED_REQUEST 没有额外的 activity
PayPal: MALFORMED_REQUEST with no additional activity
以下PHP:
public function processPayment($data)
{
// Create Payer object
$payer = new Payer();
// Payment method is via PayPal. Take the customer to PayPal for processing.
$payer->setPaymentMethod("paypal");
// Create billingAddress as Address object and fill with customer's billing address.
$billingAddress = new Address();
$billingAddress->setLine1($data['payment_address_1'])
->setLine2($data['payment_address_2'])
->setCity($data['payment_city'])
->setState(/* TWO-LETTER STATE POSTAL ABBREV */)
->setPostalCode($data['payment_postcode'])
->setCountryCode(/* COUNTRY CODE */);
// Create PayerInfo object, populate with customer's billing
// info (name, billingAddress, phone, email)
$payerInfo = new PayerInfo();
$payerInfo->setFirstName($data['payment_firstname'])
->setLastName($data['payment_lastname'])
->setBillingAddress($billingAddress)
//->setPhone($data['telephone'])
->setEmail($data['email']);
// Assign payerInfo to payer.
$payer->setPayerInfo($payerInfo);
/**
* List of items sold and their details
* Add shipping address
*/
$itemList = new ItemList();
foreach ($data['products'] as $product)
{
if ($product['product_sku']) {
$item = new Item();
$item->setName($product['product_name'])
->setSku($product['product_sku'])
->setQuantity($product['quantity'])
->setPrice(number_format($product['price'], 2 , "." , "," ))
->setTax(number_format($product['tax'] , 2 , "." , "," ))
->setCurrency($data['currency_code']);
$itemList->addItem($item);
}
}
$shippingAddress = new ShippingAddress();
$shippingAddress->setRecipientName($data['shipping_firstname'].' '.$data['shipping_lastname'])
->setLine1($data['shipping_address_1'])
->setLine2($data['shipping_address_2'])
->setCity($data['shipping_city'])
->setState(/* TWO-LETTER STATE POSTAL ABBREV */)
->setPostalCode($data['shipping_postcode'])
->setCountryCode(/* COUNTRY CODE */);
$itemList->setShippingAddress($shippingAddress);
$details = new Details();
$details->setShipping(number_format($totals['shipping'] , 2 , "." , "," ))
->setTax(number_format($totals['tax'] , 2 , "." , "," ))
->setSubtotal(number_format($totals['subTotal'] , 2 , "." , "," ));
$amount = new Amount();
$amount->setCurrency($data['currency_code'])
->setTotal(number_format($data['total'] , 2 , "." , "," ))
->setDetails($details);
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($itemList)
->setInvoiceNumber($data['invoice_number'])
->setNotifyUrl(/* NOTIFY URL */);
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(/* RETURN URL */)
->setCancelUrl(/* CANCEL URL */);
$payment = new Payment();
$payment->setIntent("sale")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->addTransaction($transaction)
->setPayee($this->payee); // payee created and populated in _constructor
echo '<h1>Redirecting. . . .</h1>';
try {
$payment->create($this->apiContext); // apiContext created and populated in _constructor
} catch (Exception $ex) {
echo $this->PayPalError($ex); // Print detailed error messages
}
echo "<pre>$payment</pre>";
return;
}
结果
Redirecting. . . .
MALFORMED_REQUEST - Incoming JSON request does not map to API request
{
"intent": "sale",
"payer": {
"payment_method": "paypal",
"payer_info": {
"first_name": "Sandbox",
"last_name": "Buyer",
"billing_address": {
"line1": "BILLING ADDRESS LINE 1",
"line2": "",
"city": "CITY",
"state": "ST",
"postal_code": "ZIP",
"country_code": "US"
},
"email": "SANDBOX BUYER EMAIL"
}
},
"redirect_urls": {
"return_url": "RETURN URL",
"cancel_url": "CANCEL URL"
},
"transactions": [
{
"amount": {
"currency": "USD",
"total": "156.00",
"details": {
"shipping": "23.00",
"tax": "0.00",
"subtotal": "133.00"
}
},
"item_list": {
"items": [
{
"name": "PRODUCT NAME",
"sku": "PRODUCT SKU",
"quantity": 1,
"price": "133.00",
"tax": "0.00",
"currency": "USD"
}
],
"shipping_address": {
"recipient_name": "Sandbox Buyer",
"line1": "SHIPPING ADDRESS LINE 1",
"line2": "",
"city": "SHIPPING CITY",
"state": "ST",
"postal_code": "ZIP",
"country_code": "US"
}
},
"invoice_number": 25,
"notify_url": "NOTIFY URL"
}
],
"payee": {
"email": "SANDBOX MERCHANT EMAIL",
"merchant_id": "SANDBOX MERCHANT ID"
}
}
我得到 MALFORMED_REQUEST 和数据转储,没有额外的 activity。用户应该被带到 PayPal(沙盒,在这种情况下)进行支付处理(然后 return 到调用站点。我正在使用 PayPal PHP SDK (REST)。我在哪里从这里去?
我发现 JSON 存在一些可能导致潜在错误的问题。一个导致 MALFORMED_REQUEST 错误,还有两个在修复后可能 运行 进入。
首先,payee 对象实际上位于 transactions 对象之下,因此该节点应如下所示:
"transactions": [{
"amount": {
"currency": "USD",
"total": "156.00",
"details": {
"shipping": "23.00",
"tax": "0.00",
"subtotal": "133.00"
}
},
"payee": {
"email": "SANDBOX MERCHANT EMAIL"
},
"item_list": {
"items": [{
"name": "PRODUCT NAME",
"sku": "PRODUCT SKU",
"quantity": 1,
"price": "133.00",
"tax": "0.00",
"currency": "USD"
}],
"shipping_address": {
"recipient_name": "Sandbox Buyer",
"line1": "SHIPPING ADDRESS LINE 1",
"line2": "",
"city": "SHIPPING CITY",
"state": "ST",
"postal_code": "ZIP",
"country_code": "US"
}
},
"invoice_number": "25",
"notify_url": "NOTIFY URL"
}]
接下来,在您的收款人对象中,您指定电子邮件和 merchant_id。只有其中一个是必需的。添加两者时会发生一点怪癖,并且可能无法正确匹配,从而产生错误。具体错误如下:
{"response":{"name":"PAYEE_ACCOUNT_INVALID","message":"Payee account is invalid.","information_link":"https://developer.paypal.com/docs/api/#PAYEE_ACCOUNT_INVALID","debug_id":"feefw4543a1a5","httpStatusCode":400},"httpStatusCode":400}
最后,invoice_number 需要一个字符串 (https://developer.paypal.com/docs/api/payments/#definition-transaction:v1)。 API端点可能会自动转换它,但最好让它符合要求。
我在上面发布的事务对象应该可以满足您的需求,一旦添加了实际值。
以下PHP:
public function processPayment($data)
{
// Create Payer object
$payer = new Payer();
// Payment method is via PayPal. Take the customer to PayPal for processing.
$payer->setPaymentMethod("paypal");
// Create billingAddress as Address object and fill with customer's billing address.
$billingAddress = new Address();
$billingAddress->setLine1($data['payment_address_1'])
->setLine2($data['payment_address_2'])
->setCity($data['payment_city'])
->setState(/* TWO-LETTER STATE POSTAL ABBREV */)
->setPostalCode($data['payment_postcode'])
->setCountryCode(/* COUNTRY CODE */);
// Create PayerInfo object, populate with customer's billing
// info (name, billingAddress, phone, email)
$payerInfo = new PayerInfo();
$payerInfo->setFirstName($data['payment_firstname'])
->setLastName($data['payment_lastname'])
->setBillingAddress($billingAddress)
//->setPhone($data['telephone'])
->setEmail($data['email']);
// Assign payerInfo to payer.
$payer->setPayerInfo($payerInfo);
/**
* List of items sold and their details
* Add shipping address
*/
$itemList = new ItemList();
foreach ($data['products'] as $product)
{
if ($product['product_sku']) {
$item = new Item();
$item->setName($product['product_name'])
->setSku($product['product_sku'])
->setQuantity($product['quantity'])
->setPrice(number_format($product['price'], 2 , "." , "," ))
->setTax(number_format($product['tax'] , 2 , "." , "," ))
->setCurrency($data['currency_code']);
$itemList->addItem($item);
}
}
$shippingAddress = new ShippingAddress();
$shippingAddress->setRecipientName($data['shipping_firstname'].' '.$data['shipping_lastname'])
->setLine1($data['shipping_address_1'])
->setLine2($data['shipping_address_2'])
->setCity($data['shipping_city'])
->setState(/* TWO-LETTER STATE POSTAL ABBREV */)
->setPostalCode($data['shipping_postcode'])
->setCountryCode(/* COUNTRY CODE */);
$itemList->setShippingAddress($shippingAddress);
$details = new Details();
$details->setShipping(number_format($totals['shipping'] , 2 , "." , "," ))
->setTax(number_format($totals['tax'] , 2 , "." , "," ))
->setSubtotal(number_format($totals['subTotal'] , 2 , "." , "," ));
$amount = new Amount();
$amount->setCurrency($data['currency_code'])
->setTotal(number_format($data['total'] , 2 , "." , "," ))
->setDetails($details);
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($itemList)
->setInvoiceNumber($data['invoice_number'])
->setNotifyUrl(/* NOTIFY URL */);
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(/* RETURN URL */)
->setCancelUrl(/* CANCEL URL */);
$payment = new Payment();
$payment->setIntent("sale")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->addTransaction($transaction)
->setPayee($this->payee); // payee created and populated in _constructor
echo '<h1>Redirecting. . . .</h1>';
try {
$payment->create($this->apiContext); // apiContext created and populated in _constructor
} catch (Exception $ex) {
echo $this->PayPalError($ex); // Print detailed error messages
}
echo "<pre>$payment</pre>";
return;
}
结果
Redirecting. . . .
MALFORMED_REQUEST - Incoming JSON request does not map to API request
{ "intent": "sale", "payer": { "payment_method": "paypal", "payer_info": { "first_name": "Sandbox", "last_name": "Buyer", "billing_address": { "line1": "BILLING ADDRESS LINE 1", "line2": "", "city": "CITY", "state": "ST", "postal_code": "ZIP", "country_code": "US" }, "email": "SANDBOX BUYER EMAIL" } }, "redirect_urls": { "return_url": "RETURN URL", "cancel_url": "CANCEL URL" }, "transactions": [ { "amount": { "currency": "USD", "total": "156.00", "details": { "shipping": "23.00", "tax": "0.00", "subtotal": "133.00" } }, "item_list": { "items": [ { "name": "PRODUCT NAME", "sku": "PRODUCT SKU", "quantity": 1, "price": "133.00", "tax": "0.00", "currency": "USD" } ], "shipping_address": { "recipient_name": "Sandbox Buyer", "line1": "SHIPPING ADDRESS LINE 1", "line2": "", "city": "SHIPPING CITY", "state": "ST", "postal_code": "ZIP", "country_code": "US" } }, "invoice_number": 25, "notify_url": "NOTIFY URL" } ], "payee": { "email": "SANDBOX MERCHANT EMAIL", "merchant_id": "SANDBOX MERCHANT ID" } }
我得到 MALFORMED_REQUEST 和数据转储,没有额外的 activity。用户应该被带到 PayPal(沙盒,在这种情况下)进行支付处理(然后 return 到调用站点。我正在使用 PayPal PHP SDK (REST)。我在哪里从这里去?
我发现 JSON 存在一些可能导致潜在错误的问题。一个导致 MALFORMED_REQUEST 错误,还有两个在修复后可能 运行 进入。
首先,payee 对象实际上位于 transactions 对象之下,因此该节点应如下所示:
"transactions": [{
"amount": {
"currency": "USD",
"total": "156.00",
"details": {
"shipping": "23.00",
"tax": "0.00",
"subtotal": "133.00"
}
},
"payee": {
"email": "SANDBOX MERCHANT EMAIL"
},
"item_list": {
"items": [{
"name": "PRODUCT NAME",
"sku": "PRODUCT SKU",
"quantity": 1,
"price": "133.00",
"tax": "0.00",
"currency": "USD"
}],
"shipping_address": {
"recipient_name": "Sandbox Buyer",
"line1": "SHIPPING ADDRESS LINE 1",
"line2": "",
"city": "SHIPPING CITY",
"state": "ST",
"postal_code": "ZIP",
"country_code": "US"
}
},
"invoice_number": "25",
"notify_url": "NOTIFY URL"
}]
接下来,在您的收款人对象中,您指定电子邮件和 merchant_id。只有其中一个是必需的。添加两者时会发生一点怪癖,并且可能无法正确匹配,从而产生错误。具体错误如下:
{"response":{"name":"PAYEE_ACCOUNT_INVALID","message":"Payee account is invalid.","information_link":"https://developer.paypal.com/docs/api/#PAYEE_ACCOUNT_INVALID","debug_id":"feefw4543a1a5","httpStatusCode":400},"httpStatusCode":400}
最后,invoice_number 需要一个字符串 (https://developer.paypal.com/docs/api/payments/#definition-transaction:v1)。 API端点可能会自动转换它,但最好让它符合要求。
我在上面发布的事务对象应该可以满足您的需求,一旦添加了实际值。