>

URL로 리디렉션하고 싶습니다 (Sermepa/Redsys)를 POST 및 컨트롤러의 일부 양식 매개 변수와 함께 사용하십시오. 프로세스는 일부 데이터를 수집하는 양식을 제출하고 사용자가이 양식을 제출하면 컨트롤러로 리디렉션됩니다. 이 컨트롤러에서 게시 데이터를 준비한 다음 POST를 사용하여 은행 게이트웨이로 리디렉션하고 싶습니다.

<?php
namespace Drupal\mymodule_sermepa_redsys\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\mymodule_sermepa_redsys\RedsysAPI;
use Drupal\node\NodeInterface;
/**
 * Class DoPaymentController.
 */
class DoPaymentController extends ControllerBase {
  public function doPayment(NodeInterface $node = null) {
    if ($node!==null) {
    
      $redsys = new RedsysAPI();
      $config = \Drupal::config('sermepa_redsys.settings');      
      // Completamos los datos para la petición
      $redsys->setParameter("DS_MERCHANT_AMOUNT", $config->get('ammount'));
      $redsys->setParameter("DS_MERCHANT_ORDER", $node->id());
      $redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $config->get('merchant_code'));
      $redsys->setParameter("DS_MERCHANT_CURRENCY", $config->get('currency'));
      $redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $config->get('transaction_type'));
      $redsys->setParameter("DS_MERCHANT_TERMINAL", $config->get('terminal'));
      $redsys->setParameter("DS_MERCHANT_MERCHANTURL", $config->get('url'));
      $redsys->setParameter("DS_MERCHANT_URLOK", $config->get('merchant_url_ok'));
      $redsys->setParameter("DS_MERCHANT_URLKO", $config->get('merchant_url_ko'));
      $version= $config->get('version');
      $kc = $config->get('merchant_password');
      
      $params = $redsys->createMerchantParameters();
      $signature = $redsys->createMerchantSignature($kc);
      
      $post_data['Ds_SignatureVersion'] = $version;
      $post_data['Ds_MerchantParameters'] = $params;
      $post_data['Ds_Signature'] = $signature;
      
      $client = \Drupal::httpClient();          
      $response = $client->request('POST', $config->get('url_webservice'), ['form_params' => $post_data]);
      return $response;
      
    }
    else {
      return [
        '#markup' => t('Error. No nid'),
      ];
    }
  }
}

내가 예상 한 것은 양식을 sumbit 한 후 컨트롤러가 호출 된 다음 사용자가 은행 지불 페이지로 리디렉션되었습니다. 양식은 사용자 정의 컨텐츠 유형의 "만들기 노드"입니다. 내 .module 파일에서 사용자 정의 제출을 ​​추가했습니다.

function mymodule_form_node_mycustomtype_form_alter(&$form, FormStateInterface &$form_state) {  
...
$form['actions']['submit']['#submit'][]  = '_mycustom_form_submit';
}
function _mycustom_form_submit(array &$form, FormStateInterface $form_state) {
    $url = Url::fromRoute('mymodule_sermepa_redsys.payment_controller_doPayment');
    $url->setRouteParameters(array('node' => $form_state->getValue('nid')));
    $form_state->setRedirectUrl($url); 
}

내 라우팅 파일 :

mymodule_sermepa_redsys.payment_controller_doPayment:
  path: '/doPayment/{node}'
  defaults:
    _controller: '\Drupal\mymodule_sermepa_redsys\Controller\DoPaymentController::doPayment'
    _title: 'Do Payment'
  requirements:
    _permission: 'access content'

참고 : RedsysAPI 클래스는 POST로 데이터를 준비하는 도우미 클래스이지만이 질문과 관련이 없습니다.


  • 답변 # 1

    게시물 속성으로 리디렉션 할 수 없습니다. 요청한 내용 만 수행 할 수 있습니다. 그만큼 $response 컨트롤러에서 생성하면 원격 서비스에 대한 HTTP 요청 결과가 포함됩니다. 해당 객체에서 관련 데이터를 검색하고 무언가를 수행해야합니다. 현재 함수에서 반환하고 있습니다. $response Psr \ Http \ Message \ ResponseInterface 개체입니다. 이 제품 만 반품하면 컨트롤러가 어떻게해야하는지 알 수 없습니다.

관련 자료

  • 이전 drupal - 코어 권장으로 전환 한 후 작성기로 코어를 업데이트 할 수 없습니다
  • 다음 drupal - UI를 통해 생성 된 필드를 수정 가능한 엔터티에서 수정할 수없는 것으로 정의