Example #1
0
    /**
     * 支付宝调用回调方法
     */
    public static function paying_notify()
    {
        /**
         * 功能:支付宝服务器异步通知页面
         *************************页面功能说明*************************
         * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
         * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该
         *   页面。
         * 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见
         *      alipay_notify_class.php中的函数verifyNotify
         * 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的
         *    时间策略重发通知
         */
        //require_once("alipay.config.php");
        //require_once("lib/alipay_notify.class.php");
        //计算得出通知验证结果
        $alipay_config = AlipayConfig::config();
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        if (!$verify_result) {
            die('error:verify_result_failed');
        }
        //验证成功
        //商户订单号
        $out_trade_no = $_POST['out_trade_no'];
        //支付宝交易号
        $trade_no = $_POST['trade_no'];
        //交易状态
        $trade_status = $_POST['trade_status'];
        $time = time();
        if (!in_array($_POST['trade_status'], array('TRADE_FINISHED', 'TRADE_SUCCESS'))) {
            die('error:trade_status_error');
        }
        //判断该笔订单是否在商户网站中已经做过处理
        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订
        //  单系统中查到该笔订单的详细,并执行商户的业务程序
        //如果有做过处理,不执行商户的业务程序
        $db = Fn::db();
        $row = TransactionRecordModel::transactionRecordInfoByTrNo($out_trade_no);
        if (!$row) {
            die('error:out_trade_no_not_exist');
        }
        if ($row['tr_flag'] == 1) {
            // 已处理过
            echo 'success';
            exit;
        }
        if (!$db->beginTransaction()) {
            die('error:start_transaction_failed');
        }
        $param = array('tr_flag' => 1, 'tr_finishtime' => $time);
        TransactionRecordModel::setTransactionRecordByTrNo($out_trade_no, $param);
        $sql = <<<EOT
UPDATE rd_student SET account = account + ({$row['tr_trade_amount']}) 
WHERE uid = {$row['tr_uid']}
EOT;
        $flag = $db->exec($sql);
        if (!$db->commit()) {
            $db->rollBack();
            die('error:commit_transaction_failed');
        }
        //注意:
        //付款完成后,支付宝系统发送该交易状态通知
        echo "success";
        exit;
    }