当前位置: 首页 > 知识库问答 >
问题:

无法验证托管签出PHP中的razorpay签名

翁心思
2023-03-14

我已经添加了razorpay测试版本和支付流程工程,但当我试图验证签名时,我得到以下错误

通知:未定义的索引:razorpay_order_id在C:\用户\阿明\文档\NetBeansProjects\OLX\付款\verify.php行24您的付款失败

Razorpay错误:传递的签名无效

我在这里遵循了代码结构形式https://github.com/razorpay/razorpay-php-testapp我正在努力实现https://razorpay.com/docs/payment-gateway/web-integration/hosted/#step-2--粘贴托管签出选项。

有人能指出我做错了什么吗。这里是验证。php

require('config.php');

session_start();

require('razorpay-php/Razorpay.php');

use Razorpay\Api\Api;
use Razorpay\Api\Errors\SignatureVerificationError;

$success = true;

$error = "Payment Failed";

if (empty($_POST['razorpay_payment_id']) === false) {
    $api = new Api($keyId, $keySecret);

    try {
        // Please note that the razorpay order ID must
        // come from a trusted source (session here, but
        // could be database or something else)
        $attributes = array(
            'razorpay_order_id' => $_SESSION['razorpay_order_id'],
            'razorpay_payment_id' => $_POST['razorpay_payment_id'],
            'razorpay_signature' => $_POST['razorpay_signature']
        );

        $api->utility->verifyPaymentSignature($attributes);
    } catch (SignatureVerificationError $e) {
        $success = false;
        $error = 'Razorpay Error : ' . $e->getMessage();
    }
}

if ($success === true) {
    $html = "<p>Your payment was successful</p>
             <p>Payment ID: {$_POST['razorpay_payment_id']}</p>";
} else {
    $html = "<p>Your payment failed</p>
             <p>{$error}</p>";
}

echo $html;

这里有详细的表格

<form method="POST" action="https://api.razorpay.com/v1/checkout/embedded">
    <input type="hidden" name="key_id" value="<?= $data['key']?>">
    <input type="hidden" name="order_id" value="<?= $data['order_id']?>">
    <input type="hidden" name="name" value="<?= $data['name']?>">
    <input type="hidden" name="description" value="<?= $data['description']?>">
    <input type="hidden" name="image" value="<?= $data['image']?>">
    <input type="hidden" name="prefill[name]" value="<?= $data['prefill']['name']?>">
    <input type="hidden" name="prefill[contact]" value="<?= $data['prefill']['contact']?>">
    <input type="hidden" name="prefill[email]" value="<?= $data['prefill']['email']?>">
    <input type="hidden" name="notes[shipping address]" value="L-16, The Business Centre, 61 Wellfield Road, New Delhi - 110001">
    <input type="hidden" name="callback_url" value="http://localhost:8000/payment/verify.php">
    <input type="hidden" name="cancel_url" value="https://example.com/payment-cancel">
    <button>Submit</button>
</form>

支付php

require('config.php');
require('razorpay-php/Razorpay.php');
session_start();

// Create the Razorpay Order

use Razorpay\Api\Api;

$api = new Api($keyId, $keySecret);

//
// We create an razorpay order using orders api
// Docs: https://docs.razorpay.com/docs/orders
//
$orderData = [
    'receipt'         => 4563,
    'amount'          => 2000 * 100, // 2000 rupees in paise
    'currency'        => 'INR',
    'payment_capture' => 1 // auto capture
];

$razorpayOrder = $api->order->create($orderData);

$razorpayOrderId = $razorpayOrder['id'];

$_SESSION['razorpay_order_id'] = $razorpayOrderId;

$displayAmount = $amount = $orderData['amount'];

if ($displayCurrency !== 'INR'){
    $url = "https://api.fixer.io/latest?symbols=$displayCurrency&base=INR";
    $exchange = json_decode(file_get_contents($url), true);

    $displayAmount = $exchange['rates'][$displayCurrency] * $amount / 100;
}

$checkout = 'automatic';

if (isset($_GET['checkout']) and in_array($_GET['checkout'], ['automatic', 'manual'], true))
{
    $checkout = $_GET['checkout'];
}

$data = [
    "key"               => $keyId,
    "amount"            => $amount,
    "name"              => "Sanoj Lawrence",
    "description"       => "safebrowser.tk",
    "image"             => "https://demo-cdn.sirv.com/chair.jpg",
    "prefill"           => [
    "name"              => "",
    "email"             => "test@gmail.com",
    "contact"           => "6381211774",
    ],
    "notes"             => [
    "address"           => "Hello World",
    "merchant_order_id" => "12312321",
    ],
    "theme"             => [
    "color"             => "#red"
    ],
    "order_id"          => $razorpayOrderId,
];

if ($displayCurrency !== 'INR'){
    $data['display_currency']  = $displayCurrency;
    $data['display_amount']    = $displayAmount;
}

$json = json_encode($data);

require("checkout/{$checkout}.php");

共有1个答案

伏德义
2023-03-14

我认为这个流程中不存在会话。或者指出它在会话中存储的位置。

否则,请使用从回调URL获取数据时所使用的方法。

你试过了吗

        $attributes = array(
            'razorpay_order_id' => $_POST['razorpay_order_id'],
            'razorpay_payment_id' => $_POST['razorpay_payment_id'],
            'razorpay_signature' => $_POST['razorpay_signature']
        );
 类似资料:
  • 我无法验证付款签名。 这就是razorpay提供的代码。 当我检查的时候。 我得到的只是,签名没有验证。 附言:我有付款签名,订单

  • 我正在尝试从外部远程服务对文档进行签名。签署过程分两个阶段进行。远程服务在第一阶段期待base64编码的散列,并在身份验证后发出令牌。在第二阶段,我们将使用接收到的令牌再次传递相同的散列并获得base64签名的散列。我在这里附上签名错误的文件。文件 如果有人可以分析它并指导我评估无效签名背后的原因。我正在使用执行与pdf相关的操作。 更新 根据反馈,我做了一些更正。文档现在正在更改。已更改的文档

  • 我有一个C应用程序来对一些数据进行签名和验证,现在我想在PHP中验证数据,以下是我的数据签名C代码: 我尝试过PHPopenssl_verify(),但我不能正确地提供公钥;在C中,我有一个公钥blob的字节数组,但我不知道如何从这个数组中提取公钥,并将其与php openssl一起使用。 但我从openssl\u get\u publickey中获得了“错误:0906D06C:PEM例程:PEM

  • 问题内容: 我正在使用node.js request.js到达api。我收到这个错误 [错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE] 我所有的凭据都是准确有效的,并且服务器还不错。我对邮递员提出了同样的要求。 此代码仅在可执行脚本ex中运行。,那是为什么?是否需要在服务器上运行? 问题答案: 注意 :以下情况很危险,并且将允许在客户端和服务器之间截取和修改API内容。 这

  • 我正在尝试在python中使用ECDSA验证比特币签名,但发现它非常困难,许多尝试已经失败了。 参数: 注意:我已经根据ECDSA的要求将签名从base64转换为hexstring。每当我试图验证它时,它会说: 预期64字节签名(128十六进制字符串),提供了65字节签名(130十六进制字符串) 我查看了许多关于ECDSA的stackoverflow问题,但没有一个答案与我的qs 100%相关。感

  • 我是从IDP接收SAML断言签名的服务提供商。我在Tomcat上使用JOSSO来使用断言。这里的问题是我无法验证断言签名。 IDP证书使用别名“IDP”上传到我的密钥库。 在验证sig时,我得到以下错误: 为什么JOSSO无法检测密钥库中的证书并验证签名?我需要以不同的方式定义别名吗?