怎样在这个类里加连接数据并存数据

<?php

include 'Base.php';                  


 * 1.获取数据

 * 2.验证签名

 * 3.验证是否来自支付宝的请求

 * 4.验证交易状态

 * 5. 验证订单号和金额

 * 6.更改订单状态

 *  

 */


class Notify extends Base

{

  public function __construct() {

    // 1.获取数据

    $postData = $_POST;

     

    //2.验证签名MD5和RSA

    if($postData['sign_type'] == 'MD5'){

      if(!$this->checkSign($postData)){

        $this->logs('log.txt', 'MD5签名失败!');

        exit();

      }else{

        $this->logs('log.txt', 'MD5签名成功!');

      }

    }elseif($postData['sign_type'] == 'RSA'){

      if(!$this->rsaCheck($this->getStr($postData), self::ALIPUBKEY, $postData['sign']) ){

        $this->logs('log.txt', 'RSA签名失败!');

        exit();

      }else{

        $this->logs('log.txt', 'RSA签名成功!');

      }

    }elseif($postData['sign_type'] == 'RSA2'){

      if(!$this->rsaCheck($this->getStr($postData), self::NEW_ALIPUBKE, $postData['sign'],'RSA2') ){

        $this->logs('log.txt', 'RSA2签名失败!');

        exit();

      }else{

        $this->logs('log.txt', 'RSA2签名成功!');

      }

    }else{

      exit('签名方式有误');

    }

    //验证是否来自支付宝的请求

    if(!$this->isAlipay($postData)){

      $this->logs('log.txt', '不是来之支付宝的通知!');

      exit();

    }else{

      $this->logs('log.txt', '是来之支付宝的通知验证通过!');

    }

    // 4.验证交易状态

    if(!$this->checkOrderStatus($postData)){

       $this->logs('log.txt', '交易未完成!');

       exit();

    }else{

       $this->logs('log.txt', '交易成功!');

                       

    }

    //5. 验证订单号和金额

    //获取支付发送过来的订单号 在商户订单表中查询对应的金额 然后和支付宝发送过来的做对比

     $this->logs('log.txt', '订单号:' . $postData['out_trade_no'] . '订单金额:' . $postData['total_amount']);

   

      //更改订单状态

       echo 'success';  

  }


}


$obj = new Notify();

。。。

干嘛无语 就是没法连接啊

你是不是觉得很简单啊

<?php




?>

在return.PHP 也连接不了

你是不是又要无语

支付宝异步和同步里都不知道要怎么连数据库

 $this->logs('log.txt', '交易成功!');

不可以在这里的后面写连接数据库,并插入数据吗

没有用啊

他这个是继承类

是不是该写在父类里呢

我觉得写在哪里都没有关系呀。

1)首先自己写一个修改数据库的DB类。

2)你在交易成功的那个地方,应该是已经记录下来交易的信息了(用户,金额,备注等信息)

3)根据交易信息,然后创建表,然后直接插入表里。

这样不行吗?


1) DB.class.php

2)include "DB.class.php"

3)DB::intotable($data,$tab);

都有现成的就是没用

应该不是在notify_url.php这里入库

//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay

34

35 $request = new AlipayTradeAppPayRequest();

36 //SDK已经封装掉了公共参数,这里只需要传入业务参数

37 $trade_no = chongzhi_sn();

38 //入库信息

39 require(dirname(__FILE__) . '../../includes/init.php');

40 include_once(ROOT_PATH .'includes/lib_clips.php');

41

42 $user_m = get_user_info($user_id);

43

44 $dbcontent = array(

45 'user_id' => $user_id,

46 'amount' => $money,

47 'user_name' => $user_m['user_name'],

48 'payment' => "支付宝",

49 'cz_sn' => $trade_no,

50 'add_time' => gmtime()

51 );

52 //传参信息

53 $bizcontent = array(

54 'body' =>(string)$trade_no,

55 'subject' =>'充值',

56 'total_amount' => $money,

57 'out_trade_no' => (string)$trade_no,

58 'product_code' => 'QUICK_MSECURITY_PAY',

59 'timeout_express'=> '30m'

60 );

你看 应该是父类里去入库 //入库信息

39 require(dirname(__FILE__) . '../../includes/init.php');

40 include_once(ROOT_PATH .'includes/lib_clips.php');

然后 在业务层去调用

要不发你一份 你试试看 怎么弄

你在交易成功的那个地方,应该是已经记录下来交易的信息了(用户,金额,备注等信息)

是的你说的很对 这里是可以得到数据 $this->logs('log.txt', '订单号:' . $postData['out_trade_no'] . '订单金额:' . $postData['total_amount']);

他只能写进日志里

写不进数据库

支付宝的话,就是在notify_url.php这里入库的:异步通知,获取支付状态。处理数据


已经获取了支付状态啊


// 4.验证交易状态

    if(!$this->checkOrderStatus($postData)){

       $this->logs('log.txt', '交易未完成!');

       exit();

    }else{

       $this->logs('log.txt', '交易成功!');

                       

    }

这不是吗

第6步自己写 不就可以 入库了吗

问题是 数据库都连不上

嗯,能看下链接数据库的代码吗?


这个是我链接的一个方式

if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {   

      define('DBHOST', '*********');

                    define('DBUSER', '*****');

                    define('DBPW', '*****');

                    define('DBNAME', '******');

                    define('DBCHARSET', 'gb2312');

                    define('DBTABLEPRE', '');

                    define('DBCONNECT', 0);

 

                    // 创建连接

                   $conn = @ mysql_connect(DBHOST,DBUSER,DBPW)

                   or die("连接服务器出错: " . mysql_error());

                    

                   @ mysql_select_db(DB_NAME) or die("连接服务器出错: " . mysql_error());

                   @mysql_query("set names utf8");

                  

                    $this->logs('log.txt', '连接数据库成功!');  

$sql = 'insert into ******(username,out_trade_no, trade_no, trade_status,receipt_amount,gmt_payment, buyer_logon_id)values('3','1','1','1','1','1','1')';

           

              mysql_query($sql);

                   $this->logs('log.txt', '成功存储数据!');        

  }

  else {

        $this->logs('log.txt', '存储数据失败!');

        exit();  

  }

你这个链接的方法是写在if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {  

还是单独的一个文件

然后在notify_url.php里 include


($_POST['trade_status'] == 'TRADE_FINISHED' )


这个地方不对吧?如果真的正常的支付成功了的话

都是 带 SUCCESS 的吧。



$_POST['trade_status'] == 'TRADE_SUCCESS'

那你先用这一个判断下,看看能不能入库


都试过了没有用

那个是或

if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {  

||


有一个条件为真就是真

还有 我只要加上 require_once ();在<?PHP 头部就报错

程序就执行不了

本来数据库的 根本不用在写 直接包含进去就可以的 这里居然不能包含

本来这个回调地址 也就是异步通知地址不能写参数的 它这里居然能写 还能执行

异步通知是可以带参数的:passback_params好像是这个。

在回调的这个notify_url.php这里一定是可以用链接数据库的。

那么我能想到的问题

1)是不是你的回调地址用错了

2)如果require_once 报错的话,那就用 include 这个实验下,这个应该不会有问题的

回调地址错了的话 不可能有数据返回啊 但是这个有数据返回啊

 include是可以 但是还是连接不上数据库

你这么说他这回调地址是 配置的  'notify_url' => self::NOURL ,//异步通知地址 可空

      'return_url' => self::REURL,//同步通知地址 可空

 const REURL =*********

 const NOURL =********

但是你能拿到数据说明就没有问题

1)能拿到数据,说明地址没问题

2)include可以,那就剩下是你连接数据库的方式不对了。

你用的是mysql_connect的方式,那你能换成pdo的方式实验一下吗?如果pdo的成功了,那就说明是你的连接方式错了,也是时候换成pdo的操作方式了

要不发一份源码给你 你给我测试下 看看是不是数据库的问题

不用不用,你自己就可以很好的测试,你在随便一个地方单独的做个php文件,然后连接下数据库,看看是否可以连接上,并可以插入一条记录。按照你说的,应该是你单独做的这个文件也应该不能连接数据库的。

而且我们两人的环境也不一定都是一样的。给我的代码也不一定就好用,也许是在我这里好用。

我这个项目里就有连接数据库的文件 但是放到支付宝通知地址里的PHP 里就不好使

所以我就纳闷

我另外开个PHP文件是可以连接数据库的还能插入数据

兄弟能不能发一份你的支付宝代码给我用用 ?

我看看是不是我的数据库有问题

你的数据库文件不能连接,是不是因为你用namespace了,这样导致你的数据库操作类路径不对啥的?

我的支付宝代码是属于逻辑处理,判断已经是上面贴出来了,就是你那么判断的。

能记录log文件,不能插入数据库,那你能不能单独在那个程序里,写连接数据库的



连接数据库

$host = '127.0.0.1';

            $dbname ='youdatabase';

            $dbuser = 'root';

            $dbpwd = 'root';

            $db = new PDO("mysql:host=$host;dbname=$dbname","$dbuser","$dbpwd");

            $db->exec("SET NAMES 'utf8';"); 

$sql = "insert into tab(xx,xxx)value('xx','xxxx')";

$tf = $db->exec($sql);


这里的$tf 就是你执行sql语句后的返回结果,如果是数字的话,代表你插入了几条数据,如果不是数字的话,就会告诉你错误原因了。

不是 是路径问题 在支付宝异步通知里, 数据库文件复制到和异步通知同一个目录下才能被读取 这个点很坑 终于解决了

如果是路径的问题,那就是namespace你看看这个吧。

PDO也挺好的,操作起来也挺方便的。