You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

268 lines
9.4 KiB

<?php
/**
* ECSHOP 银联在线支付
* ============================================================================
* 版权所有 2005-2016 上海商创网络科技有限公司,并保留所有权利。
* 网站地址: http://www.ecmoban.com;
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
* 使用;不允许对程序代码以任何形式任何目的的再发布。
* ============================================================================
* $Author: douqinghua $
* $Id: upop.php 17063 2010-03-25 06:35:46Z douqinghua $
*/
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
// 包含配置文件
$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/upop.php';
if (file_exists($payment_lang))
{
global $_LANG;
include_once($payment_lang);
}
/* 模块的基本信息 */
if (isset($set_modules) && $set_modules == TRUE)
{
$i = isset($modules) ? count($modules) : 0;
/* 代码 */
$modules[$i]['code'] = basename(__FILE__, '.php');
/* 描述对应的语言项 */
$modules[$i]['desc'] = 'upop_desc';
/* 是否支持货到付款 */
$modules[$i]['is_cod'] = '0';
/* 是否支持在线支付 */
$modules[$i]['is_online'] = '1';
/* 作者 */
$modules[$i]['author'] = 'ECSHOP TEAM';
/* 网址 */
$modules[$i]['website'] = 'http://www.ecmoban.com';
/* 版本号 */
$modules[$i]['version'] = '1.0.0';
/* 配置信息 */
$modules[$i]['config'] = array(
array('name' => 'upop_merAbbr', 'type' => 'text', 'value' => '商户名称'),
array('name' => 'upop_account', 'type' => 'text', 'value' => ''),
array('name' => 'upop_security_key', 'type' => 'text', 'value' => ''),
);
return;
}
/**
* 类
*/
class UPOP
{
/**
* 生成支付代码
* @param array $order 订单信息
* @param array $payment 支付方式信息
*/
function get_code($order, $payment)
{
// 初始化变量
if (!defined('EC_CHARSET'))
{
$charset = 'UTF-8';
}
else
{
$charset = strtoupper(EC_CHARSET);
}
$front_pay_url = 'https://unionpaysecure.com/api/Pay.action';
$security_key = $payment['upop_security_key'];
$merId = $payment['upop_account'];
$orderNumber = $order['order_sn'] . '-' . $this->_formatSN($order['log_id']);
$frontEndUrl = return_url(basename(__FILE__, '.php'));
$backEndUrl = return_url(basename(__FILE__, '.php'));
$merAbbr = $payment['upop_merAbbr'];
$params = array(
"version" => '1.0.0', //接口版本
"signMethod" => 'md5', //加密方式
"charset" => $charset, //编码
"transType" => '01', //交易类型
"origQid" => '',
"merId" => $merId, //收款账号
"merAbbr" => $merAbbr, //商户名称
"acqCode" => '',
"merCode" => '',
"commodityUrl" => '', //商品url
"commodityName" => '', //商品名字
"commodityUnitPrice" => '', //商品单价
"commodityQuantity" => '', //商品数量
"commodityDiscount" => '',
"transferFee" => '',
"orderNumber" => $orderNumber, //订单号,必须唯一
"orderAmount" => $order['order_amount'] * 100, //交易金额 转化为分
"orderCurrency" => '156', //交易币种,CURRENCY_CNY=>人民币
"orderTime" => date('YmdHis'), //交易时间, YYYYmmhhddHHMMSS
"customerIp" => $_SERVER['REMOTE_ADDR'], //用户IP
"customerName" => '',
"defaultPayType" => '',
"defaultBankNumber" => '',
"transTimeout" => '',
"frontEndUrl" => $frontEndUrl, // 前台回调URL
"backEndUrl" => $backEndUrl, // 后台回调URL
"merReserved" => ''
);
$params['signature'] =$this->sign($params, $security_key,'md5');
$button = "<input type='submit' value='" . $GLOBALS['_LANG']['upop_button'] . "' />";
$html = $this->create_html($params,$front_pay_url,$button);
return $html;
}
/**
* 响应操作
*/
function respond()
{
$payment = get_payment('upop');
$arr_args = array();
$arr_reserved = array();
if (is_array($_POST))
{
$arr_args = $_POST;
$cupReserved = isset($arr_args['cupReserved']) ? $arr_args['cupReserved'] : '';
parse_str(substr($cupReserved, 1, -1), $arr_reserved); //去掉前后的{}
}
else
{
$cupReserved = '';
$pattern = '/cupReserved=(\{.*?\})/';
if (preg_match($pattern, $_POST, $match)) { //先提取cupReserved
$cupReserved = $match[1];
}
//将cupReserved的value清除(因为含有&, parse_str没法正常处理)
$args_r = preg_replace($pattern, 'cupReserved=', $_POST);
parse_str($args_r, $arr_args);
$arr_args['cupReserved'] = $cupReserved;
parse_str(substr($cupReserved, 1, -1), $arr_reserved); //去掉前后的{}
}
//提取服务器端的签名
if (!isset($arr_args['signature']))
{
return false;
}
//验证签名
$signature=$this->sign($arr_args, $payment['upop_security_key'],'md5');
if ($signature != $arr_args['signature'])
{
return false;
}
$arr_ret = array_merge($arr_args, $arr_reserved);
unset($arr_ret['cupReserved']);
if ($arr_ret['respCode'] != '00')
{
return false;
}
if(!strpos($arr_ret['orderNumber'], '-'))
{
return false;
}
$order_sn_arr = explode('-', $arr_ret['orderNumber']);
$order_sn = $order_sn_arr['0'];
$pay_id = intval($order_sn_arr['1']);
$payment_amount = intval($arr_ret['settleAmount']);
// 检查商户账号是否一致。
if ($payment['upop_account'] != $arr_ret['merId'])
{
return false;
}
// 检查价格是否一致
if (!check_money($pay_id, $payment_amount/100))
{
return false;
}
// 如果未支付成功。
if ($arr_ret['respCode'] != '00')
{
return false;
}
$action_note = $arr_ret['respCode'] . ':'
. $arr_ret['respMsg']
. $GLOBALS['_LANG']['upop_txn_id'] . ':'
. $arr_ret['qid'];
// 完成订单。
order_paid($pay_id, PS_PAYED, $action_note);
//告诉用户交易完成
return true;
}
/**
* 格式订单号
*/
function _formatSN($sn)
{
return str_repeat('0', 9 - strlen($sn)) . $sn;
}
function create_html($params,$front_pay_url,$button)
{
$html = <<<eot
<br />
<form style="text-align:center;" id="pay_form" name="pay_form" action="{$front_pay_url}" method="post" target="_blank">
eot;
foreach ($params as $key => $value)
{
$html .= " <input type=\"hidden\" name=\"{$key}\" id=\"{$key}\" value=\"{$value}\" />\n";
}
$html .= $button . "</form><br />";
return $html;
}
function sign($params,$security_key,$sign_method)
{
if (strtolower($sign_method) == "md5")
{
ksort($params);
$sign_str = "";
$sign_ignore_params=array('bank','signMethod','signature');
foreach ($params as $key => $val)
{
if (in_array($key,$sign_ignore_params))
{
continue;
}
$sign_str .= sprintf("%s=%s&", $key, $val);
}
return md5($sign_str . md5($security_key));
}
else
{
exit("Unknown sign_method set in quickpay_conf");
}
}
}
?>