public function m_alipay_notify()
 {
     Log::record('mp_notify called. get:' . print_r($_GET, true) . ' post:' . print_r($_POST, true), Log::INFO);
     Log::save();
     $out_trade_no = $_POST['out_trade_no'];
     $agent_cfg;
     if (!empty($out_trade_no)) {
         $sql = 'select u.id,ac.agent_id,ac.cfg_data,a.role ' . ' from tp_audit_merchant_purchase as mp ' . ' left JOIN tp_users as u on mp.user_id = u.id ' . ' LEFT JOIN tp_oem_cfg as ac on u.administrator = ac.agent_id ' . " LEFT JOIN tp_user as a on u.administrator = a.id " . " where mp.trade_no = '{$out_trade_no}';";
         $Model = new Model();
         $cfg = $Model->query($sql);
         $agent_cfg = unserialize($cfg[0]['cfg_data']);
         if ($cfg != false && ($cfg[0]['role'] == 12 || $cfg[0]['role'] == 13)) {
             $default_agent_cfg = C('default_agent_info');
             //代理商用户和直销用户使用领众的支付信息
             $agent_cfg['alipay_seller_email'] = $default_agent_cfg['alipay_seller_email'];
             $agent_cfg['alipay_partner'] = $default_agent_cfg['alipay_partner'];
             $agent_cfg['alipay_key'] = $default_agent_cfg['alipay_key'];
             $agent_cfg['alipay_service'] = $default_agent_cfg['alipay_service'];
         }
     }
     $alipayConfig = C('alipay_config');
     $alipayConfig['partner'] = $agent_cfg['alipay_partner'];
     $alipayConfig['key'] = $agent_cfg['alipay_key'];
     import("@.ORG.Alipay.AlipayNotify");
     //计算得出通知验证结果
     $alipayNotify = new AlipayNotify($alipayConfig);
     $verify_result = $alipayNotify->verifyNotify();
     if ($verify_result) {
         Log::record('mp_notify verify succeed.' . $out_trade_no, Log::INFO);
         //Log::record('mp_notify:  '.print_r($_POST, true), Log::INFO);
         Log::save();
         //商户订单号
         $out_trade_no = $_POST['out_trade_no'];
         //支付宝交易号
         $data['ali_trade_no'] = $_POST['trade_no'];
         //交易状态
         $data['ali_trade_status'] = $_POST['trade_status'];
         $data['ali_notify_id'] = $_POST['notify_id'];
         $data['ali_notify_type'] = $_POST['notify_type'];
         $data['ali_total_fee'] = $_POST['total_fee'];
         $data['ali_is_success'] = '1';
         $data['ali_buyer_email'] = $_POST['buyer_email'];
         $data['ali_buyer_id'] = $_POST['buyer_id'];
         $data['handler'] = 1;
         //notify
         $data['finish_time'] = time();
         // 检查交易是否存在领众数据库
         $auditRecord = M('audit_merchant_purchase')->where(array('trade_no' => $out_trade_no))->find();
         if ($auditRecord == false || empty($auditRecord['user_id'])) {
             Log::record('mp_notify: out_trade_no not exist:' . $out_trade_no, Log::ERR);
             // Log::record("record the notify info:".print_r($_POST,true));
             Log::save();
             echo 'fail';
             exit;
         }
         $merchantPackages = C('MERCHANT_PACKAGES');
         // 如果订单不处于 提交 状态,则忽略
         if ($auditRecord['status'] != 1) {
             Log::record('mp_notify conflict ' . $out_trade_no);
             if ($auditRecord['status'] != 6) {
                 //如果不是重复提交,则应该保存提醒信息
                 Log::record("record the notify info:" . print_r($_POST, true));
             }
             Log::save();
             echo "fail";
             exit;
         }
         if ($data['ali_trade_status'] == 'TRADE_FINISHED' || $data['ali_trade_status'] == 'TRADE_SUCCESS') {
             $data['status'] = 2;
             M('audit_merchant_purchase')->where(array('trade_no' => $out_trade_no))->save($data);
             // 验证该请求来自支付宝
             require_once COMMON_PATH . '/AlipayNotifyVerifyHelper.php';
             $verifyStatus = AlipayNotifyVerifyHelper::ali_notify_verify($alipayConfig['partner'], $data['ali_notify_id']);
             if ($verifyStatus == false) {
                 Log::record('m_return_url fail ali_notify_verify' . $out_trade_no, Log::ERR);
                 Log::save();
                 M('audit_merchant_purchase')->where(array('trade_no' => $out_trade_no))->setField('status', 4);
                 echo "fail";
                 exit;
             }
             M('audit_merchant_purchase')->where(array('trade_no' => $out_trade_no))->setField('status', 5);
             Log::record('mp_notify finish ali_notify_verify. status=>5 ' . $out_trade_no, Log::INFO);
             Log::save();
             // 套餐处理
             //需根据套餐类型设置payload参数:功能套餐设置成天数,短信包设置为条数
             $package_type = $merchantPackages[$auditRecord['package_id']]['type'];
             switch ($package_type) {
                 case 1:
                     // 套餐处理
                     $fgListStr = $merchantPackages[$auditRecord['package_id']]['function_groups'];
                     $durationInSecs = $auditRecord['package_duration'] * 31 * 24 * 60 * 60;
                     Log::record('mp_notify start open fg ' . $fgListStr . ' for ' . $durationInSecs . ' secs ' . $out_trade_no, Log::INFO);
                     Log::save();
                     $codeFgIdList = explode(",", $fgListStr);
                     $websiteUserFuncManager = new WebsiteUserFuncManager($auditRecord['user_id']);
                     $websiteUserFuncManager->extendFuncGroups($codeFgIdList, $durationInSecs);
                     Log::record('mp_notify finish open fg ' . $out_trade_no, Log::INFO);
                     Log::save();
                     break;
                 case 2:
                     //短信包
                     $volume = $auditRecord['package_duration'];
                     Log::record('mp_notify start sms ' . $volume . ' ' . $out_trade_no, Log::INFO);
                     $websiteUserFuncManager = new WebsiteUserFuncManager($auditRecord['user_id']);
                     $res = $websiteUserFuncManager->extendSmsAccount($volume);
                     Log::record('mp_notify finish sms ' . $out_trade_no, Log::INFO);
                     Log::save();
                     break;
             }
             M('audit_merchant_purchase')->where(array('trade_no' => $out_trade_no))->setField('status', 6);
             echo "success";
             Log::save();
             exit;
         } else {
             Log::record('mp_notify fail to pay ' . $out_trade_no, Log::ERR);
             Log::save();
             $data['status'] = 3;
             //支付失败
             M('audit_merchant_purchase')->where(array('trade_no' => $out_trade_no))->save($data);
             echo "fail";
             exit;
         }
     } else {
         Log::record('mp_notify verify fail.', Log::ERR);
         Log::save();
         echo "fail";
         exit;
     }
 }