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; } }