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

359 lines
8.7 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
/// 尝试获取sid和scode
$sid = isset($_GET['sid']) ? $_GET['sid'] : '';
$scode = isset($_GET['scode']) ? $_GET['scode'] : '';
/// 判断是否有sid和scode, 什么数据都没有则先跳转到登录页面授权
if (empty($sid) || empty($scode))
{
if (strpos($_SERVER['HTTP_USER_AGENT'],"MicroMessenger "))
{
$url = "https://api2.daoqijuyou77.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;
}
else
{
/// 登录
$url = 'https://api2.daoqijuyou77.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;
}
}
if (!isset($_POST['refund_fee'])) /// 有 sid 和 scode 但是 没有 refund_fee 则要求页面输入并提交 refund_fee 参数
{
$url = getLocaleUrl();
$html = <<<EOF
<script>
function submit() {
var transaction_id = document.getElementById('transaction_id').value;
var out_trade_no = document.getElementById('out_trade_no').value;
var refund_fee = document.getElementById('refund_fee').value;
if ('' == refund_fee || undefined == refund_fee) {
alert('请输入要退款的金额(单位为分)');
return;
}
var script =
"<form style='display:none;' id='frm' name='frm' method='post' action=''>" +
" <input name='transaction_id' type='text' value='" + transaction_id + "' />\\r\\n" + /// 三方订单号(微信等)
" <input name='out_trade_no' type='text' value='" + out_trade_no + "' />\\r\\n" + /// 平台订单号
" <input name='refund_fee' type='text' value='" + refund_fee + "' />\\r\\n" + /// 退款金额
"</form>";
$('#mainbody').append(script);
$('#frm').submit();
}
</script>
<section>
<header class="header"><span>退款测试</span></header>
<div class="neirong">
<ul>
<li><span class="name">三方订单号:</span><input type="text" id="transaction_id" placeholder="长度32" class="input"></li>
<li><span class="name">平台订单号:</span><input type="text" id="out_trade_no" placeholder="长度32" class="input"></li>
<li><span class="name">退款金额:</span><input type="text" id="refund_fee" 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>
EOF;
}
else /// 有refund_fee参数表示已提交页面中输入的退款金额
{
$data = array(
'appid' => $app_id,
'devkey' => $dev_key,
'sid' => $sid,
'scode' => $scode,
'transaction_id' => $_POST['transaction_id'],
'out_trade_no' => $_POST['out_trade_no'],
'refund_fee' => $_POST['refund_fee'],
'version' => 1,
);
$data['sign'] = SignParameter($data, $sign_key);
$result = new ResultObject(rawurldecode(SendPost('https://api.daoqijuyou77.cn/api/newpay/refund/', $data)));
if (0 != $result->error) /// error不为0表示有错误发生
{
$html = <<<EOL
<script>
alert('{$result->msg}');
</script>
EOL;
}
else /// 调用成功, 则把图片显示在前台中
{
$html = <<<EOL
<script>
alert('申请退款成功!');
</script>
EOL;
}
}
echo $html;
?>
</body>
</html>