In your CI controller, if you wrote your code as follows:
function paypalipn(){ $this->load->model('subscription'); $this->load->library('paypal', array('sandbox' => true));; $this->paypal->run(); $fields = $this->paypal->post_fields; if($this->paypal->verified){ $data = array( 'user_id' => $fields['buyer_id'], 'txn_id' => $fields['txn_id'], 'payment_gross' => $fields['mc_gross'], 'currency_code' => $fields['mc_currency'], 'payer_email' => $fields['payer_email'], 'plan_id' => $fields['item_number'], 'payment_status' => $fields['payment_status'] ); $this->subscription->create_payment($data); $this->load->library('email'); $this->email->to('*******@gmail.com'); $this->email->from('**************'); $this->email->subject('PayPal IPN'); $this->email->message($this->paypal->result."\nAmount: ".$fields['mc_gross']."\nCurrency: ".$fields['mc_currency']."\nUser ID: ".$fields['buyer_id']); $this->email->send(); } }
OR if you stopped the script if the if statement failed
if($this->paypal->verified){ $data = array( 'user_id' => $fields['buyer_id'], 'txn_id' => $fields['txn_id'], 'payment_gross' => $fields['mc_gross'], 'currency_code' => $fields['mc_currency'], 'payer_email' => $fields['payer_email'], 'plan_id' => $fields['item_number'], 'payment_status' => $fields['payment_status'] ); $this->subscription->create_payment($data); } else { exit("We are sad to inform you that verification FAILED. Bye!"); }
you would not receive any email. The problem is the public function run() in your paypal class, and this is most likely the bad part.
if ( !($res = curl_exec($ch)) ) { curl_close($ch); die('curl did not work<br>'.FCPATH.'cacert.pem'); } curl_close($ch); if (strcmp ($res, "VERIFIED") == 0) { $this->verified = true; }
Try rewriting it like this:
$res=curl_exec($ch); // define $res if($res==null){ // check if $res is null exit('curl did not work<br>'.FCPATH.'cacert.pem'); } curl_close($ch); if (strcmp ($res, "VERIFIED") === 0) { $this->verified = true; }
Regarding the last 3 lines where strcmp() , and based on a custom comment in strcmp() documentation.
- strcmp () will return NULL on failure.
- This has the side effect of equating coincidence when using comparative comparison (==).
- Instead, you can test for matches using an identical comparison (===), which should not capture NULL returns.
What does the foregoing mean? In a small example.
if(null==0) { echo "1"; } if(null===0) { echo "2"; }
The above example will output => 1 , which in your case means that if strcmp() fails, you must set verified to true , which is incorrect.