添加后台代理代码

This commit is contained in:
2026-03-15 01:27:05 +08:00
parent 11f9ac4dc1
commit ea08c9366a
5254 changed files with 721042 additions and 0 deletions

View File

@@ -0,0 +1,165 @@
body{
font-size: 14px;
font-family: "微软雅黑";
position: relative;
}
body,ul,li,article{
margin: 0;
padding: 0;
}
ul,li{
list-style: none;
}
a{
text-decoration: none;
color: inherit;
}
.text-center{
text-align: center;
}
.red{
color: red;
}
.btn{
display: inline-block;
padding: 8px 14px;
margin-bottom: 0;
font-size: 14px;
font-weight: 400;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-image: none;
border: 1px solid transparent;
/*border-radius: 4px;*/
text-decoration: none;
}
.btn-blue{
color: #fff;
background: -moz-linear-gradient(top, #41b8ff, #0b53bb);
background: -webkit-gradient(linear,0% 0%,0% 100%,from(#41b8ff),to(#0b53bb));
background: -webkit-linear-gradient(top, #41b8ff, #0b53bb);
background: -o-linear-gradient(top, #41b8ff, #0b53bb);
background: -ms-linear-gradient(top, #41b8ff, #0b53bb);
border-color: rgb(253, 253, 254);
}
.header{
background-color: #2b2b2b;
color: #ffffff;
height: 40px;
line-height: 40px;
text-align: center;
position: fixed;
width: 100%;
}
.header .img{
position: absolute;
left: 0;
top: 7px;
padding-left: 10px;
height: 25px;
}
.neirong{
padding-top: 40px;
}
.neirong ul{
padding-top: 15px;
}
.neirong ul li{
padding: 12px 0;
/*text-align: center;*/
}
.neirong ul li .name{
text-align: right;
width: 98px;
display: inline-block;
}
.neirong ul li .input{
height: 35px;
line-height: 35px;
width: 63%;
border: none;
outline: none;
border-bottom: 1px solid #d8d8d8;
}
.foot_btn{
width: 45%;
margin-top: 25px;
height: 32px;
line-height: 32px;
border-radius: 6px;
}
.shaoma{
z-index: 3;
position: absolute;
text-align: center;
top: 35%;
display: none;
width: 100%;
}
.shaoma .xians{
width: 80%;
height: 100%;
border: 1px solid #d8d8d8;
position: relative;
background-color: #ffffff;
left: 10%;
right: 10%;
}
.shaoma .xians .img_close{
position: absolute;
right: 0;
top: 0;
}
.img-responsive{
width: 100%;
max-width: 100%;
height: auto;
}
.mt_20{
margin-top: 20px;
}
.shaoma .xians .qing{
width: 70%;
height: 80px;
background-color: #445e84;
color: #ffffff;
margin: 0 auto 20px auto;
}
.shaoma .xians .qing .sys{
width: 50px;
height: 50px;
display: inline-block;
float: left;
margin: 15px;
}
.shaoma .xians .qing span{
margin: 10px;
height: 70px;
display: block;
padding-top: 7%;
}
@media screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)
{
.neirong ul li .input{
width: 84%;
}
}
@media screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)
{
.neirong ul li .input{
width: 84%;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -0,0 +1,45 @@
<!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">
</head>
<body>
<section>
<header class="header"><span>支付测试</span></header>
<div class="neirong">
<ul>
<li><span class="name">总金额:</span><input type="text" placeholder="单位:分 整型" class="input"> <sapn class="red">*</sapn></li>
</ul>
<footer class="text-center">
<a href="javascript:;" onclick="sm();" class="btn btn-blue foot_btn">确定</a>
</footer>
</div>
</section>
<div class="shaoma">
<div class="xians">
<a href="javascript:;" class="close"><img src="img/close.png" class="img_close"></a>
<div class="mt_20">
<img src="img/timg.jpg" class="img-responsive">
</div>
<div class="qing">
<img src="img/sys.jpg" width="50" height="50" class="sys">
<span>请使用微信扫描二维码以完成支付</span>
</div>
</div>
</div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
function sm(){
$(".shaoma").css("display","block");
}
$(".shaoma .xians .close").click(function(){
var obj = $(this);
obj.parents(".shaoma").css("display","none");
})
</script>
</body>
</html>

View File

@@ -0,0 +1,370 @@
<?php
define('USEDCHARSET', 'utf-8');
/// 这里定义公共变量
$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
/// 尝试获取sid和scode
$sid = isset($_REQUEST['sid']) ? $_REQUEST['sid'] : '';
$scode = isset($_REQUEST['scode']) ? $_REQUEST['scode'] : '';
/// 判断是否有sid和scode, 什么数据都没有则先跳转到登录页面授权
if (empty($sid) || empty($scode))
{
$url = "https://api.tscce.cn/source/login/login.php?app_id={$app_id}&dev_key={$dev_key}&market_key={$market_key}&redirect_uri=" . rawurlencode(getLocaleUrl());
header("Location: {$url}");
exit;
}
elseif (!isset($_REQUEST['fee'])) /// 有sid和scode 但是 没有fee 则要求页面输入并提交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" autofocus 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;
}
else /// 有fee参数表示已提交页面中输入的支付金额
{
/// 通过接口获取门店所支援的支付方式
$data = array(
'appid' => $app_id, /// appid
'devkey' => $dev_key, /// 开发者key
'market_key' => $market_key, /// 门店key
'level' => 1, /// 支付类型(1: 线上, 2: 扫码, 3: app)
'version' => 1, /// 版本号
);
$data['sign'] = SignParameter($data, $sign_key);
$result = new ResultObject(rawurldecode(SendPost('https://api.tscce.cn/api/newpay/querylist', $data)));
if (0 == $result->error && count($result->data) > 0) /// 成功
{
/// 这里为了演示, 只判断了第一个支付方式, 实际应该先判断当前用户的运行环境, 然后才去决定使用哪种支付通道(微信或支付宝等)
$pay_type = $result->data[0]->type_id;
$order_id = date('YmdHis') . rand(1000, 9999); /// 随机生成一个订单号
$notice_url = dirname(getLocaleUrl()) . '/notice.php'; /// 通知页面地址
$return_url = getLocaleUrl() . "?sid={$sid}&scode={$scode}"; /// 回调地址
$fee = $_REQUEST['fee'];
$data = array(
'appid' => $app_id, /// appid
'devkey' => $dev_key, /// 开发者key
'sid' => $sid, /// sid
'scode' => $scode, /// scode
'orderid' => $order_id, /// 订单号
'fee' => $fee, /// 支付金额(单位分)
'title' => 'test', /// 支付标题
'notice_url' => $notice_url, /// 回调页面地址(异步)
'return_url' => $return_url, /// 回调页面地址(同步)
'paytype' => $pay_type, /// 支付类型(可通过接口获取所有支持的类型列表)
'p1' => 'p1', /// 附加的其他参数, 回调时会原样返回, 参数名可自定义
'p2' => 'p2', /// 附加的其他参数, 回调时会原样返回, 参数名可自定义
'version' => 1, /// 接口版本号, 整型, 目前只支持1
);
$data['sign'] = SignParameter($data, $sign_key);
$html = <<<EOF
<form style="display:none;" id="frm" name="frm" method="post" action="https://api.tscce.cn/api/newpay/pay/online/">
<input name="appid" type="text" value="{$data['appid']}" />
<input name="devkey" type="text" value="{$data['devkey']}" />
<input name="sid" type="text" value="{$data['sid']}" />
<input name="scode" type="text" value="{$data['scode']}" />
<input name="orderid" type="text" value="{$data['orderid']}" />
<input name="fee" type="text" value="{$data['fee']}" />
<input name="title" type="text" value="{$data['title']}" />
<input name="notice_url" type="text" value="{$data['notice_url']}" />
<input name="return_url" type="text" value="{$data['return_url']}" />
<input name="paytype" type="text" value="{$data['paytype']}"/>
<input name="p1" type="text" value="{$data['p1']}"/>
<input name="p2" type="text" value="{$data['p2']}"/>
<input name="version" type="text" value="{$data['version']}"/>
<input name="sign" type="text" value="{$data['sign']}"/>
</form>
<script>
frm.submit();
</script>
EOF;
}
elseif (0 != $result->error) /// 有错误发生
{
$html = <<<EOL
<script>
alert('{$result->msg}');
</script>
EOL;
}
else
{
$html = <<<EOL
<script>
alert('该门店不支援任何的支付方式!');
</script>
EOL;
}
}
echo $html;
?>
</body>
</html>

View File

@@ -0,0 +1,216 @@
//var g_appid = '14919772144482';
//var g_devkey = '14915485974028';
var g_RequestAddress = 'https://api.tscce.cn';
/**
* @note 字符串格式化
* @param fn_objs
* @returns object
* @constructor
*/
Overload = function (fn_objs) {
var is_match = function (x, y) {
if (x == y) {
return true;
}
if (x.indexOf("*") == -1) {
return false;
}
var x_arr = x.split(","), y_arr = y.split(",");
if (x_arr.length != y_arr.length) {
return false;
}
while (x_arr.length) {
var x_first = x_arr.shift(), y_first = y_arr.shift();
if (x_first != "*" && x_first != y_first) {
return false;
}
}
return true;
};
var ret = function () {
var args = arguments
, args_len = args.length
, args_types = []
, args_type
, fn_objs = args.callee._fn_objs
, match_fn = function () {
};
for (var i = 0; i < args_len; i++) {
var type = typeof args[i];
type == "object" && (args[i].length > -1) && (type = "array");
args_types.push(type);
}
args_type = args_types.join(",");
for (var k in fn_objs) {
if (is_match(k, args_type)) {
match_fn = fn_objs[k];
break;
}
}
return match_fn.apply(this, args);
};
ret._fn_objs = fn_objs;
return ret;
};
/**
* 通过对字符串进行伪重载实现对字符串对象的格式化功能
* @type {Object}
*/
String.prototype.format = Overload({
"array": function (params) {
var reg = /{(\d+)}/gm;
return this.replace(reg, function (match, name) {
return params[~~name];
});
},
"object": function (param) {
var reg = /{([^{}]+)}/gm;
return this.replace(reg, function (match, name) {
return param[name];
});
}
});
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) {
return r[2];
}
return null;
}
//------------设置Cookie参数方法------------//
function setCookie(name, value) {
var Days = 30; //此 cookie 将被保存 30 天
var exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie = name + "=" + value + ";expires=" + exp.toGMTString();
}
//------------获取Cookie参数方法------------//
function getCookie(name) {
var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
if (arr != null) {
return arr[2];
}
return null;
}
//------------删除Cookie参数方法------------//
function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval != null) {
document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
}
/**
* 获取随机数
*/
function randomChar(length) {
var x = "0123456789qwertyuioplkjhgfdsazxcvbnm";
var tmp = "";
var timestamp = new Date().getTime();
for (var i = 0; i < length; i++) {
tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
}
return timestamp + tmp;
}
function localeUrl() {
var url = window.location.origin + window.location.pathname;
var index = url.indexOf('?');
if (-1 == index)
return url;
else
return name.substr(0, index);
}
function extractPath(name) {
var index = name.lastIndexOf('/');
if (-1 == index)
return name;
else
return name.substr(0, index + 1);
}
function HttpRequest(args) {
var defaults =
{
url: g_RequestAddress,
async: true,
OnBeforeSend: function (/*XMLHttpRequest*/object) { },
OnComplete: function (/*XMLHttpRequest, textStatus*/object, status) { },
OnSuccess: function (/*data, textStatus*/message, status) { },
OnError: function (/*XMLHttpRequest, textStatus, errorThrown*/object, status, error) { },
},
settings = $.extend({}, defaults, args);
var data = {};
$.each(settings, function (name, value) {
if (
'async' != name &&
'url' != name &&
'OnBeforeSend' != name &&
'OnComplete' != name &&
'OnSuccess' != name &&
'OnError' != name
) {
data[name] = value;
}
});
//var succ = function (/*data, textStatus*/message, status) {
// var obj = eval("(" + decodeURIComponent(message) + ")");
// if (!obj) {
// //alert('pager6');
// window.location.href = PAGENAME_LOGIN + "?manager_id=" + getCookie(g_managerid);
// return false;
// }
// else if (1 == obj.error && 10008 == obj.error_code) {
// //alert('pager7');
// window.location.href = PAGENAME_LOGIN + "?manager_id=" + getCookie(g_managerid);
// return false;
// }
// else {
// return settings.OnSuccess(message, status);
// }
//};
$.ajax({
url: settings.url,
type: 'post',
async: settings.async,
data: data,
datatype: 'json',
timeout: 1000 * 7,
beforeSend: settings.OnBeforeSend,
success: settings.OnSuccess,
//success: succ,
error: settings.OnError,
complete: settings.OnComplete,
});
return settings;
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
<?php
/// 支付的回调通知页面
$data = file_get_contents('php://input');
file_put_contents(__DIR__ . '/pay.log', $data);
/// 返回success表示成功接收到了回调通知
die('success');

View File

@@ -0,0 +1 @@
p1=p1&p2=p2&paytime=1544641952&order_no=201812130312305371&out_trade_no=abf396ccacd2990abb969d1df8280ebc&transaction_id=4200000238201812130876844546&total_fee=5&version=1&sign=f4df027d8bf888e07274dbbc7b46adda

View File

@@ -0,0 +1,4 @@
<?php
/// 支付的回调通知页面
file_put_contents(__DIR__ . '/return.log', json_encode($_REQUEST));

View File

@@ -0,0 +1,345 @@
<?php
/// https://api.tscce.cn/sample/onlinepay/test.php
define('USEDCHARSET', 'utf-8');
/// 这里定义公共变量
$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;
}
$order_id = md5(time().rand(1000,9999));
$notice_url = dirname(getLocaleUrl()) . '/notice.php'; /// 通知页面地址
$return_url = dirname(getLocaleUrl()) . '/return.php'; /// 通知页面地址
/// 登录
$url = 'https://api.tscce.cn/api/login/ylnn';
$data = array(
'appid' => $app_id, /// appid
'devkey' => $dev_key, /// 开发者key
'market_key' => $market_key, /// 门店key
'scode' => md5(date('Ymdhis') . rand(1000, 9999)), /// 随机数
'agent_key' => 'i33v0llvp0euhd1n9qo1fM2RV8vtog4y', /// 代理号
'game_key' => '7N0e0z2u2098pf1M2fj0kyB1D4n4ylkA', /// 渠道号
'user_key' => '100000', /// 用户号
'headImg' => '', /// 头像
'nickname' => '100000', /// 昵称
);
$ret = SendPost($url, $data);
$ret = new ResultObject($ret);
if ($ret->error)
die($ret->msg);
$sid = $ret->data->sid;
$scode = $ret->data->scode;
$fee = 1;
$title = '支付测试';
$tdy_id = 1;
$tdy_token = 1;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form style="display:none;" id="frm" name="frm" method="post" action="https://api.tscce.cn/api/newpay/pay/online/">
<input name="appid" type="text" value="<?php echo $app_id; ?>" />
<input name="devkey" type="text" value="<?php echo $dev_key; ?>" />
<input name="sid" type="text" value="<?php echo $sid; ?>" />
<input name="scode" type="text" value="<?php echo $scode; ?>" />
<input name="orderid" type="text" value="<?php echo $order_id; ?>" />
<input name="fee" type="text" value="1" />
<input name="title" type="text" value="支付测试" />
<input name="notice_url" type="text" value="<?php echo $notice_url; ?>" />
<input name="return_url" type="text" value="<?php echo $return_url; ?>" />
<input name="paytype" type="text" value="9"/>
<input name="p1" type="text" value="aaa"/>
<input name="p2" type="text" value="bbb"/>
<input name="version" type="text" value="1"/>
<input name="sign" type="text" value=""/>
</form>
<script>
frm.submit();
<?php
/*
$html = <<<EOL
var add_formchild = function (name, value) {
var edt = document.createElement('input');
edt.type = 'text';
edt.id = name;
edt.name = name;
edt.value = value;
frmPost.appendChild(edt);
};
function startpay() {
var frmPost = document.createElement('form');
frmPost.id = '____frmPost____';
frmPost.name = '____frmPost____';
frmPost.method = 'post';
frmPost.action = 'https://api.tscce.cn/api/newpay/pay/online/';
var add_formchild = function (name, value) {
var edt = document.createElement('input');
edt.type = 'text';
edt.id = name;
edt.name = name;
edt.value = value;
frmPost.appendChild(edt);
};
add_formchild('appid', '{$app_id}');
add_formchild('devkey', '{$dev_key}');
add_formchild('market_key', '{$market_key}');
add_formchild('sid', '{$sid}');
add_formchild('scode', '{$scode}');
add_formchild('tdyid', '{$tdy_id}');
add_formchild('tdytoken', '{$tdy_token}');
add_formchild('fee', '{$fee}'); /// 本次需要支付的金额,单位为分
add_formchild('orderid', '{$order_id}'); /// 订单编号
add_formchild('title', '{$title}'); /// 本次支付主题
add_formchild('return_url', '{$return_url}'); /// 支付成功后的通知回调地址, 异步
add_formchild('notice_url', '{$return_url}'); /// 支付成功后的回跳地址, 同步
add_formchild('paytype', '1001');
add_formchild('version', 1);
add_formchild('sign', '');
/// form表单提交
document.body.appendChild(frmPost);
frmPost.submit();
frmPost.remove();
}
startpay();
EOL;
echo $html, PHP_EOL;
*/
?>
</script>
</body>
</html>