支付寶即時(shí)到賬Alipay.class.php

最近由于公司項(xiàng)目需要接入支付横浑,正好研究下支付寶接口的使用传藏。我呢使用的是支付寶即時(shí)到賬接口腻暮,通過(guò)對(duì)支付寶提供的接口DEMO的研究,決定將其進(jìn)行封裝整合毯侦,于是就有了這個(gè)啦哭靖!當(dāng)然目前這個(gè)自定義支付寶支付類還不太完整,缺少退款方法侈离,不過(guò)支付是沒(méi)有問(wèn)題的试幽,測(cè)試也通過(guò)了的。

未完成版 Alipay.class.php
<?php
/**
 * Alipay 自定義支付寶即時(shí)到賬類
 * 主要是將支付寶即時(shí)到賬DEMO中的方法整合成了一個(gè)文件
 * @version 1.0 2016-07-06
 */
class Alipay {

    // 支付寶網(wǎng)關(guān)地址(新)
    CONST ALIPAY_GATEWAY_NEW = 'https://mapi.alipay.com/gateway.do?';
    // HTTPS形式消息驗(yàn)證地址
    CONST HTTPS_VERIFY_URL = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
    // HTTP形式消息驗(yàn)證地址
    CONST HTTP_VERIFY_URL = 'http://notify.alipay.com/trade/notify_query.do?';


    // 支付寶配置數(shù)組
    // partner       合作身份者ID 簽約賬號(hào)
    // seller_id     同partner
    // key           MD5密鑰 安全檢驗(yàn)碼
    // notify_url    服務(wù)器異步通知頁(yè)面路徑
    // return_url    頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑
    // sign_type     簽名方式
    // input_charset 字符編碼格式
    // cacert        ca證書(shū)路徑地址 用于curl中ssl校驗(yàn)
    // transport     訪問(wèn)模式
    // payment_type  支付類型
    // service       產(chǎn)品類型
    // log_path      日志路徑
    // anti_phishing_key 防釣魚(yú)時(shí)間戳
    // exter_invoke_ip 客戶端的IP地址
    private $_config = array();




    /**
     * 構(gòu)造函數(shù) 初始化支付寶配置數(shù)組
     * @param array $config
     */
    public function __construct($config = array()){
        
        $this->_config = $config;
        
    }

    /**
     * 同構(gòu)造函數(shù)
     */
    public function Alipay($config = array()){
        
        $this->__construct($config);
        
    }


    /**
     * buildRequestForm
     * 建立請(qǐng)求卦碾,以表單HTML形式構(gòu)造(默認(rèn))
     * @access public
     * @param $para_temp 請(qǐng)求參數(shù)數(shù)組
     * @param $method 提交方式抡草。兩個(gè)值可選:post、get
     * @param $button_name 確認(rèn)按鈕顯示文字
     * @return 提交表單HTML文本
     */
    public function buildRequestForm($parameter, $method, $button_name) {
        $para_temp = array(
            'service'           => $this->_config['pay_service'],
            'partner'           => $this->_config['partner'],
            'seller_id'         => $this->_config['seller_id'],
            'payment_type'      => $this->_config['payment_type'],
            'notify_url'        => $this->_config['notify_url'],
            'return_url'        => $this->_config['return_url'],
            'anti_phishing_key' => $this->_config['anti_phishing_key'],
            'exter_invoke_ip'   => $this->_config['exter_invoke_ip'],
            '_input_charset'    => trim(strtolower($this->_config['input_charset']))
        );

        // 待請(qǐng)求參數(shù)數(shù)組
        $para = $this->buildRequestPara(array_merge($para_temp, $parameter));
        
        $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".self::ALIPAY_GATEWAY_NEW."_input_charset=".trim(strtolower($this->_config['input_charset']))."' method='".$method."'>";

        foreach ($para as $k => $v) {
            $sHtml.= "<input type='hidden' name='".$k."' value='".$v."'/>";
        }

        // submit按鈕控件請(qǐng)不要含有name屬性
        $sHtml = $sHtml."<input type='submit' value='".$button_name."' style='display:none;'></form>";
        
        $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
        
        return $sHtml;
    }

    /**
     * refund 退款
     * @access public
     * @param array $para 請(qǐng)求參數(shù)數(shù)組
     * @return void
     */
    public function refund(){
        // 構(gòu)造要請(qǐng)求的參數(shù)數(shù)組 無(wú)需改動(dòng)
        $parameter = array(
            'service'           => trim($alipay_config['refund_service']),
            'partner'           => trim($alipay_config['partner']),
            'notify_url'        => trim($alipay_config['refund_notify_url']),
            'seller_user_id'    => trim($alipay_config['partner']),
            'refund_date'       => date('Y-m-d H:i:s', time()),
            'batch_no'          => $batch_no,
            'batch_num'         => $batch_num,
            'detail_data'       => $detail_data,
            '_input_charset'    => trim(strtolower($alipay_config['input_charset']))
                
        );
        // 待更新
        // 待更新
        // 待更新
        // 待更新
    }

    /**
     * buildRequestPara
     * 生成要請(qǐng)求給支付寶的參數(shù)數(shù)組
     * @access public
     * @param $para_temp 請(qǐng)求前的參數(shù)數(shù)組
     * @return 要請(qǐng)求的參數(shù)數(shù)組
     */
    public function buildRequestPara($para_temp) {
        // 除去待簽名參數(shù)數(shù)組中的空值和簽名參數(shù)
        $para_filter = $this->paraFilter($para_temp);

        // 對(duì)待簽名參數(shù)數(shù)組排序
        $para_sort = $this->argSort($para_filter);

        // 生成簽名結(jié)果
        $mysign = $this->buildRequestMysign($para_sort);
        
        //簽名結(jié)果與簽名方式加入請(qǐng)求提交參數(shù)組中
        $para_sort['sign'] = $mysign;
        $para_sort['sign_type'] = strtoupper(trim($this->_config['sign_type']));
        
        return $para_sort;
    }

    /**
     * buildRequestMysign 生成簽名結(jié)果
     * @access public
     * @param $para_sort 已排序要簽名的數(shù)組
     * return 簽名結(jié)果字符串
     */
    public function buildRequestMysign($para_sort) {
        // 把數(shù)組所有元素蔗坯,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
        $prestr = $this->createLinkString($para_sort);
        
        $mysign = '';
        switch (strtoupper(trim($this->_config['sign_type']))) {
            case 'MD5' :
                $mysign = $this->md5Sign($prestr);
                break;
            default :
                $mysign = '';
        }
        
        return $mysign;
    }

    /**
     * verify 驗(yàn)證
     * @access public
     * @param array $data
     * @return bool
     */
    public function verify($data = array()){
        if (empty($data)) { // 判斷數(shù)組是否為空
            return false;
        } else {
            // 生成簽名結(jié)果
            $isSign = $this->getSignVerify($data, $data['sign']);

            // 獲取支付寶遠(yuǎn)程服務(wù)器ATN結(jié)果 驗(yàn)證是否是支付寶發(fā)來(lái)的消息
            $responseTxt = 'false';
            if (isset($data['notify_id'])) {
                $responseTxt = $this->getResponse($data['notify_id']);
            }

            if (preg_match("/true$/i", $responseTxt) && $isSign) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * getSignVerify
     * 獲取返回時(shí)的簽名驗(yàn)證結(jié)果
     * @access public
     * @param array $para_temp 通知返回來(lái)的參數(shù)數(shù)組
     * @param string $sign 返回的簽名結(jié)果
     * @return bool 簽名驗(yàn)證結(jié)果
     */
    public function getSignVerify($para_temp, $sign) {
        // 除去待簽名參數(shù)數(shù)組中的空值和簽名參數(shù)
        $para_filter = $this->paraFilter($para_temp);

        // 對(duì)待簽名參數(shù)數(shù)組排序
        $para_sort = $this->argSort($para_filter);
        
        // 把數(shù)組所有元素康震,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
        $prestr = $this->createLinkString($para_sort);
        
        $isSgin = false;
        switch (strtoupper(trim($this->_config['sign_type']))) {
            case 'MD5' :
                $isSgin = $this->md5Sign($prestr) == $sign;
                break;
            default :
                $isSgin = false;
        }
        
        return $isSgin;
    }

    /**
     * getResponse
     * 獲取遠(yuǎn)程服務(wù)器ATN結(jié)果,驗(yàn)證返回URL
     * @access public
     * @param $notify_id 通知校驗(yàn)ID
     * @return 服務(wù)器ATN結(jié)果
     * 驗(yàn)證結(jié)果集:
     * invalid 命令參數(shù)不對(duì) 出現(xiàn)這個(gè)錯(cuò)誤,請(qǐng)檢測(cè)返回處理中partner和key是否為空 
     * true 返回正確信息
     * false 請(qǐng)檢查防火墻或者是服務(wù)器阻止端口問(wèn)題以及驗(yàn)證時(shí)間是否超過(guò)一分鐘
     */
    public function getResponse($notify_id) {
        $transport = strtolower(trim($this->_config['transport']));
        $partner = trim($this->_config['partner']);
        $verify_url = '';
        if ($transport == 'https') {
            $verify_url = self::HTTPS_VERIFY_URL;
        } else {
            $verify_url = self::HTTP_VERIFY_URL;
        }
        $verify_url = $verify_url.'partner='.$partner.'&notify_id='.$notify_id;
        $responseTxt = $this->getHttpResponseGET($verify_url);
        
        return $responseTxt;
    }

    /**
     * createLinkString
     * 把數(shù)組所有元素宾濒,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
     * @access public
     * @param array $para 需要拼接的數(shù)組
     * @return 拼接完成以后的字符串
     */
    public function createLinkString($para = array()){
        $arg  = '';
        while (list ($key, $val) = each ($para)) {
            $arg .= $key . '=' . $val . '&';
        }
        // 去掉最后一個(gè)&字符
        // $arg = substr($arg, 0, count($arg) - 2);
        $arg = trim($arg, '&');
        
        // 如果存在轉(zhuǎn)義字符腿短,那么去掉轉(zhuǎn)義
        if (get_magic_quotes_gpc()) {
            $arg = stripslashes($arg);
        }
        
        return $arg;
    }

    /**
     * paraFilter
     * 除去數(shù)組中的空值和簽名參數(shù)
     * @access public
     * @param array $para 簽名參數(shù)組
     * @return 去掉空值與簽名參數(shù)后的新簽名參數(shù)組
     */
    public function paraFilter($para = array()) {
        // 去除空值及簽名參數(shù)
        foreach ($para as $k => $v) {
            if ($k == 'sign' || $k == 'sign_type' || $v == '') {
                unset($para[$k]);
            }
        }

        return $para;
    }

    /**
     * argSort 對(duì)數(shù)組排序
     * @access public
     * @param array $para 排序前的數(shù)組
     * @return array 排序后的數(shù)組
     */
    public function argSort($para = array()) {
        ksort($para);
        reset($para);
        return $para;
    }

    /**
     * md5Sign 簽名字符串
     * @access public
     * @param string $prestr 需要簽名的字符串
     * @return string 簽名結(jié)果
     */
    public function md5Sign($prestr){
        $prestr = $prestr . $this->_config['key'];
        return md5($prestr);
    }

    /**
     * logDebug
     * 寫(xiě)日志,方便測(cè)試(看網(wǎng)站需求绘梦,也可以改成把記錄存入數(shù)據(jù)庫(kù))
     * 注意:服務(wù)器需要開(kāi)通fopen配置
     * @access public
     * @param string $content 要寫(xiě)入日志里的文本內(nèi)容 默認(rèn)值:空值
     * @return void
     */
    public function logDebug($content = '', $level = 'debug') {
        if (strtolower($level) == 'error') $level = '失敗';
        if (strtolower($level) == 'success') $level = '成功';
        if (strtolower($level) == 'debug') $level = '調(diào)試';
        $fp = fopen($this->_config['log_path'], 'a+');
        flock($fp, LOCK_EX);    // 文件鎖定 避免其他人同時(shí)操作
        fwrite($fp, '#AlipayDebug# '.date('Y-m-d H:i:s')." {$level} ~ ".$content . "\n\n");
        flock($fp, LOCK_UN);
        fclose($fp);
    }

    /**
     * queryTimeStamp
     * @access public
     * 用于防釣魚(yú)橘忱,調(diào)用接口query_timestamp來(lái)獲取時(shí)間戳的處理函數(shù)
     * 注意:該功能PHP5環(huán)境及以上支持,因此必須服務(wù)器卸奉、本地電腦中裝有支持DOMDocument钝诚、SSL的PHP配置環(huán)境。建議本地調(diào)試時(shí)使用PHP開(kāi)發(fā)軟件
     * @return string 時(shí)間戳字符串
     */
    public function queryTimeStamp() {
        $url = self::ALIPAY_GATEWAY_NEW.'service=query_timestamp&partner='.trim(strtolower($this->_config['partner'])).'&_input_charset='.trim(strtolower($this->_config['input_charset']));
        $encrypt_key = '';

        $doc = new DOMDocument();
        $doc->load($url);
        $itemEncrypt_key = $doc->getElementsByTagName( 'encrypt_key' );
        $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
        
        return $encrypt_key;
    }

    /**
     * getHttpResponsePOST
     * 遠(yuǎn)程獲取數(shù)據(jù)榄棵,POST模式
     * 注意:
     * 1.使用Crul需要修改服務(wù)器中php.ini文件的設(shè)置凝颇,找到php_curl.dll去掉前面的";"就行了
     * 2.文件夾中cacert.pem是SSL證書(shū)請(qǐng)保證其路徑有效,目前默認(rèn)路徑是:getcwd().'\\cacert.pem'
     * @access public
     * @param $url 指定URL完整路徑地址
     * @param $cacert_url 指定當(dāng)前工作目錄絕對(duì)路徑
     * @param $para 請(qǐng)求的數(shù)據(jù)
     * @param $input_charset 編碼格式疹鳄。默認(rèn)值:空值
     * return 遠(yuǎn)程輸出的數(shù)據(jù)
     */
    public function getHttpResponsePOST($url, $cacert_url, $para, $input_charset = '') {

        if (trim($input_charset) != '') {
            $url = $url.'_input_charset='.$input_charset;
        }
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);   // SSL證書(shū)認(rèn)證
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);      // 嚴(yán)格認(rèn)證
        curl_setopt($curl, CURLOPT_CAINFO, $cacert_url);    // 證書(shū)地址
        curl_setopt($curl, CURLOPT_HEADER, 0 );             // 過(guò)濾HTTP頭
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);      // 顯示輸出結(jié)果
        curl_setopt($curl, CURLOPT_POST,true);              // post傳輸數(shù)據(jù)
        curl_setopt($curl, CURLOPT_POSTFIELDS, $para);      // post傳輸數(shù)據(jù)
        $responseText = curl_exec($curl);
        // 如果執(zhí)行curl過(guò)程中出現(xiàn)異常拧略,可打開(kāi)此開(kāi)關(guān),以便查看異常內(nèi)容
        // var_dump( curl_error($curl) );
        curl_close($curl);
        
        return $responseText;
    }

    /**
     * getHttpResponseGET
     * 遠(yuǎn)程獲取數(shù)據(jù)瘪弓,GET模式
     * 注意:
     * 1.使用Crul需要修改服務(wù)器中php.ini文件的設(shè)置垫蛆,找到php_curl.dll去掉前面的";"就行了
     * 2.文件夾中cacert.pem是SSL證書(shū)請(qǐng)保證其路徑有效,目前默認(rèn)路徑是:getcwd().'\\cacert.pem'
     * @access public
     * @param $url 指定URL完整路徑地址
     * @param $cacert_url 指定當(dāng)前工作目錄絕對(duì)路徑
     * return 遠(yuǎn)程輸出的數(shù)據(jù)
     */
    public function getHttpResponseGET($url) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, 0 ); // 過(guò)濾HTTP頭
        curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 顯示輸出結(jié)果
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL證書(shū)認(rèn)證
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//嚴(yán)格認(rèn)證
        curl_setopt($curl, CURLOPT_CAINFO, $this->_config['cacert']);//證書(shū)地址
        $responseText = curl_exec($curl);
        // 如果執(zhí)行curl過(guò)程中出現(xiàn)異常,可打開(kāi)此開(kāi)關(guān)袱饭,以便查看異常內(nèi)容
        // var_dump( curl_error($curl) );
        curl_close($curl);
        
        return $responseText;
    }

}

?>
我在CI下的應(yīng)用
1. libraries下MY_Alipay.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');

// 加載支付寶類
require_once APPPATH.'libraries/Payment/Alipaylib/Alipay.class.php';

/**
 * MY_Alipay 
 * @author Mike Lee
 */
class MY_Alipay extends Alipay {
    
    protected $_CI;

    public function  __construct($config = array()){
        // 獲得 CI 超級(jí)對(duì)象
        $this->_CI = & get_instance();
        
        // 判斷是否存在配置文件
        if (empty($config)) {
            // 加載 Alipay 配置文件
            $this->_CI->load->config('alipay', TRUE);
            $config = $this->_CI->config->item('alipay');
        }

        parent::__construct($config);
    }

    /**
     * submit 支付提交
     * @access public
     * @param string $out_trade_no 商戶訂單號(hào) 商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號(hào)
     * @param string $subject 訂單名稱
     * @param float $total_fee 付款金額
     * @param string $body 商品描述 可空
     * @return void
     * @author Mike Lee
     */
    public function paySubmit($order_code){
        $this->_CI->load->model('order_model');
        $order_info = $this->_CI->order_model->getMyOrderDetails($order_code, true);
        if ( ! is_array($order_info) || ! $order_info) return false;
        if ($order_info['pay_status'] == '1') return true;
        $subject = 'XXXX商城-商品訂單';
        $total_fee = $order_info['order_amount'];
        $goods_detail_str = '';
        foreach ($order_info['goods'] as $og) {
            $goods_detail_str .= $og['goods_name'];
            $goods_detail_str .= ' 數(shù)量'.$og['num'].'件川无;';
        }
        // 構(gòu)造要請(qǐng)求的參數(shù)數(shù)組
        $parameter = array(
            'out_trade_no' => $order_code,
            'subject'      => $subject,
            'total_fee'    => $total_fee,
            'body'         => $goods_detail_str
        );

        $html_text = $this->buildRequestForm($parameter, 'post', '確認(rèn)');
        return $html_text;
    }

    /**
     * refundSubmit 退款提交
     * @access public
     * @param string $order_code
     * @return void
     */
    public function refundSubmit(){

    }

    /**
     * asynNotify 異步通知
     * @access public
     * @param void
     * @return void
     * @author Mike Lee
     */
    public function asynNotify(){
        $notify_data = $this->_CI->input->post(null, true);
        $verify_result = $this->verify($notify_data);
        if ($verify_result) {    //驗(yàn)證成功
            //交易狀態(tài)
            $trade_status = $notify_data['trade_status'];
            // 根據(jù)交易狀態(tài)處理訂單支付狀態(tài)
            if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
                $this->updateOrderPay($notify_data);
            }
            echo 'success';     //請(qǐng)不要修改或刪除

        } else {    //驗(yàn)證失敗
            echo 'fail';    //請(qǐng)不要修改或刪除
        }
    }

    /**
     * syncReturn 頁(yè)面跳轉(zhuǎn)同步通知
     * @access public
     * @param void
     * @return void
     * @author Mike Lee
     */
    public function syncReturn(){
        $return_data = $this->_CI->input->get(null, true);
        $verify_result = $this->verify($return_data);
        if ($verify_result) {    // 驗(yàn)證成功
            // 交易狀態(tài)
            $trade_status = $return_data['trade_status'];
            if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
                $this->updateOrderPay($return_data);
                return true;
            } else {
                return false;
            }
            return true;
        } else {    // 驗(yàn)證失敗
            return false;
        }
    }

    /**
     * refundNotify 退款異步通知
     * @access public
     * @param void
     * @return void
     */
    public function refundNotify(){
        $notify_data = $this->_CI->input->post(null, true);
        $verify_result = $this->verify($notify_data);
        if ($verify_result) {    //驗(yàn)證成功
            //交易狀態(tài)
            $trade_status = $notify_data['trade_status'];
            // 根據(jù)交易狀態(tài)處理訂單支付狀態(tài)
            if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
                $this->orderRefund($notify_data);
            }
            echo 'success';     //請(qǐng)不要修改或刪除

        } else {    //驗(yàn)證失敗
            echo 'fail';    //請(qǐng)不要修改或刪除
        }
    }

    /**
     * updateOrderPay 更新訂單支付信息
     * @access private
     * @param string $order_code
     * @return mixed
     * @author Mike Lee
     */
    public function updateOrderPay($alipay_data){
        $this->_CI->load->model('order_model');
        // 根據(jù)訂單號(hào)獲取訂單信息
        $order_code = $alipay_data['out_trade_no'];
        $order_info = $this->_CI->order_model->getOrderByID($order_code, true);
        if (empty($order_info) || ! isset($order_info['pay_status'])) return;
        if ($order_info['order_status'] == 0 && $order_info['pay_status'] != '1') {
            // 更新訂單的支付狀態(tài)及支付方式
            // pay_status => 1 表示支付成功
            // pay_method => 1 表示支付方式為支付寶支付
            $pay_info = array('pay_status' => '1', 'pay_method' => 1);
            $pay_result = $this->_CI->order_model->updateOrderPayStatus($order_code, $pay_info, true);
            // 添加訂單支付信息
            // user_id 用戶ID
            // order_id 訂單ID
            // total_fee 支付總額
            // buyer_id 用戶支付寶ID buyer_id
            $order_pay_info = array(
                'user_id'      => $order_info['user_id'],
                'order_id'     => $order_info['id'],
                'trade_no'     => $alipay_data['trade_no'],
                'total_fee'    => $alipay_data['total_fee'],
                #'total_fee'   => $alipay_data['price'],
                'seller_id'    => $alipay_data['seller_id'],
                'seller_email' => $alipay_data['seller_email'],
                'buyer_id'     => $alipay_data['buyer_id'],
                'buyer_email'  => $alipay_data['buyer_email'],
                'add_time'     => time()
            );
            $this->_CI->order_model->addPayLogForOrderAliPay($order_pay_info);
            // 添加用戶收支日志
            // correlation_id 關(guān)聯(lián)ID 這里為訂單ID
            // action_type => 1 表示XXXX商城訂單事件
            // pay_type => 1 表示支付寶支付
            $payment_log = array(
                'user_id'        => $order_info['user_id'],
                'correlation_id' => $order_info['id'],
                'action_type'    => 1,
                'pay_type'       => 1,
                'cash_fee'       => $alipay_data['total_fee'],
                'remark'         => 'XXXX商城訂單:支付寶支付'.$alipay_data['total_fee'],
                'action_ip'      => $_SERVER['REMOTE_ADDR'],
                'add_time'       => time()
            );
            $this->_CI->order_model->addLogForUserPay($payment_log);
            // 添加支付寶支付日志
            $alipay_log = array(
                'user_id'        => $order_info['user_id'],
                'correlation_id' => $order_info['id'],
                'seller_id'      => $alipay_data['seller_id'],
                'seller_email'   => $alipay_data['seller_email'],
                'buyer_id'       => $alipay_data['buyer_id'],
                'buyer_email'    => $alipay_data['buyer_email'],
                'total_fee'      => $alipay_data['total_fee'],
                'trade_no'       => $alipay_data['trade_no'],
                'gmt_create'     => $alipay_data['gmt_create'],
                'gmt_payment'    => $alipay_data['gmt_payment'],
                'price'          => $alipay_data['total_fee'],
                'action_ip'      => $_SERVER['REMOTE_ADDR'],
                'add_time'       => time()
            );
            $this->_CI->order_model->addLogForAliPay($alipay_log);
        }

        return true;
    }   

}

/* End of file MY_Alipay.php */
/* Location: ./application/libraries/MY_Alipay.php */
2. 控制器Pay.php
<?php defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * pay 支付控制器
 */
class Pay extends MY_Controller {

    public function __construct(){
        $this->isNeedLogin = FALSE;
        parent::__construct();
    }

    /**
     * alipaySubmit 提交支付寶支付
     * @access public
     * @param string $order_code
     * @return void
     * @author Mike Lee
     */
    public function alipaySubmit($order_code){
        $this->load->library('MY_Alipay');
        $result = $this->my_alipay->paySubmit($order_code);
        if (is_bool($result) && ! $result) {
            $this->jumpNoticePage('訂單信息不存在!', site_url('main'), 'ERROR');
        }
        if (is_bool($result) && $result == true) {
            $this->jumpNoticePage('訂單已支付虑乖,請(qǐng)不要重復(fù)支付懦趋!', site_url('user/orders'), 'ERROR');
        }

        $this->assign('html_text', $result);
        $this->display('order/alipay.html');
    }

    /**
     * aliPayNotify 支付寶異步回調(diào)
     * @access public
     * @param void
     * @return void
     * @author Mike Lee
     */
    public function aliPayNotify(){
        $this->load->library('MY_Alipay');
        $this->my_alipay->asynNotify();
    }

    /**
     * aliPayReturn 支付寶同步通知
     * @access public
     * @param void
     * @return void
     * @author Mike Lee
     */
    public function aliPayReturn(){
        $this->load->library('MY_Alipay');
        $this->my_alipay->syncReturn();
        $order_code = $this->input->get('out_trade_no');
        header('location: '.site_url('order/paysuccess/'.$order_code));
    }


}

/* End of file pay.php */
/* Location: ./apps/home/controllers/pay.php */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市决左,隨后出現(xiàn)的幾起案子愕够,更是在濱河造成了極大的恐慌走贪,老刑警劉巖佛猛,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坠狡,居然都是意外死亡继找,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)逃沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)婴渡,“玉大人,你說(shuō)我怎么就攤上這事凯亮”呔剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵假消,是天一觀的道長(zhǎng)柠并。 經(jīng)常有香客問(wèn)我,道長(zhǎng)富拗,這世上最難降的妖魔是什么臼予? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮啃沪,結(jié)果婚禮上粘拾,老公的妹妹穿的比我還像新娘。我一直安慰自己创千,他們只是感情好缰雇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著追驴,像睡著了一般寓涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氯檐,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天戒良,我揣著相機(jī)與錄音,去河邊找鬼冠摄。 笑死糯崎,一個(gè)胖子當(dāng)著我的面吹牛几缭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沃呢,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼年栓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了薄霜?” 一聲冷哼從身側(cè)響起某抓,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惰瓜,沒(méi)想到半個(gè)月后否副,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崎坊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年备禀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奈揍。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曲尸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出男翰,到底是詐尸還是另有隱情另患,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布蛾绎,位于F島的核電站昆箕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏秘通。R本人自食惡果不足惜为严,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肺稀。 院中可真熱鬧第股,春花似錦、人聲如沸话原。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)繁仁。三九已至涉馅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黄虱,已是汗流浹背稚矿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晤揣。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓桥爽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昧识。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钠四,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容