www.gusucode.com > Ectouch手机端网购商城系统PHP版源码程序 > ectouch/plugins/payment/tenpay.php

    <?php

/**
 * ECTouch Open Source Project
 * ============================================================================
 * Copyright (c) 2012-2014 http://ectouch.cn All rights reserved.
 * ----------------------------------------------------------------------------
 * 文件名称:tenpay.php
 * ----------------------------------------------------------------------------
 * 功能描述:财付通wap支付插件
 * ----------------------------------------------------------------------------
 * Licensed ( http://www.ectouch.cn/docs/license.txt )
 * ----------------------------------------------------------------------------
 */

/* 访问控制 */
defined('IN_ECTOUCH') or die('Deny Access');

$payment_lang = ROOT_PATH . 'plugins/payment/language/' . C('lang') . '/' . basename(__FILE__);

if (file_exists($payment_lang)) {
    include_once ($payment_lang);
    L($_LANG);
}

/* 模块的基本信息 */
if (isset($set_modules) && $set_modules == TRUE) {
    $i = isset($modules) ? count($modules) : 0;
    /* 代码 */
    $modules[$i]['code'] = basename(__FILE__, '.php');
    /* 描述对应的语言项 */
    $modules[$i]['desc'] = 'tenpay_desc';
    /* 是否支持货到付款 */
    $modules[$i]['is_cod'] = '0';
    /* 是否支持在线支付 */
    $modules[$i]['is_online'] = '1';
    /* 作者 */
    $modules[$i]['author'] = 'ECTOUCH TEAM';
    /* 网址 */
    $modules[$i]['website'] = 'http://www.ectouch.cn';
    /* 版本号 */
    $modules[$i]['version'] = '1.0.0';
    /* 配置信息 */
    $modules[$i]['config'] = array(
        array(
            'name' => 'bargainor_id',
            'type' => 'text',
            'value' => ''
        ),
        array(
            'name' => 'tenpay_key',
            'type' => 'text',
            'value' => ''
        )
    );

    return;
}

/**
 * 支付插件类
 */
class tenpay
{

    /**
     * 生成支付代码
     *
     * @param array $order 订单信息
     * @param array $payment 支付方式信息
     */
    function get_code($order, $payment)
    {
        $gateway = 'https://wap.tenpay.com/cgi-bin/wappayv2.0/wappay_init.cgi';
        // 初始化
        $data = array(
            'ver' => '2.0', // 必填 版本号,ver 默认值是 1.0。目前版本 ver 取值应为 2.0
            'charset' => 1, // 可选 1 UTF-8, 2 GB2312, 默认为 1 UTF-8
            'bank_type' => 0, // 必填 银行类型:财付通支付填 0;目前只能为 0
            'desc' => $order['order_sn'], // 必填 商品描述,32 个字符以内
            'purchaser_id' => '', // 可选 用户(买方)的财付通帐户(QQ 或 EMAIL)。若商户没有传该参数则在财付通支付页面;买家需要输入其财付通帐户。
            'bargainor_id' => $payment['bargainor_id'], // 必填 商户号,由财付通统一分配的 10 位正整数(120XXXXXXX)号
            'sp_billno' => $order['order_sn'] . 'O' . $order['log_id'], // 必填 商户系统内部的定单号,32 个字符内、可包含字母
            'total_fee' => $order['order_amount'] * 100, // 必填 总金额,以分为单位,不允许包含任何字母、符号
            'fee_type' => 1, // 可选 现金支付币种,目前只支持人民币,默认值是 1-人民币
            'notify_url' => return_url(basename(__FILE__, '.php'), array('type'=>0)), // 必填 接收财付通通知的 URL
            'callback_url' => return_url(basename(__FILE__, '.php'), array('type'=>1)), //必填 交易完成后跳转的 URL
            // 'attach' => , // 可选 商户附加信息,可做扩展参数255 字符内
            // 'time_start' => , // 可选 订单生成时间 格式为 yyyymmddhhmmss 如 2009 年 12 月 25日 9 点 10 分 10 秒表示为 20091225091010。时区为 GMT+8 beijing。该时间取自商户服务器
            // 'time_expire' => , // 可选 订单失效时间 格式为 yyyymmddhhmmss 如 2009 年 12 月 27日 9 点 10 分 10 秒表示为 20091227091010。时区为 GMT+8beijing。该时间取自商户服务器
            // 'sign' => , // 必填 MD5 签名结果,详见“第二章 MD5 签名规则”
        );
        // 字典排序
        ksort($data);
        reset($data);
        // 生成签名
        $sign = '';
        foreach ($data as $key => $vo) {
            if ($vo !== '') {
                $sign .= $key . '=' . $vo . '&';
            }
        }
        $sign .= 'key=' . $payment['tenpay_key'];
        $data['sign'] = strtoupper(md5($sign));
        // 交易初始化
        $result = Http::doPost($gateway, $data);
        $xml = (array)simplexml_load_string($result);
        if (isset($xml['err_info'])) {
            return '<div style="color:red; text-align: center">错误信息:'.$xml['err_info'].'</div>';
        }
        /* 生成支付按钮 */
        $button = '<div><input type="button" class="btn btn-info ect-btn-info ect-colorf ect-bg" onclick="window.open(\'' . $gateway . '?token_id=' . $xml['token_id'] . '\')" value="' . L('pay_button') . '" class="c-btn3" /></div>';
        return $button;
    }

    /**
     * 同步响应操作
     *
     * @return boolean
     */
    public function callback($data)
    {
        if (! empty($_GET)) {
            $payment = model('Payment')->get_payment($data['code']);
            $record_data = in($_GET);
            // 字典排序
            ksort($record_data);
            reset($record_data);
            // 生成签名
            $sign = '';
            foreach ($record_data as $key => $vo) {
                if ($vo !== '' && $key != 'sign') {
                    $sign .= $key . '=' . $vo . '&';
                }
            }
            $sign .= 'key=' . $payment['tenpay_key'];
            $sign = strtoupper(md5($sign));
            // 验证签名
            if ($sign != $record_data['sign']) {
                return false;
            }
            // 订单号和支付log_id
            $sp_billno = explode('O', $record_data['sp_billno']);
            $log_id = $sp_billno[1];
            if ($record_data['pay_result'] == 0) {
                /* 改变订单状态 */
                model('Payment')->order_paid($log_id, 2);
                return true;
            } else {
                return false;
            }
        }else{
            return false;
        }
    }

    /**
     * 异步通知
     *
     * @return string
     */
    public function notify($data)
    {
        if (! empty($_GET)) {
            $payment = model('Payment')->get_payment($data['code']);
            $record_data = in($_GET);
            // 字典排序
            ksort($record_data);
            reset($record_data);
            // 生成签名
            $sign = '';
            foreach ($record_data as $key => $vo) {
                if ($vo !== '' && $key != 'sign') {
                    $sign .= $key . '=' . $vo . '&';
                }
            }
            $sign .= 'key=' . $payment['tenpay_key'];
            $sign = strtoupper(md5($sign));
            // 验证签名
            if ($sign != $record_data['sign']) {
                exit("fail");
            }
            // 交易状态
            $pay_result = $record_data['pay_result'];
            // 获取支付订单号log_id
            $sp_billno = explode('O', $record_data['sp_billno']);
            $log_id = $sp_billno[1]; // 订单号log_id
            if ($pay_result == 0) {
                /* 改变订单状态 */
                model('Payment')->order_paid($log_id, 2);
                if(method_exists('WechatController', 'do_oauth')){
                    /* 如果需要,微信通知 wanglu */
                    $order_id = model('Base')->model->table('order_info')->field('order_id')->where('order_sn = "'.$sp_billno[0].'"')->getOne();
                    $order_url = __HOST__ . url('user/order_detail', array('order_id'=>$order_id));
                    $order_url = urlencode(base64_encode($order_url));
                    send_wechat_message('pay_remind', '', $sp_billno[0].' 订单已支付', $order_url, $sp_billno[0]);
                }
                exit("success");
            } else {
                exit("fail");
            }
        } else {
            exit("fail");
        }
    }
}