رفتن به مطلب

مشکل در طراحی درگاه پرداخت


پست های پیشنهاد شده

با سلام

من دارم درگاه پرداخت افزونه ای رو که پی پال هستش رو به پی لاین تبدیل میکنم و چند تا مشکل دارم (افزونه وردپرس نیست)

تمامی موارد ارسال به درگاه و انجام تراکنش رو تونستم پیاده کنم مشکل من بعد انجام تراکنش که به سایت مبدا برمیگیرده هستش

دو مشکل دارم

1. پی لاین دو متغیر رو به با متد پست برگشت میزنه حالا نمیدونم این دو متغیر رو کجای این فایل قرار بدم


$trans_id = $_POST['trans_id'];
$id_get = $_POST['id_get'];

2. متغیر های برگشتی پی پال چیه که با اونا جایگزین کنم؟


class Payment_gateway_ext_paypalController extends Controller
{
// the extension instance
public $extension;

/**
* Process the IPN
*/
public function actionIpn()
{
if (!Yii::app()->request->isPostRequest) {
$this->redirect(array('price_plans/index'));
}

$postData = Yii::app()->params['POST'];
if (!$postData->itemAt('custom')) {
Yii::app()->end();
}
$transaction = PricePlanOrderTransaction::model()->findByAttributes(array(
'payment_gateway_transaction_id' => $postData->itemAt('custom'),
'status' => PricePlanOrderTransaction::STATUS_PENDING_RETRY,
));

if (empty($transaction)) {
Yii::app()->end();
}

$newTransaction = clone $transaction;
$newTransaction->transaction_id = null;
$newTransaction->transaction_uid = null;
$newTransaction->isNewRecord = true;
$newTransaction->date_added = new CDbExpression('NOW()');
$newTransaction->status = PricePlanOrderTransaction::STATUS_FAILED;
$newTransaction->payment_gateway_response = print_r($postData->toArray(), true);
$newTransaction->payment_gateway_transaction_id = $postData->itemAt('txn_id');

$model = $this->extension->getExtModel();
$postData->add('cmd', '_notify-validate');
$request = AppInitHelper::simpleCurlPost($model->getModeUrl(), $postData->toArray());

if ($request['status'] != 'success') {
$newTransaction->save(false);
Yii::app()->end();
}

$paymentStatus = strtolower(trim($postData->itemAt('payment_status')));
$paymentPending = strpos($paymentStatus, 'pending') === 0;
$paymentFailed = strpos($paymentStatus, 'failed') === 0;
$paymentSuccess = strpos($paymentStatus, 'completed') === 0;

$verified = strpos(strtolower(trim($request['message'])), 'verified') === 0;
$sameEmail = $postData->itemAt('receiver_email') == $model->email;
$order = $transaction->order;

if ($order->status == PricePlanOrder::STATUS_COMPLETE) {
$newTransaction->save(false);
Yii::app()->end();
}

if (!$verified || !$sameEmail || $paymentFailed) {
$order->status = PricePlanOrder::STATUS_FAILED;
$order->save(false);

$transaction->status = PricePlanOrderTransaction::STATUS_FAILED;
$transaction->save(false);

$newTransaction->save(false);

Yii::app()->end();
}

if ($paymentPending) {
$newTransaction->status = PricePlanOrderTransaction::STATUS_PENDING_RETRY;
$newTransaction->save(false);
Yii::app()->end();
}

$order->status = PricePlanOrder::STATUS_COMPLETE;
$order->save(false);

$transaction->status = PricePlanOrderTransaction::STATUS_SUCCESS;
$transaction->save(false);

$newTransaction->status = PricePlanOrderTransaction::STATUS_SUCCESS;
$newTransaction->save(false);
Yii::app()->end();
}
}

ویرایش شده توسط مریم مقبولی
لینک به ارسال

دوست عزیز شما کوئری custom پی پال رو با چه متغیری جایگزین کردید و به بانک فرستادید ؟

چون یکی از قسمت های اصلی کد برگشت شما مربوط به کد زیره :


$transaction = PricePlanOrderTransaction::model()->findByAttributes(array(
'payment_gateway_transaction_id' => $postData->itemAt('custom'),
'status' => PricePlanOrderTransaction::STATUS_PENDING_RETRY,
));

یعنی وقتی از بانک بر میگرده میخواد اول تراکنش مربوطه که وضعیتش pending هست رو از روی $_POST['custom'] پیدا کنه و بعدش بیاد از روی وضعیت پی لاین تراکنش رو یا رد کنه یا تایید کنه ... فایل ارسال به بانک رو هم بذارید .

لینک به ارسال

ببخشید من اصلا از php سر در نمیارم

فایل ارسال به بانک


<?php defined('MW_PATH') || exit('No direct script access allowed');
// PAYLINE SENDER
function send($url,$api,$amount,$redirect){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,"api=$api&amount=$amount&redirect=$redirect");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
function get($url,$api,$trans_id,$id_get){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,"api=$api&id_get=$id_get&trans_id=$trans_id");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
//PAYLINE SEND
$url = 'http://payline.ir/payment/gateway-send';
$api = 'adxcv-zzadq-polkjsad-opp13opoz-1sdf455aadzmck1244567';
$amount = round($order->total, 2);
$redirect = $notifyUrl;
$result = send($url,$api,$amount,$notifyUrl);
switch($result){
case '-1':
echo 'ERROR';
break;
case '-2':
echo 'ERROR';
break;
case '-3':
echo 'ERROR';
break;
case '-4':
echo 'ERROR';
break;
}
?>
<form id="paypal-hidden-form" action="http://payline.ir/payment/gateway-<?php echo $result; ?>" data-order="/script/panel/customer/index.php/price-plans/order" method="post">
<?php
echo CHtml::hiddenField('payline-api', 'adxcv');
echo CHtml::hiddenField('cmd', '_xclick');
echo CHtml::hiddenField('item_name', Yii::t('price_plans', 'Price plan').': '. $order->plan->name);
echo CHtml::hiddenField('item_number', $order->plan->uid);
echo CHtml::hiddenField('amount', round($order->total, 2));
echo CHtml::hiddenField('currency_code', $order->currency->code);
echo CHtml::hiddenField('no_shipping', 1);
echo CHtml::hiddenField('cancel_return', $cancelUrl);
echo CHtml::hiddenField('return', $returnUrl);
echo CHtml::hiddenField('notify_url', $notifyUrl);
echo CHtml::hiddenField('custom', $customVars);
?>
<p class="text-muted well well-sm no-shadow" style="margin-top: 10px;">
Paypal - www.paypal.com <br />
<?php echo Yii::t('ext_payment_gateway_paypal', 'You will be redirected to pay securely on paypal.com official website!');?>
</p>
<p><button class="btn btn-success pull-right"><i class="fa fa-credit-card"></i> <?php echo Yii::t('price_plans', 'Submit payment')?></button></p>
<?php echo CHtml::endForm(); ?>

فایل کامل افزونه

لینک به ارسال

ببینید اینکه php بلد نیستید یکم لقمه بزرگی برداشتید چون برای کار با این اسکریپت با فریمورک یی نوشته شده باید با معماری MVC هم آشنایی داشته باشید .... خب منم که فرصت نمیکنم از شما اسکریپتشو بگیرم و نصبش کنم ولی راهنماییتون میکنم یکم تلاش کنید راحت به نتیجه میرسید ....

اول از همه شما باید متغیر هایی که تو برگشت از بانک لازم دارید رو به سمت بانک بفرستید و در برگشت از بانک ازش پس بگیرید ... پس به صورت زیر کوئری میکنیم . ( باید جایگزین متغیر redirect تو فایل ارسال به بانک کنید)


//باید متغیر های مورد نظر در برگشت رو به صورت کوئری بفرستید و بعدش هم پس بگیرید .
$redirect = $notifyUrl.'?custom='.$customVars.'&price='.$amount;
//یا میتونید سشن کنید که کوئری بهتره به نظرم

الان ما 2 متغیر custom و قیمت رو میفرستیم برای بازگشت از بانک ...

خب کد زیر هم با فرض اینکه اون کدی که گذاشته بودید توی پست اول واقعا کد های بررسی برگشت باشه و اشتباه نکرده باشید باید به صورت زیر استفاده کنید :


<?php
class Payment_gateway_ext_paypalController extends Controller
{
// the extension instance
public $extension;

/**
* Process the IPN
*/
public function actionIpn()
{
if (!Yii::app()->request->isPostRequest) {
$this->redirect(array('price_plans/index'));
}

$postData = Yii::app()->params['POST'];
/*
if (!$postData->itemAt('custom')) {
Yii::app()->end();
}
*/


// بررسی وضعیت تراکنش توسط پی لاین
$apiID = ''; //api پی لاین
$Amount = $_GET['price'];
$url = 'http://payline.ir/payment/gateway-result-second';
$id_get = isset($_POST['id_get']) ? $_POST['id_get'] : $postData->itemAt('id_get');
$trans_id = isset($_POST['trans_id']) ? $_POST['trans_id'] : $postData->itemAt('trans_id');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, "api=$apiID&id_get=$id_get&trans_id=$trans_id");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
curl_close($ch);
if ($res == 1) {
// تراکنش موفق است
$stat = 'completed';
$transaction_id = $trans_id;
$fault = 0;
}
else if ( $res == -1 || $res == -2 || $res == -3 ) {
// تراکنش ناموفق است
$stat = 'failed';
$transaction_id = $trans_id;
$fault = $res;
}
else {
// تراکنش انصرافی کاربر است
$stat = 'cancelled';
$transaction_id = $trans_id;
$fault = 0;
}
// اتمام بررسی وضعیت پی لاین


// فراخونی کوئری custom
$custom = $_GET['custom'];

//پیدا کردن تراکنش از روی custom
$transaction = PricePlanOrderTransaction::model()->findByAttributes(array(
'payment_gateway_transaction_id' => $custom,
'status' => PricePlanOrderTransaction::STATUS_PENDING_RETRY,
));


if (empty($transaction)) {
Yii::app()->end();
}

$newTransaction = clone $transaction;
$newTransaction->transaction_id = null;
$newTransaction->transaction_uid = null;
$newTransaction->isNewRecord = true;
$newTransaction->date_added = new CDbExpression('NOW()');
$newTransaction->status = PricePlanOrderTransaction::STATUS_FAILED;
$newTransaction->payment_gateway_response = print_r($postData->toArray(), true);
// $newTransaction->payment_gateway_transaction_id = $postData->itemAt('txn_id');

$newTransaction->payment_gateway_transaction_id = $transaction_id;



$model = $this->extension->getExtModel();
$postData->add('cmd', '_notify-validate');
$request = AppInitHelper::simpleCurlPost($model->getModeUrl(), $postData->toArray());

/*
if ($request['status'] != 'success') {
$newTransaction->save(false);
Yii::app()->end();
}
*/


// $paymentStatus = strtolower(trim($postData->itemAt('payment_status')));
// $paymentPending = strpos($paymentStatus, 'pending') === 0;
// $paymentFailed = strpos($paymentStatus, 'failed') === 0;
// $paymentSuccess = strpos($paymentStatus, 'completed') === 0;

// $verified = strpos(strtolower(trim($request['message'])), 'verified') === 0;
// $sameEmail = $postData->itemAt('receiver_email') == $model->email;
$order = $transaction->order;

// اگر تراکنش از قبل تکمیل شده بود که هیچی بیخیال ولی .....
if ($order->status == PricePlanOrder::STATUS_COMPLETE) {
$newTransaction->save(false);
Yii::app()->end();
}


// if (!$verified || !$sameEmail || $paymentFailed) {


// اگر وضعیت پی لاین ناموفق بود ... وضعیت ناموفق رو ثبت کن
if ( $stat == 'failed') {
$order->status = PricePlanOrder::STATUS_FAILED;
$order->save(false);

$transaction->status = PricePlanOrderTransaction::STATUS_FAILED;
$transaction->save(false);

$newTransaction->save(false);

Yii::app()->end();
}

// if ($paymentPending) {


// اگر وضعیت پی لاین کنسل شده بود همونطوری تو وضعیت پندینگ بمونه
if ( $stat == 'cancelled') {

$newTransaction->status = PricePlanOrderTransaction::STATUS_PENDING_RETRY;
$newTransaction->save(false);
Yii::app()->end();
}


/// اگر هیچ کدوم از وضعیت های بالا نبود پس موفق بوده ... موفق بودنش رو ثبت کن ..
$order->status = PricePlanOrder::STATUS_COMPLETE;
$order->save(false);

$transaction->status = PricePlanOrderTransaction::STATUS_SUCCESS;
$transaction->save(false);

$newTransaction->status = PricePlanOrderTransaction::STATUS_SUCCESS;
$newTransaction->save(false);
Yii::app()->end();
}
}

سعی کردم قسمت های مختلفشو توضیح بدم روی کد که راحت تر به نتیجه برسید ..

موفق باشید .

ویرایش شده توسط HANNANStd
لینک به ارسال

سعی کردم قسمت های مختلفشو توضیح بدم روی کد که راحت تر به نتیجه برسید ..

موفق باشید .

ممنون دوست عزیز

خیلی کمکم کرد بالاخره یه چیزی پیاده میکنم.

فرم هنگام ارسال به بانک input هیدن هایی نیز فراخوانی میکند فک کنم باید از طریق آنان کوئری رو ست کنم


<form id="paypal-hidden-form" action="http://payline.ir/payment/gateway--4" data-order="/script/panel/customer/index.php/price-plans/order" method="post">
<input type="hidden" value="adxcv" name="payline-api" id="payline-api"><input type="hidden" value="_xclick" name="cmd" id="cmd">
<input type="hidden" value="Price plan: نام" name="item_name" id="item_name">
<input type="hidden" value="yh75689k414df" name="item_number" id="item_number"><input type="hidden" value="1000" name="amount" id="amount"><input type="hidden" value="IRT" name="currency_code" id="currency_code"><input type="hidden" value="1" name="no_shipping" id="no_shipping">
<input type="hidden" value="customer/index.php/price-plans/index" name="cancel_return" id="cancel_return">
<input type="hidden" value="customer/index.php/price-plans/index" name="return" id="return">
<input type="hidden" value="customer/index.php/payment-gateways/paypal/ipn" name="notify_url" id="notify_url">
<input type="hidden" value="3a4a1dc0387912e08df0b0d86d2b4e2374179ee4" name="custom" id="custom">
<p class="text-muted well well-sm no-shadow" style="margin-top: 10px;">
Paypal - www.paypal.com <br>
You will be redirected to pay securely on paypal.com official website!</p>
<p><button class="btn btn-success pull-right"><i class="fa fa-credit-card"></i> Submit payment</button></p>
</form>

ویرایش شده توسط مریم مقبولی
لینک به ارسال

سعی کردم قسمت های مختلفشو توضیح بدم روی کد که راحت تر به نتیجه برسید ..

موفق باشید .

ببخشید باز یه مشکل پیش اومد

بعد از اینکه بانک به سایت مبدا برگشت میزنه لینک اینجوری میشه


customer/index.php/payment-gateways/paypal/ipn?custom=557b5434f287b641858bf21ac0c578bd10b501eb

price نمیدونم چرا نیومد تو آدرس. درحالی که متغییر rediect رو اینجوری تنظیم کرده بودم.


//PAYLINE SEND
$url = 'http://payline.ir/payment/gateway-send';
$api = 'f707e-1f2a4-f3ba5-6102d-bc302c72af8f3e52a87c31e83336';
$amount = round($order->total, 2);
$redirect = $notifyUrl.'?custom='.$customVars.'&price='.$amount;
echo $redirect;
$result = send($url,$api,$amount,$redirect);

حالا price رو بیخیال من تو فایل برگشت که برام ست کردید به طور دستی price رو تنظیم کردم

ولی صفحه سفید میاد

خواستم ببینم تو اطلاعات مشکلی هست یا نه متغییر های زیر رو echo کردم


echo $res;
$custom = $_GET['custom'];
echo $custom;
echo $stat;

و اینا چاپ میشه


1
557b5434f287b641858bf21ac0c578bd10b501eb
completed

پس میشه نتیجه گرفت مشکل از ثبت توی سیستم هست

بسیاری از کد هارو خودتون تو // قرار دادید؟ کاربردی ندارن اونا؟

لینک به ارسال

فک کنم این فایل هم نسبت در ثبت بی ربط نیست

ممنون میشم بهش یه نگاه بندازید.


class PaypalPaymentHandler extends PaymentHandlerAbstract
{
// render the payment form
public function renderPaymentView()
{
$order = $this->controller->getData('order');
$model = $this->extension->getExtModel();

$cancelUrl = Yii::app()->createAbsoluteUrl('price_plans/index');
$returnUrl = Yii::app()->createAbsoluteUrl('price_plans/index');
$notifyUrl = Yii::app()->createAbsoluteUrl('payment_gateway_ext_paypal/ipn');

$assetsUrl = Yii::app()->assetManager->publish(Yii::getPathOfAlias($this->extension->getPathAlias()) . '/assets/customer', false, -1, MW_DEBUG);
Yii::app()->clientScript->registerScriptFile($assetsUrl . '/js/payment-form.js');

$customVars = sha1(StringHelper::uniqid());
$view = $this->extension->getPathAlias() . '.customer.views.payment-form';

$this->controller->renderPartial($view, compact('model', 'order', 'cancelUrl', 'returnUrl', 'notifyUrl', 'customVars'));
}

// mark the order as pending retry
public function processOrder()
{
$request = Yii::app()->request;

if (strlen($request->getPost('custom')) != 40) {
return false;
}

$transaction = $this->controller->getData('transaction');
$order = $this->controller->getData('order');

$order->status = PricePlanOrder::STATUS_PENDING;
$order->save(false);

$transaction->payment_gateway_name = 'Paypal - www.paypal.com';
$transaction->payment_gateway_transaction_id = $request->getPost('custom');
$transaction->status = PricePlanOrderTransaction::STATUS_PENDING_RETRY;
$transaction->save(false);

$message = Yii::t('payment_gateway_ext_paypal', 'Your order is in "{status}" status, it usually takes a few minutes to be processed and if everything is fine, your pricing plan will become active!', array(
'{status}' => Yii::t('orders', $order->status),
));

if ($request->isAjaxRequest) {
return $this->controller->renderJson(array(
'result' => 'success',
'message' => $message,
));
}

Yii::app()->notify->addInfo($message);
$this->controller->redirect(array('price_plans/index'));
}
}

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...