热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

网站的成员注册想接入支付宝,并且在提交成员资料之后能跳转到支付宝,当用户实现支付之后,成员资料再存入到数据库。我用了session来存储传递数据,在return_url.php中session里的数据能有效地被传递,但是在not...
网站的成员注册想接入支付宝,并且在提交成员资料之后能跳转到支付宝,当用户实现支付之后,成员资料再存入到数据库。我用了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

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
author-avatar
书友34043247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有