تصویر محمدعلی اکبری
آموزش توسعه ماژول پرداخت برای Drupal Commerce

معرفی روش پرداخت بانک پاسارگاد به Drupal Commerce

 

function commerce_pasargad_commerce_payment_method_info() {
  $payment_methods = array();

  $payment_methods['commerce_pasargad'] = array(
      'method_id' => 'commerce_pasargad',
      'title' => t('Pasargad Bank Gateway'),
      'display_title' => '<span id="commerce-pasargad-method-button">' . t('Pasargad') . '</span>',
      'short_title' => t('Pasargad'),
      'description' => t('Redirect users to submit payments through Pasargad.'),
      'active' => TRUE,
      'terminal' => FALSE,
      'offsite' => TRUE,
      'offsite_autoredirect' => TRUE,
  );

  return $payment_methods;
}

 

در صورتی که بخواهیم کاربر بعد از انتخاب روش پرداخت از طریق درگاه پاسارگاد و قبل از انتقال به درگاه بانک پاسارگاد فعالیتی را در سایت انجام دهد (مثلا فرمی را پر کند) باید مقدار offsite_autoredirect را FALSE قرار دهیم و HOOKهای لازم را بنویسیم، در این مثال نیازی به گرفتن اطلاعات دیگر از کاربر نیست و تنها کار لازم انتقال کاربر به درگاه بانک برای انجام عملیات پرداخت است.
فرم تنظیمات روش پرداخت و دریافت اطلاعات حساب فروشگاه:

 

function commerce_pasargad_settings_form($settings = NULL) {

  $settings += array(
      'gateway_address' => 'https://epayment.bankpasargad.com/gateway.aspx',
      'result_gateway_address' => 'https://epayment.bankpasargad.com/CheckTransactionResult.aspx',
      'merchant_code' => '000000',
      'terminal_code' => '000000',
      'private_key' => '<RSAKeyValue>...</RSAKeyValue>',
  );

  $form['merchant_code'] = array(
      '#type' => 'textfield',
      '#title' => t('Merchant Code'),
      '#default_value' => $settings['merchant_code'],
      '#description' => t('Merchant code is provided by Pasargad'),
      '#required' => TRUE,
  );

  $form['terminal_code'] = array(
      '#type' => 'textfield',
      '#title' => t('Terminal Code'),
      '#default_value' => $settings['terminal_code'],
      '#description' => t('Terminal code is provided by Pasargad'),
      '#required' => TRUE,
  );

  $form['gateway_address'] = array(
      '#type' => 'textfield',
      '#title' => t('Gateway Address'),
      '#default_value' => $settings['gateway_address'],
      '#description' => t('Gateway address is provided by Pasargad'),
      '#required' => TRUE,
  );

  $form['result_gateway_address'] = array(
      '#type' => 'textfield',
      '#title' => t('Result Gateway Address'),
      '#default_value' => $settings['result_gateway_address'],
      '#description' => t('Result gateway address is provided by Pasargad'),
      '#required' => TRUE,
  );

  $form['private_key'] = array(
      '#type' => 'textarea',
      '#title' => t('Private Key'),
      '#default_value' => $settings['private_key'],
      '#description' => t('Private key is provided by Pasargad'),
      '#required' => TRUE,
  );

  return $form;
}

 

ارسال کاربر به درگاه بانک پاسارگاد:

 

function commerce_pasargad_redirect_form($form, &$form_state, $order, $payment_method) {
  module_load_include('inc', 'commerce_pasargad', 'inc/pasargad');

  $total = field_get_items('commerce_order', $order, 'commerce_order_total');
  $date_time = date("Y/m/d H:i:s");
  $redirectAddress = url('checkout/' . $order->order_id . '/payment/return/' . $order->data['payment_redirect_key'], array('absolute' => TRUE));
  $data = "#" . $payment_method['settings']['merchant_code'] .
          "#" . $payment_method['settings']['terminal_code'] .
          "#" . $order->order_id .
          "#" . $date_time .
          "#" . $total[0]['amount'] .
          "#" . $redirectAddress .
          "#" . '1003' .
          "#" . $date_time . "#";
  $data = sha1($data, true);
  $processor = new RSAProcessor($payment_method['settings']['private_key'], RSAKeyType::XMLString);
  $data = $processor->sign($data);
  $sign = base64_encode($data);

  $form['#action'] = $payment_method['settings']['gateway_address'];
  $form['invoiceNumber'] = array(
      '#type' => 'hidden',
      '#value' => $order->order_id,
  );
  $form['invoiceDate'] = array(
      '#type' => 'hidden',
      '#value' => $date_time,
  );
  $form['amount'] = array(
      '#type' => 'hidden',
      '#value' => $total[0]['amount'],
  );
  $form['terminalCode'] = array(
      '#type' => 'hidden',
      '#value' => $payment_method['settings']['terminal_code'],
  );
  $form['merchantCode'] = array(
      '#type' => 'hidden',
      '#value' => $payment_method['settings']['merchant_code'],
  );
  $form['redirectAddress'] = array(
      '#type' => 'hidden',
      '#value' => $redirectAddress,
  );
  $form['timeStamp'] = array(
      '#type' => 'hidden',
      '#value' => $date_time,
  );
  $form['action'] = array(
      '#type' => 'hidden',
      '#value' => '1003',
  );
  $form['sign'] = array(
      '#type' => 'hidden',
      '#value' => $sign,
  );

  // Submit button.
  $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Proceed to Pasargad Bank Gateway'),
      '#weight' => 50,
  );
  return $form;
}

 

 بازگشت کاربر از درگاه بانک، دریافت و ذخیره نتیجه تراکنش:

 

function commerce_pasargad_redirect_form_validate($order, $payment_method) {
  module_load_include('inc', 'commerce_pasargad', 'inc/pasargad');
  $response = $_GET;
  if ($order->order_id != $response['iN']) {
    watchdog('commerce_pasargad', t('$order->order_id != iN'), array(), WATCHDOG_ERROR);
    commerce_payment_redirect_pane_previous_page($order);
    return FALSE;
  }
  $postback = post2https($response['tref'], $payment_method['settings']['result_gateway_address']);
  $postback = makeXMLTree($postback);
  $result = $postback['resultObj']['result'];
  if ($result !== 'True') {
    watchdog('commerce_pasargad', t('$result !== True'), array(), WATCHDOG_ERROR);
    commerce_pasargad_transaction($payment_method, $order, $response, COMMERCE_PAYMENT_STATUS_FAILURE);
    commerce_payment_redirect_pane_previous_page($order);
    return FALSE;
  }
  // Process the payment.
  commerce_pasargad_transaction($payment_method, $order, $response, COMMERCE_PAYMENT_STATUS_SUCCESS);
  commerce_payment_redirect_pane_next_page($order);
  return TRUE;
}

 

function commerce_pasargad_transaction($payment_method, $order, $response, $transaction_status) {
  $total = field_get_items('commerce_order', $order, 'commerce_order_total');
  $transaction = commerce_payment_transaction_new('commerce_pasargad', $order->order_id);
  $transaction->instance_id = $payment_method['instance_id'];
  $transaction->amount = $total[0]['amount'];
  $transaction->currency_code = 'IRR';
  $transaction->remote_id = $response['tref'];

  $transaction->status = $transaction_status;
  if ($transaction_status == COMMERCE_PAYMENT_STATUS_SUCCESS) {
    $transaction->message = 'Transaction accepted with id @transaction_id';
  } elseif ($transaction_status == COMMERCE_PAYMENT_STATUS_FAILURE) {
    $transaction->message = 'Error for the transaction with id @transaction_id';
  }
  $transaction->message_variables = array(
      '@transaction_id' => $response['tref'],
  );
  commerce_payment_transaction_save($transaction);
}

دیدگاه‌ها

تصویر farhad

farhad (تایید نشده)

مرسی
من الان دانلود کردم ماژول پاسارگاد رو، چیکار باید بکنم!؟

تصویر mohammadreza

mohammadreza (تایید نشده)

damet garm kheili khoob bood

تصویر امین

امین (تایید نشده)

سلام
آیا روش پرداخت برای ماژول بانک سامان هم به همین ترتیب هست؟ یا شبیه به بانک ملت هست بیشتر؟

تصویر محمدعلی اکبری

محمدعلی اکبری

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

تصویر امین

امین (تایید نشده)

بنظرم شبیه بانک ملت هست اینم مستندات ممنون میشم تو همین وبلاگتون راهنمایی کنین
http://www.sep.ir/images/form/SamanMPSpecifications87.pdf
http://www.sep.ir/sample.zip

تصویر محمدعلی اکبری

محمدعلی اکبری

کاملا شبیه به ماژول بانک ملت هست. در صورتی که برای توسعه این ماژول کمک نیاز داشتید، من هستم. شناسه من در سایت دروپال، بیت باکت و گیت هاب: mohamadaliakbari

تصویر امین

امین (تایید نشده)

سلام من اینو دیدم تو github ولی تازه هست و هنوز تکمیل نشده
https://github.com/3ehzad/Commerce_sb24

تصویر محمدعلی اکبری

محمدعلی اکبری

سلام. آدرسی که ارسال کرده بودید شامل هیچ کدی نبود. اما فکر میکنم توسعه دهنده آن به زودی ماژول را منتشر خواهد کرد. برای همین منتظر انتشارش در آدرسی که ارسال کردید هستیم.
مستندات سامان را دوباره مطالعه کردم. خیلی ساده تر از ملت و پاسارگاد است. http://blog.rastasoft.ir/fa/node/74

تصویر معصومه

معصومه (تایید نشده)

سلام دوستان
کسی کد اسکریپت بانک ملی را دارد ؟
من می خواهم روی کامرس پیاده سازی کنم
سپاسگدارم

تصویر علی

علی (تایید نشده)

سلام و درود و وقت بخیر
اگر ماژول پرداخت بانک ملی برای کامرس موجود است بفرمایید بنده نیاز دارم.
هزینش چقدره؟
ممنون

تصویر حامد

حامد (تایید نشده)

سلام،
من از ماژول پرداخت بانک سامان که نوشتید استفاده می کنم.
مشکل اینجاست که بعد از اینکه از وب سایت بانک برگشت میخورم به وب سایت خودم این خطا رو دریافت میکنم:
Uncoated error.
Payment failed at the payment server. Please review your information and try again.
تراکنش ها هم چون بعد از نیم ساعت به بانک تاییدی از سمت سایت من فرستاده نمیشه، بانک همه پول ها رو به حساب مشتری ها بر میگردونه!
خوشحال می شم راهنمایی بفرمایید

تصویر محمدعلی اکبری

محمدعلی اکبری

سلام، در این مورد لازمه کدها و درخواست های روی سایت شما  debug بشه که به دلیل مشغله زیاد فعلا نمیتونم کمکتون بکنم. این ماژول کار میکنه و شکلی نداره باید مشکل رو پیدا کرد که گیر کجاست.

تصویر حامد

حامد (تایید نشده)

سلام مجدد،
من تو این مدت کدهای ماژولتون رو بررسی کردم و دیدم Uncoated error موقعی که commerce_saman_redirect_form_validate فراخوان می شود و مشکل می خوره آن پیامها (که در پست قبلی توضیح دادم ) نمایش داده میشه.
از آنجاییکه Host من در خارج از ایران هست، آیا ممکن است که مخابرات ارتباط میان وب سایت من و بانک را یه طوری بگیره و باعث این مشکل بشود؟ آیا لازم است که Host ام رو بیارم تو ایران؟

با تشکر

افزودن نظر جدید