<?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也挺好的,操作起来也挺方便的。