【问题标题】:Transaction Status API in PHP for Payment Gateway用于支付网关的 PHP 中的交易状态 API
【发布时间】:2018-06-18 09:37:39
【问题描述】:

我正在开发 PayUMoney 支付网关。我已经成功集成了它。现在,在通过 PayUMoney 进行审核之前,他们突然告诉我,我必须在我的门户上集成交易状态 API。他们为我提供了 API。我也整合了它。以下是他们提供给我的代码。

$key = "gtKFFx";
$salt = "eCwWELxi";
$command = "verify_payment";
$var1 = "NPMM87334121";

//hash formaula
$hash_str = $key  . '|' . $command . '|' . $var1 . '|' . $salt ;
$hash = strtolower(hash('sha512', $hash_str));
$r = array('key' => $key , 'hash' =>$hash , 'var1' => $var1, 'command' => $command);
$qs= http_build_query($r);
$wsUrl = "https://test.payu.in/merchant/postservice.php?form=1";
//$wsUrl = "https://info.payu.in/merchant/postservice?form=1";

$c = curl_init();
curl_setopt($c, CURLOPT_URL, $wsUrl);
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_POSTFIELDS, $qs);
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
$o = curl_exec($c);
if (curl_errno($c)) {
  $sad = curl_error($c);
  throw new Exception($sad);
}
curl_close($c);

$valueSerialized = @unserialize($o);
if($o === 'b:0;' || $valueSerialized !== false) {
  print_r($valueSerialized);
}
print_r($o);

上面的代码给了我如下回复:

Array
(
    [status] => 1
    [msg] => 1 out of 1 Transactions Fetched Successfully
    [transaction_details] => Array
        (
            [NPMM87334121] => Array
                (
                    [mihpayid] => 403993715517090502
                    [request_id] => 
                    [bank_ref_num] => 
                    [amt] => 100813.00
                    [transaction_amount] => 100813.00
                    [txnid] => TRANS-2011-01-05-11-05-00
                    [additional_charges] => 0.00
                    [productinfo] => Test
                    [firstname] => Test User
                    [bankcode] => CC
                    [udf1] => 
                    [udf3] => 
                    [udf4] => 
                    [udf5] => 
                    [field2] => 
                    [field9] => FSS0001-Authentication Not Available
                    [error_code] => E500
                    [payment_source] => payu
                    [card_type] => VISA
                    [error_Message] => Bank failed to authenticate the customer
                    [net_amount_debit] => 0.00
                    [disc] => 0.00
                    [mode] => CC
                    [PG_TYPE] => HDFCPG
                    [card_no] => 411111XXXXXX1111
                    [name_on_card] => Demo
                    [udf2] => 
                    [addedon] => 2018-01-05 11:21:36
                    [status] => failure
                    [unmappedstatus] => failed
                    [Merchant_UTR] => 
                    [Settled_At] => 
                )

        )

)

在此之后,我编写了以下行以访问上述响应。

$checkout_data = $o['transaction_details'][$var1];

但是在这一行之后它给了我以下错误。

Message: Illegal string offset 'transaction_details'
Message: Illegal string offset 'NPMM87334121'

我不明白我在哪里做错了。 payu 给出的响应在数组中,所以如果我将它作为数组访问,仍然为什么它会给我错误。

【问题讨论】:

  • 检查我的答案!在 print_r($o); 之后你可以在 json_decode 之后在 foreach 中做 ..
  • 尝试一次,如果您遇到任何问题,请告诉我。
  • 所以你现在在用别人的钱工作,请告诉我你为什么要关闭安全性? (CURLOPT_SSL_VERIFYHOST, 0...)
  • @DanFromGermany 代码仅由 PayU 团队提供。 OP 未更新 CURLOPT_SSL_VERIFYHOST
  • @DanFromGermany 请检查一次:- documentation.payubiz.in/check-status-apis

标签: php payment-gateway payumoney


【解决方案1】:

更新你的代码的Curl部分,如下所示:

$wsUrl = "https://info.payu.in/merchant/postservice?form=2";
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $wsUrl);
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_POSTFIELDS, $qs);
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
$o = curl_exec($c);
if (curl_errno($c)) {
  $sad = curl_error($c);
  throw new Exception($sad);
}
curl_close($c);

$valueSerialized = @unserialize($o);
if($o === 'b:0;' || $valueSerialized !== false) {
  print_r($valueSerialized);
} 
//print_r($o);

$o = json_decode($o);

foreach($o->transaction_details as $key => $val){
    if(($val->status=="success")&&($val->unmappedstatus=="captured")){
        // Update
    }
}

【讨论】:

  • 在 foreach 之后它给我以下错误:严重性:通知消息:尝试获取非对象的属性
  • 你添加了这个 $o = json_decode($o);在 foreach 之前
  • 我在我的许多网站上都这样做了,并且运行良好。我用更多代码更新了我的答案。检查一次!
  • 先加$o = json_decode($o);然后 foreach($o->transaction_details as $key => $val){
  • 在 foreach 中,您可以获得所有响应变量,例如 $val->mihpayid;
【解决方案2】:
$valueSerialized = @unserialize($o);
if($o === 'b:0;' || $valueSerialized !== false) {
  print_r($valueSerialized);
}
print_r($o);

$checkout_data = $o['transaction_details'][$var1];

您正在访问(序列化的)字符串$o,而不是未序列化的对象$valueSerialized

应该是这样的

$checkout_data = $valueSerialized['transaction_details'][$var1];

您的脚本中存在巨大问题:

  • 你关闭了安全,你应该删除这些行

    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);

    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);

  • 变量名具有误导性(例如称为序列化的变量中的未序列化值)

  • 您没有对 HTTP 响应状态代码进行错误检查,并且您正在抑制 @unserialize($o) 中的错误。不要使用@

【讨论】:

  • 其实用 curl 写的都是 PayUMoney 提供给我的。所以我对此一无所知。我只是按照他们提供给我的方式使用它。
  • 这不是安全性差的借口。答案并没有解决您的问题?我猜你没试过。
【解决方案3】:

将此网址用于 Payu Status Api

$wsUrl = "https://test.payu.in/merchant/postservice.php?form=2";

注意变量形式=2 而不是 1
这个 url 返回 json 输出 而形式=1 返回难以操作的数组输出

【讨论】:

    【解决方案4】:

    它在 pre 标签内返回数组的 print_r 。响应不是数组,而是文本 根据 manojit 我们必须使用

    $wsUrl = "https://test.payu.in/merchant/postservice.php?form=2";
    

    form=2 获取json格式

    大批 ( [状态] => 1 [msg] => 1 / 1 成功获取交易 [transaction_details] => 数组 ( [0345b17744cc6e0bab66] => 数组 ( [mihpayid] => 403993715521192567 [request_id] => [bank_ref_num] => [amt] => 1.00 [交易金额] => 1.00 [txnid] => 0345b17744cc6e0bab66 [额外费用] => 0.00 [productinfo] => quot CartItemId quot 28729 quot CartId quot 1423 quot ProductId quot [名字] => ss dhar [银行代码] => CC [udf1] => [{"CartItemId":"28729","CartId":"1423","ProductId":"58","BasePrice":"890.00","Quantity":"1","ItemPromoId" :null,"ItemPromoDiscount":null [udf3] => 9007291400 [udf4] => 12 md 路 gorabazar [udf5] => 0345b17744cc6e0bab66 [字段2] => [field9] => FSS0001-身份验证不可用。 [error_code] => E501 [补充] => 2020-06-26 10:49:43 [payment_source] => payu [card_type] => 签证 [error_Message] => 银行无法进行身份验证。 [net_amount_debit] => 0.00 [光盘] ​​=> 0.00 [模式] => CC [PG_TYPE] => HDFCPG [card_no] => 401200XXXXXX1112 [name_on_card] => swarna sekhar dhar [udf2] => xyx.9@gmail.com [状态] => 失败 [未映射状态] => 失败 [Merchant_UTR] => [Settled_At] => ) ) ) </pre>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2013-11-02
      • 1970-01-01
      • 2011-05-29
      • 2018-02-26
      • 2012-06-23
      相关资源
      最近更新 更多