增加docke部署
265
codes/agent/game-docker/api/source/login/common.php
Normal file
@@ -0,0 +1,265 @@
|
||||
<?php
|
||||
define('USEDCHARSET', 'utf-8');
|
||||
|
||||
// 加载环境变量配置
|
||||
require_once dirname(dirname(dirname(__DIR__))) . '/env_config.php';
|
||||
// 域名配置(若 pay/common.php 已先定义则跳过)
|
||||
if (!defined('SITE_API_DOMAIN')) define('SITE_API_DOMAIN', env('SITE_API_URL', 'https://api.tscce.cn'));
|
||||
if (!defined('SITE_API2_DOMAIN')) define('SITE_API2_DOMAIN', env('SITE_API2_URL', 'https://api2.tscce.cn'));
|
||||
|
||||
/// 接口返回用的信息类
|
||||
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 获取当前页面的完整连接
|
||||
* @param $always_http bool
|
||||
* @return string
|
||||
*/
|
||||
function getLocaleUrl($always_http = false)
|
||||
{
|
||||
$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']);
|
||||
|
||||
if ($always_http)
|
||||
return 'http://' . $hostname . $hostport;
|
||||
else
|
||||
return $request_scheme . $hostname . $hostport;
|
||||
}
|
||||
|
||||
function getFullUrl($relatively_url, $always_http = false)
|
||||
{
|
||||
if (mb_strstr($relatively_url, '/', false, USEDCHARSET) == $relatively_url)
|
||||
return getLocaleUrl($always_http) . $relatively_url;
|
||||
else
|
||||
return getLocaleUrl($always_http) . '/' . $relatively_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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;
|
||||
|
||||
// 4:md5加密这个字符串
|
||||
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);
|
||||
|
||||
// 如果请求失败,记录错误并返回空字符串
|
||||
if ($ret === false) {
|
||||
// 记录错误到日志文件用于调试
|
||||
$error_msg = "SendPost failed: URL=$url, Data=" . print_r($data, true);
|
||||
if (isset($http_response_header)) {
|
||||
$error_msg .= ", Headers=" . print_r($http_response_header, true);
|
||||
}
|
||||
error_log($error_msg);
|
||||
return '';
|
||||
}
|
||||
|
||||
$ret = trim($ret, "\xEF\xBB\xBF");
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @note 从参数中过滤不需要的参数
|
||||
* @param array|null $ignores 要过滤的参数列表(参数名)
|
||||
* @param array|null $parameters 目标参数列表
|
||||
* @return array
|
||||
*/
|
||||
function GetAttachParameters($ignores = null, $parameters = null)
|
||||
{
|
||||
$return = (array)(empty($parameters) ? $_REQUEST : $parameters);
|
||||
if (!empty($ignores))
|
||||
{
|
||||
foreach ($return as $k => $v)
|
||||
{
|
||||
if (in_array($k, $ignores))
|
||||
unset($return[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
7199
codes/agent/game-docker/api/source/login/css/bootstrap.min.css
vendored
Normal file
217
codes/agent/game-docker/api/source/login/css/style.css
Normal file
@@ -0,0 +1,217 @@
|
||||
.body_bg{
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
.body_bg>.yl_logo{
|
||||
margin: 0 auto;
|
||||
padding: 15% 20px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.body_bg>.yl_logo>img{
|
||||
display: inline-block;
|
||||
height: 45px;
|
||||
}
|
||||
.s_row{
|
||||
position: relative;
|
||||
margin: 0 auto 20px auto;
|
||||
text-align: center;
|
||||
width: 90%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.s_row .img_tb{
|
||||
width: 15%;
|
||||
height: 31px;
|
||||
position: relative;
|
||||
clear: both;
|
||||
}
|
||||
.s_row .img_tb img{
|
||||
width: 22px;
|
||||
height: 27px;
|
||||
}
|
||||
.s_row .img_tb img,
|
||||
.s_row>input{
|
||||
float: left;
|
||||
}
|
||||
.s_row>input{
|
||||
display: block;
|
||||
position: relative;
|
||||
height: 31px;
|
||||
padding: 12px 10px;
|
||||
border-top: none;
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
border-bottom: 1px solid #bcbcbc;
|
||||
line-height: 40px;
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
background-color: #f1f1f1;
|
||||
outline: 0;
|
||||
margin-left: 5%;
|
||||
width: 85%;
|
||||
}
|
||||
.s_row .duanxin{
|
||||
margin-left: 11%;width: 60%;
|
||||
}
|
||||
.s_row .huoqu{
|
||||
background-color: #02a7f1;
|
||||
border: 1px solid #02a7f1;
|
||||
color: #ffffff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 3%;
|
||||
padding: 6px 14px;
|
||||
}
|
||||
|
||||
.dr_btn{
|
||||
text-align: center;
|
||||
}
|
||||
.dr_btn .btn{
|
||||
width: 90%;
|
||||
padding: 10px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.dr_btn .btn-danger{
|
||||
background-color: #cb4c02;
|
||||
border: 1px solid #cb4c02;
|
||||
}
|
||||
.dr_btn .btn-info{
|
||||
background-color: #5c8ceb;
|
||||
border: 1px solid #5c8ceb;
|
||||
margin-top: 18%;
|
||||
}
|
||||
.dr_btn .btn-info:hover,
|
||||
.dr_btn .btn-info:active,
|
||||
.dr_btn .btn-info:active:hover{
|
||||
background-color: #5174c7;
|
||||
border: 1px solid #5c8ceb;
|
||||
}
|
||||
.dr_btn .btn-default{
|
||||
background-color: #969696;
|
||||
border: 1px solid #969696;
|
||||
color: #ffffff;
|
||||
}
|
||||
.wj_row{
|
||||
text-align: center;
|
||||
width: 90%;
|
||||
margin: 0 auto 20% auto;
|
||||
}
|
||||
.wj_row a{
|
||||
color: #7b94f1;
|
||||
}
|
||||
.wj_row .wjmm{
|
||||
text-align: left;
|
||||
display: inherit;
|
||||
float: left;
|
||||
}
|
||||
.wj_row .zczh{
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.sigma-content{
|
||||
text-align: center;
|
||||
background-color: #f1f1f1;
|
||||
position: relative;
|
||||
color: #bfbfbf;
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.sigma-middle-line:before{
|
||||
content: '';
|
||||
display: block;
|
||||
height: 1px;
|
||||
width: 100%;
|
||||
background-color: #bfbfbf;/*颜色需与主题大背景色一致*/
|
||||
position: relative;
|
||||
top: 10px;/*调节线高*/
|
||||
left: 0;
|
||||
}
|
||||
.sigma-line-text{
|
||||
display: inline-block;
|
||||
background: #f1f1f1;
|
||||
padding: 0 18px 0 18px;
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.fangshi{
|
||||
width: 80%;
|
||||
margin: 8% auto;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
}
|
||||
.fangshi .box{
|
||||
display: inline-block;
|
||||
width: 18.1%;
|
||||
margin-left: 3%;
|
||||
margin-right: 3%;
|
||||
text-align: center;
|
||||
color: #787878;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.fangshi .box:first-child{
|
||||
margin-left: 0;
|
||||
}
|
||||
.fangshi .box:last-child{
|
||||
margin-right: 0;
|
||||
}
|
||||
.fangshi .box img{
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 0 auto 5px auto;
|
||||
}
|
||||
.fangshi .box:active{
|
||||
color: red;
|
||||
font-size: 12px;
|
||||
}
|
||||
.fangshi .box:active img{
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
/**/
|
||||
.hui{
|
||||
color: #787878;
|
||||
font-size: 16px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
.w_tongy{
|
||||
height: 40px;
|
||||
}
|
||||
.w_tongy>input[type=checkbox]{
|
||||
width: 5%;
|
||||
}
|
||||
.w_tongy .xieyi{
|
||||
margin-left: 5%; line-height: 2.8; float: left;color: #666;
|
||||
}
|
||||
.w_tongy .xieyi .red{
|
||||
color: red;
|
||||
}
|
||||
.huoqu_duanxin{
|
||||
height: 35px;overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
@media screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)
|
||||
{
|
||||
.s_row .duanxin{
|
||||
margin-left: 14%;
|
||||
}
|
||||
.s_row .huoqu{
|
||||
right: 1%;
|
||||
}
|
||||
}
|
||||
@media screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)
|
||||
{
|
||||
.s_row .duanxin{
|
||||
margin-left: 8.5%;
|
||||
}
|
||||
.s_row .huoqu{
|
||||
right: 2%;
|
||||
}
|
||||
.s_row>input{
|
||||
width: 90%;
|
||||
}
|
||||
}
|
||||
147
codes/agent/game-docker/api/source/login/error.html
Normal file
@@ -0,0 +1,147 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<script language="JavaScript" src="js/jquery-2.1.4.min.js"></script>
|
||||
<script language="JavaScript" src="js/common.js"></script>
|
||||
<title>错误提示</title>
|
||||
</head>
|
||||
<style type="text/css">
|
||||
body {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
* {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.container {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .header {
|
||||
min-height: 45px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .body {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .header .header-nav.default {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.container .header .header-nav {
|
||||
background-color: #ec6061;
|
||||
height: 45px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .header .header-nav-c {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
line-height: 45px;
|
||||
padding: 0 50px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container .body .login-box {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container .body .login-box img {
|
||||
height: 160px;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.container .body .login-box .login-btn-group, .loading {
|
||||
margin: 50px 30px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.container .body .login-box .login-btn-group .btn {
|
||||
border-radius: 5px;
|
||||
font-size: 14px;
|
||||
margin-bottom: 10px;
|
||||
padding: 7px 0;
|
||||
}
|
||||
|
||||
.btn-block {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background-color: #5cb85c;
|
||||
border-color: #4cae4c;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-image: none;
|
||||
cursor: pointer;
|
||||
font-weight: normal;
|
||||
line-height: 1.4;
|
||||
outline: medium none;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background-color: #d9534f;
|
||||
border-color: #d43f3a;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
var error_code = getQueryString('error_code'); // 错误代码
|
||||
var msg = getQueryString('msg'); // 错误消息
|
||||
|
||||
var html = '<strong><center>系统发生错误!</center></strong><p><br>错误代码: {error_code}<br>错误消息: {msg}</p>'.format({
|
||||
'error_code': error_code,
|
||||
'msg': decodeURIComponent(msg)
|
||||
});
|
||||
|
||||
if (error_code && msg) {
|
||||
$('.loading').addClass('hide');
|
||||
$('.login-btn-group').html(html).removeClass('hide');
|
||||
}
|
||||
else {
|
||||
$('.loading').html('出现异常错误,请稍后重试!');
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div id="content">
|
||||
<div class="header">
|
||||
<div class="header-nav default">
|
||||
<div class="header-nav-c">错误提示</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="login-box">
|
||||
<img alt="login" src="http://game.mianwangkeji.com/images/youle.png">
|
||||
<div class="login-btn-group hide"></div>
|
||||
<div class="loading">Loading...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
147
codes/agent/game-docker/api/source/login/error.php
Normal file
@@ -0,0 +1,147 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<script language="JavaScript" src="js/jquery-2.1.4.min.js"></script>
|
||||
<script language="JavaScript" src="js/common.js"></script>
|
||||
<title>错误提示</title>
|
||||
</head>
|
||||
<style type="text/css">
|
||||
body {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
* {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.container {
|
||||
margin: 0 auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .header {
|
||||
min-height: 45px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .body {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .header .header-nav.default {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.container .header .header-nav {
|
||||
background-color: #ec6061;
|
||||
height: 45px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.container .header .header-nav-c {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
line-height: 45px;
|
||||
padding: 0 50px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container .body .login-box {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.container .body .login-box img {
|
||||
height: 160px;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.container .body .login-box .login-btn-group, .loading {
|
||||
margin: 50px 30px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.container .body .login-box .login-btn-group .btn {
|
||||
border-radius: 5px;
|
||||
font-size: 14px;
|
||||
margin-bottom: 10px;
|
||||
padding: 7px 0;
|
||||
}
|
||||
|
||||
.btn-block {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background-color: #5cb85c;
|
||||
border-color: #4cae4c;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-image: none;
|
||||
cursor: pointer;
|
||||
font-weight: normal;
|
||||
line-height: 1.4;
|
||||
outline: medium none;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background-color: #d9534f;
|
||||
border-color: #d43f3a;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
$(function () {
|
||||
var error_code = getQueryString('error_code'); // 错误代码
|
||||
var msg = getQueryString('msg'); // 错误消息
|
||||
|
||||
var html = '<strong><center>系统发生错误!</center></strong><p><br>错误代码: {error_code}<br>错误消息: {msg}</p>'.format({
|
||||
'error_code': error_code,
|
||||
'msg': decodeURIComponent(msg)
|
||||
});
|
||||
|
||||
if (error_code && msg) {
|
||||
$('.loading').addClass('hide');
|
||||
$('.login-btn-group').html(html).removeClass('hide');
|
||||
}
|
||||
else {
|
||||
$('.loading').html('出现异常错误,请稍后重试!');
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div id="content">
|
||||
<div class="header">
|
||||
<div class="header-nav default">
|
||||
<div class="header-nav-c">错误提示</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="login-box">
|
||||
<img alt="login" src="http://game.mianwangkeji.com/images/youle.png">
|
||||
<div class="login-btn-group hide"></div>
|
||||
<div class="loading">Loading...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
BIN
codes/agent/game-docker/api/source/login/img/QQ.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
codes/agent/game-docker/api/source/login/img/jkx.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
codes/agent/game-docker/api/source/login/img/mm.png
Normal file
|
After Width: | Height: | Size: 477 B |
BIN
codes/agent/game-docker/api/source/login/img/sj.png
Normal file
|
After Width: | Height: | Size: 467 B |
BIN
codes/agent/game-docker/api/source/login/img/wx.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
codes/agent/game-docker/api/source/login/img/yl.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
codes/agent/game-docker/api/source/login/img/zfb.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
codes/agent/game-docker/api/source/login/img/zh.png
Normal file
|
After Width: | Height: | Size: 682 B |
216
codes/agent/game-docker/api/source/login/js/common.js
Normal file
@@ -0,0 +1,216 @@
|
||||
//var g_appid = '14919772144482';
|
||||
//var g_devkey = '14915485974028';
|
||||
var g_RequestAddress = 'https://api2.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;
|
||||
}
|
||||
4
codes/agent/game-docker/api/source/login/js/jquery-1.11.1.min.js
vendored
Normal file
2394
codes/agent/game-docker/api/source/login/js/jquery-2.1.4.min.js
vendored
Normal file
240
codes/agent/game-docker/api/source/login/login.html
Normal file
@@ -0,0 +1,240 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<script language="JavaScript" src="js/jquery-2.1.4.min.js"></script>
|
||||
<script language="JavaScript" src="js/common.js"></script>
|
||||
<title>授权登录</title>
|
||||
</head>
|
||||
|
||||
<script>
|
||||
function frm_submit(id) {
|
||||
var frm = document.getElementById(id);
|
||||
return frm.submit();
|
||||
}
|
||||
|
||||
function bodyload(sender) {
|
||||
/// appid
|
||||
var app_id = getQueryString('app_id');
|
||||
/// 开发者key
|
||||
var dev_key = getQueryString('dev_key');
|
||||
/// 门店key
|
||||
var market_key = getQueryString('market_key');
|
||||
/// 登陆方式
|
||||
var login_type = getQueryString('login_type');
|
||||
/// 回调页面地址
|
||||
var redirect_uri = getQueryString('redirect_uri');
|
||||
/// 错误页面地址
|
||||
var error_uri = getQueryString('error_uri');
|
||||
/// 随机数
|
||||
var scode = randomChar(32);
|
||||
|
||||
if (!redirect_uri || '' == redirect_uri)
|
||||
redirect_uri = localeUrl(); /// window.location.href;
|
||||
if (!error_uri || '' == error_uri)
|
||||
error_uri = extractPath(localeUrl()) + 'error.html';
|
||||
|
||||
|
||||
HttpRequest({
|
||||
'url': g_RequestAddress + '/api/login/querylist',
|
||||
'market_key': market_key,
|
||||
'logintype': login_type,
|
||||
OnSuccess: function (/*data, textStatus*/message, status) {
|
||||
if ('string' == typeof(message)) {
|
||||
message = eval("(" + decodeURIComponent(message) + ")");
|
||||
}
|
||||
|
||||
if (0 == message.length) {
|
||||
alert('找不到支援的任何登录方式, 请联系相关管理员!');
|
||||
return;
|
||||
}
|
||||
|
||||
var type1 = new Array();
|
||||
var type2 = new Array();
|
||||
for (var i = 0; i < message.length; i++) {
|
||||
if ('string' == typeof(message[i].component)) {
|
||||
message[i].component = eval("(" + decodeURIComponent(message[i].component) + ")");
|
||||
}
|
||||
|
||||
if (0 != message[i].is_third) {
|
||||
type2.push(message[i]);
|
||||
}
|
||||
else
|
||||
type1.push(message[i]);
|
||||
}
|
||||
|
||||
/// 只存在一种三方的校验方式则直接跳转到目标连接
|
||||
if (0 == type1.length && 1 == type2.length) {
|
||||
window.location =
|
||||
type2[0].url + '?' + (
|
||||
'appid={appid}&' +
|
||||
'devkey={devkey}&' +
|
||||
'scode={scode}&' +
|
||||
'market_key={market_key}&' +
|
||||
'target={target}&' +
|
||||
'fail_target={fail_target}'
|
||||
).format({
|
||||
'appid': app_id,
|
||||
'devkey': dev_key,
|
||||
'scode': scode,
|
||||
'market_key': market_key,
|
||||
'target': redirect_uri,
|
||||
'fail_target': error_uri
|
||||
});
|
||||
}
|
||||
else {
|
||||
document.getElementById('splitter').style.display = (0 != type1.length && 0 != type2.length) ? 'inline' : 'none';
|
||||
|
||||
var
|
||||
forms = '',
|
||||
elements = '',
|
||||
item = '',
|
||||
url = '';
|
||||
if (type1.length > 0) { /// 需要输入信息的登陆方式
|
||||
for (var i = 0; i < type1.length; i++) {
|
||||
item =
|
||||
('<form style="display:none;" id="{frmid}" name="{frmname}" method="post" action="{url}">\r\n' +
|
||||
' <input name="appid" type="text" value="{appid}" />\r\n' +
|
||||
' <input name="devkey" type="text" value="{devkey}" />\r\n' +
|
||||
' <input name="scode" type="text" value="{scode}" />\r\n' +
|
||||
' <input name="market_key" type="text" value="{market_key}" />\r\n' +
|
||||
' <input name="target" type="text" value="{target}" />\r\n' +
|
||||
' <input name="fail_target" type="text" value="{fail_target}" />\r\n' +
|
||||
'</form>');
|
||||
forms += item.format({
|
||||
'frmid': 'frm' + i,
|
||||
'frmname': 'frm' + i,
|
||||
'url': type1[i].url,
|
||||
'appid': app_id,
|
||||
'devkey': dev_key,
|
||||
'scode': scode,
|
||||
'market_key': market_key,
|
||||
'target': redirect_uri,
|
||||
'fail_target': error_uri
|
||||
});
|
||||
|
||||
|
||||
item =
|
||||
'<p class="s_row">\r\n' +
|
||||
' <span class="img_tb"><img src="img/zh.png"></span>\r\n' +
|
||||
' <input type="text" placeholder="账号|手机号|邮箱" autofocus>\r\n' +
|
||||
'</p>\r\n' +
|
||||
'<p class="s_row" style="margin-bottom: 30px;">\r\n' +
|
||||
' <span class="img_tb"><img src="img/mm.png"></span>\r\n' +
|
||||
' <input type="text" placeholder="请输入密码">\r\n' +
|
||||
'</p>\r\n' +
|
||||
'<div class="dr_btn">\r\n' +
|
||||
' <button onclick="frm_submit(\'frm' + i + '\')" class="btn btn-danger">登录</button>\r\n' +
|
||||
'</div>\r\n' +
|
||||
'<div class="wj_row">\r\n' +
|
||||
' <a href="password.html" class="wjmm">忘记密码?</a>\r\n' +
|
||||
' <a href="password_detail.html" class="zczh">没有帐号?立即注册>>></a>\r\n' +
|
||||
'</div>\r\n';
|
||||
|
||||
elements += item;
|
||||
}
|
||||
|
||||
$('#mainbody').append(forms);
|
||||
$('#own').append(elements);
|
||||
}
|
||||
|
||||
if (type2.length > 0) { /// 其他登录方式(三方认证方式)
|
||||
elements = '';
|
||||
|
||||
for (var i = 0; i < type2.length; i++) {
|
||||
item =
|
||||
'<a class="box" href="{url}">\r\n' +
|
||||
' <img src="{image}">\r\n' +
|
||||
//' <label>{type_name}</label>\r\n' +
|
||||
'</a>';
|
||||
|
||||
url = type2[i].url + '?' + (
|
||||
'appid={appid}&' +
|
||||
'devkey={devkey}&' +
|
||||
'scode={scode}&' +
|
||||
'market_key={market_key}&' +
|
||||
'target={target}&' +
|
||||
'fail_target={fail_target}'
|
||||
).format({
|
||||
'appid': app_id,
|
||||
'devkey': dev_key,
|
||||
'scode': scode,
|
||||
'market_key': market_key,
|
||||
'target': redirect_uri,
|
||||
'fail_target': error_uri
|
||||
});
|
||||
|
||||
elements += item.format({
|
||||
'url': url,
|
||||
'image': type2[i].image,
|
||||
'type_name': type2[i].type_name
|
||||
});
|
||||
}
|
||||
$('#third').append(elements);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<body class="body_bg" id="mainbody" onload="bodyload(this)">
|
||||
<header class="yl_logo">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<div class="fangshi" id="own">
|
||||
<!--
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/zh.png"></span>
|
||||
<input type="text" placeholder="账号|手机号|邮箱" autofocus>
|
||||
</p>
|
||||
<p class="s_row" style="margin-bottom: 30px;">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="请输入密码">
|
||||
</p>
|
||||
|
||||
<div class="dr_btn">
|
||||
<a href="javascript:;" class="btn btn-danger">登录</a>
|
||||
</div>
|
||||
<div class="wj_row">
|
||||
<a href="password.html" class="wjmm">忘记密码?</a>
|
||||
<a href="password_detail.html" class="zczh">没有帐号?立即注册>>></a>
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
|
||||
<div class="sigma-content" id="splitter" style="display:none">
|
||||
<div class="sigma-middle-line">
|
||||
<span class="sigma-line-text">更多登录方式</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fangshi" id="third">
|
||||
<!--
|
||||
<div class="box">
|
||||
<img src="img/wx.png">
|
||||
<label>微信</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/zfb.png">
|
||||
<label>支付宝</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/QQ.png">
|
||||
<label>QQ</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/jkx.png">
|
||||
<label>聚开心</label>
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
252
codes/agent/game-docker/api/source/login/login.php
Normal file
@@ -0,0 +1,252 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<script language="JavaScript" src="js/jquery-2.1.4.min.js"></script>
|
||||
<script language="JavaScript" src="js/common.js"></script>
|
||||
<title>授权登录</title>
|
||||
</head>
|
||||
|
||||
<?php
|
||||
require_once dirname(__FILE__) . '/common.php';
|
||||
|
||||
/// 获取参数(GET)。
|
||||
$app_id = isset($_GET['app_id']) ? $_GET['app_id'] : ''; /// appid
|
||||
$dev_key = isset($_GET['dev_key']) ? $_GET['dev_key'] : ''; /// 开发者key
|
||||
$market_key = isset($_GET['market_key']) ? $_GET['market_key'] : ''; /// 门店key
|
||||
$login_type = isset($_GET['login_type']) ? $_GET['login_type'] : ''; /// 登陆方式
|
||||
$redirect_uri = isset($_GET['redirect_uri']) ? $_GET['redirect_uri'] : ''; /// 回调页面地址
|
||||
$error_uri = isset($_GET['error_uri']) ? $_GET['error_uri'] : ''; /// 错误页面地址
|
||||
$silence = isset($_GET['silence']) ? $_GET['silence'] : null; /// 是否静默方式登录
|
||||
$scode = isset($_GET['scode']) ? $_GET['scode'] : md5(date('Ymdhis') . rand(1000, 9999)); /// 随机数
|
||||
$forms = '';
|
||||
|
||||
/// 其他的参数
|
||||
$attach_array = GetAttachParameters(array('app_id','dev_key','market_key','login_type','redirect_uri','error_uri',), $_GET);
|
||||
|
||||
$attach_param = ''; /// 链接用的附加参数
|
||||
$attach_items = ''; /// 创建表单用的附加参数
|
||||
foreach ($attach_array as $key => $value)
|
||||
{
|
||||
$attach_param .= "&{$key}={$value}";
|
||||
$attach_items .= " <input name=\"{$key}\" type=\"text\" value=\"{$value}\" />" . PHP_EOL;
|
||||
}
|
||||
|
||||
if (empty($redirect_uri))
|
||||
$redirect_uri = rawurlencode(getLocaleUrl());
|
||||
|
||||
if (empty($error_uri))
|
||||
$error_uri = rawurlencode(dirname(getLocaleUrl()) . '/error.php');
|
||||
|
||||
$data = array(
|
||||
'market_key' => $market_key,
|
||||
'logintype' => $login_type,
|
||||
);
|
||||
if (!is_null($silence))
|
||||
$data['silence'] = $silence;
|
||||
|
||||
$api_url = getFullUrl('/api/login/querylist');
|
||||
$response = SendPost($api_url, $data);
|
||||
|
||||
// 如果API调用失败,直接从数据库查询登录方式
|
||||
if (empty($response)) {
|
||||
error_log("Login API Error: Empty response from $api_url, using database fallback");
|
||||
|
||||
try {
|
||||
// 直接连接数据库获取登录方式(从环境变量读取)
|
||||
require_once dirname(dirname(dirname(__DIR__))) . '/env_config.php';
|
||||
$dsn = "mysql:host=" . env('API_DB_HOST', 'rm-bp1btyuwq77591x0jpo.mysql.rds.aliyuncs.com') . ":" . env('API_DB_PORT', '3306') . ";dbname=" . env('API_DB_NAME', 'youlehudong') . ";";
|
||||
$username = env('API_DB_USER', 'games');
|
||||
$passwd = env('API_DB_PASSWORD', 'Games0791!!');
|
||||
$pdo = new PDO($dsn, $username, $passwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
|
||||
|
||||
if (empty($market_key)) {
|
||||
$condition = 'is_enabled = 1 and is_silence = ' . intval(empty($silence) ? 0 : $silence);
|
||||
if (!empty($login_type))
|
||||
$condition .= sprintf(' and type_id = %d', intval($login_type));
|
||||
|
||||
$stmt = $pdo->prepare("SELECT type_id,type_key,type_name,image,url,component,is_third,third_flag FROM syweb_logintype_base WHERE $condition");
|
||||
$stmt->execute();
|
||||
} else {
|
||||
$condition = 'a.type_key = b.type_key and a.is_enabled = 1 and b.is_enabled = 1 and market_key = ? and a.is_silence = ' . intval(empty($silence) ? 0 : $silence);
|
||||
if (!empty($login_type))
|
||||
$condition .= sprintf(' and a.type_id = %d', intval($login_type));
|
||||
|
||||
$stmt = $pdo->prepare("SELECT a.type_id,a.type_key,a.type_name,a.image,a.url,a.component,a.is_third,a.third_flag FROM syweb_logintype_base a, syweb_logintype_market b WHERE $condition");
|
||||
$stmt->execute(array($market_key));
|
||||
}
|
||||
|
||||
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 处理URL为完整路径
|
||||
foreach ($data as $key => &$value) {
|
||||
$value['url'] = getFullUrl($value['url']);
|
||||
}
|
||||
|
||||
$response = rawurlencode(json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("Database fallback error: " . $e->getMessage());
|
||||
|
||||
// 最后的备用方案:返回默认微信登录配置
|
||||
$default_login_types = array(
|
||||
array(
|
||||
'type_id' => 2,
|
||||
'type_key' => '0002',
|
||||
'type_name' => '微信登录',
|
||||
'image' => 'img/wx.png',
|
||||
'url' => getFullUrl('api/login/weixin'),
|
||||
'component' => null,
|
||||
'is_third' => 1,
|
||||
'third_flag' => 'weixin'
|
||||
)
|
||||
);
|
||||
|
||||
$response = rawurlencode(json_encode($default_login_types, JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
|
||||
$result = json_decode(rawurldecode($response));
|
||||
if (empty($result)) /// 为空表示没有获取到任何登录方式
|
||||
{
|
||||
$html = <<<EOL
|
||||
<script>
|
||||
alert('找不到支援的任何登录方式, 请联系相关管理员!');
|
||||
</script>
|
||||
|
||||
EOL;
|
||||
}
|
||||
else /// 正常
|
||||
{
|
||||
$third_array = array(); /// 三方认证方式(不需要输入账号密码的方式)
|
||||
$owner_array = array(); /// 本地认证方式(需要输入账号密码的方式)
|
||||
|
||||
foreach ($result as $item)
|
||||
{
|
||||
$item = (array)$item;
|
||||
if (0 != $item['is_third']) /// 三方认证方式
|
||||
array_push($third_array, $item);
|
||||
else /// 本地认证方式
|
||||
array_push($owner_array, $item);
|
||||
}
|
||||
|
||||
$third_count = count($third_array);
|
||||
$owner_count = count($owner_array);
|
||||
|
||||
$third_html = '';
|
||||
$owner_html = '';
|
||||
|
||||
$splitter = '';
|
||||
$forms = '';
|
||||
|
||||
if (0 == $owner_count && 1 == $third_count) /// 只存在一种三方的校验方式则直接跳转到目标连接
|
||||
{
|
||||
$url = $third_array[0]['url'] . "?appid={$app_id}&devkey={$dev_key}&scode={$scode}&market_key={$market_key}&target={$redirect_uri}&fail_target={$error_uri}{$attach_param}";
|
||||
header("Location: {$url}");
|
||||
exit;
|
||||
}
|
||||
|
||||
/// 如果两种方式都有,则需要分隔元素。
|
||||
if (0 != $owner_count && 0 != $third_count)
|
||||
$splitter = <<<EOL
|
||||
<div class="sigma-content">
|
||||
<div class="sigma-middle-line">
|
||||
<span class="sigma-line-text">更多登录方式</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
EOL;
|
||||
|
||||
|
||||
if (0 != $owner_count) /// 如果本地验证方式不为空则需要用于输入账号密码的表单元素。
|
||||
{
|
||||
$owner_html = ' <div class="fangshi" id="owner">' . PHP_EOL;
|
||||
$forms = '';
|
||||
$index = 0;
|
||||
foreach ($owner_array as $owner)
|
||||
{
|
||||
$index++;
|
||||
|
||||
/// 用来提交数据的表单
|
||||
$forms .= <<<EOL
|
||||
<form style="display:none;" id="frm{$index}" name="frm{$index}" method="post" action="{$owner['url']}">
|
||||
<input name="appid" type="text" value="{$app_id}" />
|
||||
<input name="devkey" type="text" value="{$dev_key}" />
|
||||
<input name="scode" type="text" value="{$scode}" />
|
||||
<input name="market_key" type="text" value="{$market_key}" />
|
||||
<input name="target" type="text" value="{$redirect_uri}" />
|
||||
<input name="fail_target" type="text" value="{$error_uri}" />
|
||||
{$attach_items}
|
||||
</form>
|
||||
|
||||
EOL;
|
||||
|
||||
/// 用来显示的页面元素
|
||||
$owner_html .= <<<EOL
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/zh.png"></span>
|
||||
<input type="text" placeholder="账号|手机号|邮箱" autofocus>
|
||||
</p>
|
||||
<p class="s_row" style="margin-bottom: 30px;">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="请输入密码">
|
||||
</p>
|
||||
<div class="dr_btn">
|
||||
<button onclick="frm_submit(frm{$index})" class="btn btn-danger">登录</button>
|
||||
</div>
|
||||
<div class="wj_row">
|
||||
<a href="password.php" class="wjmm">忘记密码?</a>
|
||||
<a href="password_detail.php" class="zczh">没有帐号?立即注册>>></a>
|
||||
</div>
|
||||
|
||||
EOL;
|
||||
}
|
||||
|
||||
$owner_html .= ' </div>' . PHP_EOL;
|
||||
}
|
||||
|
||||
|
||||
if (0 != $third_count)
|
||||
{
|
||||
$third_html = ' <div class="fangshi" id="third">' . PHP_EOL;
|
||||
$index = 0;
|
||||
foreach ($third_array as $third)
|
||||
{
|
||||
$index++;
|
||||
$url = $third['url'] . "?appid={$app_id}&devkey={$dev_key}&scode={$scode}&market_key={$market_key}&target={$redirect_uri}&fail_target={$error_uri}{$attach_param}";
|
||||
|
||||
$third_html .= <<<EOL
|
||||
<a class="box" href="{$url}">
|
||||
<img src="{$third['image']}">
|
||||
<label>{$third['type_name']}</label>
|
||||
</a>
|
||||
|
||||
EOL;
|
||||
}
|
||||
}
|
||||
|
||||
$html = $owner_html . $splitter . $third_html;
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
<script>
|
||||
function frm_submit(form) {
|
||||
return form.submit();
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<body class="body_bg">
|
||||
<?php echo $forms; ?>
|
||||
<header class="yl_logo">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<?php echo $html; ?>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
187
codes/agent/game-docker/api/source/login/login_tj.php
Normal file
@@ -0,0 +1,187 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<script language="JavaScript" src="js/jquery-2.1.4.min.js"></script>
|
||||
<script language="JavaScript" src="js/common.js"></script>
|
||||
<title>授权登录</title>
|
||||
</head>
|
||||
|
||||
<?php
|
||||
require_once dirname(__FILE__) . '/common.php';
|
||||
|
||||
/// 获取参数(GET)。
|
||||
$app_id = isset($_GET['app_id']) ? $_GET['app_id'] : ''; /// appid
|
||||
$dev_key = isset($_GET['dev_key']) ? $_GET['dev_key'] : ''; /// 开发者key
|
||||
$market_key = isset($_GET['market_key']) ? $_GET['market_key'] : ''; /// 门店key
|
||||
$login_type = isset($_GET['login_type']) ? $_GET['login_type'] : ''; /// 登陆方式
|
||||
$redirect_uri = isset($_GET['redirect_uri']) ? $_GET['redirect_uri'] : ''; /// 回调页面地址
|
||||
$error_uri = isset($_GET['error_uri']) ? $_GET['error_uri'] : ''; /// 错误页面地址
|
||||
$scode = isset($_GET['scode']) ? $_GET['scode'] : md5(date('Ymdhis') . rand(1000, 9999)); /// 随机数
|
||||
$forms = '';
|
||||
|
||||
/// 其他的参数
|
||||
$attach_array = GetAttachParameters(array('app_id','dev_key','market_key','login_type','redirect_uri','error_uri',), $_GET);
|
||||
|
||||
$attach_param = ''; /// 链接用的附加参数
|
||||
$attach_items = ''; /// 创建表单用的附加参数
|
||||
foreach ($attach_array as $key => $value)
|
||||
{
|
||||
$attach_param .= "&{$key}={$value}";
|
||||
$attach_items .= " <input name=\"{$key}\" type=\"text\" value=\"{$value}\" />" . PHP_EOL;
|
||||
}
|
||||
|
||||
if (empty($redirect_uri))
|
||||
$redirect_uri = rawurlencode(getLocaleUrl());
|
||||
|
||||
if (empty($error_uri))
|
||||
$error_uri = rawurlencode(dirname(getLocaleUrl()) . '/error.php');
|
||||
|
||||
$data = array(
|
||||
'market_key' => $market_key,
|
||||
'logintype' => $login_type,
|
||||
);
|
||||
$result = json_decode(rawurldecode(SendPost(SITE_API2_DOMAIN . '/api/login/querylist', $data)));
|
||||
if (empty($result)) /// 为空表示没有获取到任何登录方式
|
||||
{
|
||||
$html = <<<EOL
|
||||
<script>
|
||||
alert('找不到支援的任何登录方式, 请联系相关管理员!');
|
||||
</script>
|
||||
|
||||
EOL;
|
||||
}
|
||||
else /// 正常
|
||||
{
|
||||
$third_array = array(); /// 三方认证方式(不需要输入账号密码的方式)
|
||||
$owner_array = array(); /// 本地认证方式(需要输入账号密码的方式)
|
||||
|
||||
foreach ($result as $item)
|
||||
{
|
||||
$item = (array)$item;
|
||||
if (0 != $item['is_third']) /// 三方认证方式
|
||||
array_push($third_array, $item);
|
||||
else /// 本地认证方式
|
||||
array_push($owner_array, $item);
|
||||
}
|
||||
|
||||
$third_count = count($third_array);
|
||||
$owner_count = count($owner_array);
|
||||
|
||||
$third_html = '';
|
||||
$owner_html = '';
|
||||
|
||||
$splitter = '';
|
||||
$forms = '';
|
||||
|
||||
if (0 == $owner_count && 1 == $third_count) /// 只存在一种三方的校验方式则直接跳转到目标连接
|
||||
{
|
||||
$url = $third_array[0]['url'] . "?appid={$app_id}&devkey={$dev_key}&scode={$scode}&market_key={$market_key}&target={$redirect_uri}&fail_target={$error_uri}{$attach_param}";
|
||||
header("Location: {$url}");
|
||||
exit;
|
||||
}
|
||||
|
||||
/// 如果两种方式都有,则需要分隔元素。
|
||||
if (0 != $owner_count && 0 != $third_count)
|
||||
$splitter = <<<EOL
|
||||
<div class="sigma-content">
|
||||
<div class="sigma-middle-line">
|
||||
<span class="sigma-line-text">更多登录方式</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
EOL;
|
||||
|
||||
|
||||
if (0 != $owner_count) /// 如果本地验证方式不为空则需要用于输入账号密码的表单元素。
|
||||
{
|
||||
$owner_html = ' <div class="fangshi" id="owner">' . PHP_EOL;
|
||||
$forms = '';
|
||||
$index = 0;
|
||||
foreach ($owner_array as $owner)
|
||||
{
|
||||
$index++;
|
||||
|
||||
/// 用来提交数据的表单
|
||||
$forms .= <<<EOL
|
||||
<form style="display:none;" id="frm{$index}" name="frm{$index}" method="post" action="{$owner['url']}">
|
||||
<input name="appid" type="text" value="{$app_id}" />
|
||||
<input name="devkey" type="text" value="{$dev_key}" />
|
||||
<!--<input name="sscode" type="text" value="{$scode}" />-->
|
||||
<input name="market_key" type="text" value="{$market_key}" />
|
||||
<input name="target" type="text" value="{$redirect_uri}" />
|
||||
<input name="fail_target" type="text" value="{$error_uri}" />
|
||||
{$attach_items}
|
||||
</form>
|
||||
|
||||
EOL;
|
||||
|
||||
/// 用来显示的页面元素
|
||||
$owner_html .= <<<EOL
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/zh.png"></span>
|
||||
<input type="text" placeholder="账号|手机号|邮箱" autofocus>
|
||||
</p>
|
||||
<p class="s_row" style="margin-bottom: 30px;">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="请输入密码">
|
||||
</p>
|
||||
<div class="dr_btn">
|
||||
<button onclick="frm_submit(frm{$index})" class="btn btn-danger">登录</button>
|
||||
</div>
|
||||
<div class="wj_row">
|
||||
<a href="password.php" class="wjmm">忘记密码?</a>
|
||||
<a href="password_detail.php" class="zczh">没有帐号?立即注册>>></a>
|
||||
</div>
|
||||
|
||||
EOL;
|
||||
}
|
||||
|
||||
$owner_html .= ' </div>' . PHP_EOL;
|
||||
}
|
||||
|
||||
|
||||
if (0 != $third_count)
|
||||
{
|
||||
$third_html = ' <div class="fangshi" id="third">' . PHP_EOL;
|
||||
$index = 0;
|
||||
foreach ($third_array as $third)
|
||||
{
|
||||
$index++;
|
||||
$url = $third['url'] . "?appid={$app_id}&devkey={$dev_key}&scode={$scode}&market_key={$market_key}&target={$redirect_uri}&fail_target={$error_uri}{$attach_param}";
|
||||
|
||||
$third_html .= <<<EOL
|
||||
<a class="box" href="{$url}">
|
||||
<img src="{$third['image']}">
|
||||
<label>{$third['type_name']}</label>
|
||||
</a>
|
||||
|
||||
EOL;
|
||||
}
|
||||
}
|
||||
|
||||
$html = $owner_html . $splitter . $third_html;
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
<script>
|
||||
function frm_submit(form) {
|
||||
return form.submit();
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<body class="body_bg">
|
||||
<?php echo $forms; ?>
|
||||
<header class="yl_logo">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<?php echo $html; ?>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
24
codes/agent/game-docker/api/source/login/password.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<title>密码找回</title>
|
||||
</head>
|
||||
<body class="body_bg">
|
||||
<header class="yl_logo">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<p class="hui">忘记了密码?我们会把重设的密码以短信的形式下发到您绑定的手机!</p>
|
||||
|
||||
<div class="dr_btn">
|
||||
<a href="password_detail.html" class="btn btn-info">发送密码找回短信</a>
|
||||
<a href="login.html" class="btn btn-default">返回</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
24
codes/agent/game-docker/api/source/login/password.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<title>密码找回</title>
|
||||
</head>
|
||||
<body class="body_bg">
|
||||
<header class="yl_logo">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<p class="hui">忘记了密码?我们会把重设的密码以短信的形式下发到您绑定的手机!</p>
|
||||
|
||||
<div class="dr_btn">
|
||||
<a href="password_detail.html" class="btn btn-info">发送密码找回短信</a>
|
||||
<a href="login.html" class="btn btn-default">返回</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,71 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<title>密码找回</title>
|
||||
</head>
|
||||
<body class="body_bg">
|
||||
<header class="yl_logo" style="padding-bottom: 10%;">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<a href="login.html" class="pull-right" style="margin-right: 7%;color: #42b8f2;">已有账号?点此登录>>></a>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/zh.png"></span>
|
||||
<input type="text" placeholder="请输入账号" autofocus >
|
||||
</p>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="请输入密码">
|
||||
</p>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="再输入一次密码">
|
||||
</p>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/sj.png"></span>
|
||||
<input type="text" placeholder="请输入手机号">
|
||||
</p>
|
||||
<p class="s_row huoqu_duanxin">
|
||||
<input type="text" placeholder="请输入短信验证码" class="duanxin">
|
||||
<a class="btn btn-default huoqu">获取</a>
|
||||
</p>
|
||||
<p class="s_row w_tongy">
|
||||
<input type="checkbox"><label class="xieyi">同意<a href="javascript:;" class="red">用户协议</a></label>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<div class="sigma-content">
|
||||
<div class="sigma-middle-line">
|
||||
<span class="sigma-line-text">更多登录方式</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fangshi">
|
||||
<div class="box">
|
||||
<img src="img/wx.png">
|
||||
<label>微信</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/zfb.png">
|
||||
<label>支付宝</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/QQ.png">
|
||||
<label>QQ</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/jkx.png">
|
||||
<label>聚开心</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
71
codes/agent/game-docker/api/source/login/password_detail.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<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">
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<title>密码找回</title>
|
||||
</head>
|
||||
<body class="body_bg">
|
||||
<header class="yl_logo" style="padding-bottom: 10%;">
|
||||
<img src="img/yl.png" class="img-responsive">
|
||||
</header>
|
||||
<div class="container-fluid">
|
||||
<a href="login.html" class="pull-right" style="margin-right: 7%;color: #42b8f2;">已有账号?点此登录>>></a>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/zh.png"></span>
|
||||
<input type="text" placeholder="请输入账号" autofocus >
|
||||
</p>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="请输入密码">
|
||||
</p>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/mm.png"></span>
|
||||
<input type="text" placeholder="再输入一次密码">
|
||||
</p>
|
||||
<p class="s_row">
|
||||
<span class="img_tb"><img src="img/sj.png"></span>
|
||||
<input type="text" placeholder="请输入手机号">
|
||||
</p>
|
||||
<p class="s_row huoqu_duanxin">
|
||||
<input type="text" placeholder="请输入短信验证码" class="duanxin">
|
||||
<a class="btn btn-default huoqu">获取</a>
|
||||
</p>
|
||||
<p class="s_row w_tongy">
|
||||
<input type="checkbox"><label class="xieyi">同意<a href="javascript:;" class="red">用户协议</a></label>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<div class="sigma-content">
|
||||
<div class="sigma-middle-line">
|
||||
<span class="sigma-line-text">更多登录方式</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fangshi">
|
||||
<div class="box">
|
||||
<img src="img/wx.png">
|
||||
<label>微信</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/zfb.png">
|
||||
<label>支付宝</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/QQ.png">
|
||||
<label>QQ</label>
|
||||
</div>
|
||||
<div class="box">
|
||||
<img src="img/jkx.png">
|
||||
<label>聚开心</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
18
codes/agent/game-docker/api/source/login/readme.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
页面地址:
|
||||
https://api.daoqijuyou77.cn/source/login/login.php
|
||||
主要功能:
|
||||
实现无关业务的支付调用
|
||||
调用方式:
|
||||
get/post
|
||||
|
||||
所需参数:
|
||||
app_id: appid
|
||||
dev_key: 开发者key
|
||||
market_key: 门店key
|
||||
login_type: 登陆方式
|
||||
redirect_uri: 回调页面地址
|
||||
error_uri: 错误页面地址
|
||||
用户其他参数
|
||||
|
||||
调用示例:
|
||||
https://api.daoqijuyou77.cn/source/login/login.php?app_id=14936872341446&dev_key=14915485974028&market_key=test&redirect_uri=https://www.baidu.com
|
||||