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/pay/libraries/alipay_call.php

155 lines
6.6 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Alipay_call
{
protected $ci;
public function __construct()
{
$this->ci =& get_instance();
$this->ci->load->helper('payment');
$this->ci->config->load('alipay', true);
$this->ci->load->model('Online_payment_note_model', 'note_model');
$this->ci->load->model('Online_payment_account_model', 'account_model');
}
/**
*/
public function read_settlement_excel($filePath, $sheetIndex=0)
{
$tarr1=array();
$this->ci->load->library('PHPExcel');
$PHPExcel = new PHPExcel();
/**默认用excel2007读取excel若格式不对则用之前的版本进行读取*/
$PHPReader = new PHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($filePath)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($filePath)){
echo 'no Excel';
return ;
}
}
$PHPExcel = $PHPReader->load($filePath);
/**读取excel文件中的第一个工作表*/
$currentSheet = $PHPExcel->getSheet($sheetIndex);
/**取得最大的列号*/
$allColumn = $currentSheet->getHighestColumn();
/**取得一共有多少行*/
$allRow = $currentSheet->getHighestRow();
log_message('error','total row' . PHP_EOL . var_export($allRow, 1));
$col_titles = $this->settlement_excel_title();
/**从第二行开始输出因为excel表中第一行为列名*/
for($currentRow = 2;$currentRow <= $allRow;$currentRow++){
$row_tmp = array();
/**从第A列开始输出*/
$columnNum = 0;
// for($currentColumn= 'A';$currentColumn<= "AD"; $currentColumn++){
// 列标题Z之后的不能直接用逻辑运算
for($currentColumn= 'A';str_pad($currentColumn, 2, "0", STR_PAD_LEFT)<= $allColumn; $currentColumn++){
/**ord()将字符转为十进制数*/
// $val = trim($currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65,$currentRow)->getValue());
// 列标题Z之后不能直接用ord计算ASCII码,因ord仅返回第一个字符的结果导致列AA的值读取到列A
$val = trim($currentSheet->getCellByColumnAndRow($columnNum,$currentRow)->getValue());
if ( ! isset($col_titles[$currentColumn])) {
continue;
}
if ($currentColumn==='D' && !in_array(trim($val), array('交易', '交易退款'))) {
$row_tmp = array();
break;
}
$col_mean = $col_titles[$currentColumn];
$row_tmp[$col_mean] = trim($val)==='-' ? '' : str_replace('`','',$val);
$columnNum++;
}
if ( ! empty($row_tmp)) {
$tarr1[] = $row_tmp;
}
}
return $tarr1;
}
public function save_settlement_excel($excel_data)
{
$settle_cnt = 0;
foreach ($excel_data as $settle) {
$save_column = array();
$save_column['OPN_accountMethod'] = $this->ci->config->item('method_code', 'alipay');
$save_column['OPN_noticeType'] = trim($settle['trade_type']) === '交易' ? 'pay' : 'refund';
$save_column['OPN_fundSource'] = 'cht';
$save_column['OPN_transactionId'] = $settle['transaction_id'];
// $save_column['OPN_relatedId'] = str_ireplace("-", '', $settle['related_id']);
$save_column['OPN_orderAmount'] = bcsub(floatval($settle['trade_amount']),floatval($settle['refund_amount']));
$save_column['OPN_orderId'] = $settle['orderid'];
$note_exists = $this->ci->note_model->if_note_exists($settle['transaction_id']);
// test:
if (true === $note_exists) {
continue;
}
// test: 月账单太长
if ($settle_cnt > 999) {
break;
}
$order_info = $this->ci->account_model
->get_gai(
$save_column['OPN_transactionId'],
$save_column['OPN_orderId'],
$save_column['OPN_orderAmount'],
$save_column['OPN_accountMethod']
);
if ($order_info['data'] !== null) {
$save_column['OPN_orderId'] = $order_info['data']->orderId;
$save_column['OPN_accountType'] = $order_info['type'];
$save_column['OPN_accountStatus'] = 'recorded';
}
$save_column['OPN_subject'] = $settle['item_name'];
$save_column['OPN_payAmount'] = $save_column['OPN_orderAmount'];
$save_column['OPN_noticeSendStatus'] = 'closed';
$save_column['OPN_transactionResult'] = 'completed';
$save_column['OPN_rawOrderId'] = $settle['orderid'];
$save_column['OPN_invoiceId'] = $settle['orderid'];
$save_column['OPN_currency'] = 'CNY'; // $settle['trade_currency'];
$save_column['OPN_acquiringTime'] = $settle['complete_date'];
$save_column['OPN_completeTime'] = $settle['complete_date'];
$save_column['OPN_remark'] = $settle['remark'];
$save_column['OPN_rawContent'] = json_encode($settle, JSON_UNESCAPED_UNICODE);
$save_column['OPN_noticeTime'] = date('Y-m-d H:i:s');
$note_exists = $this->ci->note_model->if_note_exists($settle['transaction_id'], $settle['orderid']);
if (true === $note_exists) {
// update
$update_where = " OPN_transactionId='" . $settle['transaction_id'] . "' AND OPN_rawOrderId='" . $settle['orderid'] . "' ";
$this->ci->note_model->update_note($update_where, $save_column) ;
$settle_cnt++;
} elseif (false === $note_exists) {
// insert
$this->ci->note_model->insert_note($save_column) ;
$settle_cnt++;
}
}
return $settle_cnt;
}
/**
* 入账时间 支付宝交易号 商户订单号 账务类型 收入(+元) 支出(-元) 商品名称 备注
*/
private function settlement_excel_title()
{
return array(
"A" => "complete_date",
"B" => "transaction_id",
"C" => "orderid",
"D" => "trade_type",
"E" => "trade_amount",
"F" => "refund_amount",
"G" => "item_name",
"H" => "remark"
);
}
}
/* End of file Alipay_call.php */