2017-02-21 48 views
1

以下PHP:貝寶:MALFORMED_REQUEST沒有其它活動

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和數據轉儲,不需要額外的活動。用戶應該被帶到PayPal(在這種情況下是Sandbox)進行支付處理(然後返回到調用網站。我正在使用PayPal PHP SDK(REST)。我該從哪裏出發?

回答

0

我可以看到一些可能導致潛在錯誤的JSON問題,一種是導致MALFORMED_REQUEST錯誤,另一種是您修復該問題後可能遇到的錯誤。

首先,收款人對象實際上會在下面交易對象,這樣的節點應該是這個樣子:

"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端點可以自動轉換它,但最好讓它符合要求。

的交易對象我上面貼應該爲你的工作需要,一旦實際值在增加。

+0

有意思,[SDK源文件](http://paypal.github.io/PayPal-PHP- SDK/docs /)指示收款人對象可以分配給交易或付款,但他們不顯示何時使用。 –

+0

這解決了錯誤信息問題。仍然沒有把用戶帶到PayPal。 –

+0

我會看看Github文檔,看看如何解決這個問題。當你嘗試重定向時發生了什麼?有沒有產生錯誤? –