当前位置:Gxlcms > PHP教程 > html-[PHP]session在个别页面间的传递的问题

html-[PHP]session在个别页面间的传递的问题

时间:2021-07-01 10:21:17 帮助过:36人阅读

网站的成员注册想接入支付宝,并且在提交成员资料之后能跳转到支付宝,当用户实现支付之后,成员资料再存入到数据库。我用了session来存储传递数据,在return_url.php中session里的数据能有效地被传递,但是在notify_url.php中却获取的session数据竟然是空的。下面分别是这两个文件的代码。请求各位大虾帮我看看这个到底是什么问题,在线等,谢谢。

notify_url.php:

verifyNotify();

if($verify_result) {//验证成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //请在这里加上商户的业务逻辑程序代
    /**
    *连接数据库并传输数据,暂时不清楚需不需要参数的传递。
    */
    
    $cname=$info[0];
    $ename=$info[1];
    $email=$info[2];
    $phone=$info[3];
    $IDC  =$info[4];
    $callU=$info[5];
    $words=$info[6];
    $gender =$selection[0];
    $cTypy  =$selection[1];
    $channel=$selection[2];

    /*Connect to Database*/

    $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
    if(!$con){ die('could
     not connect:'.mysql_error());     
    }
    mysql_select_db(SAE_MYSQL_DB,$con);

    $query = "insert into bp_user(cname,ename,gender,email,phone,cType,IDC,channel,callU,words,registerTime) 
    values('$cname','$ename','$gender','$email','$phone','$cType','$IDC','$channel','$callU','$words',now())";
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());

    mysql_close($con);
    
    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    
    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
    
    //商户订单号

    $out_trade_no = $_POST['out_trade_no'];

    //支付宝交易号

    $trade_no = $_POST['trade_no'];

    //交易状态
    $trade_status = $_POST['trade_status'];


    if($_POST['trade_status'] == 'TRADE_FINISHED') {
        //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
            //如果有做过处理,不执行商户的业务程序
                
        //注意:
        //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知

        //调试用,写文本函数记录程序运行情况是否正常
        //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
    }
    else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
        //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
            //如果有做过处理,不执行商户的业务程序
                
        //注意:
        //付款完成后,支付宝系统发送该交易状态通知

        //调试用,写文本函数记录程序运行情况是否正常
        //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
    }

    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        
    echo "success";        //请不要修改或删除
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //验证失败
    echo "fail";

    //调试用,写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
?>

return_url.php:




    
    
verifyReturn();
if($verify_result) {//验证成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //请在这里加上商户的业务逻辑程序代码
    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

    //商户订单号

    $out_trade_no = $_GET['out_trade_no'];

    //支付宝交易号

    $trade_no = $_GET['trade_no'];

    //交易状态
    $trade_status = $_GET['trade_status'];


    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
        //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //如果有做过处理,不执行商户的业务程序
    }
    else {
      echo "trade_status=".$_GET['trade_status'];
    }
    echo $info[0].",欢迎您的加入!
"; //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } else { //验证失败 //如要调试,请看alipay_notify.php页面的verifyReturn函数 echo "验证失败"; } ?> 支付宝即时到账交易接口

[已解决]
结合rainwsy和有明的建议得出->支付宝支付成功后,用户信息写入数据库的方法:
1.在alipayapi.php中将注册信息临时存储在数据库中;
2.在notify_url.php中,用来自alipayapi的out_trade_no从数据库中来提取出用户注册信息,最后加入用户注册表中。
支付宝接口参数:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.SMaYno&treeId=62&articleId=103740&docType=1

回复内容:

网站的成员注册想接入支付宝,并且在提交成员资料之后能跳转到支付宝,当用户实现支付之后,成员资料再存入到数据库。我用了session来存储传递数据,在return_url.php中session里的数据能有效地被传递,但是在notify_url.php中却获取的session数据竟然是空的。下面分别是这两个文件的代码。请求各位大虾帮我看看这个到底是什么问题,在线等,谢谢。

notify_url.php:

verifyNotify();

if($verify_result) {//验证成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //请在这里加上商户的业务逻辑程序代
    /**
    *连接数据库并传输数据,暂时不清楚需不需要参数的传递。
    */
    
    $cname=$info[0];
    $ename=$info[1];
    $email=$info[2];
    $phone=$info[3];
    $IDC  =$info[4];
    $callU=$info[5];
    $words=$info[6];
    $gender =$selection[0];
    $cTypy  =$selection[1];
    $channel=$selection[2];

    /*Connect to Database*/

    $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
    if(!$con){ die('could
     not connect:'.mysql_error());     
    }
    mysql_select_db(SAE_MYSQL_DB,$con);

    $query = "insert into bp_user(cname,ename,gender,email,phone,cType,IDC,channel,callU,words,registerTime) 
    values('$cname','$ename','$gender','$email','$phone','$cType','$IDC','$channel','$callU','$words',now())";
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());

    mysql_close($con);
    
    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    
    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
    
    //商户订单号

    $out_trade_no = $_POST['out_trade_no'];

    //支付宝交易号

    $trade_no = $_POST['trade_no'];

    //交易状态
    $trade_status = $_POST['trade_status'];


    if($_POST['trade_status'] == 'TRADE_FINISHED') {
        //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
            //如果有做过处理,不执行商户的业务程序
                
        //注意:
        //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知

        //调试用,写文本函数记录程序运行情况是否正常
        //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
    }
    else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
        //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
            //如果有做过处理,不执行商户的业务程序
                
        //注意:
        //付款完成后,支付宝系统发送该交易状态通知

        //调试用,写文本函数记录程序运行情况是否正常
        //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
    }

    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        
    echo "success";        //请不要修改或删除
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //验证失败
    echo "fail";

    //调试用,写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
?>

return_url.php:




    
    
verifyReturn();
if($verify_result) {//验证成功
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //请在这里加上商户的业务逻辑程序代码
    //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

    //商户订单号

    $out_trade_no = $_GET['out_trade_no'];

    //支付宝交易号

    $trade_no = $_GET['trade_no'];

    //交易状态
    $trade_status = $_GET['trade_status'];


    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
        //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //如果有做过处理,不执行商户的业务程序
    }
    else {
      echo "trade_status=".$_GET['trade_status'];
    }
    echo $info[0].",欢迎您的加入!
"; //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } else { //验证失败 //如要调试,请看alipay_notify.php页面的verifyReturn函数 echo "验证失败"; } ?> 支付宝即时到账交易接口

[已解决]
结合rainwsy和有明的建议得出->支付宝支付成功后,用户信息写入数据库的方法:
1.在alipayapi.php中将注册信息临时存储在数据库中;
2.在notify_url.php中,用来自alipayapi的out_trade_no从数据库中来提取出用户注册信息,最后加入用户注册表中。
支付宝接口参数:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.SMaYno&treeId=62&articleId=103740&docType=1

那当然,return_url是用户完成支付后由用户浏览器跳转到你的服务器的,请求发送来自用户浏览器,这时候你能通过用户识别到session。而notify_url是用户完成支付后,支付宝通过支付宝自身服务器进行调用通知的,请求来自支付宝服务器,并没有通过用户端,你当然不同通过这个来识别用户。

要识别用户,请在支付参数里携带识别用户的标识,不要依赖于session

不需要用session,先说下原因,因为你没有session_start,且notify_url.php是支付宝访问过来的,不是你的用户.

不用session的原因:试想用户产生订单[并在支付宝生成了账单],当用户关闭了浏览器通过支付宝钱包付款的时候你的notify_url.php始终是支付宝的session,而非用户。

在生成付款URL的时候你应该在transactions表记录订单信息,例如订单号,会员ID。

应该仅用notify_url的通知来做订单状态改变的处理而非return_url

人气教程排行