【问题标题】:php - insert purchase order in database before submit data to payment gatewayphp - 在向支付网关提交数据之前在数据库中插入采购订单
【发布时间】:2020-11-01 15:20:58
【问题描述】:

我是PHP新手,不知道能不能做到。我正在建立一个在线商店,我想在将数据发送到支付网关之前将订单保存在数据库中。当我将数据发送到外部页面(支付网关)时,我无法先记录买家的数据,而无需执行额外的步骤(页面)。

编辑:我应该提到我已经缩短了我附加的代码。是的,在 SESSION 中有一个购物车,我有所有订单详细信息。问题是我从 Redsys 使用的方法是重定向。我通过向其发送数组中的一些字段来将付款委托给他们的网关。因此,当用户单击“支付”按钮时,我离开我的网站并转到网关,在那里付款,如果一切正常,网关允许我转到 URLOK 或 URLKO。我尝试的是在结帐表单中,它由买家/客户数据和重定向到网关的“summit”按钮组成,在转到网关 URL 之前,将订单插入状态为“PENDING”,然后当它从 URLOK 或 URLKO ​​返回更新状态。简而言之,我需要通过单击执行这两个步骤:

  1. 在数据库中插入
  2. 向 REDSYS Gatewey 提交数据

否则,您将不得不执行一个额外步骤,首先制作一个保存买家和订单数据的表单,然后制作一个“检查您的数据”类型的额外屏幕,然后将必要的内容发送到网关。

<?php

    include 'config/apiRedsys.php';

    $miObj = new RedsysAPI;

    $currency="978";
    $url="";
    $urlOKKO="http://localhost/confirmed";
    $urlKO="http://localhost/ko";
    $id=time();
    $amount=50000;
    
    // Fill fields
    $miObj->setParameter("DS_MERCHANT_AMOUNT",$amount);
    $miObj->setParameter("DS_MERCHANT_ORDER",$id);
    $miObj->setParameter("DS_MERCHANT_CURRENCY",$currency);
    $miObj->setParameter("DS_MERCHANT_MERCHANTURL",$url);
    $miObj->setParameter("DS_MERCHANT_URLOK",$urlOKKO);
    $miObj->setParameter("DS_MERCHANT_URLKO",$urlKO);
    
    
    $version="HMAC_SHA256_V1";
    $kc = 'key';

    $request = "";
    $params = $miObj->createMerchantParameters();
    $signature = $miObj->createMerchantSignature($kc);
 
?>          

<form class="needs-validation" novalidate action="https://sis-t.redsys.es:25443/sis/realizarPago" method="POST" target="_blank">
    <input type="hidden" name="Ds_SignatureVersion" value="<?php echo $version; ?>"/>
    <input type="hidden" name="Ds_MerchantParameters" value="<?php echo $params; ?>"/>
    <input type="hidden" name="Ds_Signature" value="<?php echo $signature; ?>"/>
    <div class="row">
        <div class="col-md-6 mb-3">
            <label for="firstName">Name</label>
            <input type="text" class="form-control" id="firstName" name="firstName" placeholder="" required>
            <div class="invalid-feedback">
                Required valid name
            </div>
        </div>
        <div class="col-md-6 mb-3">
            <label for="lastName">Apellidos</label>
            <input type="text" class="form-control" id="lastName" name="lastName" placeholder="" required>
            <div class="invalid-feedback">
                Required valid surname
            </div>
        </div>
    </div>

    <div>                       
        <input type="submit" value="Confirm and pay" class="a-button-input" />
    </div>
</form>

【问题讨论】:

  • 你需要使用Ajax & jQuery

标签: php


【解决方案1】:

传统上,在在线商店中,所有订购的商品都会先收集在虚拟购物车中,然后再进行订购。通常,您会为您的订单分配一个 ID,然后您可以在所有客户沟通中使用该 ID。

这样,您将拥有自己的订单持久副本,可用于保持状态。如果付款失败,您可以提醒用户并提供重试尝试,而无需他们再次经历整个过程。

但是,您的代码没有提及购物车或订购商品,因此我不会假设是这种情况。如果您的流程需要在确认购买后立即将用户重定向到网关,那么您应该考虑从 PHP 发出 API 请求。从 Redsys API 来看,这是他们提供的功能。看看他们的 REST API。

更新

您的流程似乎要求用户真正离开您的网站并访问 PSP。这是一种常见的情况。

如果您只想在用户离开您的站点之前捕获确认操作,您可以在 JavaScript 中发出重定向,只需 到您的服务器的 XHR ('Ajax') 完成。如果您在此之前还没有保存 $_SESSION 数据,那么这也是一个很好的时间和地点。

XHR 只会调用您编写的一些后端 PHP,唯一的工作就是捕获确认操作。当您收到包含purchase_confirmed=1 的 POST 请求时,编写脚本以更新数据库中的订单。它可能会将一些 JSON 输出回您的 JavaScript (json_encode(['success' =&gt; TRUE])),进而触发表单提交。

许多可能的方法之一是为此使用 jQuery,如下所示(未测试!)。如果您需要 vanilla JavaScript,请咨询You Might Not Need jQuery。深入了解 Fetch API 或其他(可能更好)解决方案的细节超出了您的问题范围。

$.ajax({
    type: 'POST',
    url: '/path/to/your/script.php',
    data: { purchase_confirmed: 1 },
    dataType: 'json'
}).done((json) => {
    // Your backend may choose to signal server-side success/failure by passing
    // a 'success' element to the JSON.
    if (json.success)
        // All good. This will initiate the redirect to Redsys.
        $('#your-form-id').submit();
    else
        // Something went wrong as indicated by your backend code.
        // Determine what to say and how to inform the user.
        // alert() for demo purposes.
        alert('Your error message here');
}).fail(() => {
    // Something else went wrong. Determine what to say and how to inform the user.
    // Write something informative according to your business logic and the error detected.
    alert('Something went wrong.'); 
});

【讨论】:

  • 感谢您的回复。我已经用更多细节 Ro Ach 编辑了我的问题~
  • 感谢@Ro Achterberg。我将尝试 Javascript 和 Ajax 并在此之前保存会话数据。问候。
  • Achterberd。泰很多!我正在检查你的例子!很有帮助。对不起,我是论坛的新人:D。
猜你喜欢
  • 2014-03-25
  • 2020-05-15
  • 1970-01-01
  • 2015-07-04
  • 2019-05-05
  • 2012-07-08
  • 2017-08-16
  • 2020-10-29
  • 2017-06-05
相关资源
最近更新 更多