Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Paypal Api Do not pass PAY-XXX or PAYID-XXX directly

Everything in my system was in good condition, but since yesterday I get an error like this I could not understand why?

Error: Do not pass PAY-XXX or PAYID-XXX directly into createOrder. Pass the EC-XXX token instead

This is my Smart Payment Button script

<script>
  paypal.Buttons({
        style: {
          layout: 'vertical',
          color: 'black',
          shape: 'rect',
          label: 'paypal',
          tagline: false,
          size: 'responsive',
        },

        createOrder: function() {

          var SETEC_URL = '/api/create-payment';
          var checkBox = document.getElementById("ship_to_different");
          var note = $("#ordernote").val();
          if (checkBox.checked == true) {
            var body = $("#checkoutt, #data").serializeArray();
          } else {
            $('input[name=note]').val(note);
            var body = $("#data").serializeArray();

          }
          $("#wait").show();
          return fetch(SETEC_URL, {
            method: 'post',
            headers: {
              'content-type': 'application/json'
            },
            body: JSON.stringify({
              body: body
            })

          }).then(function(res) {
            return res.json();
          }).then(function(data) {
            return data.id;
          });


        },
        commit: false,
        onApprove: function(data) {

          var EXECUTE_URL = '/api/execute-payment';
          return fetch(EXECUTE_URL, {
            method: 'post',
            headers: {
              'content-type': 'application/json'
            },
            body: JSON.stringify({
              paymentID: data.paymentID,
              payerID: data.payerID,

            })
          }).then(function(response) {
              console.log(response);

              if (response.statusText == 'OK') {
                var checkBox =
                  document.getElementById("ship_to_different");
                var note = $("#ordernote").val();
                if (checkBox.checked == true) {
                  var xdata = $("#checkoutt, #data").serialize();
                } else {
                  $('input[name=note]').val(note);
                  var xdata = $("#data").serialize();
                }
                $.ajax({
                    type: 'post',
                    url: 'check-data',
                    data: xdata,
                    success: function() {
                      $("#wait").hide();
                      $("#success").show();
                    },
                    error: function(request) {
                      json = $.parseJSON(request.responseText);
                      $.each(json.errors, function(key, value) {
                          $('#error' + key).html('');
                          $('#error' + key).append('<p 
                            class = "erro" > '+value+' < /p>');
                          });
                      }
                    });
                }
              })
          }, onError: function(err) {
            console.log(err);
          }
        }).render('#paypal-button-container');
</script>

This is my backend Create-Payment function:

public function createorder(Request $request){

    $body = json_decode(json_encode($request['body']),true);

    foreach($body as $valpay){
        if($valpay['name'] == '_token'){
            unset($valpay);
        }elseif($valpay['name'] == 'title[]'){
            $titlepay[] = $valpay['value'];
        }elseif($valpay['name'] == 'product_id[]'){
            $product_idpay[] = $valpay['value'];
        }elseif($valpay['name'] == 'price[]'){
            $pricepay[] = $valpay['value'];
        }elseif($valpay['name'] == 'quantity[]'){
            $quantitypay[] = $valpay['value'];
        }elseif($valpay['name'] == 'ssh'){
            $shippingpay = $valpay['value'];
        }elseif($valpay['name'] == 'total'){
            $totalpay = $valpay['value'];
        }elseif($valpay['name'] == 'subtotal'){
            $subtotalpay = $valpay['value'];
        }elseif($valpay['name'] == 'tax'){
            $taxpay = $valpay['value'];
        }elseif($valpay['name'] == 'city'){
            $city = $valpay['value'];
        }elseif($valpay['name'] == 'country'){
            $country = $valpay['value'];
        }elseif($valpay['name'] == 'state'){
            $state = $valpay['value'];
        }elseif($valpay['name'] == 'street'){
            $street = $valpay['value'];
        }elseif($valpay['name'] == 'zip'){
            $zip = $valpay['value'];
        }elseif($valpay['name'] == 'coupon'){
            $coupon = $valpay['value'];
        }elseif($valpay['name'] == 'discount'){
            $discount = $valpay['value'];
        }elseif($valpay['name'] == 'data'){
            $data = $valpay['value'];
        }elseif($valpay['name'] == 'x1'){
            $gift = $valpay['value'];
        }elseif($valpay['name'] == 'cost'){
            $cost = $valpay['value'];
        }

    }


    $apiContext = new  ApiContext(
        new OAuthTokenCredential(
            'clientid',
            'secret'
        ));
    $payer = new Payer();
    $payer->setPaymentMethod("paypal");


    if(isset($gift)){
        $item = new Item();
        $item->setName('Gift Coupon')
            ->setCurrency('USD')
            ->setQuantity('1')
            ->setPrice($cost);
        $items[] = $item;
        $subtotalpay = $cost;
        $totalpay = $cost;
    }else{
        foreach ($product_idpay as $key => $p_id){
            $item[$key] = new Item();
            $item[$key]->setName($titlepay[$key])
                ->setCurrency('USD')
                ->setQuantity($quantitypay[$key])
                ->setSku("123123") 
                ->setPrice($pricepay[$key]);
            $items[] = $item[$key];
        }
    }


    if(isset($coupon)){

        $subtotalpay = $coupon;
        $item[$key+1] = new Item();
        $item[$key+1]->setName('Coupon')
            ->setCurrency('USD')
            ->setQuantity("1")
            ->setSku("test") // Similar to `item_number` in Classic API
            ->setPrice('-'.$discount);
        $items[] = $item[$key+1];
    }

    if($taxpay == '1'){
        $tax = round($subtotalpay * 8.625/100,2);

    }else{
        $tax = 0;
    }
    $itemList = new ItemList();
    $itemList->setItems($items);


    $details = new Details();
    $details->setShipping($shippingpay)
        ->setTax($tax)
        ->setSubtotal($subtotalpay);

    $amount = new Amount();
    $amount->setCurrency("USD")
        ->setTotal($totalpay)
        ->setDetails($details);

    $transaction = new Transaction();
    $transaction->setAmount($amount)
        ->setItemList($itemList)
        ->setDescription("Payment description")
        ->setInvoiceNumber(uniqid());

    $redirectUrls = new RedirectUrls();
    $redirectUrls->setReturnUrl("http://homee.test/checkout")
        ->setCancelUrl("http://homee.test/checkout");

    $inputFields = new InputFields();
    $inputFields->setNoShipping(1);

    $webProfile = new WebProfile();
    $webProfile->setName('test'. uniqid())->setInputFields($inputFields);
    $webProfileId = $webProfile->create($apiContext)->getId();
    $payment = new Payment();
    $payment->setExperienceProfileId($webProfileId);
    $payment->setIntent("sale")
        ->setPayer($payer)
        ->setRedirectUrls($redirectUrls)
        ->setTransactions(array($transaction));

    $request = clone $payment;

    try {
        $payment->create($apiContext);
    } catch (PayPalConnectionException $ex) {
        echo $ex->getCode(); // Prints the Error Code
        echo $ex->getData(); // Prints the detailed error message
        die($ex);
    } catch (Exception $ex) {
        die($ex);
    }

    $approvalUrl = $payment->getApprovalLink();

    return $payment;
}

And this is Execute-Payment function

public function execute(Request $request){

    $apiContext = new ApiContext(
        new OAuthTokenCredential(
            'clientid',
            'secret'
        ));


    $paymentId = $request->paymentID;
    $payment = Payment::get($paymentId, $apiContext);

    $execution = new PaymentExecution();
    $execution->setPayerId($request->payerID);

    try{
        $result = $payment->execute($execution, $apiContext);
        $res = $result->transactions[0]->related_resources[0]->sale->id;
        $res2 = $result->transactions[0]->invoice_number;
        $res3 = $result->getId();

        Transactions::create([
            'ip' => \Request::ip(),
            'transaction_id' => $res,
            'invoice_id' => $res2,
            'payment_id' => $res3
        ]);
        Refunds::create([
            'ip' => \Request::ip(),
            'transaction_id' => $res,
            'invoice_id' => $res2,
            'payment_id' => $res3,
            'amount' => '0'
        ]);

    }catch (Exception $e){
        echo $e->getMessage();
        exit(1);
    }


}

public function validateorder(Request $request)
{
    if($request['status']) {
        $messages = array(
            'zip' => 'Post Code Field is Required.'
        );
        $validator = Validator::make($request->all(), [
            'street' => 'required',
            'city' => 'required',
            'state' => 'required',
            'zip' => 'required',


        ]);
    }elseif($request['guest']) {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required',
            'country' => 'required',
            'phone' => 'required',
            'street' => 'required',
            'city' => 'required',
            'state' => 'required',
            'zip' => 'required',


        ]);
    }elseif($request['x1']) {
        $validator = Validator::make($request->all(), [
            'email' => 'required'

        ]);
    }
        try
        {
            if ($validator->fails()) {
                return response()->json($validator->errors(), 422);
            }
        }
        catch (\Exception $e){
        }

    }

What is wrong?

like image 772
Energy40 Avatar asked Sep 01 '25 10:09

Energy40


1 Answers

If any one getting same problem like this i was able to find work around from this one now i have tried the solution with python but i think if any one can do the same thing from any other language

payPal sending us a array of link so what i am doing is getting the link from the list

    {
   "intent":"sale",
   "payer":{
      "payment_method":"paypal"
   },
   "redirect_urls":{
      "return_url":"http://localhost:3000/payment/execute",
      "cancel_url":"http://localhost:3000/"
   },
   "transactions":[
      {
         "amount":{
            "total":"5.00",
            "currency":"USD"
         },
         "description":"This is the payment transaction description.",
         "item_list":{
            "items":[
               {
                  "name":"item",
                  "sku":"item",
                  "price":"5.00",
                  "currency":"USD",
                  "quantity":1
               }
            ]
         },
         "related_resources":[
            
         ]
      }
   ],
   "id":"PAYID-MG5D3JA33asdasdasdasdASDASD815R",
   "state":"created",
   "create_time":"2021-12-15T19:10:28Z",
   "links":[
      {
         "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAYID-MG5SSDASDASDSADSAKD564815R",
         "rel":"self",
         "method":"GET"
      },
      {
         "href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-5K121231232094281T",
         "rel":"approval_url",
         "method":"REDIRECT"
      },
      {
         "href":"https://api.sandbox.paypal.com/v1/payments/payment/PAYID-MG5ADSADASDASDSA4564815R/execute",
         "rel":"execute",
         "method":"POST"
      }
   ]
}

then i am getting the array of links and search for

approval_url Then do small regex/search and get the code

token = ''

links = payment.links
for i in links:
    if(i.rel=="approval_url"):
        token = i.href.split("EC-",1)[1]
return token

and if you pass this one it will work. i don't know why PayPal send this inside a URL this makes it extra work to retrieve but it's work. hope this one helps any one since we can't find this in documentation in PayPal

like image 163
Thalinda Bandara Avatar answered Sep 03 '25 01:09

Thalinda Bandara