Files
youlegames/codes/agent/game/api/sample/offlinepay/index.php
2026-03-15 01:27:05 +08:00

365 lines
8.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
define('USEDCHARSET', 'utf-8');
/// 这里定义公共变量
//$app_id = '14936872341446'; /// appid
//$dev_key = '14915485974028'; /// 开发者key
$app_id = '14992192722868'; /// appid
$dev_key = '14915485974028'; /// 开发者key
$market_key = '0000'; /// 门店key
$sign_key = '0000'; /// 签名key(暂时支付时不校验签名, 但是退款时将校验这个签名)
/// 接口返回用的信息类
class ResultObject
{
public $error; /// 返回值: 0成功; 非0失败;
public $error_code; /// 错误号
public $msg; /// 错误信息
public $data; /// 返回的数据
public function ResultObject($string)
{
$this->error = 0;
$this->error_code = 0;
$this->msg = null;
$this->data = null;
$this->from_string($string);
}
public function to_array()
{
return (array)$this;
}
public function to_string()
{
return json_encode($this, JSON_UNESCAPED_UNICODE);
}
public function from_array($array)
{
foreach ($array as $key => $value)
{
if (property_exists($this, $key))
{
$this->$key = $value;
}
}
return true;
}
public function from_string($string)
{
return $this->from_array((array)json_decode($string));
}
}
/**
* @note 获取当前页面的完整连接
* @return string
*/
function getLocaleUrl()
{
$is_https =
(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ||
(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ||
(isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https');
$request_scheme = $is_https ? 'https://' : 'http://';
$hostname = $_SERVER['SERVER_NAME'];
$hostport = (($is_https && '443' == $_SERVER['SERVER_PORT']) || (!$is_https && '80' == $_SERVER['SERVER_PORT'])) ? '' : ':' . intval($_SERVER['SERVER_PORT']);
return $request_scheme . $hostname . $hostport . $_SERVER['PHP_SELF'];
}
/**
* @date 2017-03-04
* @note 给参数按key的顺序排序。支持递归
* @param mixed $parameter 要排序的参数
* @return array
* @auth 应俊
*/
function SortParam($parameter)
{
$parameter = (array)$parameter;
foreach ($parameter as $k => $v)
{
if (is_array($v) || is_object($v))
{
$parameter[$k] = SortParam($v);
}
}
// 调用strcmp函数来排序该函数区分大小写。
uksort($parameter, 'strcmp');
return $parameter;
}
/**
* @date 2017-03-06
* @note 转换参数成字符串形式按key=value的形式用&分隔)。
* @param mixed $parameter 要转换的参数
* @return string
* @auth 应俊
*/
function ConvertParam($parameter)
{
$parameter = (array)$parameter;
$return = '';
foreach ($parameter as $k => $v)
{
if (is_array($v) || is_object($v))
{
$return .= sprintf('&%s={%s}', $k, ConvertParam($v));
}
else
{
$return .= sprintf('&%s=%s', $k, $v);
}
}
$sublen = mb_strlen('&', USEDCHARSET);
$retlen = mb_strlen($return, USEDCHARSET);
$return = mb_substr($return, $sublen, $retlen - $sublen, USEDCHARSET);
return $return;
}
/**
* @date 2017-03-04
* @note 为参数生成签名
* @param mixed $parameter 要签名的参数
* @param string $signkey 签名key
* @return string
* @auth 应俊
*/
function SignParameter($parameter, $signkey = '')
{
// 1先把参数按参数名key从小到大排序
$parameter = SortParam($parameter);
// 2连接参数成一个字符串按key=value的形式用&分隔)。
$return = ConvertParam($parameter);
// 3结尾加上key=签名key
$return .= '&key=' . $signkey;
// 4md5加密这个字符串
return md5($return);
}
/**
* @param mixed $data
* @return array|mixed
*/
function ChangePostData($data)
{
switch (gettype($data))
{
case 'array':
{
foreach ($data as $key => $value)
{
$data[$key] = ChangePostData($value);
}
break;
}
case 'object':
{
$array = (array)$data;
foreach ($array as $key => $value)
{
$data->$key = ChangePostData($value);
}
break;
}
default:
{
$data = preg_replace_callback('/\+/', function ($r) { return '%2B'; }, $data);
$data = preg_replace_callback('/\&/', function ($r) { return '%26'; }, $data);
break;
}
}
return $data;
}
/**
* @note 发送post请求
* @param string $url
* @param mixed $data
* @return string
*/
function SendPost($url, $data)
{
$data = http_build_query(ChangePostData($data));
$opts = array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n",
'content' => $data,
),
);
$context = stream_context_create($opts);
$ret = file_get_contents($url, false, $context);
$ret = trim($ret, "\xEF\xBB\xBF");
return $ret;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>支付测试</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<link href="css/style.css" rel="stylesheet">
<script src="js/jquery-2.1.4.min.js"></script>
<script src="js/common.js"></script>
</head>
<body id="mainbody">
<?php
if (isset($_REQUEST['fee'])) /// 有fee参数表示已提交页面中输入的支付金额
{
/// 1: 获取该门店下支援的所有支付方式列表(线下)
$data = array(
'appid' => $app_id, /// appid
'devkey' => $dev_key, /// 开发者key
'market_key' => $market_key, /// 门店key
'level' => 2, /// 支付类型(1: 线上, 2: 扫码, 3: app)
'version' => 1, /// 版本号
);
$data['sign'] = SignParameter($data, $sign_key);
$result = new ResultObject(rawurldecode(SendPost('https://api2.tscce.cn/api/newpay/querylist', $data)));
if (0 == $result->error && count($result->data) > 0) /// 调用成功, 并且有支援的支付方式
{
/// 这里只获取第一种支付方式
$pay_type = $result->data[0]->type_id; /// 支付方式的id
$order_id = date('YmdHis') . rand(1000, 9999); /// 随机生成一个订单号
$notice_url = dirname(getLocaleUrl()) . '/notice.php'; /// 通知页面地址
$data = array(
'appid' => $app_id, /// appid
'devkey' => $dev_key, /// 开发者key
'market_key' => $market_key, /// 门店key
'orderid' => $order_id, /// 订单号
'fee' => $_REQUEST['fee'], /// 支付金额(单位分)
'title' => 'test', /// 支付主题
'notice_url' => $notice_url, /// 回调地址
'paytype' => $pay_type, /// 支付方式
'version' => 1, /// 接口版本号
/// 以下为附加参数,会在通知回调时返回。
'p1' => 'p1', /// 自定义附加参数1
'p2' => 'p2', /// 自定义附加参数2
);
$data['sign'] = SignParameter($data, $sign_key); /// 生成签名
/// 调用接口
$result = new ResultObject(rawurldecode(SendPost('https://api2.tscce.cn/api/newpay/pay/offline/', $data)));
if (0 != $result->error) /// error不为0表示有错误发生
{
$html = <<<EOL
<script>
alert('{$result->msg}');
</script>
EOL;
}
else /// 调用成功, 则把图片显示在前台中
{
$url = @$result->data->code_img_url;
$html = <<<EOL
<center>
<div id="img" class="mt_20">
<img src="{$url}" class="img-responsive">
</div>
<div class="qing">
<img src="img/sys.jpg" width="50" height="50" class="sys">
<span>请扫描二维码以完成支付</span>
</div>
</center>
EOL;
}
}
elseif (0 != $result->error) /// 有错误发生
{
$html = <<<EOL
<script>
alert('{$result->msg}');
</script>
EOL;
}
else
{
$html = <<<EOL
<script>
alert('该门店不支援任何的支付方式!');
</script>
EOL;
}
}
else /// 无fee参数则需要提示在页面中输入这个参数
{
$html = <<<EOL
<script>
function submit() {
var fee = document.getElementById('fee').value;
if ('' == fee || undefined == fee) {
alert('请输入要支付的金额(单位为分)');
return;
}
var script =
"<form style='display:none;' id='frm' name='frm' method='post' action=''>" +
" <input name='fee' type='text' value='" + fee + "' />" + /// 支付金额(单位分)
"</form>";
$('#mainbody').append(script);
$('#frm').submit();
}
</script>
<section>
<header class="header"><span>支付测试</span></header>
<div class="neirong">
<ul>
<li><span class="name">总金额:</span><input id="fee" type="text" placeholder="单位:分 整型" class="input"> <sapn class="red">*</sapn></li>
</ul>
<footer class="text-center"><a href="javascript:;" onclick="submit();" class="btn btn-blue foot_btn">确定</a></footer>
</div>
</section>
EOL;
}
echo $html;
?>
</body>
</html>