You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
information-system/webht/third_party/paypal/controllers/index.php

1506 lines
71 KiB
PHTML

<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Index extends CI_Controller {
public function __construct() {
parent::__construct();
// $this->output->enable_profiler(TRUE);
$this->load->model('Paypal_model');
$this->load->model('Note_model');
bcscale(2);
}
public function index() {
$this->note_list();
}
//收款记录列表
public function index_old($date = 'all', $page = 1) {
$this->permission->is_admin(true);
$data = array();
$data['current_m'] = $date == 'all' ? date('Ym') : date('Ym', strtotime($date));
$data['current_d'] = $date == 'all' ? '' : date('Ymj', strtotime($date));
$data['userdata'] = $this->session->userdata('admin_chtcdn');
$date = $date == 'all' ? 'all' : date('Y-m-d', strtotime($date));
$list = $this->Paypal_model->get_mail_list(30, '', $date);
$pages['total'] = count($list); //数据总条数
$pages['pageSize'] = 30; //每页展示数量
$pages['url'] = site_url("apps/paypal/index/index/" . $date . '/'); //页码链接
$pages['current'] = $page; //当前页码
$data['pageinfo'] = show_page($pages);
$mail_id_str = 0;
$list = array_slice($list, $pages['pageSize'] * ($page - 1), $pages['pageSize']);
foreach ($list as $v) {
$mail_id_str.=',' . $v->M_SN;
}
//echo $mail_id_str;
$data['list'] = array();
!empty($list) && $data['list'] = $this->Paypal_model->get_mail_list(30, $mail_id_str);
$this->load->view('n-header', $data);
$this->load->view('index');
$this->load->view('n-footer');
}
//收款邮件详情
public function detail($mail_sn, $tpl = 0) {
$this->permission->is_admin(true);
$data = array();
$mailinfo = $list = $this->Paypal_model->get_mail_list(30, $mail_sn);
if (empty($mailinfo[0])) {
//$url=site_url('apps/paypal/index/error_paypal');
//echo '<b style="color:#000ccc;text-align:center;">无详细信息,三秒后跳转......</b>';
//echo '<meta http-equiv="refresh"content="3; url='.$url.'"/>';
//die();
}
$mailinfo = $mailinfo[0];
$data['mail'] = $mailinfo;
if ($tpl == 0) {
$data['current_m'] = date('Ym', strtotime($mailinfo->M_AddTime));
$data['current_d'] = date('Ymj', strtotime($mailinfo->M_AddTime));
$data['detail_tpl'] = '1';
$data['userdata'] = $this->session->userdata('admin_chtcdn');
!empty($mailinfo->pm_orderid) && $data['orderinfo'] = $this->Paypal_model->get_order($mailinfo->pm_orderid, true);
$this->load->view('n-header', $data);
$this->load->view('index');
$this->load->view('n-footer');
} else {
$this->load->view('detail', $data);
}
}
//用于HT--交易详情
public function detail_ht($pm_transaction_id) {
$data = array();
//先查询原来的数据
$data['mailinfo'] = $list = $this->Paypal_model->get_paypal_msg($pm_transaction_id);
if (!empty($data['mailinfo'])) {
$data['mailinfo'] = $data['mailinfo'][0];
$this->load->view('detail_ht', $data);
} else {
$data = $this->Note_model->note($pm_transaction_id);
$this->load->view('mail_templete', $data);
}
}
//收款记录搜索
public function search() {
$data = array();
$data['current_m'] = date('Ym');
$data['current_d'] = '';
$data['userdata'] = $this->session->userdata('admin_chtcdn');
$data['list'] = array();
$mail_o_orderno = $this->input->post('search_key');
$data['search_key'] = $mail_o_orderno;
$data['list'] = $this->Paypal_model->get_search_mails($mail_o_orderno);
$this->load->view('n-header', $data);
$this->load->view('index');
$this->load->view('n-footer');
}
//我的收款
public function my_paypal() {
$userdata = $this->session->userdata('admin_chtcdn');
$data['current_m'] = date('Ym');
$data['current_d'] = '';
$data['userdata'] = $userdata;
$data['list'] = array();
if ($userdata != false && !empty($userdata['OPI_Email']) && !empty($userdata['OPI_FirstName'])) {
$data['list'] = $this->Paypal_model->get_my_order($userdata['OPI_Email'], $userdata['OPI_FirstName'], $userdata['OPI_Name']);
}
$this->load->view('n-header', $data);
$this->load->view('index');
$this->load->view('n-footer');
}
//从paypal接口获取交易记录列表
public function get_transactions_list() {
//查询条件 最后一次更新的时间
$last_paypal_msg = $this->Paypal_model->last_paypal_msg();
//修改为,查询最后一个交易记录时间,根据原始文本中的时间来查询,而不是数据库入库时间
$last_date = empty($last_paypal_msg) ? date('Y-m-d') . ' 00:00:00' : $last_paypal_msg[0]->pm_payment_date;
$last_date = str_replace(' ', 'T', $last_date) . 'Z';
$param['request'] = array(
'TRANSACTIONCLASS' => 'ALL',
'startdate' => $last_date
);
//访问接口,并对返回的数据转换格式
$sandbox = '0';
$base = $this->base($sandbox);
$transactions = $this->get_transactions($base, $param); //获取历史交易记录
$transactions = urldecode($transactions); //url格式
$result_count = substr_count($transactions, 'L_TIMESTAMP'); //交易记录条数
$list = array();
$temparray = explode('&', $transactions);
foreach ($temparray as $key => $value) {
$temp_arr = explode('=', $value);
if (isset($temp_arr[1])) {
$list[$temp_arr[0]] = $temp_arr[1];
}
}
//保存信息
for ($i = 0; $i < $result_count; $i++) {
//已经更新了的记录就不再保存,并停止处理剩下的数据
$has_exit = $this->Paypal_model->get_paypal_msg($list['L_TRANSACTIONID' . $i]);
if (!empty($has_exit)) {
die('更新了' . $i . '/' . $result_count . '条记录');
}
//只保存已经支付完成,且交易类型是付款和退款的交易记录,因为其他类型的交易记录获取不到交易详情
if ($list['L_STATUS' . $i] != 'Completed' || !in_array($list['L_TYPE' . $i], array('Payment', 'Refund'))) {
continue;
}
//保存交易信息
$pm_transaction_id = $list['L_TRANSACTIONID' . $i]; //交易号
$pm_orderid = ''; //订单号
$pm_item_name = ''; //交易备注说明
$pm_money = $list['L_AMT' . $i]; //交易金额
$pm_currency = $list['L_CURRENCYCODE' . $i]; //交易币种
$pm_payer = $list['L_NAME' . $i]; //客人名字
$pm_payer_email = ''; //客人邮箱
$pm_payer_status = ''; //是否paypal已认证的客人
$pm_memo = ''; //交易详情json数据集
$pm_pay_type = $list['L_TYPE' . $i]; //交易类型
$pm_payment_date = $list['L_TIMESTAMP' . $i]; //交易时间
$pm_payment_date = str_replace(array('T', 'Z'), array(' ', ''), $pm_payment_date);
$insert_res = $this->Paypal_model->save_paypal_msg($pm_transaction_id, $pm_orderid, $pm_item_name, $pm_money, $pm_currency, $pm_payer, $pm_payer_email, $pm_payer_status, $pm_memo, $pm_payment_date, $pm_pay_type);
}
echo ('更新了' . ($result_count) . '条记录');
}
public function get_transactions_detail_by_paymentToken()
{
$token = $this->input->post("t");
$base = $this->base(0);
// $post = "METHOD=GetTransactionDetails&VERSION=100.0&TRANSACTIONID=$token";
// $post = "METHOD=GetExpressCheckoutDetails&VERSION=124.0&TOKEN=$token";
$token = str_replace(' ', 'T', $token) . 'Z';
$post = "METHOD=TransactionSearch&VERSION=100.0&TRANSACTIONCLASS=ALL&STARTDATE=$token";
$detail = $this->call($base, $post);
var_dump($detail);
return;
}
//根据交易号获取交易详细信息
public function get_transactions_detail($redirect = 0) {
//从数据库提取一条还没有更新交易详情的记录获取交易号
$pay_data = $this->Paypal_model->get_paypal_msg();
if (empty($pay_data)) {
if ($redirect == 1) {
//重定向
redirect(site_url('apps/paypal'));
}
die('暂无更新');
}
$pay_data = $pay_data[0];
$transactionsID = $pay_data->pm_transaction_id;
//接口信息拼接
$sandbox = '0';
$base = $this->base($sandbox);
$post = "METHOD=GetTransactionDetails&VERSION=100.0&TRANSACTIONID=$transactionsID";
$detail = $this->call($base, $post);
//格式化接口返回数据
$detail = urldecode($detail);
$detail_list = array();
$temparray = explode('&', $detail);
foreach ($temparray as $key => $value) {
$temp_arr = explode('=', $value);
if (isset($temp_arr[1])) {
$detail_list[$temp_arr[0]] = $temp_arr[1];
}
}
//请求数据状态是成功且支付状态是完成的,更新交易记录信息
if (isset($detail_list['ACK']) && isset($detail_list['PAYMENTSTATUS']) && $detail_list['ACK'] == 'Success' && $detail_list['PAYMENTSTATUS'] == 'Completed') {
$pm_sn = $pay_data->pm_sn;
//$pm_orderid=(isset($detail_list['INVNUM']) && !empty($detail_list['INVNUM']))?$detail_list['INVNUM']:isset($detail_list['CUSTOM'])?$detail_list['CUSTOM']:isset($detail_list['L_NAME0'])?$detail_list['L_NAME0']:'';
//ycc 修改了获取订单号的优先级和优化逻辑判断INVNUM>L_NUMBER0>CUSTOM>L_NAME0
$pm_orderid = '';
if (isset($detail_list['INVNUM']) && !empty($detail_list['INVNUM'])) {
$pm_orderid = $detail_list['INVNUM'];
} else {
if (isset($detail_list['L_NUMBER0']) && !empty($detail_list['L_NUMBER0'])) {
$pm_orderid = $detail_list['L_NUMBER0'];
} else {
if (isset($detail_list['CUSTOM']) && !empty($detail_list['CUSTOM'])) {
$pm_orderid = $detail_list['CUSTOM'];
} else {
if (isset($detail_list['L_NAME0']) && !empty($detail_list['L_NAME0'])) {
$pm_orderid = $detail_list['L_NAME0'];
}
}
}
}
$pm_item_name = $pm_orderid;
$orderinfo = $pm_orderid;
if (strpos($orderinfo, 'Tracking Code:') !== false) {
$orderinfo = explode('Tracking Code:', $orderinfo);
$orderinfo = explode('Travel Advisor', $orderinfo[1]);
$orderinfo = trim($orderinfo[0]);
}
//订单号过滤
$orderinfo = explode('--', $orderinfo);
$orderinfo = $orderinfo[0];
$orderinfo = explode('_', $orderinfo);
//$orderinfo=$orderinfo[0]; ycc移到下面去了在这里赋值的话后面用$orderinfo[1]是不存在的 --2016.02.19
$ordertype = 'N';
if (isset($orderinfo[1])) {
$ordertype_temp = trim($orderinfo[1]);
if (substr($ordertype_temp, 0, 1) == 'T') {
$ordertype = 'T';
} elseif (substr($ordertype_temp, 0, 1) == 'B') {
$ordertype = 'B';
}
}
$orderinfo = $orderinfo[0];
$orderinfo = explode(',', $orderinfo);
$orderid = trim($orderinfo[0]);
$temp_orderid = explode('-', $orderid);
if (isset($temp_orderid[1])) {
$orderid = trim($temp_orderid[1]);
}
$tempid = explode(' ', $orderid);
$pm_orderid = $tempid[0]; //订单号
$pm_payer_email = $detail_list['EMAIL']; //客人邮箱
$pm_payer_status = $detail_list['PAYERSTATUS']; //客人认证状态
$pm_memo = json_encode($detail_list); //序列化数据
$this->Paypal_model->update_paypal_msg($pm_sn, $pm_orderid, $pm_item_name, $pm_payer_email, $pm_payer_status, $pm_memo);
//查找外联信息
$M_State = 0;
if (!empty($pm_orderid)) {
$pm_invoice = $pm_orderid;
$advisor_info = $this->Paypal_model->get_order($pm_orderid, false, $ordertype);
$OPI_Email = isset($advisor_info->OPI_Email) ? $advisor_info->OPI_Email : '';
$OPI_FirstName = isset($advisor_info->OPI_FirstName) ? $advisor_info->OPI_FirstName : isset($advisor_info->OPI_Name) ? $advisor_info->OPI_Name : '';
//有订单号,但是匹配不到外联(带收款进来的新订单)
if (empty($OPI_Email) && empty($OPI_FirstName)) {
$M_State = 2;
}
//匹配到了外联,但是外联没有邮箱
elseif (empty($OPI_Email) && !empty($OPI_FirstName)) {
$M_State = 3;
}
}
//没有订单号,转发给陆燕
else {
$OPI_Email = 'lussie@chinahighlights.net';
$OPI_FirstName = 'Lussie';
}
//给外联发送通知邮件
$fromName = $pay_data->pm_payer;
$fromEmail = $detail_list['EMAIL'];
$toName = $OPI_FirstName;
$toEmail = $OPI_Email;
$subject = '来自' . $pay_data->pm_payer . '的付款';
if (!empty($pm_orderid))
$subject = $pm_orderid . ' / ' . $pay_data->pm_money . $pay_data->pm_currency . ' / ' . $pay_data->pm_payer;
$data['mailinfo'] = $pay_data;
$data['mailinfo']->INSURANCEOPTIONSELECTED = isset($detail_list['INSURANCEOPTIONSELECTED']) ? $detail_list['INSURANCEOPTIONSELECTED'] : '';
$data['mailinfo']->SUBJECT = isset($detail_list['SUBJECT']) ? $detail_list['SUBJECT'] : '';
$data['mailinfo']->NOTE = isset($detail_list['NOTE']) ? $detail_list['NOTE'] : '';
$data['mailinfo']->pm_payer_email = $detail_list['EMAIL'];
$data['mailinfo']->pm_item_name = $pm_item_name;
$data['mailinfo']->pm_memo = $pm_memo;
$data['mailinfo']->pm_payer_status = $pm_payer_status;
$body = $this->load->view('mail_tpl', $data, true);
$M_RelatedInfo = $pm_sn;
$M_AddTime = $pay_data->pm_payment_date;
$this->Paypal_model->save_automail($fromName, $fromEmail, $toName, $toEmail, $subject, $body, $M_RelatedInfo, $M_State, $M_AddTime);
if (!empty($pm_orderid)) {
//更新还没有填的客邮和交易号de收款记录商务订单
if (isset($advisor_info->order_type) && $advisor_info->order_type == 0) {
$ht_memo = '交易号(自动录入):' . $transactionsID;
$GAI_COLI_SN = isset($advisor_info->COLI_SN) ? $advisor_info->COLI_SN : 0;
$this->Paypal_model->add_account_info($GAI_COLI_SN, $advisor_info->COLI_ID, $pay_data->pm_money, $pay_data->pm_payment_date, mb_strtoupper($pay_data->pm_currency), $pay_data->pm_payment_date, $pay_data->pm_payment_date, $pay_data->pm_payment_date, '', $detail_list['EMAIL'], $transactionsID, $ht_memo);
}
//更新还没有填的客邮和交易号de收款记录传统订单
elseif (isset($advisor_info->order_type) && $advisor_info->order_type == 1) {
//
}
}
}
if ($redirect == 1) {
//redirect(site_url('apps/paypal'));
}
echo $transactionsID . '更新成功';
}
//定时执行:重新设置新订单邮件的外联信息
public function set_owner() {
//新订单,无外联,每次更新最新的10条
$mail_info2 = $this->Paypal_model->get_unsend_list(10, 2);
if (!empty($mail_info2)) {
foreach ($mail_info2 as $key => $mail_info) {
$orderinfo = $mail_info->pm_item_name;
if (strpos($orderinfo, 'Tracking Code:') !== false) {
$orderinfo = explode('Tracking Code:', $orderinfo);
$orderinfo = explode('Travel Advisor', $orderinfo[1]);
$orderinfo = trim($orderinfo[0]);
}
$orderinfo = explode('--', $orderinfo);
$orderinfo = $orderinfo[0];
$orderinfo = explode('_', $orderinfo);
$ordertype = 'N';
if (isset($orderinfo[1])) {
$ordertype_temp = trim($orderinfo[1]);
if (substr($ordertype_temp, 0, 1) == 'T') {
$ordertype = 'T';
} elseif (substr($ordertype_temp, 0, 1) == 'B') {
$ordertype = 'B';
}
}
$advisor_info = $this->Paypal_model->get_order($mail_info->pm_orderid, false, $ordertype);
$OPI_Email = isset($advisor_info->OPI_Email) ? $advisor_info->OPI_Email : '';
$OPI_FirstName = isset($advisor_info->OPI_FirstName) ? $advisor_info->OPI_FirstName : isset($advisor_info->OPI_Name) ? $advisor_info->OPI_Name : '';
//设置外联邮箱,并把邮件设置为未发送
if (!empty($OPI_Email)) {
$send_state = 0;
$this->Paypal_model->update_mail($mail_info->M_SN, $OPI_Email, $OPI_FirstName, $send_state);
echo '新订单外联信息有更新<br>';
}
}
} else {
echo '暂无“没有设置外联”的新订单<br>';
}
//外联无邮箱,每次更新最新的10条
$mail_info3 = $this->Paypal_model->get_unsend_list(10, 3);
if (!empty($mail_info3)) {
foreach ($mail_info3 as $key => $mail_info) {
$orderinfo = $mail_info->pm_item_name;
if (strpos($orderinfo, 'Tracking Code:') !== false) {
$orderinfo = explode('Tracking Code:', $orderinfo);
$orderinfo = explode('Travel Advisor', $orderinfo[1]);
$orderinfo = trim($orderinfo[0]);
}
$orderinfo = explode('--', $orderinfo);
$orderinfo = $orderinfo[0];
$orderinfo = explode('_', $orderinfo);
$ordertype = 'N';
if (isset($orderinfo[1])) {
$ordertype_temp = trim($orderinfo[1]);
if (substr($ordertype_temp, 0, 1) == 'T') {
$ordertype = 'T';
} elseif (substr($ordertype_temp, 0, 1) == 'B') {
$ordertype = 'B';
}
}
$advisor_info = $this->Paypal_model->get_order($mail_info->pm_orderid, false, $ordertype);
$OPI_Email = isset($advisor_info->OPI_Email) ? $advisor_info->OPI_Email : '';
$OPI_FirstName = isset($advisor_info->OPI_FirstName) ? $advisor_info->OPI_FirstName : isset($advisor_info->OPI_Name) ? $advisor_info->OPI_Name : '';
//设置外联邮箱,并把邮件设置为未发送
if (!empty($OPI_Email)) {
$send_state = 0;
$this->Paypal_model->update_mail($mail_info->M_SN, $OPI_Email, $OPI_FirstName, $send_state);
echo '外联没有邮箱的邮件信息有更新<br>';
} else {
echo $OPI_FirstName . '没有外联邮箱<br>';
}
}
} else {
echo '暂无外联没有邮箱<br>';
}
echo 'ok<br>';
}
//设置授权
public function base($sandbox) {
if ($sandbox == '1') {
$base = array(
'url' => 'https://api-3t.sandbox.paypal.com/nvp',
'username' => 'pays_api1.chinahighlights.com',
'password' => 'HWJ7BFSZBZUETZ4K',
'signature' => 'AxfjDmuPaaxMccY-8ZHIWGDHQKxOAyYzBPToLDzU-cgnldnh6eZGKJMn'
);
}
if ($sandbox == '0') {
$base = array(
'url' => 'https://api-3t.paypal.com/nvp',
'username' => 'pays_api1.chinahighlights.com',
'password' => 'HWJ7BFSZBZUETZ4K',
'signature' => 'AxfjDmuPaaxMccY-8ZHIWGDHQKxOAyYzBPToLDzU-cgnldnh6eZGKJMn'
);
}
return $base;
}
//获取交易历史记录列表
public function get_transactions($base, $param) {
$post = 'METHOD=TransactionSearch&';
$post .= 'VERSION=100.0';
foreach ($param['request'] as $key => $value) {
$post .= '&' . strtoupper($key) . '=' . $value;
}
$transactions = $this->call($base, $post);
return $transactions;
}
//请求接口
public function call($base, $post) {
$post .= '&PWD=' . $base['password'];
$post .= '&USER=' . $base['username'];
$post .= '&SIGNATURE=' . $base['signature'];
//print_r($post);
// print_r($base);
//die();
//启动服务器代理
$ch = curl_init($base['url']); //初始化URL
curl_setopt($ch, CURLOPT_PORT, 443);
curl_setopt($ch, CURLOPT_HEADER, 0); //启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); //在完成交互以后强迫断开连接,不能重用
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); //强制获取一个新的连接,替代缓存中的连接。
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //数据全部通过post发送Content-Type头将会被设置成multipart/form-data
$response = curl_exec($ch);
if (empty($response)) {
return 'No response received.';
} else {
return $response;
}
curl_close($ch);
}
//错误信息
public function error_paypal($page = 1) {
$userdata = $this->session->userdata('admin_chtcdn');
$data['current_m'] = date('Ym');
$data['current_d'] = '';
$data['userdata'] = $userdata;
//获取最近三个月的数据
$lastinfo = $this->Paypal_model->last_paypal_msg();
$lastdate = $lastinfo[0]->pm_create_date;
$lastdate = substr($lastdate, 0, 10);
$data['list'] = array();
$data['list'] = $this->Paypal_model->get_all_error_order(0, $lastdate);
$data['error'] = 1;
$this->load->view('n-header', $data);
$this->load->view('index');
$this->load->view('n-footer');
}
//订单不匹配处理
public function unmatch($type) {
$userdata = $this->session->userdata('admin_chtcdn');
$data['current_m'] = date('Ym');
$data['current_d'] = '';
$data['userdata'] = $userdata;
$data['list2'] = array();
//获取最近三个月的数据
$lastinfo = $this->Paypal_model->last_paypal_msg();
$lastdate = $lastinfo[0]->pm_create_date;
$lastdate = substr($lastdate, 0, 10);
if (isset($type)) {
$data['list2'] = $this->Paypal_model->get_unmatch_list($type, $lastdate);
} else {
redirect(site_url('apps/paypal'));
die();
}
$data['fg'] = 1; //@fg为订单不匹配时显示的标志
$this->load->view('n-header', $data);
$this->load->view('index');
$this->load->view('n-footer');
}
//存储paypal发送的消息
public function paypal_note() {
$pn_txn_id = $this->input->post('txn_id');
6 years ago
log_message('error','paypal-note: ' . $pn_txn_id);
$pn_invoice = $this->input->post('invoice');
empty($pn_invoice) ? $pn_invoice = $this->input->post('transaction_subject') : false;
empty($pn_invoice) ? $pn_invoice = '' : false;
$pn_custom = $this->input->post('custom');
empty($pn_custom) ? $pn_custom = '' : false;
$pn_mc_gross = $this->input->post('mc_gross');
$pn_item_name = $this->input->post('item_name');
if (empty($pn_item_name)) {
$pn_item_name = $this->input->post('item_name1'); //APP用SDK支付的话会是item_name1
empty($pn_item_name) ? $pn_item_name = '' : false;
}
$pn_item_number = $this->input->post('item_number');
if (empty($pn_item_number)) {
$pn_item_number = $this->input->post('item_number1'); //APP用SDK支付的话会是item_number1
empty($pn_item_number) ? $pn_item_number = '' : false;
}
$pn_mc_currency = $this->input->post('mc_currency');
$pn_payment_status = $this->input->post('payment_status');
$pn_payment_date = $this->input->post('payment_date');
$pn_payer = $this->input->post('first_name') . ' ' . $this->input->post('last_name');
$pn_payer_email = $this->input->post('payer_email');
$pn_memo = json_encode($_POST);
if (!empty($pn_txn_id)) {
//把PDT时间转成GMT时间
$pn_payment_date = gmdate('Y-m-d H:i:s', strtotime($pn_payment_date));
$this->Note_model->save_paypal_note($pn_txn_id, $pn_invoice, $pn_custom, $pn_mc_gross, $pn_item_name, $pn_item_number, $pn_mc_currency, $pn_payment_status, $pn_payer, $pn_payer_email, $pn_payment_date, $pn_memo);
6 years ago
log_message('error','paypal-note-succeed ' . $pn_txn_id . ' # ' . $pn_invoice);
6 years ago
// echo 'ok';
} else {
6 years ago
// echo 'no';
}
6 years ago
return ;
}
//解析出订单号
public function analysis_orderid($note_invoice_string) {
$data = array();
//空字符串或者小于8位都属于不正确的订单号
if (empty($note_invoice_string) || strlen($note_invoice_string) < 8) {
return false;
}
//APP订单处理如标题China Train Booking-160617462
if ((strpos($note_invoice_string, 'China Train Booking') !== false) || (strpos($note_invoice_string, 'ChinaTrainBooking') !== false)) {
$note_invoice_string = explode('-', $note_invoice_string);
if (isset($note_invoice_string[1])) {
$note_invoice_string = trim($note_invoice_string[1]);
}
return json_encode(array('orderid' => $note_invoice_string, 'ordertype' => 'A')); //APP订单不需要处理交易记录和通知
}
//订单号例子 160420021_B--9608
//Tracking code:2016-05-06-JJ160319027 /Travel advisor:Fiona Jiang /Content:Shanghai, Beijing, Pingyao, Xian, Guilin, Yangshuo, S
if (strpos($note_invoice_string, 'Tracking Code:') !== false) {
$note_invoice_string = explode('Tracking Code:', $note_invoice_string);
$note_invoice_string = explode('Travel Advisor', $note_invoice_string[1]);
$note_invoice_string = trim($note_invoice_string[0]);
}
//订单号过滤
$note_invoice_string = explode('--', $note_invoice_string);
$note_invoice_string = $note_invoice_string[0];
$note_invoice_string = explode('_', $note_invoice_string);
//订单类型识别
$ordertype = 'N';
if (isset($note_invoice_string[1])) {
$ordertype_temp = trim($note_invoice_string[1]);
if (substr($ordertype_temp, 0, 2) == 'TP') {
$ordertype = 'TP';
} elseif (substr($ordertype_temp, 0, 1) == 'T') {
$ordertype = 'T';
} elseif (substr($ordertype_temp, 0, 1) == 'B') {
$ordertype = 'B';
}
}
// 2018.05.28 for Trippest, tourMaster的订单号是01开头
if (substr($note_invoice_string[0], 0, 2) == '01') {
$ordertype = 'TP';
}
//手机订单、机票订单都没有加标示,在这里帮加上,暂时的,今后还是要在网前设置好
if ($ordertype == 'N' && isset($note_invoice_string[0])) {
$orderid_temp = $note_invoice_string[0];
if (strlen($orderid_temp) == 9 && substr($orderid_temp, 0, 2) == '16') {
$ordertype = 'B';
}
}
//前台预付款订单以45开头如45117640类型的订单号这个类型的订单会分配到某个新订单去需要查找COLI_AddCode来找新订单号然后再发送通知
if ($ordertype == 'N' && isset($note_invoice_string[0])) {
$orderid_temp = $note_invoice_string[0];
if (strlen($orderid_temp) == 8 && substr($orderid_temp, 0, 2) == '45') {
$ordertype = 'M';
}
}
//新的订单号14733661876255
if ($ordertype == 'N' && isset($note_invoice_string[0])) {
$orderid_temp = $note_invoice_string[0];
if (strlen($orderid_temp) == 14 && substr($orderid_temp, 0, 2) == '14') {
$ordertype = 'M';
}
}
if ($ordertype == 'N') {
return false; //没有编号的订单直接显示错误,由人工分配
}
$note_invoice_string = $note_invoice_string[0];
$note_invoice_string = explode(',', $note_invoice_string);
$orderid = trim($note_invoice_string[0]);
$temp_orderid = explode('-', $orderid);
if (isset($temp_orderid[1])) {
$orderid = trim($temp_orderid[1]);
}
$tempid = explode(' ', $orderid);
$pm_orderid = $tempid[0]; //订单号
if (empty($pm_orderid) || strlen($pm_orderid) < 8) {
return false;
}
return json_encode(array('orderid' => $pm_orderid, 'ordertype' => $ordertype));
}
/*
业务处理流程:
1. paypal_note函数是用来接收paypal提交过来的数据每一笔交易记录都会自动post过来
2. 用定时程序访问send_note函数查询未发送和发送错误的记录paypal_note函数存储的记录
3. analysis_orderid函数分析记录中的订单号识别传统订单、商务订单等
4. Paypal_model->get_order根据订单号和类型找到对应外联信息构造邮件发送给外联
5. 添加付款记录到订单信息中
*/
//找到没有发送的记录
public function send_note($pn_txn_id = false, $old_ssje=NULL) {
$data = array();
6 years ago
$handpick = empty($pn_txn_id) ? false : TRUE;
//优先处理指定的交易号,用于修正交易号直接发送通知
if (!empty($pn_txn_id)) {
$data['unsend_list'] = array($this->Note_model->note($pn_txn_id));
}
//找到处理过的的记录
if (empty($data['unsend_list'])) {
$data['unsend_list'] = $this->Note_model->unsend(10);
}
//没有未处理的数据再查找处理失败的数据
if (empty($data['unsend_list'])) {
$data['unsend_list'] = $this->Note_model->failnote(20);
}
$show_index = 0;
foreach ($data['unsend_list'] as $item) {
//已经发送的不处理,防止重复发送
if ($item->pn_send == 'send' && empty($pn_txn_id)) {
continue;
}
//显示处理记录
if (empty($pn_txn_id)) {
echo ++$show_index . ' ' . $item->pn_txn_id . '<br/>';
}
//退款状态默认为已经处理,陆燕在退款前手动通知外联了,系统跳过处理
if ($item->pn_payment_status == 'Refunded') {
$this->Note_model->update_send($item->pn_txn_id, 'send');
continue;
}
//只处理完成状态,其他状态由陆燕处理
if ($item->pn_payment_status !== 'Completed') {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
continue;
}
//根据note信息找到订单号
$get_order_no = $item->pn_invoice;
$orderid_info = $this->analysis_orderid($item->pn_invoice);
if (empty($orderid_info)) {
$get_order_no = $item->pn_custom;
$orderid_info = $this->analysis_orderid($item->pn_custom);
}
if (empty($orderid_info)) {
$get_order_no = $item->pn_item_name;
$orderid_info = $this->analysis_orderid($item->pn_item_name);
}
if (empty($orderid_info)) {
$get_order_no = $item->pn_item_number;
$orderid_info = $this->analysis_orderid($item->pn_item_number);
}
//找不到订单号,设置为发送失败标示
if (empty($orderid_info)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
continue;
}
$orderid_info = json_decode($orderid_info);
// 仅自动程序发送提醒 false == $handpick &&
if ($item->pn_payment_status === 'Completed'
&& $orderid_info->ordertype == 'A' && strpos($get_order_no, 'China Train Booking') !== false) {
// APP 组的China Train Booking-开头的订单号
// 发送邮件提醒外联核对收款金额, 不写入收款记录
$this->process_notify_APP($item, $orderid_info);
continue;
}
//检测是否是APP订单,默认不处理
// && $item->pn_payment_status !== 'Refunded'
if (
( (strpos($item->pn_memo, 'China Train Booking') !== false)
|| (strpos($item->pn_memo, 'ChinaTrainBooking') !== false)
)
&& empty($pn_txn_id)
) { //APP自动出票的订单不需要处理
$this->Note_model->update_send($item->pn_txn_id, 'send');
continue;
}
//根据订单号查找外联信息
$advisor_info = $this->Paypal_model->get_order($orderid_info->orderid, false, $orderid_info->ordertype, $handpick);
// for trippest tourMaster 2018.05.28
if ($orderid_info->ordertype == 'TP') {
$this->trippest_note($orderid_info, $item);
continue;
}
//查不到订单信息
if (empty($advisor_info)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
continue;
}
//更新正确的订单信息到记录中,以这个为主
$this->Note_model->set_invoice($item->pn_txn_id, $orderid_info->orderid . '_' . $orderid_info->ordertype);
//检测是否是APP订单,默认不处理
if ($orderid_info->ordertype == 'A' ) { //APP自动出票的订单不需要处理
$this->Note_model->update_send($item->pn_txn_id, 'send');
continue;
}
//添加支付信息入库
//没有分配订单之前先添加付款记录,这个过程可能会执行多次,必须在添加记录前查找是否有数据
if (!empty($orderid_info)) {
$ssje = $this->Paypal_model->get_ssje($item->pn_mc_gross, '15002', mb_strtoupper($item->pn_mc_currency));
$ssje = $old_ssje===NULL ? $ssje : $old_ssje;
//更新还没有填的客邮和交易号de收款记录商务订单
if (isset($advisor_info->order_type) && $advisor_info->order_type == 0) {
$ht_memo = '交易号(自动录入):' . $item->pn_txn_id;
$GAI_COLI_SN = isset($advisor_info->COLI_SN) ? $advisor_info->COLI_SN : 0;
//CHTAPP订单添加记录前判断是否有记录以前的APP版本没有交易号只能拿金额来判断
if (substr($advisor_info->COLI_WebCode, 0, 6) == 'CHTAPP' && strstr($advisor_info->COLI_WebCode, "-") !== '-biz') {//只判断前6位字符CHTAPP-fr CHTAPP-jp等各语种都属于APP订单
$this->Paypal_model->add_account_info_forAPP($GAI_COLI_SN, $advisor_info->COLI_ID, $item->pn_mc_gross, $item->pn_payment_date, mb_strtoupper($item->pn_mc_currency), $ssje, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payment_date, '', $item->pn_payer_email, $item->pn_txn_id, $ht_memo);
if ($advisor_info->COLI_WebCode == 'CHTAPP' && $advisor_info->COLI_State == 11) { //只修改APP组的订单状态并且订单进度是我的订单
$this->Paypal_model->update_biz_coli_state($GAI_COLI_SN, 8); //把订单状态改为已付款
$this->Paypal_model->insert_biz_order_log($GAI_COLI_SN, 'BS8');
}
} else {
// 把订单状态设置为13-新订单已支付
if (false == $this->Paypal_model->if_biz_gai_exists($item->pn_txn_id) ) {
$this->Paypal_model->update_biz_coli_state($GAI_COLI_SN, 13);
$this->Paypal_model->insert_biz_order_log($GAI_COLI_SN, 'BS13');
}
$this->Paypal_model->add_account_info($GAI_COLI_SN, $advisor_info->COLI_ID, $item->pn_mc_gross, $item->pn_payment_date, mb_strtoupper($item->pn_mc_currency), $ssje, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payment_date, '', $item->pn_payer_email, $item->pn_txn_id, $ht_memo);
// 更新订单主表付款方式,防止没访问thankyou-train.asp
$this->Paypal_model->update_paymanner($GAI_COLI_SN, '15010');
}
}
//更新还没有填的客邮和交易号de收款记录传统订单
elseif (isset($advisor_info->order_type) && $advisor_info->order_type == 1) {
$ht_memo = '交易号(自动录入):' . $item->pn_txn_id;
$GAI_COLI_SN = isset($advisor_info->COLI_SN) ? $advisor_info->COLI_SN : 0;
$gai_sn = $this->Paypal_model->add_tour_account_info($GAI_COLI_SN, $item->pn_mc_gross, $item->pn_payment_date, mb_strtoupper($item->pn_mc_currency), $ssje, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payer, $item->pn_payer_email, $item->pn_txn_id, $ht_memo);
//添加汉特的订单提醒
$this->Paypal_model->update_coli_introduction($GAI_COLI_SN, '已支付 ' . mb_strtoupper($item->pn_mc_currency) . $item->pn_mc_gross);
// 添加HT任务
$this->Paypal_model->exec_addToTask($gai_sn);
}
}
$opi_email = !empty($advisor_info->OPI_Email) ? $advisor_info->OPI_Email : ''; //lussie@chinahighlights.net
$opi_firstname = !empty($advisor_info->OPI_FirstName) ? $advisor_info->OPI_FirstName : !empty($advisor_info->OPI_Name) ? $advisor_info->OPI_Name : ''; //lussie
//没有外联信息表示订单未分配
if (empty($opi_email) || empty($opi_firstname)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
continue;
}
//添加邮件发送记录
if ($item->pn_send !== 'send') {
//给外联发送通知邮件
$fromName = !empty($item->pn_payer) ? $item->pn_payer : '';
$fromEmail = !empty($item->pn_payer_email) ? $item->pn_payer_email : '';
$toName = !empty($opi_firstname) ? $opi_firstname : '';
$toEmail = !empty($opi_email) ? $opi_email : '';
$subject = $orderid_info->orderid . '_' . $orderid_info->ordertype . ' / ' . $item->pn_mc_gross . $item->pn_mc_currency . ' / ' . $fromName;
$body = $this->load->view('mail_templete', $item, true); //$item->pn_memo;
$M_RelatedInfo = $item->pn_sn;
$M_AddTime = $item->pn_payment_date;
$M_State = 0;
$this->Paypal_model->save_automail($fromName, $fromEmail, $toName, $toEmail, $subject, $body, $M_RelatedInfo, $M_State, $M_AddTime, 'paypal note');
//添加邮件发送记录 end
$this->Note_model->update_send($item->pn_txn_id, 'send');
}
}
//echo 'done!';
}
6 years ago
/*!
* 退款处理
* @date 2019-05-05
* TODO:
* * 退款的记录增加发送财务的状态
*/
6 years ago
public function send_refund($item, $handpick, $old_ssje=NULL)
{
// 找到原始收款交易的订单
$parent_txn_id = json_decode($item->pn_memo)->parent_txn_id;
$parent_note = $this->Note_model->note($parent_txn_id);
if (empty($parent_note)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
return false;
}
//订单号
$orderid_info = $this->analysis_orderid($parent_note->pn_invoice);
//找不到订单号,设置为发送失败标示
if (empty($orderid_info)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
return false;
}
$orderid_info = json_decode($orderid_info);
if (in_array($orderid_info->ordertype, array('TP', 'A')) ) {
$orderid_info->ordertype = 'B';
}
//根据订单号查找外联信息
$advisor_info = $this->Paypal_model->get_order($orderid_info->orderid, false, $orderid_info->ordertype, $handpick);
//查不到订单信息
if (empty($advisor_info)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
return false;
}
//更新正确的订单信息到记录中,以这个为主
$this->Note_model->set_invoice($item->pn_txn_id, $orderid_info->orderid . '_' . $orderid_info->ordertype);
//添加支付信息入库
//没有分配订单之前先添加付款记录,这个过程可能会执行多次,必须在添加记录前查找是否有数据
if (!empty($orderid_info)) {
$ssje = $this->Paypal_model->get_ssje($item->pn_mc_gross, '15002', mb_strtoupper($item->pn_mc_currency));
$ssje = $old_ssje===NULL ? $ssje : $old_ssje;
//更新还没有填的客邮和交易号de收款记录商务订单
if (isset($advisor_info->order_type) && $advisor_info->order_type == 0) {
$ht_memo = '(自动录入)退款号:' . $item->pn_txn_id . "\n. ";
$ht_memo .= '原收款号:' . $parent_txn_id;
$GAI_COLI_SN = isset($advisor_info->COLI_SN) ? $advisor_info->COLI_SN : 0;
//CHTAPP订单添加记录前判断是否有记录以前的APP版本没有交易号只能拿金额来判断
if (substr($advisor_info->COLI_WebCode, 0, 6) == 'CHTAPP' && strstr($advisor_info->COLI_WebCode, "-") != '-biz') {//只判断前6位字符CHTAPP-fr CHTAPP-jp等各语种都属于APP订单
$this->Paypal_model->add_account_info_forAPP($GAI_COLI_SN, $advisor_info->COLI_ID, $item->pn_mc_gross, $item->pn_payment_date, mb_strtoupper($item->pn_mc_currency), $ssje, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payer, $item->pn_payer_email, $item->pn_txn_id, $ht_memo);
$this->Paypal_model->insert_biz_order_log($GAI_COLI_SN, 'Refunded');
} else {
if (false == $this->Paypal_model->if_biz_gai_exists($item->pn_txn_id) ) {
$this->Paypal_model->insert_biz_order_log($GAI_COLI_SN, 'Refunded');
}
$this->Paypal_model->add_account_info($GAI_COLI_SN, $advisor_info->COLI_ID, $item->pn_mc_gross, $item->pn_payment_date, mb_strtoupper($item->pn_mc_currency), $ssje, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payer, $item->pn_payer_email, $item->pn_txn_id, $ht_memo);
}
}
//更新还没有填的客邮和交易号的收款记录(传统订单)
elseif (isset($advisor_info->order_type) && $advisor_info->order_type == 1) {
$ht_memo = '(自动)退款号:' . $item->pn_txn_id . "\n. ";
$ht_memo .= '原交易号:' . $parent_txn_id;
$GAI_COLI_SN = isset($advisor_info->COLI_SN) ? $advisor_info->COLI_SN : 0;
$gai_sn = $this->Paypal_model->add_tour_account_info($GAI_COLI_SN, $item->pn_mc_gross, $item->pn_payment_date, mb_strtoupper($item->pn_mc_currency), $ssje, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payment_date, $item->pn_payer, $item->pn_payer_email, $item->pn_txn_id, $ht_memo);
//添加汉特的订单提醒
$this->Paypal_model->update_coli_introduction($GAI_COLI_SN, '已退款 ' . mb_strtoupper($item->pn_mc_currency) . $item->pn_mc_gross);
}
}
$opi_email = !empty($advisor_info->OPI_Email) ? $advisor_info->OPI_Email : ''; //lussie@chinahighlights.net
$opi_firstname = !empty($advisor_info->OPI_FirstName) ? $advisor_info->OPI_FirstName : !empty($advisor_info->OPI_Name) ? $advisor_info->OPI_Name : ''; //lussie
//没有外联信息表示订单未分配
if (empty($opi_email) || empty($opi_firstname)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
return false;
}
//添加邮件发送记录
if ($item->pn_send !== 'send' && substr($item->pn_send, 0, 5) !== 'send-') {
// 客人邮件中的外联落款
// $web_code = 'cht'; // 默认cht
$web_lgc = 1;
$web_code = strtolower($advisor_info->COLI_WebCode);
$site_info = $this->config->item('site');
if (isset($site_info[$web_code])) {
$site_info = $site_info[$web_code];
$item->site = $site_info['site_url'];
$web_lgc = $site_info['site_lgc'];
}
$advisor_detail = $this->Paypal_model->get_advisor_detail($advisor_info->COLI_SN, $advisor_info->OPI_SN, $web_lgc);
$item->advisor_detail = $advisor_detail;
//给外联发送通知邮件
$fromName = !empty($item->pn_payer) ? $item->pn_payer : '';
$fromEmail = !empty($item->pn_payer_email) ? $item->pn_payer_email : '';
$toName = !empty($opi_firstname) ? $opi_firstname : '';
$toEmail = !empty($opi_email) ? $opi_email : '';
$subject = $orderid_info->orderid . '_' . $orderid_info->ordertype . ' / ' . $item->pn_mc_gross . $item->pn_mc_currency . ' / ' . $fromName;
$body = $this->load->view('mail_templete', $item, true);
$M_RelatedInfo = $item->pn_sn;
$M_AddTime = $item->pn_payment_date;
$M_State = 0;
$this->Paypal_model->save_automail($fromName, $fromEmail, $toName, $toEmail, $subject, $body, $M_RelatedInfo, $M_State, $M_AddTime, 'paypal note');
// 通知客人, 客人邮箱
$customer_detail = $this->Paypal_model->get_customer_detail($advisor_info->COLI_SN, $orderid_info->ordertype);
$c_fromName = $advisor_detail->fullname;
$opi_email_list = explode(";", $advisor_detail->email); // 解析外联的邮件
$c_fromEmail = trim($opi_email_list[0]);
$c_toName = $customer_detail->fullname;
$c_toEmail = $customer_detail->email;
$c_subject = $item->pn_mc_currency . " " . str_replace('-', '', $item->pn_mc_gross) . " Refunded to your account, booking number " . $item->pn_invoice;
$c_body = $this->load->view('refund_buyer', $item, true);
$c_M_RelatedInfo = $item->pn_sn;
$c_M_AddTime = $item->pn_payment_date;
$c_M_State = 0;
$this->Paypal_model->save_automail(
$c_fromName,
$c_fromEmail,
$c_toName,
$c_toEmail,
$c_subject,
$c_body,
$c_M_RelatedInfo,
$c_M_State,
$c_M_AddTime,
'paypal refund receipt');
$this->Note_model->update_send($item->pn_txn_id, 'send-customer');
}
//添加邮件发送记录 end
// TODO 如果已做账, 标记需要通知财务send-to-finance, 通知时间用订单日志记录
return ;
}
public function trippest_note($orderid_info, $paypal_msg)
{
$send_type = '';
$tp_orderid = '';
$real_orderid = $orderid_info->orderid;
if (substr($orderid_info->orderid, 0, 2) == '01') {
$tp_orderid = "#" . substr($orderid_info->orderid, 10);
$real_orderid = '';
}
// 获取HT订单号
$ht_tp_order = $this->Paypal_model->get_trippest_order($tp_orderid, $real_orderid);
if (empty($ht_tp_order)) {
/**
* 此处不直接退出是为了:在(邮件订单不能自动录入/未收到新订单邮件)时也能通知外联已收款,防止漏单
* 本方法内-以下的非空判断同理: !empty($ht_tp_order)
* * 未找到订单先邮件通知: pn_send='', 继续排队等待录入. 直到匹配订单变更为send
*/
// return $this->Note_model->update_send($paypal_msg->pn_txn_id, 'sendfail');
} else {
$tp_orderid = $ht_tp_order->COLI_PriceMemo;
$real_orderid = $ht_tp_order->COLI_ID;
//更新正确的订单信息到记录中,以这个为主
$this->Note_model->set_invoice($paypal_msg->pn_txn_id, $ht_tp_order->COLI_ID . '_TP');
}
$ssje = $this->Paypal_model->get_ssje($paypal_msg->pn_mc_gross, '15002', mb_strtoupper($paypal_msg->pn_mc_currency));
$ht_memo = '交易号(自动录入):' . $paypal_msg->pn_txn_id;
if (false == $this->Paypal_model->if_biz_gai_exists($paypal_msg->pn_txn_id) ) {
if ( ! empty($ht_tp_order)) {
$this->Paypal_model->update_biz_coli_state($ht_tp_order->COLI_SN, 13);
$this->Paypal_model->insert_biz_order_log($ht_tp_order->COLI_SN, 'BS13');
$this->Paypal_model->update_paymanner($ht_tp_order->COLI_SN, '15010');
}
if (trim($paypal_msg->pn_send)!='' && trim($paypal_msg->pn_send)!='send') {
$opi_firstname = "David";
$opi_email = "david@trippest.com";
$fromName = !empty($paypal_msg->pn_payer) ? $paypal_msg->pn_payer : '';
$fromEmail = !empty($paypal_msg->pn_payer_email) ? $paypal_msg->pn_payer_email : '';
$toName = !empty($opi_firstname) ? $opi_firstname : '';
$toEmail = !empty($opi_email) ? $opi_email : '';
$subject = $real_orderid . $tp_orderid . '_' . $orderid_info->ordertype . ' / ' . $paypal_msg->pn_mc_gross . $paypal_msg->pn_mc_currency . ' / ' . $fromName;
$body = $this->load->view('mail_templete', $paypal_msg, true); //$paypal_msg->pn_memo;
$M_RelatedInfo = $paypal_msg->pn_sn;
$M_AddTime = $paypal_msg->pn_payment_date;
$M_State = 0;
$this->Paypal_model->save_automail($fromName, $fromEmail, $toName, $toEmail, $subject, $body, $M_RelatedInfo, $M_State, $M_AddTime, 'paypal note');
empty($ht_tp_order) ? $send_type = "" : false ; // 未录订单先通知收款, 置为空继续排队
}
}
if ( ! empty($ht_tp_order)) {
$this->Paypal_model->add_account_info(
$ht_tp_order->COLI_SN,
$ht_tp_order->COLI_ID,
$paypal_msg->pn_mc_gross,
$paypal_msg->pn_payment_date,
mb_strtoupper($paypal_msg->pn_mc_currency),
$ssje,
$paypal_msg->pn_payment_date,
$paypal_msg->pn_payment_date,
$paypal_msg->pn_payment_date,
'',
$paypal_msg->pn_payer_email,
$paypal_msg->pn_txn_id,
$ht_memo
);
$send_type = "send";
}
$this->Note_model->update_send($paypal_msg->pn_txn_id, $send_type);
}
//所有记录列表
public function note_list() {
$this->permission->is_admin(true);
$data = array();
//有关键词则不限制日期
$data['search_key'] = $this->input->post('search_key');
$data['date'] = $this->input->get('date');
empty($data['date']) ? $data['date'] = date('Y-m-d') : false;
if (!empty($data['search_key'])) {
$data['notelist'] = $this->Note_model->search_key($data['search_key']);
} else {
$data['notelist'] = $this->Note_model->search_date($data['date']);
}
/**
* 导出记录用的记录节点
*/
$data['record_flags'] = $this->Note_model->list_export_record();
$this->load->view('n-header', $data);
$this->load->view('note_list');
$this->load->view('n-footer');
}
//所有记录列表
public function note_faillist() {
$this->permission->is_admin(true);
$data = array();
//有关键词则不限制日期
$data['search_key'] = $this->input->post('search_key');
$data['date'] = $this->input->get('date');
empty($data['date']) ? $data['date'] = date('Y-m-d') : false;
$data['notelist'] = $this->Note_model->failnote(100);
$this->load->view('n-header', $data);
$this->load->view('note_list');
$this->load->view('n-footer');
}
//获取note详情修改各项数据
public function note_modal($pn_txn_id, $pn_invoice = false) {
$this->permission->is_admin(true);
$data = array();
$data['pn_invoice'] = $pn_invoice;
if (!empty($pn_txn_id)) {
$data['note'] = $this->Note_model->note($pn_txn_id);
if (!empty($data['note'])) {
if (!empty($pn_invoice)) {
$orderid_info = $this->analysis_orderid($pn_invoice);
} else {
$orderid_info = $this->analysis_orderid($data['note']->pn_invoice);
}
if (!empty($orderid_info)) {
$orderid_info = json_decode($orderid_info);
$data['order_info'] = $this->Paypal_model->get_order($orderid_info->orderid, true, $orderid_info->ordertype);
}
echo json_encode($this->load->view('note_setting', $data, true));
return true;
}
}
echo json_encode('没找到数据!');
}
//修改订单名
public function note_modal_save() {
$this->gai_modal_save();
// $data = array();
// $pn_txn_id = $this->input->post('pn_txn_id');
// $pn_invoice = $this->input->post('pn_invoice');
// if (!empty($pn_txn_id) && !empty($pn_invoice)) {
// $orderid_info = $this->analysis_orderid($pn_invoice);
// if (!empty($orderid_info)) {
// $orderid_info = json_decode($orderid_info);
// $advisor_info = $this->Paypal_model->get_order($orderid_info->orderid, false, $orderid_info->ordertype);
// if (!empty($advisor_info)) {
// $this->Note_model->set_invoice($pn_txn_id, $pn_invoice);
// $this->send_note($pn_txn_id);
// echo json_encode('修改成功!');
// return true;
// }
// }
// }
// echo json_encode('没找到数据!');
}
//关闭note通知用于手动处理通知后
public function close_note($pn_txn_id) {
$data = array();
$data['note'] = $this->Note_model->note($pn_txn_id);
if (!empty($data['note'])) {
$this->Note_model->update_send($pn_txn_id, 'send');
echo json_encode('通知已经关闭!');
return true;
}
echo json_encode('没找到数据!');
}
public function export_list()
{
$from_date = $this->input->post("from_date");
$to_date = $this->input->post("to_date");
$currency = $this->input->post("currency");
$amount = $this->input->post("set_amount");
$last_record = $this->input->post("date_history");
if (empty($amount)) {
$export_list = $this->Note_model->date_range($from_date, $to_date, $currency);
} else {
$allmost_day = intval(ceil($amount/10000));
if ( ! in_array($currency, array('CNY','USD'))) {
$allmost_day = 30;
}
$last_sn = null;
$last_notice_sn = null;
$last_notice_record = array();
if ( ! empty($last_record)) {
$selection_text = explode("@", $last_record);
$last_sn = $selection_text[0];
$last_notice_record = $this->Note_model->list_export_record($last_sn);
if ( ! empty($last_notice_record[0])) {
$last_notice_sn = $last_notice_record[0]->TEL_transactionNoticeId;
// 查询导出记录时包含上次导出的最后一条.
// 因此目标金额设为本次的目标+上次已导出的部分
// 得到结果集之后会把本次的第一条的金额重新计算,即减去上次已导出金额.下述<!$>
$amount = bcadd($amount, $last_notice_record[0]->TEL_exportAmount);
$from_date = strstr($last_notice_record[0]->TEL_transactionDate, " ", TRUE);
$currency = $last_notice_record[0]->TEL_transactionCurrency;
}
}
$all_list = $this->target_amount_recursive($currency, $amount, 0, $from_date, $allmost_day, array(), $last_notice_sn);
$export_list = $all_list['list'];
// <!$>修改导出的第一条记录, 金额改为剩余金额<!$>
if ( ! empty($last_notice_record[0]) && $last_notice_record[0]->TEL_transactionNoticeId==$export_list[0]->pn_sn) {
$export_list[0]->pn_mc_gross = bcsub($last_notice_record[0]->TEL_transactionAmount, $last_notice_record[0]->TEL_exportAmount);
}
}
if ($export_list == false) {
echo "Not found any records for export.";
return false;
}
// 记录这次导出的最后一条
if (isset($all_list['last_flag']) && ! empty($all_list['last_flag'])) {
$balance_diff = bcsub($all_list['now_amount'], $amount);
$last_record_export = bcsub($all_list['last_flag']->pn_mc_gross, $balance_diff);
$insert_db = array(
"TEL_transactionType" => 15002
,"TEL_transactionNoticeId" => $all_list['last_flag']->pn_sn
,"TEL_transactionId" => $all_list['last_flag']->pn_txn_id
,"TEL_transactionDate" => $all_list['last_flag']->pn_datetime
,"TEL_transactionAmount" => $all_list['last_flag']->pn_mc_gross
,"TEL_transactionCurrency" => $all_list['last_flag']->pn_mc_currency
,"TEL_orderId" => $all_list['last_flag']->pn_invoice
,"TEL_exportAmount" => $last_record_export
,"TEL_exportDate" => date('Y-m-d H:i:s')
);
$this->Note_model->export_record($insert_db);
// 修改导出的最后一条
array_pop($export_list);
$all_list['last_flag']->pn_mc_gross = $last_record_export;
array_push($export_list, $all_list['last_flag']);
}
$this->save_excel($export_list);
}
/*!
* 递归查询收款记录, 直到总金额>=目标总金额
* @date 2019-02-27
*/
public function target_amount_recursive($currency, $target_amount, $now_amount, $from_date,$days=10,$list=array(), $last_sn=null, $last_flag=null)
{
$to_date = date('Y-m-d', strtotime("+$days days", strtotime($from_date)));
$former_list = $this->Note_model->date_range($from_date, $to_date, $currency, $last_sn);
$list_index = 0;
$last_sn = $last_sn===null ? 0 : $last_sn;
$last_flag = $last_flag===null ? null : $last_flag;
while ($now_amount < $target_amount && isset($former_list[$list_index])) {
$list[] = $former_list[$list_index];
$now_amount = bcadd($now_amount, $former_list[$list_index]->pn_mc_gross);
$last_sn = $former_list[$list_index]->pn_sn;
$last_flag = $former_list[$list_index];
$list_index++;
}
$ret = array(
"last_flag" => $last_flag,
"list" => $list,
"now_amount" => $now_amount
);
if (empty($former_list)) {
return $ret;
}
if ($now_amount < $target_amount) {
return $this->target_amount_recursive($currency, $target_amount, $now_amount, $to_date, 10, $list, $last_sn, $last_flag);
} else {
return $ret;
}
}
public function save_excel($export_list)
{
$this->load->library('PHPExcel');
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
//set width
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(5);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(30);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(30);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(20);
// 对齐
$objPHPExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$objPHPExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
// 表标题行
$objPHPExcel->getActiveSheet()
->SetCellValue('A1', '#')
->SetCellValue('B1', '团号')
->SetCellValue('C1', '金额')
->SetCellValue('D1', '币种')
->SetCellValue('E1', '付款人')
->SetCellValue('F1', '付款人邮箱')
->SetCellValue('G1', '交易号')
->SetCellValue('H1', '收单时间');
$currency_sum = array();
bcscale(2);
$rowCount = 2;
foreach ($export_list as $key => $row) {
if( trim($row->pn_mc_currency) != "") {
$currency_sum[trim($row->pn_mc_currency)] = @ bcadd($currency_sum[trim($row->pn_mc_currency)], $row->pn_mc_gross);
}
$payer = $row->pn_payer ? ($row->pn_payer . "<" . $row->pn_payer_email . ">") : "退款";
$orderid = $row->pn_invoice ? $row->pn_invoice : $row->pn_item_number;
$objPHPExcel->getActiveSheet()
->SetCellValue('A'.$rowCount, ($rowCount-1))
// ->SetCellValue('A'.$rowCount, $row->pn_sn)
->setCellValueExplicit('B'.$rowCount, $orderid,PHPExcel_Cell_DataType::TYPE_STRING)
->setCellValue('C'.$rowCount, number_format($row->pn_mc_gross, 2, ".", ""))
->setCellValueExplicit('D'.$rowCount, trim($row->pn_mc_currency) ,PHPExcel_Cell_DataType::TYPE_STRING)
->SetCellValue('E'.$rowCount, $row->pn_payer)
->SetCellValue('F'.$rowCount, $row->pn_payer_email)
->setCellValueExplicit('G'.$rowCount, $row->pn_txn_id,PHPExcel_Cell_DataType::TYPE_STRING)
->SetCellValue('H'.$rowCount, $row->pn_datetime);
$payer = $orderid = "";
$rowCount++;
}
$rowCount++; // 隔一行
// 汇总行
$objPHPExcel->getActiveSheet()
->SetCellValue('A' . $rowCount, '合计');
foreach ($currency_sum as $kc => $cur) {
$objPHPExcel->getActiveSheet()
->SetCellValue('B' . $rowCount, $kc)
->setCellValueExplicit('C' . $rowCount, number_format($cur, 2, ".", ""),PHPExcel_Cell_DataType::TYPE_STRING);
$rowCount++;
}
$filename = "export_paypal_" . date('Y-m-d');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $filename . '.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
}
/** 查看收款记录的是否已录入到订单 */
public function gai_modal($pn_txn_id=null, $pn_id = null, $neworder=null)
{
$this->permission->is_admin(true);
$data = array();
$data['note'] = $this->Note_model->note($pn_txn_id, $pn_id);
$orderid_info = $this->analysis_orderid($data['note']->pn_invoice);
if (!empty($orderid_info)) {
$orderid_info = json_decode($orderid_info);
if ($orderid_info->ordertype === 'TP') {
$orderid_info->ordertype = 'B';
}
if ($orderid_info->ordertype === 'T') {
$data['gai_info'] = $this->Paypal_model->get_money_t($pn_txn_id);
} elseif ($orderid_info->ordertype === 'B') {
$data['gai_info'] = $this->Paypal_model->get_money_b($pn_txn_id);
}
}
$data['old_order'] = $data['note']->pn_invoice;
$data['new_order'] = $neworder;
$data['order_info'] = null;
if ($neworder !== null) {
$neworder_id = $this->analysis_orderid($neworder);
$neworder_id = json_decode($neworder_id);
if ($neworder_id->ordertype === 'TP') {
$neworder_id->ordertype = 'B';
}
if ( ! empty($neworder_id)) {
$data['order_info'] = $this->Paypal_model->get_order($neworder_id->orderid, true, $neworder_id->ordertype);
}
}
echo json_encode($this->load->view('gai_setting', $data, true));
}
public function gai_modal_save()
{
$data = array();
$old_ssje = NULL;
$pn_txn_id = $this->input->post('pn_txn_id');
$pn_id = $this->input->post('pn_id');
$neworder = $this->input->post('pn_invoice');
$data['note'] = $this->Note_model->note($pn_txn_id, $pn_id);
$orderid_info = $this->analysis_orderid($data['note']->pn_invoice);
if (!empty($orderid_info)) {
$orderid_info = json_decode($orderid_info);
if ($orderid_info->ordertype === 'TP') {
$orderid_info->ordertype = 'B';
}
if ($orderid_info->ordertype === 'T') {
$data['gai_info'] = $this->Paypal_model->get_money_t($pn_txn_id);
if ( ! empty($data['gai_info'])) {
$old_ssje = $data['gai_info'][0]->GAI_SSJE;
$this->Paypal_model->delete_money_t($pn_txn_id);
}
} elseif ($orderid_info->ordertype === 'B') {
$data['gai_info'] = $this->Paypal_model->get_money_b($pn_txn_id);
if ( ! empty($data['gai_info'])) {
$old_ssje = $data['gai_info'][0]->GAI_SSJE;
$this->Paypal_model->delete_money_b($pn_txn_id);
}
}
}
if (!empty($pn_txn_id) && !empty($neworder)) {
$orderid_info = $this->analysis_orderid($neworder);
if (!empty($orderid_info)) {
$orderid_info = json_decode($orderid_info);
if ($orderid_info->ordertype === 'TP') {
$orderid_info->ordertype = 'B';
}
$advisor_info = $this->Paypal_model->get_order($orderid_info->orderid, false, $orderid_info->ordertype, TRUE);
if (!empty($advisor_info)) {
$this->Note_model->set_invoice($pn_txn_id, $neworder);
$this->send_note($pn_txn_id, $old_ssje);
echo json_encode('修改成功!');
return true;
}
}
}
echo json_encode('没找到数据!');
return;
}
public function closeGai($pn_txn_id)
{
$data = array();
$data['note'] = $this->Note_model->note($pn_txn_id);
if (!empty($data['note'])) {
$this->Note_model->update_send($pn_txn_id, 'closeRecord');
echo json_encode('该收款记录已经忽略!');
return true;
}
echo json_encode('没找到数据!');
return;
}
public function process_notify_APP($item, $orderid_info)
{
$advisor_info = $this->Paypal_model->get_order($orderid_info->orderid, false, $orderid_info->ordertype);
//查不到订单信息
if (empty($advisor_info)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
return false;
}
$opi_email = !empty($advisor_info->OPI_Email) ? $advisor_info->OPI_Email : ''; //lussie@chinahighlights.net
$opi_firstname = !empty($advisor_info->OPI_FirstName) ? $advisor_info->OPI_FirstName : !empty($advisor_info->OPI_Name) ? $advisor_info->OPI_Name : ''; //lussie
//没有外联信息表示订单未分配
if (empty($opi_email) || empty($opi_firstname)) {
$this->Note_model->update_send($item->pn_txn_id, 'sendfail');
return false;
}
//添加邮件发送记录
if ($item->pn_send !== 'send') {
//给外联发送通知邮件
$fromName = !empty($item->pn_payer) ? $item->pn_payer : '';
$fromEmail = !empty($item->pn_payer_email) ? $item->pn_payer_email : '';
$toName = !empty($opi_firstname) ? $opi_firstname : '';
$toEmail = !empty($opi_email) ? $opi_email : '';
// $subject = $orderid_info->orderid . '_' . $orderid_info->ordertype . ' / ' . $item->pn_mc_gross . $item->pn_mc_currency . ' / ' . $fromName;
$subject = "请核对收款_" . $orderid_info->orderid . "_" . $item->pn_mc_currency . "_" . $item->pn_mc_gross;
$body = $this->load->view('mail_templete', $item, true); //$item->pn_memo;
$M_RelatedInfo = $item->pn_sn;
$M_AddTime = $item->pn_payment_date;
$M_State = 0;
$this->Paypal_model->save_automail($fromName, $fromEmail, $toName, $toEmail, $subject, $body, $M_RelatedInfo, $M_State, $M_AddTime, 'paypal note');
//添加邮件发送记录 end
$this->Note_model->update_send($item->pn_txn_id, 'send');
}
return false;
}
}