Files
2026-03-15 01:27:05 +08:00

288 lines
7.2 KiB
PHP
Raw Permalink 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 = '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
//"bank_id":"银行编号","type":"对公对私","account_no":"收款人帐号","account_name":"收款人姓名","money":"付款金额","reason":"付款理由","province":"省份","city":"城市","bank_name":"收款支行名称"
//$account_list = $_POST['account_list'];
$account_list = '{"account_no":"fantasyfinal@126.com","account_name":"应俊","money":"0.10","remark":"转账备注"}';
$order_no = date('YmdHis') . rand(1000, 9999); /// 随机生成一个订单号
$notice_url = dirname(getLocaleUrl()) . '/notice.php'; /// 通知页面地址
$return_url = getLocaleUrl(); /// 回调地址
$data = array(
'appid' => $app_id, /// appid
'devkey' => $dev_key, /// 开发者key
'market_key' => $market_key, /// 门店key
'order_no' => $order_no, /// 订单号
'account_list' => $account_list, /// 收款账户列表
'notice_url' => $notice_url, /// 回调页面地址(异步)
'return_url' => $return_url, /// 回调页面地址(同步)
'transfer_type' => '2', /// 支付类型(可通过接口获取所有支持的类型列表)
'p1' => 'p1', /// 附加的其他参数, 回调时会原样返回, 参数名可自定义
'p2' => 'p2', /// 附加的其他参数, 回调时会原样返回, 参数名可自定义
'version' => '1', /// 接口版本号, 整型, 目前只支持1
);
$sign = SignParameter($data, $sign_key); /// 对参数进行签名(必须)
$html = <<<EOL
<form style="display:none;" id="frm" name="frm" method="post" action="https://api2.tscce.cn/api/transfer/transfer/">
<input name='appid' type='text' value='{$data["appid"]}' />
<input name='devkey' type='text' value='{$data["devkey"]}' />
<input name='market_key' type='text' value='{$data["market_key"]}' />
<input name='order_no' type='text' value='{$data["order_no"]}' />
<input name='account_list' type='text' value='{$data["account_list"]}' />
<input name='notice_url' type='text' value='{$data["notice_url"]}' />
<input name='return_url' type='text' value='{$data["return_url"]}' />
<input name='transfer_type' type='text' value='{$data["transfer_type"]}' />
<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='{$sign}'/>
</form>
<script>
frm.submit();
</script>
EOL;
echo $html;
?>
</body>
</html>