怎样将订单存入数据库(需要在服务器上测试)
我把我的代码git到远程服务器上后(当然此时config.php里面的配置参数也要相应的进行修改),中间的马赛克位置填你服务器的域名或者公网IP地址:
- notify_url.php代码
<?php /* * * 功能:支付宝服务器异步通知页面 * 版本:2.0 * 修改日期:2017-05-01 * 说明: * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *************************页面功能说明************************* * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。 * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。 * 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知 */ require_once 'config.php'; require_once 'pagepay/service/AlipayTradeService.php'; require_once("../include/memcache.php"); $arr=$_POST; $alipaySevice = new AlipayTradeService($config); $alipaySevice->writeLog(var_export($_POST,true)); $result = $alipaySevice->check($arr); /* 实际验证过程建议商户添加以下校验。 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if($result) {//验证成功 / //请在这里加上商户的业务逻辑程序代 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //商户订单号 $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; //订单标题 $subject = $_POST['subject']; //订单金额 $total_amount = $_POST['total_amount']; //实收金额 $receipt_amount = $_POST['receipt_amount']; //交易支付时间 $gmt_payment = $_POST['gmt_payment']; //买家支付宝账号 $buyer_logon_id = $_POST['buyer_logon_id'];//例如: 159****5620 //买家在支付宝的用户id $buyer_user_id = $_POST['buyer_user_id'];//例如:2088101117955611 //订单描述 $body = $_POST['body']; $string_arr = explode("&", $body ); $name = $string_arr[0]; $word = $string_arr[1]; $email = $string_arr[2]; $tel = $string_arr[3]; if($_POST['trade_status'] == 'TRADE_FINISHED') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_amount与通知时获取的total_fee为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 } // pdo_query("update donate set word = 'success' where donate_id=1;"); $sql = "insert into trade(out_trade_no, trade_no, trade_status, subject, total_amount, receipt_amount, gmt_payment, buyer_logon_id, buyer_user_id, body, name, word, email, tel, trade_time) values (?,?,?,?,?,?,?,?,?,?, ?,?,?,?,NOW());"; pdo_query($sql,$out_trade_no, $trade_no, $trade_status, $subject, $total_amount,$receipt_amount, $gmt_payment, $buyer_logon_id, $buyer_user_id, $body, $name, $word, $email, $tel); if ($subject == '捐赠'){ $sql = "insert into donate( donate_money, receipt_money, name, word, email, tel, out_trade_no,trade_no, subject, time) VALUES (?,?,?,?,?,?,?,?,?, NOW())"; pdo_query($sql, $total_amount, $receipt_amount, $name, $word, $email, $tel, $out_trade_no,$trade_no, $subject); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— echo "success"; //请不要修改或删除 }else { // pdo_query("update donate set word = 'fail' where donate_id=1;"); //验证失败 echo "fail"; } ?>
- return_url.php
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <?php /* * * 功能:支付宝页面跳转同步通知页面 * 版本:2.0 * 修改日期:2017-05-01 * 说明: * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *************************页面功能说明************************* * 该页面可在本机电脑测试 * 可放入HTML等美化页面的代码、商户业务逻辑程序代码 */ require_once("config.php"); require_once 'pagepay/service/AlipayTradeService.php'; require_once("../include/memcache.php"); $arr=$_GET; $alipaySevice = new AlipayTradeService($config); $result = $alipaySevice->check($arr); /* 实际验证过程建议商户添加以下校验。 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if($result) {//验证成功 / //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表 //商户订单号 $out_trade_no = htmlspecialchars($_GET['out_trade_no']); //支付宝交易号 $trade_no = htmlspecialchars($_GET['trade_no']); $sql = "select subject from trade where trade_no=?"; $result = pdo_query($sql, $trade_no); //订单标题 $subject = trim($result[0][0]); if($subject == '捐赠'){ echo "<script>alert('感谢您的热心捐赠!');</script>"; header("location:../donate.php"); } else{ echo "<script>alert('这是其他类付款');</script>"; header("location:../index.php"); } echo "验证成功<br />支付宝交易号:".$trade_no."<br>订单标题:".$subject; //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— / } else { //验证失败 echo "验证失败"; echo "<script>alert('支付失败!如对订单有疑惑,请咨询管理员');</script>"; header("location:../index.php"); } ?> <title>支付结果</title> </head> <body> </body> </html>
-
推荐在notify_url.php中存入数据库,而不是在return_url.php
- 原因:
notify_url.php是异步页面,用户看不到,但程序依然会执行。而return_url.php是支付返回页面,用户在支付完后,可能并没有等待页面跳回到商家的return_url.php页面,而是点了支付宝页面的其他链接,或者是因各种物理因素(如:断网,断电),导致用户最终没有看到return_url.php,如果我们将存入数据库的代码放在return_url.php页面中,则是非常不明智的,很可能会导致数据没写进去。所以 推荐在notify_url.php中存入数据库 -
下午的时候,修复了一些sql语句的bug后,我的捐赠功终于能顺利地在服务器上跑起来了,顺利地完成了支付,顺利地将交易记录存入了数据库,哈哈
明天我就打算提交我们的自己的应用的审核,审核通过之后,将配置文件config.php中的应用ID改一下,然后将你的公钥上传到支付宝里你的应用中,同时保存下对应的支付宝公钥和支付宝网关到config.php就OK了