0

0

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

php中文网

php中文网

发布时间:2016-06-06 20:16:52

|

1424人浏览过

|

来源于php中文网

原创

网站的成员注册想接入支付宝,并且在提交成员资料之后能跳转到支付宝,当用户实现支付之后,成员资料再存入到数据库。我用了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数据竟然是空的。下面分别是这两个文件的代码。请求各位大虾帮我看看这个到底是什么问题,在线等,谢谢。

立即学习PHP免费学习笔记(深入)”;

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

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号