增加docke部署

This commit is contained in:
2026-04-10 16:44:13 +08:00
parent e2f8054794
commit cd4ddb606d
5076 changed files with 701092 additions and 0 deletions

View File

@@ -0,0 +1 @@
2020050900000068ilcy21b7rvr12oaqkuwmt1r2b3zbw490lrnn4066hq98pjos

View File

@@ -0,0 +1,78 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2016-08-08
* Time: 9:29
*/
require_once __DIR__ . '/common/common.inc.php';
/// html header.
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, PATCH, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization, Content-Length, X-Requested-With");
header("Access-Control-Allow-Credentials: true");
header("Content-Type: text/html; charset=utf-8");
///
///date_default_timezone_set('PRC');
date_default_timezone_set('Asia/Shanghai');
/// 请求参数
/// app_id: 【未使用】appid
/// developer_id: 【未使用】开发者身份信息
/// method: 【必须】模块名(包.类.方法)
/// format: 【必须】格式json
/// charset: 【必须】编码utf-8
/// timestamp: 【必须】调用方的时间戳
/// version: 【必须】模块对应的版本
/// notify_url: 【可选】回调地址(如需要,接口会通过指定的该地址通知调用方)
/// user_auth_token: 【非必须】用户授权信息,操作员/用户身份信息(除部分指定接口外、每次接口调用前都会校验该参数)
/// app_auth_token: 【未使用】应用授权信息
/// biz_content: 【必须】包体,模块对应需要的参数。
/// random_string: 【可选】随机字符串
/// tag: 【可选】附带参数,服务器不处理,只返回
/// signature: 【未校验】包体的签名值
/// https://localhost?method=test.test.test_1&format=json&charset=utf-8&timestamp=1&version=1.0&biz_content={"a":"a","b":"b"}&user_auth_token=xxxxxxxx&tag=tag&random_string=xxxxxx
/// 响应参数
/// retcode: 【必须】返回值0为成功非0失败
/// retinfo: 【必须】返回信息当接口执行错误时即retcode为非0时由该域返回详细的错误信息。
/// user_auth_token: 【必须】用户授权信息(自用),操作员/用户身份信息(当接口被成功调用则会返回一个新的授权码用于下次调用。)
/// app_auth_token: 【必须】应用授权信息(自用)
/// biz_content: 【必须】接口返回信息当接口执行成功时即retcode为0时由该域返回详细数据。
/// tag: 【可选】附带参数,服务器不处理,只返回
/// signature: 【必须】包体的签名值
$app = new OpenAPITrunk(); /// 创建对象
if (ERRORCODE_SUCCESS == $app->GetErrorCode()) /// errorcode不等于errorcode_success表示创建对象过程中出错连接redis出错
{
$return = $app->DispatchProcedure($_REQUEST);
if (null == $return->biz_content)
$return->biz_content = (object)null;
$app = null;
if (DEBUG_MODE)
{
OutputDebugMessage('request ==> ' . ObjectToLinkString($_REQUEST) . PHP_EOL . 'return ==> ' . JsonObjectToJsonString($return));
die(JsonObjectToJsonString($return));
}
else
die(rawurlencode(JsonObjectToJsonString($return)));
}
else
{
$return = new ReturnParameter(array('retcode' => $app->GetErrorCode(), 'retinfo' => $app->GetErrorInfo()));
$return->RefreshSignature(SIGN_KEY);
OutputDebugMessage('request ==> ' . ObjectToLinkString($_REQUEST) . PHP_EOL . 'return ==> ' . JsonObjectToJsonString($return));
if (DEBUG_MODE)
die(JsonObjectToJsonString($return));
else
die(rawurlencode(JsonObjectToJsonString($return)));
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,139 @@
<?php
define('DEFAULTHOSTNAME_ORACLE', 'localhost');
define('DEFAULTHOSTNAME_SQLSRV', 'localhost');
define('DEFAULTHOSTNAME_MYSQL', 'localhost');
define('DEFAULTHOSTPORT_ORACLE', '1521');
define('DEFAULTHOSTPORT_SQLSRV', '1433');
define('DEFAULTHOSTPORT_MYSQL', '3306');
define('DEFAULTDATABASE_ORACLE', 'orcl');
define('DEFAULTDATABASE_SQLSRV', 'master');
define('DEFAULTDATABASE_MYSQL', 'mysql');
define('DEFAULTUSERNAME_ORACLE', 'system');
define('DEFAULTUSERNAME_SQLSRV', 'sa');
define('DEFAULTUSERNAME_MYSQL', 'root');
define('DEFAULTPASSWORD_ORACLE', '');
define('DEFAULTPASSWORD_SQLSRV', '');
define('DEFAULTPASSWORD_MYSQL', '');
define('DEFAULTCHARSET_MYSQL', 'utf8');
define('DEFAULTPERSISTENT_ORACLE', false);
define('DEFAULTPERSISTENT_SQLSRV', false);
define('DEFAULTPERSISTENT_MYSQL', false);
define('PARAMETERNAME_HOSTNAME', 'host');
define('PARAMETERNAME_HOSTPORT', 'port');
define('PARAMETERNAME_DATABASE', 'database');
///define('PARAMETERNAME_SERVICE', 'service');
define('PARAMETERNAME_USERNAME', 'username');
define('PARAMETERNAME_PASSWORD', 'password');
define('PARAMETERNAME_CHARSET', 'charset');
define('PARAMETERNAME_PERSISTENT', 'persistent');
define('DATABASE_TYPE_NONE', 'NONE'); /// 无数据库
define('DATABASE_TYPE_ORACLE', 'ORACLE'); /// oracle
define('DATABASE_TYPE_SQLSRV', 'SQLSRV'); /// ms sql server
define('DATABASE_TYPE_MYSQL', 'MYSQL'); /// my sql
define('TYPENAME_STRING', 'string'); /// 字符串类型
define('TYPENAME_NUMBER', 'number'); /// 数值类型
define('TYPENAME_BOOL', 'bool'); //
define('TYPENAME_DATE', 'date'); /// 日期类型
define('TYPENAME_TIMESTAMP', 'timestamp'); /// 时间戳类型
define('TYPENAME_LOB', 'lob'); /// 大数据类型
define('TYPENAME_RAW', 'raw'); /// 源数据类型
/// 执行类型select、insert、update、delete、truncate、merge
define('COMMANDTYPE_SELECT', 'select');
define('COMMANDTYPE_INSERT', 'insert');
define('COMMANDTYPE_UPDATE', 'update');
define('COMMANDTYPE_DELETE', 'delete');
define('COMMANDTYPE_TRUNC', 'trunc');
define('COMMANDTYPE_MERGE', 'merge');
define('COMMANDTYPE_CALLSTOREDPROCEDURE', 'call');
/// 连接方式
define('JOINTYPE_INNER', 'inner join');
define('JOINTYPE_LEFT', 'left outer join');
define('JOINTYPE_RIGHT', 'right outer join');
define('JOINTYPE_OUTER', 'full outer join');
define('USEDCHARSET', 'utf-8'); /// current used charset.
///=====================================================================================================================
define('ERRORCODE_SUCCESS', 0); /// 成功
define('ERRORCODE_UNKNOWN', -1); /// 未知错误
define('ERRORCODE_NOIMPLEMENT', 0x0001); /// 方法没有被实现
define('ERRORCODE_DISABLED', 0x0002); /// 方法被停用
define('ERRORCODE_NOTINITIALIZED', 0x0003); /// 尚未初始化
define('ERRORCODE_NOPARAMETER', 0x0004); /// 无参数
define('ERRORCODE_NOCONNECTED', 0x0005); /// 未连接到数据库
define('ERRORCODE_NOCOMMANDED', 0x0006); /// 无命令
define('ERRORCODE_CANCELLED', 0x0007); /// 无命令无执行命令的command对象
define('ERRORCODE_INVALIDPARAMETER', 0x0101); /// 无效的参数
define('ERRORCODE_FILENOTFOUND', 0x0102); /// 找不到指定文件
define('ERRORCODE_FIELDNOTFOUND', 0x0103); /// 找不到域或字段
define('ERRORCODE_METHODNOTFOUND', 0x0104); /// 找不到接口(模块)
define('ERRORCODE_PARAMETERNOTFOUND', 0x0105); /// 找不到参数
define('ERRORCODE_BADPARAMETER', 0x0106); /// 错误的参数(不支持的参数)
define('ERRORCODE_INVALIDJSONDATA', 0x0107); /// 无效的json数据
define('ERRORCODE_INVALIDXMLDATA', 0x0108); /// 无效的xml数据
define('ERRORCODE_SERVERNOTALLOWED', 0x0109); /// 服务器未开放
define('ERRORCODE_INVALIDAPPINFO', 0x010a); /// 无效的app授权token
define('ERRORCODE_INVALIDUSERINFO', 0x010b); /// 无效的user授权token
define('ERRORCODE_NOPERMISSION_DEVELOPER', 0x010c); /// 无权限(开发者)
define('ERRORCODE_NOPERMISSION_USER', 0x010d); /// 无权限(用户)
define('ERRORCODE_INVALIDADDRESS', 0x010e); /// 两次请求地址不一致
define('ERRORCODE_SERVERTOBUSY', 0x010f); /// 小于允许的接口调用时间间隔
define('ERRORCODE_INVALIDREQUESTMETHOD', 0x0110); /// 错误的请求类型
define('ERRORCODE_INVALIDHTTPREQUEST', 0x0111); /// 发送http请求出错
define('ERRORCODE_SERVERTURNOFF', 0x0112); /// 服务器定时关闭
define('ERRORCODE_INVALIDSIGNATURE', 0x01ff); /// 签名错误
define('ERRORCODE_CUSTOMFIRST', 0x1000); /// 预计第一个自定义错误代码
define('ERRORCODE_CUSTOMLAST', 0xffff); /// 预计最后一个自定义错误代码
define('ERRORINFO_SUCCESS', 'success!'); /// 成功
define('ERRORINFO_UNKNOWN', 'unknown error!'); /// 未知错误
define('ERRORINFO_NOIMPLEMENT', 'not implement!'); /// 方法没有被实现
define('ERRORINFO_DISABLED', 'the function was disabled!'); /// 方法被停用
define('ERRORINFO_NOTINITIALIZED', 'not yet initialized!'); /// 尚未初始化
define('ERRORINFO_NOPARAMETER', 'no parameter!'); /// 无参数
define('ERRORINFO_NOCONNECTED', 'no connected!'); /// 未连接到数据库
define('ERRORINFO_NOCOMMANDED', 'no commanded!'); /// 无命令无执行命令的command对象
define('ERRORINFO_CANCELLED', 'the operation was cancelled by the user!'); /// 已取消
define('ERRORINFO_INVALIDPARAMETER', 'the parameter %s is invalid!'); /// 无效的参数
define('ERRORINFO_FILENOTFOUND', 'unable to find file "%s"!'); /// 找不到指定文件
define('ERRORINFO_FIELDNOTFOUND', 'unable to find field %s!'); /// 找不到域或字段
define('ERRORINFO_METHODNOTFOUND', 'unable to find method %s(version %s)!'); /// 找不到接口(模块)
define('ERRORINFO_PARAMETERNOTFOUND', 'unable to find parameter %s!'); /// 找不到参数
define('ERRORINFO_BADPARAMETER', 'the parameter %s(value %s) was not support!'); /// 错误的参数(不支持的参数)
define('ERRORINFO_INVALIDJSONDATA', 'invalid json data(%s)!'); /// 无效的json数据
define('ERRORINFO_INVALIDXMLDATA', 'invalid xml data(%s)!'); /// 无效的xml数据
define('ERRORINFO_SERVERNOTALLOWED', 'the server is not allowed to access now! please contact the system administrator!'); /// 服务器未开放
define('ERRORINFO_INVALIDAPPINFO', 'invalid application token!'); /// 无效的应用授权token
define('ERRORINFO_INVALIDUSERINFO', 'invalid user token!'); /// 无效的用户授权token
define('ERRORINFO_NOPERMISSION_DEVELOPER', 'you don\'t have permission to call this method!'); /// 无权限
define('ERRORINFO_NOPERMISSION_USER', 'you don\'t have permission to call this method!'); /// 无权限
define('ERRORINFO_INVALIDADDRESS', 'the requested address is not allowed! in order to continue working with the application you have to re-logon.'); /// 两次请求地址不一致
define('ERRORINFO_SERVERTOBUSY', 'the server is too busy, please try again later!'); /// 小于允许的接口调用时间间隔
define('ERRORINFO_INVALIDREQUESTMETHOD', 'unsupported request method!'); /// 错误的请求类型
define('ERRORINFO_INVALIDHTTPREQUEST', 'invalid http request!'); /// 发送http请求出错
//define('ERRORINFO_SERVERTURNOFF', 'the server was turn off now! please wait a few minute or contact the system administrator!'); /// 服务器定时关闭
define('ERRORINFO_SERVERTURNOFF', '当前服务器正在维护中(%s-%s维护完毕后可正常访问'); /// 服务器定时关闭
define('ERRORINFO_INVALIDSIGNATURE', 'invalid signature!'); /// 签名错误

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,293 @@
<?php
/**
* Created by PhpStorm.
* User: win7
* Date: 2016-08-11
* Time: 10:57
*/
require_once __DIR__ . '/CommonConstant.php';
define('ERRORCODE_BIGMARKET_FIRST', ERRORCODE_CUSTOMFIRST + 100); // 商城模块起始错误号
define('ERRORCODE_INPARAMERROR', ERRORCODE_BIGMARKET_FIRST + 1); // 参数无效
define('ERRORINFO_INPARAMERROR', '参数无效!'); // 参数无效
define('ERRORCODE_AGENTIDERROR', ERRORCODE_BIGMARKET_FIRST + 2); // 渠道商id错误
define('ERRORINFO_AGENTIDERROR', '渠道商id错误!'); // 参数无效
define('ERRORCODE_CHANNELIDERROR', ERRORCODE_BIGMARKET_FIRST + 3); // 渠道id错误
define('ERRORINFO_CHANNELIDERROR', '渠道id错误!'); // 渠道id错误
define('ERRORCODE_OPENIDERROR', ERRORCODE_BIGMARKET_FIRST + 4); // openid错误
define('ERRORINFO_OPENIDERROR', 'openid错误!'); // openid错误
define('ERRORCODE_UNIONIDERROR', ERRORCODE_BIGMARKET_FIRST + 5); // unionid错误
define('ERRORINFO_UNIONIDERROR', 'unionid错误!'); // unionid错误
define('ERRORCODE_NICKNAMEERROR', ERRORCODE_BIGMARKET_FIRST + 6); // 昵称错误
define('ERRORINFO_NICKNAMEERROR', '昵称错误!'); // 昵称错误
define('ERRORCODE_AVATARERROR', ERRORCODE_BIGMARKET_FIRST + 7); // 头像错误
define('ERRORINFO_AVATARERROR', '头像错误!'); // 头像错误
define('ERRORCODE_SEXERROR', ERRORCODE_BIGMARKET_FIRST + 8); // 性别错误
define('ERRORINFO_SEXERROR', '性别错误!'); // 性别错误
define('ERRORCODE_PROVINCEERROR', ERRORCODE_BIGMARKET_FIRST + 9); // 省份错误
define('ERRORINFO_PROVINCEERROR', '省份错误!'); // 省份错误
define('ERRORCODE_CITYERROR', ERRORCODE_BIGMARKET_FIRST + 10); // 城市错误
define('ERRORINFO_CITYERROR', '城市错误!'); // 城市错误
define('ERRORCODE_TYPEERROR', ERRORCODE_BIGMARKET_FIRST + 11); // 类型错误
define('ERRORINFO_TYPEERROR', '类型错误!'); // 类型错误
define('ERRORCODE_PRODUCTERROR', ERRORCODE_BIGMARKET_FIRST + 12); // 产品id错误
define('ERRORINFO_PRODUCTERROR', '产品id错误!'); // 产品id错误
define('ERRORCODE_ORDERTYPEERROR', ERRORCODE_BIGMARKET_FIRST + 13); // 订单类型无效
define('ERRORINFO_ORDERTYPEERROR', '订单类型无效!'); // 订单类型无效
define('ERRORCODE_PLAYERIDERROR', ERRORCODE_BIGMARKET_FIRST + 14); // 玩家id不能为空
define('ERRORINFO_PLAYERIDERROR', '玩家id不能为空!'); // 玩家id不能为空
define('ERRORCODE_TELERROR', ERRORCODE_BIGMARKET_FIRST + 15); // 请输入正确的联系方式
define('ERRORINFO_TELERROR', '请输入正确的联系方式!'); // 请输入正确的联系方式
define('ERRORCODE_WECHATERROR', ERRORCODE_BIGMARKET_FIRST + 16); // 微信号不能为空
define('ERRORINFO_WECHATERROR', '微信号不能为空!'); // 微信号不能为空
define('ERRORCODE_ORDERIDERROR', ERRORCODE_BIGMARKET_FIRST + 17); // 订单id错误
define('ERRORINFO_ORDERIDERROR', '订单id错误!'); // 订单id错误
define('ERRORCODE_TRADENOERROR', ERRORCODE_BIGMARKET_FIRST + 18); // tradeNo不能为空
define('ERRORINFO_TRADENOERROR', 'tradeNo不能为空!'); // 订单id错误
define('ERRORCODE_TRANSACTIONERROR', ERRORCODE_BIGMARKET_FIRST + 19); // transactionid不能为空
define('ERRORINFO_TRANSACTIONERROR', 'transactionid不能为空!'); // 订单id错误
define('ERRORCODE_SIGNKEYERROR', ERRORCODE_BIGMARKET_FIRST + 20); // 签名不能为空
define('ERRORINFO_SIGNKEYERROR', '签名不能为空!'); // 签名不能为空
define('ERRORCODE_MONEYERROR', ERRORCODE_BIGMARKET_FIRST + 21); // 金额不能为空
define('ERRORINFO_MONEYERROR', '金额不能为空!'); // 金额不能为空
define('ERRORCODE_PARENTIDERROR', ERRORCODE_BIGMARKET_FIRST + 22); // 父id不能为空
define('ERRORINFO_PARENTIDERROR', '父id不能为空!'); // 父id不能为空
define('ERRORCODE_ORDERCODEERROR', ERRORCODE_BIGMARKET_FIRST + 23); // 订单code不能为空
define('ERRORINFO_ORDERCODEERROR', '订单code不能为空!'); // 订单code不能为空
define('ERRORCODE_SIDERROR', ERRORCODE_BIGMARKET_FIRST + 24); // sid不能为空
define('ERRORINFO_SIDERROR', 'sid不能为空!'); // sid不能为空
define('ERRORCODE_SCODEERROR', ERRORCODE_BIGMARKET_FIRST + 25); // scode不能为空
define('ERRORINFO_SCODEERROR', 'scode不能为空!'); // scode不能为空
define('ERRORCODE_APPIDERROR', ERRORCODE_BIGMARKET_FIRST + 26); // appid不能为空
define('ERRORINFO_APPIDERROR', 'appid不能为空!'); // appid不能为空
define('ERRORCODE_DEVKEYERROR', ERRORCODE_BIGMARKET_FIRST + 27); // devkey不能为空
define('ERRORINFO_DEVKEYERROR', 'devkey不能为空!'); // devkey不能为空
define('ERRORCODE_BEGINTIMEERROR', ERRORCODE_BIGMARKET_FIRST + 28); // 开始时间不能为空
define('ERRORINFO_BEGINTIMEERROR', '开始时间不能为空!'); // 开始时间不能为空
define('ERRORCODE_ENDTIMEERROR', ERRORCODE_BIGMARKET_FIRST + 29); // 结束时间不能为空
define('ERRORINFO_ENDTIMEERROR', '结束时间不能为空!'); // 结束时间不能为空
define('ERRORCODE_TIMEERROR', ERRORCODE_BIGMARKET_FIRST + 30); // 时间错误
define('ERRORINFO_TIMEERROR', '时间错误!'); // 时间错误
define('ERRORCODE_SALESIDERROR', ERRORCODE_BIGMARKET_FIRST + 31); // 个人账户id错误
define('ERRORINFO_SALESIDERROR', '个人账户id错误!'); // 销售id错误
define('ERRORCODE_AWARDIDERROR', ERRORCODE_BIGMARKET_FIRST + 32); // 奖励id错误
define('ERRORINFO_AWARDIDERROR', '奖励id错误!'); // 奖励id错误
define('ERRORCODE_NOTICEIDERROR', ERRORCODE_BIGMARKET_FIRST + 32); // 公告id错误
define('ERRORINFO_NOTICEIDERROR', '公告id错误!'); // 公告id错误
define('ERRORCODE_AMOUNTERROR', ERRORCODE_BIGMARKET_FIRST + 33); // 数量错误
define('ERRORINFO_AMOUNTERROR', '数量错误!'); // 数量错误
define('ERRORCODE_AGENTNOTEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 34); // 渠道商配置信息不存在
define('ERRORINFO_AGENTNOTEXISTERROR', '渠道商配置信息不存在!'); // 渠道商配置信息不存在
define('ERRORCODE_NODATAERROR', ERRORCODE_BIGMARKET_FIRST + 35); // 无数据
define('ERRORINFO_NODATAERROR', '无数据记录!'); // 无数据
define('ERRORCODE_ASKIDERROR', ERRORCODE_BIGMARKET_FIRST + 36); // 索要账户不能为空
define('ERRORINFO_ASKIDERROR', '索要账户不能为空!'); // 索要账户不能为空
define('ERRORCODE_DEALIDERROR', ERRORCODE_BIGMARKET_FIRST + 37); // 处理编号为空
define('ERRORINFO_DEALIDERROR', '处理编号为空!'); // 处理编号为空
define('ERRORCODE_DEALSTATESERROR', ERRORCODE_BIGMARKET_FIRST + 38); // 处理状态为空
define('ERRORINFO_DEALSTATESERROR', '处理状态为空!'); // 处理状态为空
define('ERRORCODE_ORDERNULLERROR', ERRORCODE_BIGMARKET_FIRST + 39); // 无订单记录
define('ERRORINFO_ORDERNULLERROR', '无订单记录!'); // 无订单记录
define('ERRORCODE_ORDERPAYEDERROR', ERRORCODE_BIGMARKET_FIRST + 40); // 订单已支付
define('ERRORINFO_ORDERPAYEDERROR', '该订单已支付或已退款!'); // 订单已支付
define('ERRORCODE_ORDERMONEYERROR', ERRORCODE_BIGMARKET_FIRST + 41); // 支付金额错误
define('ERRORINFO_ORDERMONEYERROR', '支付金额错误!'); // 支付金额错误
define('ERRORCODE_NOTSALESERROR', ERRORCODE_BIGMARKET_FIRST + 42); // 不是个人账户
define('ERRORINFO_NOTSALESERROR', '你还没有个人账户!'); // 不是个人账户
define('ERRORCODE_ROOMCARDENOUGHERROR', ERRORCODE_BIGMARKET_FIRST + 43); // 房卡数量不足
define('ERRORINFO_ROOMCARDENOUGHERROR', '数量不足!'); // 房卡数量不足
define('ERRORCODE_NOPOWERERROR', ERRORCODE_BIGMARKET_FIRST + 44); // 没有权限
define('ERRORINFO_NOPOWERERROR', '没有权限!'); // 没有权限
define('ERRORCODE_ONLYBINDSELFERROR', ERRORCODE_BIGMARKET_FIRST + 45); // 只能给绑定了自己邀请码的玩家充卡
define('ERRORINFO_ONLYBINDSELFERROR', '只能给绑定了自己邀请码的玩家赠卡'); // 只能给绑定了自己邀请码的玩家充卡
define('ERRORCODE_INVITECODEEXISTS', ERRORCODE_BIGMARKET_FIRST + 46);
define('ERRORINFO_INVITECODEEXISTS', '你已有账户,请直接登录后台');
define('ERRORCODE_INVITECODE_NOT_EXISTS', ERRORCODE_BIGMARKET_FIRST + 47);
define('ERRORINFO_INVITECODE_NOT_EXISTS', '用户不存在!');
define('ERRORCODE_GAMEIDERROR', ERRORCODE_BIGMARKET_FIRST + 48); // 游戏编号不能为空
define('ERRORINFO_GAMEIDERROR', '游戏编号不能为空!'); // 游戏编号不能为空
define('ERRORCODE_SALESCLOSEERROR', ERRORCODE_BIGMARKET_FIRST + 49); // 账户被封
define('ERRORINFO_SALESCLOSEERROR', '账号被封!'); // 账户被封
define('ERRORCODE_SALESNOTEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 50); // 不存在该账户
define('ERRORINFO_SALESNOTEXISTERROR', '不存在指定用户'); // 不存在该账户
define('ERRORCODE_PLAYERNOTEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 51); // 玩家不存在
define('ERRORINFO_PLAYERNOTEXISTERROR', '玩家信息不存在'); // 玩家不存在
define('ERRORCODE_PASSWORDERROR', ERRORCODE_BIGMARKET_FIRST + 52); // 密码错误
define('ERRORINFO_PASSWORDERROR', '密码错误!'); // 密码错误
define('ERRORCODE_INVALID_LOGIN_INFORMATION', ERRORCODE_BIGMARKET_FIRST + 53);
define('ERRORINFO_INVALID_LOGIN_INFORMATION', '账号或密码错误,请重新输入后再试!');
define('ERRORCODE_OLDPASSWORDERROR', ERRORCODE_BIGMARKET_FIRST + 54); // 旧密码错误
define('ERRORINFO_OLDPASSWORDERROR', '旧密码错误!'); // 旧密码错误
define('ERRORCODE_OLDEQUALNEWERROR', ERRORCODE_BIGMARKET_FIRST + 55); // 新密码不能与旧密码相同
define('ERRORINFO_OLDEQUALNEWERROR', '新密码不能与旧密码相同!'); // 新密码不能与旧密码相同
define('ERRORCODE_STARNOENOUGHERROR', ERRORCODE_BIGMARKET_FIRST + 56); // 星星数量不足
define('ERRORINFO_STARNOENOUGHERROR', '星星数量不足!'); // 星星数量不足
define('ERRORCODE_NOBINDERROR', ERRORCODE_BIGMARKET_FIRST + 57); // 玩家未绑定账户
define('ERRORINFO_NOBINDERROR', '玩家未绑定账户!'); // 玩家未绑定账户
define('ERRORCODE_PLAYER_NOT_EXISTS', ERRORCODE_BIGMARKET_FIRST + 58);
define('ERRORINFO_PLAYER_NOT_EXISTS', '找不到指定的玩家!');
define('ERRORCODE_CLUBENTEDEXISTS', ERRORCODE_BIGMARKET_FIRST + 59);
define('ERRORINFO_CLUBENTEDEXISTS', '已经参加了该俱乐部!');
define('ERRORCODE_POWERERROR', ERRORCODE_BIGMARKET_FIRST + 60);
define('ERRORINFO_POWERERROR', '权限信息不能为空!');
define('ERRORCODE_SHORTNUMNULLERROR', ERRORCODE_BIGMARKET_FIRST + 61);
define('ERRORINFO_SHORTNUMNULLERROR', '玩家短号不能为空!');
define('ERRORCODE_SHORTNUMERROR', ERRORCODE_BIGMARKET_FIRST + 62);
define('ERRORINFO_SHORTNUMERROR', '玩家短号超过范围!');
define('ERRORCODE_SHORTNUMUSEDERROR', ERRORCODE_BIGMARKET_FIRST + 63);
define('ERRORINFO_SHORTNUMUSEDERROR', '玩家短号已经被使用!');
define('ERRORCODE_ROOMNUMNULLERROR', ERRORCODE_BIGMARKET_FIRST + 64);
define('ERRORINFO_ROOMNUMNULLERROR', '玩家最大开房数为空!');
define('ERRORCODE_ROOMNUMERROR', ERRORCODE_BIGMARKET_FIRST + 65);
define('ERRORINFO_ROOMNUMERROR', '玩家最大开房数超过范围!');
define('ERRORCODE_SHORTDESERROR', ERRORCODE_BIGMARKET_FIRST + 66);
define('ERRORINFO_SHORTDESERROR', '短号描述过长!');
define('ERRORCODE_WHITEIDERROR', ERRORCODE_BIGMARKET_FIRST + 67);
define('ERRORINFO_WHITEIDERROR', '好友名单不能为空!');
define('ERRORCODE_WHITEEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 68);
define('ERRORINFO_WHITEEXISTERROR', '玩家已经在好友名单中!');
define('ERRORCODE_WHITENOTEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 69);
define('ERRORINFO_WHITENOTEXISTERROR', '玩家不在好友名单中!');
define('ERRORCODE_MSGLENGTHERROR', ERRORCODE_BIGMARKET_FIRST + 70);
define('ERRORINFO_MSGLENGTHERROR', '短信验证码格式错误!');
define('ERRORCODE_MSGNODATAERROR', ERRORCODE_BIGMARKET_FIRST + 71);
define('ERRORINFO_MSGNODATAERROR', '未查询到短信验证码!');
define('ERRORCODE_TELMSGERROR', ERRORCODE_BIGMARKET_FIRST + 72);
define('ERRORINFO_TELMSGERROR', '短信验证码不匹配!');
define('ERRORCODE_BINDEDTELERROR', ERRORCODE_BIGMARKET_FIRST + 73);
define('ERRORINFO_BINDEDTELERROR', '已经绑定过手机!');
define('ERRORCODE_NOBINDEDTELERROR', ERRORCODE_BIGMARKET_FIRST + 74);
define('ERRORINFO_NOBINDEDTELERROR', '未绑定过手机!');
define('ERRORCODE_SMSSENDERROR', ERRORCODE_BIGMARKET_FIRST + 75);
define('ERRORCODE_FROMUSERERROR', ERRORCODE_BIGMARKET_FIRST + 76);
define('ERRORINFO_FROMUSERERROR', '来源账户不能为空!');
define('ERRORCODE_TOUSERERROR', ERRORCODE_BIGMARKET_FIRST + 77);
define('ERRORINFO_TOUSERERROR', '目标账户不能为空!');
define('ERRORCODE_COMMISSIONNOTEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 78);
define('ERRORINFO_COMMISSIONNOTEXISTERROR', '账户分成类型不存在!');
define('ERRORCODE_NUMMAXTEXISTERROR', ERRORCODE_BIGMARKET_FIRST + 79);
define('ERRORINFO_NUMMAXTEXISTERROR', '数值超过范围!');
define('ERRORCODE_ACCOUNTPERIODERROR', ERRORCODE_BIGMARKET_FIRST + 80);
define('ERRORINFO_ACCOUNTPERIODERROR', '账期错误!');
define('ERRORCODE_ACCOUNTPERIODEXISTS', ERRORCODE_BIGMARKET_FIRST + 81);
define('ERRORINFO_ACCOUNTPERIODEXISTS', '该账期已有支付信息,请先撤销对应的支付订单才能重新生成!(订单号:%s');
define('ERRORCODE_INVALIDCARDAMOUNT', ERRORCODE_BIGMARKET_FIRST + 82);
define('ERRORINFO_INVALIDCARDAMOUNT', '无效的房卡数量信息,当前账期赠送的房卡数超过总计转出的房卡数(累计转出数:%f当前赠送数%f');
define('ERRORCODE_INVALIDGOLDAMOUNT', ERRORCODE_BIGMARKET_FIRST + 82);
define('ERRORINFO_INVALIDGOLDAMOUNT', '无效的金币数量信息,当前账期赠送的金币数超过总计转出的金币数(累计转出数:%f当前赠送数%f');
define('ERRORCODE_INVALIDFINANCEORDER', ERRORCODE_BIGMARKET_FIRST + 83);
define('ERRORINFO_INVALIDFINANCEORDER', '找不到订单信息或该订单已被撤销!');
define('ERRORCODE_FINANCEORDERISNOTLAST', ERRORCODE_BIGMARKET_FIRST + 84);
define('ERRORINFO_FINANCEORDERISNOTLAST', '该订单不是最后一个有效的订单,你只能从最后一个有效订单开始执行撤销操作(%s');
define('ERRORCODE_FINANCEYEARERROR', ERRORCODE_BIGMARKET_FIRST + 85);
define('ERRORINFO_FINANCEYEARERROR', '无效的账期年份!');
define('ERRORCODE_CANNOTBINDCHILD', ERRORCODE_BIGMARKET_FIRST + 86);
define('ERRORINFO_CANNOTBINDCHILD', '不能绑定自己下级的邀请码!');
define('ERRORCODE_GIFTIDERROR', ERRORCODE_BIGMARKET_FIRST + 87);
define('ERRORINFO_GIFTIDERROR', '错误的礼包代码!');
define('ERRORCODE_GIFTNOTEXISTS', ERRORCODE_BIGMARKET_FIRST + 88);
define('ERRORINFO_GIFTNOTEXISTS', '找不到指定的礼包,或该礼包已被领取!');
define('ERRORCODE_CARDNUMBERERROR', ERRORCODE_BIGMARKET_FIRST + 89);
define('ERRORINFO_CARDNUMBERERROR', '错误的充值卡号或密码!');
define('ERRORCODE_CARDNUMBERNOTEXISTS', ERRORCODE_BIGMARKET_FIRST + 90);
define('ERRORINFO_CARDNUMBERNOTEXISTS', '找不到指定的充值卡,或该充值卡已被使用!');
define('ERRORCODE_LOGINRESTRICTED', ERRORCODE_BIGMARKET_FIRST + 91);
define('ERRORINFO_LOGINRESTRICTED', '登录错误次数过多请等待15分钟后再试');
define('ERRORCODE_DIAMONDENOUGHERROR', ERRORCODE_BIGMARKET_FIRST + 92); // 钻石数量不足
define('ERRORINFO_DIAMONDENOUGHERROR', '账户中钻石数量不足!'); // 钻石数量不足

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,252 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2016-08-11
* Time: 10:10
*/
require_once __DIR__ . '/CommonConstant.php';
// 加载环境变量配置
require_once dirname(dirname(dirname(__DIR__))) . '/env_config.php';
/// 是否调试环境
define('DEBUG_MODE', env('DEBUG_MODE', false));
if (DEBUG_MODE)
{
/// 数据库类型mysql, sqlsrv, oracle
define('DATABASE_TYPE', DATABASE_TYPE_MYSQL);
/// ==== ↓ 主服务器信息 ↓ ====
/// 数据服务器地址
define('MASTER_HOSTNAME', env('DLWEB_DB_HOST', '39.108.82.197'));
/// 数据端口
define('MASTER_HOSTPORT', (int)env('DLWEB_DB_PORT', 3309));
/// 数据库登录用户名
define('MASTER_USERNAME', env('DLWEB_DB_USER', 'root'));
/// 数据库登录密码
define('MASTER_PASSWORD', env('DLWEB_DB_PASSWORD', ''));
/// 数据库名
define('MASTER_DATABASE', env('DLWEB_DB_NAME', 'game_db'));
/// 是否长链接
define('MASTER_PERSISTENT', false);
/// 编码mysql有效
define('MASTER_CHARSET', 'utf8');
/// ==== ↑ 主服务器信息 ↑ ====
/// ==== ↓ 从服务器信息 ↓ ====
/// 从服务器数
define('SERVANT_COUNT', 0);
/// ==== ↓ 从服务器1 ↓ ====
/// 数据服务器地址
define('SERVANT_HOSTNAME_0', env('DLWEB_SLAVE_DB_HOST', '39.108.82.197'));
/// 数据端口
define('SERVANT_HOSTPORT_0', (int)env('DLWEB_SLAVE_DB_PORT', 3309));
/// 数据库登录用户名
define('SERVANT_USERNAME_0', env('DLWEB_SLAVE_DB_USER', 'root'));
/// 数据库登录密码
define('SERVANT_PASSWORD_0', env('DLWEB_SLAVE_DB_PASSWORD', ''));
/// 数据库名
define('SERVANT_DATABASE_0', env('DLWEB_SLAVE_DB_NAME', 'game_db'));
/// 是否长链接
define('SERVANT_PERSISTENT_0', false);
/// 编码mysql有效
define('SERVANT_CHARSET_0', 'utf8');
/// ==== ↑ 从服务器1 ↑ ====
/// ==== ↑ 从服务器信息 ↑ ====
/// ==== ↓ redis配置 ↓ ====
/// 是否启用redis缓存
define('REDIS_ENABLED', env('REDIS_ENABLED', false));
/// redis服务器名、地址
define('REDIS_HOSTNAME', env('REDIS_HOST', 'localhost'));
/// redis服务器端口
define('REDIS_HOSTPORT', (int)env('REDIS_PORT', 6379));
/// redis数据库名
define('REDIS_DATABASE', 'default');
/// redis密码
define('REDIS_PASSWORD', env('REDIS_PASSWORD', ''));
/// ==== ↑ redis配置 ↑ ====
/// ==== ↓ 其他配置 ↓ ====
/// 服务器是否对外开放
define('SERVER_ACTIVE', true);
/// 当服务器不对外开放时,可以访问服务器的地址
$_whitelist_str = env('INTERNAL_WHITELIST', 'localhost,127.0.0.1,::1,171.34.213.95');
$_whitelist_arr = array_map('trim', explode(',', $_whitelist_str));
define('INTERNAL_WHITELIST', 'return ' . var_export($_whitelist_arr, true) . ';');
/// 服务器是否需要定时关闭
define('TIMED_OFF_NEEDED', false);
/// 定时关闭开始时间
define('TIMED_OFF_BEGIN', '02:50:00');
/// 定时关闭结束时间
define('TIMED_OFF_END', '08:00:00');
/// 是否需要校验token
define('TOKEN_ENABLED', false);
/// 限制token是否只能单次使用
define('TOKEN_SIGNLE', true);
/// 是否校验token和user_id是否匹配
define('VALID_TOKEN_USERID', false);
/// 是否需要验证签名
define('SIGN_ENABLED', false);
/// 签名key
define('SIGN_KEY', 'sdk');
/// 单个接口访问的时间间隔(毫秒)
define('REQUEST_INTERVAL', 10);
/// token超时时间
define('TOKEN_EXPIRE_TICK_COUNT', 7200);
/// 登录接口名表示该接口为登录接口登录接口不校验user_auth_token参数
define('LOGIN_METHOD_LIST', 'return array(\'sales.sales.loginByPhone\', \'Admin.Admin.login\', \'agent.demand.salesInfo\', \'agent.user.getinfo\', \'agent.user.login\', \'agent.player.login\', \'agent.user.admin_login\', \'agent.user.report_login\', \'agent.user.getPlayer\');');
/// 不校验也不生成user_auth_token的接口列表
define('IGNORE_USER_AUTH_TOKEN_METHOD_LIST', 'return array(\'agent.user.getUserInfo\', \'admin.Admin.createAgent\', \'Admin.Admin.createChannel\', \'Admin.Admin.createGame\', \'agent.gift.newrechargecard\', \'report.report.areaNumberOfPeopleMap\', \'sales.sales.captchaLogin\', \'youle.youle.channelConfigById\', \'agent.user.whiteList\', \'agent.user.changeWhiteList\', \'agent.user.queryShortNum\', \'agent.order.createStarOrder\', \'agent.order.buyStarRecord\', \'Youle.Youle.productList\', \'agent.order.isPay\', \'report.report.exportReport\', \'Youle.Youle.webLog\', \'Youle.Youle.channelConfig\', \'Youle.Youle.gameList\', \'Youle.Youle.channelList\', \'sms.sms.sendBindCode\', \'agent.order.ordersuccess\', \'agent.game.downList\', );');
/// ==== ↑ 其他配置 ↑ ====
}
else
{
/// 数据库类型mysql, sqlsrv, oracle
define('DATABASE_TYPE', DATABASE_TYPE_MYSQL);
/// ==== ↓ 主服务器信息 ↓ ====
/// 数据服务器地址
define('MASTER_HOSTNAME', env('DLWEB_DB_HOST', 'rm-bp1btyuwq77591x0jpo.mysql.rds.aliyuncs.com'));
/// 数据端口
define('MASTER_HOSTPORT', (int)env('DLWEB_DB_PORT', 3306));
/// 数据库登录用户名
define('MASTER_USERNAME', env('DLWEB_DB_USER', 'games'));
/// 数据库登录密码
define('MASTER_PASSWORD', env('DLWEB_DB_PASSWORD', ''));
/// 数据库名
define('MASTER_DATABASE', env('DLWEB_DB_NAME', 'agent_db'));
/// 是否长链接
define('MASTER_PERSISTENT', false);
/// 编码mysql有效
define('MASTER_CHARSET', 'utf8');
/// ==== ↑ 主服务器信息 ↑ ====
/// ==== ↓ 从服务器信息 ↓ ====
/// 从服务器数
define('SERVANT_COUNT', 0);
/// ==== ↓ 从服务器1 ↓ ====
/// 数据服务器地址
define('SERVANT_HOSTNAME_0', env('DLWEB_SLAVE_DB_HOST', 'rr-wz9v0rl1uv6o1j9pfo.mysql.rds.aliyuncs.com'));
/// 数据端口
define('SERVANT_HOSTPORT_0', (int)env('DLWEB_SLAVE_DB_PORT', 3306));
/// 数据库登录用户名
define('SERVANT_USERNAME_0', env('DLWEB_SLAVE_DB_USER', 'yunuser'));
/// 数据库登录密码
define('SERVANT_PASSWORD_0', env('DLWEB_SLAVE_DB_PASSWORD', ''));
/// 数据库名
define('SERVANT_DATABASE_0', env('DLWEB_SLAVE_DB_NAME', 'game_db'));
/// 是否长链接
define('SERVANT_PERSISTENT_0', false);
/// 编码mysql有效
define('SERVANT_CHARSET_0', 'utf8');
/// ==== ↑ 从服务器1 ↑ ====
/// ==== ↑ 从服务器信息 ↑ ====
/// ==== ↓ redis配置 ↓ ====
/// 是否启用redis缓存
define('REDIS_ENABLED', env('REDIS_ENABLED', false));
/// redis服务器名、地址
define('REDIS_HOSTNAME', env('REDIS_HOST', 'localhost'));
/// redis服务器端口
define('REDIS_HOSTPORT', (int)env('REDIS_PORT', 6379));
/// redis数据库名
define('REDIS_DATABASE', 'default');
/// redis密码
define('REDIS_PASSWORD', env('REDIS_PASSWORD', ''));
/// ==== ↑ redis配置 ↑ ====
/// ==== ↓ 其他配置 ↓ ====
/// 服务器是否对外开放
define('SERVER_ACTIVE', true);
/// 当服务器不对外开放时,可以访问服务器的地址
$_whitelist_str = env('INTERNAL_WHITELIST', 'localhost,127.0.0.1,::1,171.34.213.95');
$_whitelist_arr = array_map('trim', explode(',', $_whitelist_str));
define('INTERNAL_WHITELIST', 'return ' . var_export($_whitelist_arr, true) . ';');
/// 服务器是否需要定时关闭
define('TIMED_OFF_NEEDED', true);
/// 定时关闭开始时间
define('TIMED_OFF_BEGIN', '02:50:00');
/// 定时关闭结束时间
define('TIMED_OFF_END', '03:10:00');
/// 是否需要校验token
define('TOKEN_ENABLED', true);
/// 限制token是否只能单次使用
define('TOKEN_SIGNLE', true);
/// 是否校验token和user_id是否匹配
define('VALID_TOKEN_USERID', false);
/// 是否需要验证签名
define('SIGN_ENABLED', false);
/// 签名key
define('SIGN_KEY', 'sdk');
/// 单个接口访问的时间间隔(毫秒)
define('REQUEST_INTERVAL', 10);
/// token超时时间
define('TOKEN_EXPIRE_TICK_COUNT', 7200);
/// 登录接口名表示该接口为登录接口登录接口不校验user_auth_token参数
define('LOGIN_METHOD_LIST', 'return array(\'sales.sales.loginByPhone\', \'Admin.Admin.login\', \'agent.demand.salesInfo\', \'agent.user.getinfo\', \'agent.user.login\', \'agent.player.login\', \'agent.user.admin_login\', \'agent.user.report_login\', \'agent.user.getPlayer\');');
/// 不校验也不生成user_auth_token的接口列表
define('IGNORE_USER_AUTH_TOKEN_METHOD_LIST', 'return array(\'agent.user.getUserInfo\', \'admin.Admin.createAgent\', \'Admin.Admin.createChannel\', \'Admin.Admin.createGame\', \'agent.gift.newrechargecard\', \'report.report.areaNumberOfPeopleMap\', \'sales.sales.captchaLogin\', \'youle.youle.channelConfigById\', \'agent.user.whiteList\', \'agent.user.changeWhiteList\', \'agent.user.queryShortNum\', \'agent.order.createStarOrder\', \'agent.order.buyStarRecord\', \'Youle.Youle.productList\', \'agent.order.isPay\', \'report.report.exportReport\', \'Youle.Youle.webLog\', \'Youle.Youle.channelConfig\', \'Youle.Youle.gameList\', \'Youle.Youle.channelList\', \'sms.sms.sendBindCode\', \'agent.order.ordersuccess\', \'agent.game.downList\', );');
/// ==== ↑ 其他配置 ↑ ====
}
/**
* @note 定义用于登录的接口名
* @return array
*/
function LOGIN_METHOD_LIST()
{
return eval(LOGIN_METHOD_LIST);
}
/**
* @note 定义用于内部访问服务器的地址
* @return array
*/
function INTERNAL_WHITELIST()
{
return eval(INTERNAL_WHITELIST);
}
/**
* @note 不校验也不生成user_auth_token的接口列表
* @return mixed
*/
function IGNORE_USER_AUTH_TOKEN_METHOD_LIST()
{
return eval(IGNORE_USER_AUTH_TOKEN_METHOD_LIST);
}
/*
游戏只读实例
rr-bp1x2415jy37d8mu1o.mysql.rds.aliyuncs.com
games
Games2017@)!&
*/

View File

@@ -0,0 +1,14 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2017/8/14
* Time: 10:24
*/
// 加载环境变量
require_once dirname(dirname(dirname(__DIR__))) . '/env_config.php';
// 0791ts
/// 实时查询玩家信息的接口地址
define('REQUEST_USER_INFO', env('GAME_SERVER_QUERY_URL', 'http://127.0.0.1:31089/index.html'));
// 其他服务器地址已移至 .env 配置

View File

@@ -0,0 +1,24 @@
<?php
$start = isset($_GET['start']) ? $_GET['start'] : '2019-04-12';
$end = isset($_GET['end']) ? $_GET['end'] : date('Y-m-d', strtotime('-1 days'));
$day = 38;
$list = [];
array_push($list, $start);
$date=date_create($start);
$tmp = '';
$times = 0;
while($tmp !== $end && $times < 200) {
date_add($date, date_interval_create_from_date_string("1 days"));
$tmp = date_format($date, "Y-m-d");
array_push($list, $tmp);
$times++;
}
echo implode($list, ',');
echo '<pre>';
print_r($list);

Binary file not shown.

View File

@@ -0,0 +1,46 @@
在做微信开发时有时需要判断用户是否已关注公众号,以便于做出不同的回应,如提醒用户关注公众号等。
判断用户是否已关注公众号可能通过获取用户信息来操作。
如果已关注公众号那么微信返回的JSON数据包会包含”subscribe”: 1这样的信息。
如果未关注公众号那么微信返回的JSON数据包会包含”subscribe”: 0这样的信息。
开发者可通过OpenID到http GET请求方式调用接口来获取用户基本信息。
请求示例:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数:
参数 是否必须 说明
access_token 是 调用接口凭证
openid 是 普通用户的标识,对当前公众号唯一
lang 否 返回国家地区语言版本zh_CN 简体zh_TW 繁体en 英语
以下是PHP来判断用户是否已关注公众号的示例
function verification($openid,$accestoken){
$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$accestoken.'&openid='.$openid.'&lang=zh_CN';
$json_Wxuser=json_decode(curlGet($url),true);
//获取用户信息后判断subcribe == 0 那么就是未关注
if(isset($json_Wxuser['subscribe']) && $json_Wxuser['subscribe'] == 0){
//跳转到提示用户关注页面中
$this->redirect('Guanzhu/index', array('id' => $id), 0, '页面跳转中...');
}
}
function curlGet($url){
$ch = curl_init();
$header = "Accept-Charset: utf-8";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$temp = curl_exec($ch);
return $temp;
}

View File

@@ -0,0 +1,18 @@
红包接口:
请求地址https://api.tscce.cn/api/newpay/sendredpack
请求类型post
请求参数:
appid: appid
devkey: 开发者key
sid: 登录sid
scode: scode
orderid: 订单号
fee: 红包金额单位分1元起步
wishing: 红包祝福语
act_name: 活动名称
remark: 备注
send_type: 红包类型1微信2支付宝
version: 版本号1
https://api.tscce.cn/api/newpay/sendredpack?appid=14936872341446&devkey=14915485974028&sid=YzT0CfCcZgqQV1dG0dZ77GR17d1R1Dqf&scode=005e15ed67176af569d6a170ef3981fa&orderid=1&fee=100&wishing=红包祝福语&act_name=活动名称&remark=备注&send_type=1&version=1

View File

@@ -0,0 +1,112 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2017/8/30
* Time: 11:11
*/
die;
require_once dirname(__DIR__) . '/common/config.inc.php';
require_once dirname(__DIR__) . '/common/DatabaseHelper.php';
/**
* @note
* @param mixed $message
* @return bool
*/
function OutputDebugMessage($message)
{
if (is_object($message) || is_array($message))
$message = JsonObjectToJsonString($message);
$nowdate = date('Y-m-d');
$nowtime = date('H:i:s');
$pathname = dirname($_SERVER['SCRIPT_FILENAME']) . '/debug/ProcessMatchResult';
$filename = "{$pathname}/{$nowdate}.log";
if (!is_dir($pathname))
mkdir($pathname, 0777, true);
if ($file = fopen($filename, 'a+')) {
if (mb_strstr($message, PHP_EOL, false, USEDCHARSET) != PHP_EOL)
$message .= PHP_EOL;
fwrite($file, "{$nowtime} ====> {$message}");
fclose($file);
return true;
} else
return false;
}
$limit = isset($_REQUEST['c']) ? $_REQUEST['c'] : 0;
if (empty($limit))
$limit = 1000;
$p = ConnectParameter::NewParameter(MASTER_HOSTNAME, MASTER_HOSTPORT, MASTER_DATABASE, MASTER_USERNAME, MASTER_PASSWORD, MASTER_PERSISTENT, MASTER_CHARSET);
/** @var IPDOHelper $reader */
$reader = new PDODelegator(DATABASE_TYPE);
/** @var IPDOHelper $writer */
$writer = new PDODelegator(DATABASE_TYPE);
$log = '';
if (!$reader->Connect($p)) {
$log = JsonObjectToJsonString($reader->GetErrors());
OutputDebugMessage($log);
exit($log);
}
if (!$writer->Connect($p)) {
$log = JsonObjectToJsonString($writer->GetErrors());
OutputDebugMessage($log);
exit($log);
}
$reader->request(
function ($row) {
/** @var IPDOHelper $db */
$db = $GLOBALS['writer'];
$player_id = $row->player_id;
$player_name = $row->player_name;
$used_card = (array)JsonStringToJsonObject($row->room_type);
$used_card = array_shift($used_card);
$game_info = JsonStringToJsonObject($row->game_info);
$player_list = isset($game_info->playerlist) ? $game_info->playerlist : null;
if (!$player_list)
return true;
$winner = null;
$integral = null;
foreach ($player_list as $key => $value) {
if (!$winner || intval($value[1]) > $integral) {
$winner = $value[0];
$integral = intval($value[1]);
}
}
if (strcasecmp($player_name, $winner) == 0) {
$command = /** @lang text */
'update ct_temp set used_card = ?, wins = 1, is_process = 1 where id = ?';
} else {
$command = /** @lang text */
'update ct_temp set used_card = ?, is_process = 1 where id = ?';
}
if ($db->execute($command, $used_card, $row->id)) {
echo 'the record id(', $row->id, ') processing success!<br>', PHP_EOL;
} else {
echo 'the record id(', $row->id, ') processing fail!<br>', PHP_EOL;
}
return true;
}, /** @lang text */
'select * from ct_temp where is_process = 0 limit ' . intval($limit)
);
if (!$reader->isdone())
echo $reader->geterrorinfo(), PHP_EOL;

View File

@@ -0,0 +1,631 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2017/7/24
* Time: 14:37
*/
/**
* 同步与游戏的交互日志表
*/
require_once dirname(__DIR__) . '/common/config.inc.php';
require_once dirname(__DIR__) . '/common/DatabaseHelper.php';
/**
* @note
* @param mixed $message
* @return bool
*/
function OutputDebugMessage($message) {
if (is_object($message) || is_array($message))
$message = JsonObjectToJsonString($message);
$nowdate = date('Y-m-d');
$nowtime = date('H:i:s');
$pathname = dirname($_SERVER['SCRIPT_FILENAME']) . '/debug/synchronize';
$filename = "{$pathname}/{$nowdate}.log";
if (!is_dir($pathname))
mkdir($pathname, 0777, true);
if ($file = fopen($filename, 'a+')) {
if (mb_strstr($message, PHP_EOL, false, USEDCHARSET) != PHP_EOL)
$message .= PHP_EOL;
fwrite($file, "{$nowtime} ====> {$message}");
fclose($file);
return true;
}
return false;
}
date_default_timezone_set('Asia/Shanghai');
/// 判断是否需要停服
if (TIMED_OFF_NEEDED) {
$Now = date('H:i:s');
if ($Now >= TIMED_OFF_BEGIN && $Now <= TIMED_OFF_END) {
$output = JsonObjectToJsonString([
'time' => date('Y-m-d H:i:s'),
'code' => ERRORCODE_SERVERTURNOFF,
'info' => sprintf(ERRORINFO_SERVERTURNOFF, TIMED_OFF_BEGIN, TIMED_OFF_END),
]);
OutputDebugMessage($output);
die($output);
}
}
/// 本地数据库
$owner_param = new ConnectParameter(MASTER_HOSTNAME, MASTER_HOSTPORT, MASTER_DATABASE, MASTER_USERNAME, MASTER_PASSWORD, MASTER_PERSISTENT, MASTER_CHARSET);
/// 游戏数据库
if (DEBUG_MODE)
$external_param = new ConnectParameter(env('EXT_DEV_DB_HOST', 'rm-bp16sbf0l9cavp7h9o.mysql.rds.aliyuncs.com'), (int)env('EXT_DEV_DB_PORT', 3306), env('EXT_DEV_DB_NAME', 'youle_games'), env('EXT_DEV_DB_USER', 'develop'), env('EXT_DEV_DB_PASSWORD', 'develop123!@#'), MASTER_PERSISTENT, MASTER_CHARSET);
else
$external_param = new ConnectParameter(env('EXT_GAME_DB_HOST', 'rm-bp1749tfxu2rpq670lo.mysql.rds.aliyuncs.com'), (int)env('EXT_GAME_DB_PORT', 3306), env('EXT_GAME_DB_NAME', 'game_db'), env('EXT_GAME_DB_USER', 'games'), env('EXT_GAME_DB_PASSWORD', 'Games0791!!'), MASTER_PERSISTENT, MASTER_CHARSET);
//$external_param = new ConnectParameter('rm-bp1x3i28se22s9z75o.mysql.rds.aliyuncs.com', 3306, 'game_db', 'games', 'Games2017@)!&', MASTER_PERSISTENT, MASTER_CHARSET);
/** @var IPDOHelper $owner_db */
$owner_db = new PDODelegator(DATABASE_TYPE);
/** @var IPDOHelper $external_db */
$external_db = new PDODelegator(DATABASE_TYPE);
if (!$owner_db->connect($owner_param)) {
OutputDebugMessage($owner_db->geterrors());
die (JsonObjectToJsonString($owner_db->geterrors()));
}
if (!$external_db->connect($external_param)) {
OutputDebugMessage($external_db->geterrors());
die (JsonObjectToJsonString($external_db->geterrors()));
}
$processcount = isset($_REQUEST['processcount']) ? intval($_REQUEST['processcount']) : 100;
if (empty($processcount))
$processcount = 100;
$command = <<<EOL
select
idx, uspl_agentid, uspl_channelid, uspl_playerid, uspl_unionid, uspl_opt, uspl_optdata, uspl_opttime, uspl_state, uspl_statetime
from
ct_user_process_log
where
uspl_state = 0
limit
{$processcount}
EOL;
$logs = $external_db->request($command);
$succeeded = '';
$failed = '';
$succeededcount = 0;
$failedcount = 0;
$totalcount = count($logs);
if (0 == $totalcount) {
$output = JsonObjectToJsonString([
'time' => date('Y-m-d H:i:s'),
'total' => $totalcount,
'succeeded' => $succeededcount,
'failed' => $failedcount,
]);
die ($output);
}
$owner_db->begintransaction();
$external_db->begintransaction();
try {
if ($totalcount > 0) {
$error_code = 0;
$error_info = 'success';
foreach ($logs as $log) {
switch ($log->uspl_opt) {
case 1: /// 1:新增玩家
$line = __LINE__;
$data = JsonStringToJsonObject($log->uspl_optdata); /// {"openid":"openid100001", "unionid":"unionid100001", "nickname":"nickname100001","avatar":"","sex":1,"province":"江西","city":"南昌"}
if (!is_object($data)) {
$failed .= $log->idx . ',';
OutputDebugMessage('sync error: invalid json data' . PHP_EOL . 'data: ' . JsonObjectToJsonString($log));
$failedcount++;
break;
}
/// 插入新玩家信息
$command = /** @lang text */<<<EOL
replace into player(play_agentid, play_channelid, play_playerid, play_openid, play_unionid, play_nickname, play_avatar, play_sex, play_province, play_city, play_regtime)
values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
EOL;
$ret = $owner_db->execute($command,
$log->uspl_agentid, $log->uspl_channelid, $log->uspl_playerid, $data->openid, $data->unionid,
$data->nickname, $data->avatar, $data->sex, $data->province, $data->city, $log->uspl_opttime);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
}
/// 查询是否有匹配的代理信息unionid或openid匹配
if (!empty($data->unionid)) {
$command = /** @lang text */<<<EOL
select idx from sales_user where saus_agentid = ? and saus_channelid = ? and saus_unionid = ?
EOL;
$ret = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $data->unionid);
} elseif (!empty($data->openid)) {
$command = /** @lang text */<<<EOL
select idx from sales_user where saus_agentid = ? and saus_channelid = ? and saus_openid = ?
EOL;
$ret = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $data->openid);
}
if (!$owner_db->isdone()) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
}
elseif (!empty($ret)) {
$command = /** @lang text */'update sales_user set player_id = ?, saus_salesman = 1 where idx = ?';
$ret = $owner_db->execute($command, $log->uspl_playerid, $ret[0]->idx);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
}
} else {
/// 新增一个代理信息
$command = /** @lang text */'update ct_agent_list set max_sales_id = max_sales_id + floor(rand() * (12-6) + 6) where agent_id = ?';
$ret = $owner_db->execute($command, $log->uspl_agentid);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
}
$command = /** @lang text */'select max_sales_id as agen_maxsalesid, default_sales_power as agen_salespower from ct_agent_list where agent_id = ?';
$agent = $owner_db->request($command, $log->uspl_agentid);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
} elseif (empty($agent)) {
$ret = false;
$line = __LINE__;
$error_code = -1;
$error_info = "找不到指定的渠道编号{$log->uspl_agentid}";
goto end_case_1;
}
$sales_id = $agent[0]->agen_maxsalesid;
$sales_power = $agent[0]->agen_salespower;
$password = md5(rand(1000, 9999));
$command = /** @lang text */<<<EOL
insert into sales_user(
saus_agentid, saus_channelid, saus_salesid, saus_power, saus_openid,
saus_unionid, saus_nickname, saus_avatar, saus_sex, saus_province,
saus_city, saus_firsttime, saus_lasttime, saus_saletime, player_id,
saus_salesman, password
) values (
?, ?, ?, ?, ?,
?, ?, ?, ?, ?,
?, ?, ?, ?, ?,
1, ?
)
EOL;
$ret = $owner_db->execute($command,
$log->uspl_agentid, $log->uspl_channelid, $sales_id, $sales_power, $data->openid,
$data->unionid, $data->nickname, $data->avatar, $data->sex, $data->province,
$data->city, $log->uspl_opttime, $log->uspl_opttime, $log->uspl_opttime, $log->uspl_playerid,
$password);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
}
$sales_user = [
'id' => 0,
'agentid' => $log->uspl_agentid,
'channelid' => $log->uspl_channelid,
'openid' => $data->openid,
'unionid' => $data->unionid,
'nickname' => $data->nickname,
'avatar' => $data->avatar,
'sex' => $data->sex,
'province' => $data->province,
'city' => $data->city,
'firsttime' => $log->uspl_opttime,
'lasttime' => $log->uspl_opttime,
'salesman' => 1,
'salesid' => $sales_id,
'level' => 0,
'parentid' => null,
'salestype' => 1,
'roomcard' => 0,
'bean' => 0,
'saletime' => $log->uspl_opttime,
'tel' => null,
'wechat' => null,
'invitecode' => null,
'power' => null,
'pushrate1' => 33,
'pushrate2' => 8,
'pushmoney1' => 0,
'pushmoney2' => 0,
];
$command = /** @lang text */<<<EOL
insert into ct_user_process_log(to_agent, to_channel, to_user, oper_type, oper_data, remark, oper_time, is_process)
values(?, ?, ?, 21, ?, ?, ?, 0)
EOL;
$ret = $owner_db->execute($command,
$log->uspl_agentid, $log->uspl_channelid, $sales_id,
JsonObjectToJsonString($sales_user), '目标用户为注册的代理信息。oper_data为用户unionid。', time());
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_1;
}
}
end_case_1:
if ($ret && $owner_db->isdone()) {
$succeeded .= $log->idx . ',';
$succeededcount++;
$output = 'sync done: ' . JsonObjectToJsonString($log);
} else {
$failed .= $log->idx . ',';
$failedcount++;
$output = sprintf('sync error: %s(%d) on line %d.' . PHP_EOL . 'data: %s.', $error_info, $error_code, $line, JsonObjectToJsonString($log));
}
OutputDebugMessage($output);
break;
case 2: /// 2:绑定邀请码
$line = __LINE__;
/// 修改玩家的邀请码
$command = /** @lang text */<<<EOL
update
player
set
play_invitecode = ?
where
play_agentid = ? and play_channelid = ? and play_playerid = ?
EOL;
$ret = $owner_db->execute($command, $log->uspl_optdata, $log->uspl_agentid, $log->uspl_channelid, $log->uspl_playerid);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
/// 获取对应的代理记录
$command = /** @lang text */'select idx from sales_user where saus_agentid = ? and saus_channelid = ? and player_id = ?';
$ret = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $log->uspl_playerid);
if (!$owner_db->isdone()) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
} elseif (!empty($ret)) { /// 如果玩家有对应的代理账户则绑定对应的代理关系
$id = $ret[0]->idx;
} else { /// 如果玩家没有对应的代理账户则先生成对应的代理账户
/// 先查询对应的玩家详细信息
$command = /** @lang text */'select play_openid openid, play_unionid unionid, play_nickname nickname, play_avatar avatar, play_sex sex, play_province province, play_city city from player where play_agentid = ? and play_channelid = ? and play_playerid = ?';
$data = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $log->uspl_playerid);
if (!$owner_db->isdone()) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
} elseif (empty($data)) {
$data = $external_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $log->uspl_playerid);
if (!$external_db->isdone()) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
} elseif (empty($data)) {
$data = (object)[
'openid' => null,
'unionid' => $log->uspl_unionid,
'nickname' => null,
'avatar' => null,
'sex' => null,
'province' => null,
'city' => null,
];
} else {
$data = $data[0];
}
} else {
$data = $data[0];
}
/// 查询是否有匹配的代理信息unionid或openid匹配
if (!empty($data->unionid)) {
$command = /** @lang text */'select idx from sales_user where saus_agentid = ? and saus_channelid = ? and saus_unionid = ?';
$ret = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $data->unionid);
} elseif (!empty($data->openid)) {
$command = /** @lang text */'select idx from sales_user where saus_agentid = ? and saus_channelid = ? and saus_openid = ?';
$ret = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid, $data->openid);
}
if (!$owner_db->isdone()) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
elseif (!empty($ret)) {
$id = $ret[0]->idx;
} else {
/// 新增一个代理信息
$command = /** @lang text */
'update ct_agent_list set max_sales_id = max_sales_id + floor(rand() * (12-6) + 6) where agent_id = ?';
$ret = $owner_db->execute($command, $log->uspl_agentid);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
$command = /** @lang text */
'select max_sales_id as agen_maxsalesid, default_sales_power as agen_salespower from ct_agent_list where agent_id = ?';
$agent = $owner_db->request($command, $log->uspl_agentid);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
$sales_id = $agent[0]->agen_maxsalesid;
$sales_power = $agent[0]->agen_salespower;
$password = md5(rand(1000, 9999));
$command = /** @lang text */<<<EOL
insert into sales_user(
saus_agentid, saus_channelid, saus_salesid, saus_power, saus_openid,
saus_unionid, saus_nickname, saus_avatar, saus_sex, saus_province,
saus_city, saus_firsttime, saus_lasttime, saus_saletime, player_id,
saus_salesman, password
) values (
?, ?, ?, ?, ?,
?, ?, ?, ?, ?,
?, ?, ?, ?, ?,
1, ?
)
EOL;
$ret = $owner_db->execute($command,
$log->uspl_agentid, $log->uspl_channelid, $sales_id, $sales_power, $data->openid,
$data->unionid, $data->nickname, $data->avatar, $data->sex, $data->province,
$data->city, $log->uspl_opttime, $log->uspl_opttime, $log->uspl_opttime, $log->uspl_playerid,
$password);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
$id = $owner_db->lastinsertid();
$sales_user = [
'id' => $id,
'agentid' => $log->uspl_agentid,
'channelid' => $log->uspl_channelid,
'openid' => $data->openid,
'unionid' => $data->unionid,
'nickname' => $data->nickname,
'avatar' => $data->avatar,
'sex' => $data->sex,
'province' => $data->province,
'city' => $data->city,
'firsttime' => $log->uspl_opttime,
'lasttime' => $log->uspl_opttime,
'salesman' => 1,
'salesid' => $sales_id,
'level' => 0,
'parentid' => null,
'salestype' => 1,
'roomcard' => 0,
'bean' => 0,
'saletime' => $log->uspl_opttime,
'tel' => null,
'wechat' => null,
'invitecode' => null,
'power' => null,
'pushrate1' => 33,
'pushrate2' => 8,
'pushmoney1' => 0,
'pushmoney2' => 0,
];
/// 记录新增代理的日志
$command = /** @lang text */<<<EOL
insert into ct_user_process_log(to_agent, to_channel, to_user, oper_type, oper_data, remark, oper_time, is_process)
values(?, ?, ?, 21, ?, ?, ?, 0)
EOL;
$ret = $owner_db->execute($command,
$log->uspl_agentid, $log->uspl_channelid, $sales_id,
JsonObjectToJsonString($sales_user), '目标用户为注册的代理信息。oper_data为用户unionid。', time());
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
}
}
/// 读取渠道是否同步邀请码的配置
$command = /** @lang text */'select sync_invitecode from ct_channel_list where agent_id = ? and channel_id = ?';
$ret = $owner_db->request($command, $log->uspl_agentid, $log->uspl_channelid);
$sync_invitecode = empty($ret) ? 0 : intval($ret[0]->sync_invitecode);
if (0 != $sync_invitecode) {
/// 修改对应代理记录的邀请码
$command = /** @lang text */<<<EOL
update
sales_user
set
saus_parentid = ?,
saus_invitecode = ?,
player_id = ?,
saus_salesman = 1
where
idx = ?
EOL;
$ret = $owner_db->execute($command, $log->uspl_optdata, $log->uspl_optdata, $log->uspl_playerid, $id);
if (!$ret) {
$line = __LINE__;
$error_code = $owner_db->GetErrorCode();
$error_info = $owner_db->GetErrorInfo();
goto end_case_2;
}
}
end_case_2:
if ($ret && $owner_db->isdone()) {
$succeeded .= $log->idx . ',';
$succeededcount++;
$output = 'sync done: ' . JsonObjectToJsonString($log);
} else {
$failed .= $log->idx . ',';
$failedcount++;
$output = sprintf('sync error: %s(%d) on line %d.' . PHP_EOL . 'data: %s.', $error_info, $error_code, $line, JsonObjectToJsonString($log));
}
OutputDebugMessage($output);
break;
default:
break;
}
}
/// 成功处理的记录把状态修改为1
if (!empty($succeeded)) {
$succeeded = substr($succeeded, 0, strlen($succeeded) - 1);
$command = /** @lang text */<<<EOL
update
ct_user_process_log
set
uspl_state = 1
where
idx in ({$succeeded})
EOL;
$external_db->execute($command);
}
/// 处理失败的记录把状态修改为-1
if (!empty($failed)) {
$failed = substr($failed, 0, strlen($failed) - 1);
$command = /** @lang text */<<<EOL
update
ct_user_process_log
set
uspl_state = -1
where
idx in ({$failed})
EOL;
$external_db->execute($command);
}
}
if (!$owner_db->commit())
throw new Exception($owner_db->GetErrorInfo(), $owner_db->GetErrorCode());
if (!$external_db->commit())
throw new Exception($external_db->GetErrorInfo(), $external_db->GetErrorCode());
$output = JsonObjectToJsonString([
'time' => date('Y-m-d H:i:s'),
'total' => $totalcount,
'succeeded' => $succeededcount,
'failed' => $failedcount,
]);
if (($succeededcount + $failedcount) != $totalcount)
OutputDebugMessage($output);
} catch (Exception $Exception) {
$owner_db->rollback();
$external_db->rollback();
$output = JsonObjectToJsonString([
'time' => date('Y-m-d H:i:s'),
'code' => $Exception->getCode(),
'info' => $Exception->getMessage(),
]);
OutputDebugMessage($output);
}
die ($output);
/*
insert into ct_user_process_log(to_agent, to_channel, to_user, oper_type, oper_data, remark, oper_time, is_process)
select
saus_agentid,
saus_channelid,
saus_salesid,
21,
concat('{',
'"id":"', ifnull(idx, 0),
'","agentid":"', ifnull(saus_agentid, ''),
'","channelid":"', ifnull(saus_channelid, ''),
'","openid":"', ifnull(saus_openid, ''),
'","unionid":"', ifnull(saus_unionid, ''),
'","nickname":"', ifnull(saus_nickname, ''),
'","avatar":"', ifnull(saus_avatar, ''),
'","sex":"', ifnull(saus_sex, ''),
'","province":"', ifnull(saus_province, ''),
'","city":"', ifnull(saus_city, ''),
'","firsttime":"', ifnull(saus_firsttime, ''),
'","lasttime":"', ifnull(saus_lasttime, ''),
'","salesman":"', ifnull(saus_salesman, 0),
'","salesid":"', ifnull(saus_salesid, ''),
'","level":"', ifnull(saus_level, ''),
'","parentid":"', ifnull(saus_parentid, ''),
'","salestype":"', ifnull(saus_salestype, ''),
'","roomcard":"', ifnull(saus_roomcard, 0),
'","bean":"', ifnull(saus_bean, 0),
'","saletime":"', ifnull(saus_saletime, ''),
'","tel":"', ifnull(saus_tel, ''),
'","wechat":"', ifnull(saus_wechat, ''),
'","invitecode":"', ifnull(saus_invitecode, 0),
'","power":"', ifnull(saus_power, ''),
'","pushrate1":"', ifnull(saus_pushrate1, 0),
'","pushrate2":"', ifnull(saus_pushrate2, 0),
'","pushmoney1":"', ifnull(saus_pushmoney1, 0),
'","pushmoney2":"', ifnull(saus_pushmoney2, 0),
'"}'
),
'目标用户为注册的代理信息。oper_data为用户unionid。',
unix_timestamp(),
0
from
sales_user
where
saus_agentid = 'veRa0qrBf0df2K1G4de2tgfmVxB2jxpv' and saus_channelid = 'FtJf073aa0d6rI1xD8J1Y42fINTm0ziK' and saus_salesid = 240973
*/

View File

@@ -0,0 +1,426 @@
<?php
/**
* 同步报表数据
*/
require_once dirname(__DIR__) . '/common/config.inc.php';
require_once dirname(__DIR__) . '/common/DatabaseHelper.php';
//http://localhost/game_proxy/trunk/api/ext/SynchronizeReportData.php
/**
* @note
* @param mixed $message
* @return bool
*/
function OutputDebugMessage($message)
{
if (is_object($message) || is_array($message))
$message = JsonObjectToJsonString($message);
$nowdate = date('Y-m-d');
$nowtime = date('H:i:s');
$pathname = dirname($_SERVER['SCRIPT_FILENAME']) . '/debug/SynchronizeReportData';
$filename = "{$pathname}/{$nowdate}.log";
if (!is_dir($pathname))
mkdir($pathname, 0777, true);
if ($file = fopen($filename, 'a+')) {
if (mb_strstr($message, PHP_EOL, false, USEDCHARSET) != PHP_EOL)
$message .= PHP_EOL;
fwrite($file, "{$nowtime} ====> {$message}");
fclose($file);
return true;
} else
return false;
}
date_default_timezone_set('Asia/Shanghai');
/// 设置超时时间
set_time_limit(0);
/// 本地数据库
$owner_param = new ConnectParameter(MASTER_HOSTNAME, MASTER_HOSTPORT, MASTER_DATABASE, MASTER_USERNAME, MASTER_PASSWORD, MASTER_PERSISTENT, MASTER_CHARSET);
/// 游戏数据库
if (DEBUG_MODE)
$external_param = new ConnectParameter(env('EXT_DEV_DB_HOST', 'rm-bp16sbf0l9cavp7h9o.mysql.rds.aliyuncs.com'), (int)env('EXT_DEV_DB_PORT', 3306), env('EXT_DEV_DB_NAME', 'youle_games'), env('EXT_DEV_DB_USER', 'develop'), env('EXT_DEV_DB_PASSWORD', 'develop123!@#'), MASTER_PERSISTENT, MASTER_CHARSET);
else
$external_param = new ConnectParameter(env('EXT_GAME_DB_HOST', 'rm-bp1749tfxu2rpq670lo.mysql.rds.aliyuncs.com'), (int)env('EXT_GAME_DB_PORT', 3306), env('EXT_GAME_DB_NAME', 'game_db'), env('EXT_GAME_DB_USER', 'games'), env('EXT_GAME_DB_PASSWORD', 'Games0791!!'), MASTER_PERSISTENT, MASTER_CHARSET);
//$external_param = new ConnectParameter('rm-bp1x3i28se22s9z75o.mysql.rds.aliyuncs.com', 3306, 'game_db', 'games', 'Games2017@)!&', MASTER_PERSISTENT, MASTER_CHARSET);
/** @var IPDOHelper $owner_db */
$owner_db = new PDODelegator(DATABASE_TYPE);
/** @var IPDOHelper $external_db */
$external_db = new PDODelegator(DATABASE_TYPE);
if (!$owner_db->connect($owner_param)) {
OutputDebugMessage($owner_db->geterrors());
die (JsonObjectToJsonString($owner_db->geterrors()));
}
if (!$external_db->connect($external_param)) {
OutputDebugMessage($external_db->geterrors());
die (JsonObjectToJsonString($external_db->geterrors()));
}
/// 同步时间
$sync_date = date('Y-m-d', strtotime(isset($_REQUEST['sync_date']) ? $_REQUEST['sync_date'] : '-1 days'));
$owner_db->begintransaction();
$external_db->begintransaction();
try {
/** @var ISQLCommand $cmd */
$cmd = new CommandDelegator($owner_db);
/// 报表时间
$report_date = $cmd->getidentifiers($sync_date, true);
/// todo: 先同步report_agent_day和report_game_day两个表
/// 同步report_agent_day
$command = /** @lang text */<<<EOL
select
read_agentid, read_day, read_newplayer, read_newsalesman, read_playeraward, read_salesmoney
from
report_agent_day
where
read_day = ?
EOL;
$data = $external_db->request($command, $sync_date);
if (!$external_db->isdone())
throw new Exception($external_db->geterrorinfo() . '(' . __LINE__ . ')', intval($external_db->geterrorcode()));
$command = '';
foreach ($data as $item) {
$command .= sprintf('select %s read_agentid, %s read_day, %s read_newplayer, %s read_newsalesman, %s read_playeraward, %s read_salesmoney' . PHP_EOL . 'union all' . PHP_EOL,
$cmd->getidentifiers($item->read_agentid, true),
$cmd->getidentifiers($item->read_day, true),
$item->read_newplayer,
$item->read_newsalesman,
$item->read_playeraward,
$item->read_salesmoney);
}
$command = substr($command, 0, strlen($command) - strlen(PHP_EOL . 'union all' . PHP_EOL));
$command = /** @lang text */<<<EOL
replace into
report_agent_day(read_agentid, read_day, read_newplayer, read_newsalesman, read_playeraward, read_salesmoney)
select
read_agentid, read_day, read_newplayer, read_newsalesman, read_playeraward, read_salesmoney
from
(
{$command}
) t
EOL;
/// 删除前一天原有的数据
if (!$cmd->execute(/** @lang text */
'delete from report_agent_day where read_day = ?', $sync_date)
)
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
/// 插入前一天的数据
if (!$cmd->execute($command))
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
echo PHP_EOL, 'the table report_agent_day was synchronized!', PHP_EOL;
ob_flush();
flush();
/// ================================================================================================================
/// 同步report_game_day
$command = /** @lang text */<<<EOL
select
regd_agentid, regd_gameid, regd_day, regd_newplayer, regd_useroomcard, regd_asetcount, regd_maxplayer, regd_maxplayertime, regd_maxroom, regd_maxroomtime
from
report_game_day
where
regd_day = ?
EOL;
$data = $external_db->request($command, $sync_date);
if (!$external_db->isdone())
throw new Exception($external_db->geterrorinfo() . '(' . __LINE__ . ')', intval($external_db->geterrorcode()));
$command = '';
foreach ($data as $item) {
$command .= sprintf('select %s regd_agentid, %s regd_gameid, %s regd_day, %s regd_newplayer, %s regd_useroomcard, %s regd_asetcount, %s regd_maxplayer, %s regd_maxplayertime, %s regd_maxroom, %s regd_maxroomtime' . PHP_EOL . 'union all' . PHP_EOL,
$cmd->getidentifiers($item->regd_agentid, true),
$cmd->getidentifiers($item->regd_gameid, true),
$cmd->getidentifiers($item->regd_day, true),
$item->regd_newplayer,
$item->regd_useroomcard,
$item->regd_asetcount,
$item->regd_maxplayer,
empty($item->regd_maxplayertime) ? 'null' : $cmd->getidentifiers($item->regd_maxplayertime, true),
$item->regd_maxroom,
empty($item->regd_maxroomtime) ? 'null' : $cmd->getidentifiers($item->regd_maxroomtime, true));
}
$command = substr($command, 0, strlen($command) - strlen(PHP_EOL . 'union all' . PHP_EOL));
$command = /** @lang text */<<<EOL
replace into
report_game_day(regd_agentid, regd_gameid, regd_day, regd_newplayer, regd_useroomcard, regd_asetcount, regd_maxplayer, regd_maxplayertime, regd_maxroom, regd_maxroomtime)
select
regd_agentid, regd_gameid, regd_day, regd_newplayer, regd_useroomcard, regd_asetcount, regd_maxplayer, regd_maxplayertime, regd_maxroom, regd_maxroomtime
from
(
{$command}
) t
EOL;
/// 删除前一天原有的数据
if (!$cmd->execute(/** @lang text */
'delete from report_game_day where regd_day = ?', $sync_date)
)
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
/// 插入前一天的数据
if (!$cmd->execute($command))
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
echo 'the table report_game_day was synchronized!', PHP_EOL;
ob_flush();
flush();
/// ================================================================================================================
/// 生成前先删除原有的数据
if (!$cmd->execute(/** @lang text */'delete from ct_report_info where date_format(report_date, \'%Y-%m-%d\') = ?', $sync_date) )
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
/// ================================================================================================================
//
// /// 更新报表明细数据(总计、不分组的数据)
// $base_view = /** @lang text */<<<EOL
// select
// a.agent_id, a.channel_id, a.report_id, a.report_name, a.report_caption, a.command_line, a.is_group, a.is_autorun
// from
// (
// select
// b.agent_id agent_id, b.channel_id channel_id, a.report_id, a.report_name, a.report_caption, a.command_line, a.is_group, a.is_autorun
// from
// ct_report_list a, ct_channel_list b
// where
// ifnull(a.agent_id, '') = '' and ifnull(a.channel_id, '') = '' and ifnull(a.is_enabled, 0) != 0
// ) a
// left join
// (
// select
// agent_id, channel_id, report_id, report_name, report_caption, command_line, is_group, is_autorun
// from
// ct_report_list
// where
// ifnull(agent_id, '') != '' and ifnull(channel_id, '') != '' and ifnull(is_enabled, 0) != 0
// ) b
// on a.agent_id = b.agent_id and a.channel_id = b.channel_id and a.report_name = b.report_name
// where
// b.report_id is null
//
// union all
//
// select
// agent_id, channel_id, report_id, report_name, report_caption, command_line, is_group, is_autorun
// from
// ct_report_list
// where
// ifnull(agent_id, '') != '' and ifnull(channel_id, '') != '' and ifnull(is_enabled, 0) != 0
//EOL;
//
// /// 读出列表
// $command = /** @lang text */<<<EOL
//select
// a.agent_id, a.channel_id, a.report_id, a.report_name, a.report_caption, a.command_line
//from
//(
//{$base_view}
//) a
//where
// ifnull(a.is_group, 0) = 0 and ifnull(a.is_autorun, 0) != 0
//EOL;
//
// $report_data = '';
// $report_date = $cmd->getidentifiers($sync_date, true);
//
// $data = $cmd->request($command);
// if (!$owner_db->isdone())
// throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
//
// if (!empty($data)) {
// foreach ($data as $item) {
// $agent_id = $cmd->getidentifiers($item->agent_id, true);
// $channel_id = $cmd->getidentifiers($item->channel_id, true);
// $report_id = $item->report_id;
//
// if (empty($command_line = $item->command_line)) {
// $report_data .= " when a.agent_id = {$agent_id} and a.channel_id = {$channel_id} and a.report_id = {$report_id} then 0" . PHP_EOL;
// } else {
// $command_line = str_ireplace('%agent_id%', $agent_id, $command_line);
// $command_line = str_ireplace('%channel_id%', $channel_id, $command_line);
// $command_line = str_ireplace('%report_date%', $report_date, $command_line);
//
// $report_data .= " when a.agent_id = {$agent_id} and a.channel_id = {$channel_id} and a.report_id = {$report_id} then ({$command_line})" . PHP_EOL;
// }
// }
// $report_data = ' case' . PHP_EOL . $report_data . ' else 0' . PHP_EOL . ' end report_data';
//
// /// 生成数据的sql语句
// $command = /** @lang text */<<<EOL
//insert into ct_report_info
// (agent_id, channel_id, report_id, report_date, report_data)
//select
// a.agent_id,
// a.channel_id,
// a.report_id,
// #a.report_name,
// #a.report_caption,
// a.report_date,
//{$report_data}
//from
//(
// select
// a.agent_id,
// a.channel_id,
// a.report_id,
// a.report_name,
// a.report_caption,
// {$report_date} report_date
// #date_format(now(), '%Y-%m-%d') report_date
// from
// (
//{$base_view}
// ) a
// where
// ifnull(a.is_group, 0) = 0 and ifnull(a.is_autorun, 0) != 0
//) a
//#where
//# a.agent_id = 'veRa0qrBf0df2K1G4de2tgfmVxB2jxpv' and a.channel_id = 'FtJf073aa0d6rI1xD8J1Y42fINTm0ziK'
//
//EOL;
//
// /// 生成前一天的报表数据
// if (!$cmd->execute($command))
// throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
//
// echo 'the report with no group was created!', PHP_EOL;
// ob_flush();
// flush();
// }
//
// /// ================================================================================================================
//
// /// 更新报表明细数据按sales_id分组的数据
//
// /// 获取列表
// $command = /** @lang text */<<<EOL
//select
// agent_id, channel_id, report_id, report_name, report_caption, command_line
//from
// (
//{$base_view}
// ) a
//where
// ifnull(a.is_group, 0) != 0 and ifnull(a.is_autorun, 0) != 0
//EOL;
//
// $data = $cmd->request($command);
// if (!$owner_db->isdone())
// throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
//
// if (!empty($data)) {
// $command = '';
// foreach ($data as $item) {
// if (empty($command_line = $item->command_line))
// continue;
//
// $agent_id = $cmd->getidentifiers($item->agent_id, true);
// $channel_id = $cmd->getidentifiers($item->channel_id, true);
// $report_id = $item->report_id;
//
// $command_line = str_ireplace('%report_id%', $report_id, $command_line);
// $command_line = str_ireplace('%agent_id%', $agent_id, $command_line);
// $command_line = str_ireplace('%channel_id%', $channel_id, $command_line);
// //$command_line = str_ireplace('%sales_id%', '__tmp__.sales_id', $command_line);
// $command_line = str_ireplace('%report_date%', $report_date, $command_line);
//
// $command .= PHP_EOL . $command_line . PHP_EOL . 'union all';
// }
//
// $command = /** @lang text */PHP_EOL . 'insert into ct_report_info(agent_id, channel_id, sales_id, report_id, report_date, report_data)' . PHP_EOL .
// mb_substr($command, 0, mb_strlen($command, USEDCHARSET) - mb_strlen('union all', USEDCHARSET), USEDCHARSET);
// if (!$owner_db->execute($command))
// throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
// echo 'the report with group of sales was created!', PHP_EOL;
// ob_flush();
// flush();
// }
/* 2018-08-10由于原语句过慢修改执行方式 */
/// 提取自动执行的报表脚本
$sql = /** @lang text */<<<EOL
select
a.report_id, a.report_name, a.report_caption, a.command_line, a.is_group, a.is_autorun
from
ct_report_list a
where
ifnull(a.is_autorun, 0) != 0 and ifnull(a.is_enabled, 0) != 0
EOL;
$list = $cmd->request($sql);
if (!$owner_db->isdone())
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
if (!empty($list)) {
$command = '';
foreach ($list as $item) {
if (empty($command_line = $item->command_line))
continue;
$report_id = $item->report_id;
$command_line = str_ireplace('%report_id%', $report_id, $command_line);
$command_line = str_ireplace('%report_date%', $report_date, $command_line);
$command .= $command_line . PHP_EOL . PHP_EOL . 'union all' . PHP_EOL . PHP_EOL;
}
$command = PHP_EOL . PHP_EOL . mb_substr($command, 0, mb_strlen($command, USEDCHARSET) - mb_strlen('union all' . PHP_EOL . PHP_EOL, USEDCHARSET), USEDCHARSET);
$command = /** @lang text */<<<EOL
insert into ct_report_info(
agent_id, channel_id, sales_id, report_id, report_date, report_data
)
select
agent_id, channel_id, sales_id, report_id, report_date, report_data
from
(
{$command}
) t
EOL;
if (!$owner_db->execute($command))
throw new Exception($owner_db->geterrorinfo() . '(' . __LINE__ . ')', intval($owner_db->geterrorcode()));
echo 'the report was created!', PHP_EOL;
ob_flush();
flush();
}
/// ================================================================================================================
$owner_db->commit();
$external_db->commit();
$output = "the data of {$sync_date} was updated!";
} catch (Exception $Exception) {
$owner_db->rollback();
$external_db->rollback();
$output = JsonObjectToJsonString(array('code' => $Exception->GetCode(), 'info' => $Exception->GetMessage(),));
OutputDebugMessage($output);
}
die ($output);

View File

@@ -0,0 +1,158 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2017/8/7
* Time: 16:33
*/
die;
require_once dirname(__DIR__) . '/common/config.inc.php';
require_once dirname(__DIR__) . '/common/DatabaseHelper.php';
/**
* @note
* @param mixed $message
* @return bool
*/
function OutputDebugMessage($message)
{
if (is_object($message) || is_array($message))
$message = JsonObjectToJsonString($message);
$nowdate = date('Y-m-d');
$nowtime = date('H:i:s');
$pathname = dirname($_SERVER['SCRIPT_FILENAME']) . '/debug/TransferAgent';
$filename = "{$pathname}/{$nowdate}.log";
if (!is_dir($pathname))
mkdir($pathname, 0777, true);
if ($file = fopen($filename, 'a+')) {
if (mb_strstr($message, PHP_EOL, false, USEDCHARSET) != PHP_EOL)
$message .= PHP_EOL;
fwrite($file, "{$nowtime} ====> {$message}");
fclose($file);
return true;
} else
return false;
}
$agent = isset($_REQUEST['a']) ? $_REQUEST['a'] : '';
$source = isset($_REQUEST['s']) ? $_REQUEST['s'] : '';
$target = isset($_REQUEST['t']) ? $_REQUEST['t'] : '';
if (empty($agent)) {
$output = 'please enter agent id!';
OutputDebugMessage($output);
die($output);
} elseif (empty($source)) {
$output = 'please enter source sales id!';
OutputDebugMessage($output);
die($output);
} elseif (empty($target)) {
$output = 'please enter target sales id!';
OutputDebugMessage($output);
die($output);
} else {
$connect_parameter = new ConnectParameter(MASTER_HOSTNAME, MASTER_HOSTPORT, MASTER_DATABASE, MASTER_USERNAME, MASTER_PASSWORD, MASTER_PERSISTENT, MASTER_CHARSET);
/** @var IPDOHelper $db */
$db = new PDODelegator(DATABASE_TYPE);
if (!$db->connect($connect_parameter)) {
$output = JsonObjectToJsonString($db->geterrors());
OutputDebugMessage($output);
die($output);
}
if (!$db->begintransaction()) {
$output = JsonObjectToJsonString($db->geterrors());
OutputDebugMessage($output);
die($output);
}
try {
/// 转移房卡
$room_card = 0;
/// 查询源代理信息
$sales_user = $db->request(/** @lang text */
'select saus_roomcard from sales_user where saus_agentid = ? and saus_salesid = ?', $agent, $source);
if (!$db->isdone()) {
throw new Exception($db->geterrorinfo(), $db->geterrorcode());
} elseif (empty($sales_user)) {
throw new Exception("unable to find sales id: {$source}!");
} else {
$room_card = intval($sales_user[0]->saus_roomcard);
}
/// 查询新代理信息
$sales_user = $db->request(/** @lang text */
'select saus_roomcard from sales_user where saus_agentid = ? and saus_salesid = ?', $agent, $target);
if (!$db->isdone()) {
throw new Exception($db->geterrorinfo(), $db->geterrorcode());
} elseif (empty($sales_user)) {
throw new Exception("unable to find sales id: {$target}!");
}
$command = <<<EOL
update
sales_user a,
(
select
saus_agentid, saus_salesid, saus_roomcard - {$room_card} saus_roomcard
from
sales_user
where
saus_agentid = ? and saus_salesid = ?
union all
select
saus_agentid, saus_salesid, saus_roomcard + {$room_card} saus_roomcard
from
sales_user
where
saus_agentid = ? and saus_salesid = ?
) b
set
a.saus_roomcard = b.saus_roomcard
where
a.saus_agentid = b.saus_agentid and a.saus_salesid = b.saus_salesid
EOL;
/// 更新新代理的房卡
$ret = $db->execute($command, $agent, $source, $agent, $target);
if (!$ret)
throw new Exception($db->geterrorinfo(), $db->geterrorcode());
/// 更新代理的邀请码
$ret = $db->execute(/** @lang text */
'update sales_user set saus_invitecode = ? where saus_agentid = ? and saus_invitecode = ?', $target, $agent, $source);
if (!$ret)
throw new Exception($db->geterrorinfo(), $db->geterrorcode());
/// 更新代理的上级代理
$ret = $db->execute(/** @lang text */
'update sales_user set saus_parentid = ? where saus_agentid = ? and saus_parentid = ?', $target, $agent, $source);
if (!$ret)
throw new Exception($db->geterrorinfo(), $db->geterrorcode());
/// 更新玩家的邀请码
$ret = $db->execute(/** @lang text */
'update player set play_invitecode = ? where play_agentid = ? and play_invitecode = ?', $target, $agent, $source);
if (!$ret)
throw new Exception($db->geterrorinfo(), $db->geterrorcode());
$db->commit();
} catch (Exception $Exception) {
$db->rollback();
$output = JsonObjectToJsonString(array('code' => $Exception->getCode(), 'info' => $Exception->getMessage(),));
OutputDebugMessage($output);
die($output);
}
}

View File

@@ -0,0 +1,112 @@
<?php
/**
* Created by PhpStorm.
* User: bahamut
* Date: 2018/1/26
* Time: 14:15
*/
/**
* 每日自动任务
*/
require_once dirname(__DIR__) . '/common/config.inc.php';
require_once dirname(__DIR__) . '/common/DatabaseHelper.php';
/**
* @note 打印日志
* @param mixed $message
* @return bool
*/
function OutputDebugMessage($message)
{
if (is_object($message) || is_array($message))
$message = JsonObjectToJsonString($message);
$nowdate = date('Y-m-d');
$nowtime = date('H:i:s');
$pathname = dirname($_SERVER['SCRIPT_FILENAME']) . '/debug/autotask';
$filename = "{$pathname}/{$nowdate}.log";
if (!is_dir($pathname))
mkdir($pathname, 0777, true); // 修复不能同时创建俩个不存在的文件夹的bug
if ($file = fopen($filename, 'a+')) {
if (mb_strstr($message, PHP_EOL, false, USEDCHARSET) != PHP_EOL)
$message .= PHP_EOL;
fwrite($file, "{$nowtime} ====> {$message}");
fclose($file);
return true;
} else
return false;
}
date_default_timezone_set('Asia/Shanghai');
$log = 'start';
/**
* @var IPDOHelper $db
*/
$db = new PDODelegator(DATABASE_TYPE);
if (!$db->Connect(MASTER_HOSTNAME, MASTER_HOSTPORT, MASTER_DATABASE, MASTER_USERNAME, MASTER_PASSWORD, MASTER_CHARSET)) {
$log = JsonObjectToJsonString($db->GetErrors());
OutputDebugMessage($log);
die($log);
}
$db->FetchStyle = PDO::FETCH_ASSOC;
/** @var ISQLCommand $cmd */
///$cmd = new CommandDelegator($db);
/// saved max execute time count.
$MaxExecuteTime = ini_get('max_execution_time');
/// disable timeout limit.
set_time_limit(0);
$sync_date = date('Y-m-d', strtotime(isset($_REQUEST['sync_date']) ? $_REQUEST['sync_date'] : '-1 days')); // 前一天
$tabel_tag = date('Ym', strtotime(isset($_REQUEST['sync_date']) ? $_REQUEST['sync_date'] : '-1 days')); // 前一天
//$db->BeginTransaction(); /// 启动事务
try {
// 1、从数据库获取自动执行脚本
if (empty($commands = $db->request(/** @lang text */'select `sql`, `params`, `table` from ct_report_ext_sql where status = 1')))
throw new Exception('从数据库获取自动执行脚本失败', -1);
// 删除指定天数原有的数据
foreach ($commands as $key => $value) {
if (!$db->execute(/** @lang text */"delete from `{$value['table']}` where date_format(`time`, '%Y-%m-%d') = ?", $sync_date)) {
throw new Exception($db->geterrorinfo() . '(' . __LINE__ . ')', intval($db->geterrorcode()));
}
}
/// 插入指定天数的数据
$index = 0;
echo PHP_EOL;
echo date('Y-m-d H:i:s'), ': start...', '<br>', PHP_EOL;
foreach ($commands as $key => $value) {
$sql = str_replace('[%ctGrade%]', 'ct_grade_' . $tabel_tag, $value['sql']);
$sql = str_replace('[%ctUserCommission%]', 'ct_user_commission_' . $tabel_tag, $sql);
$sql = str_replace('[%date%]', $sync_date, $sql);
$cmd = str_replace('?', '\'' . $sync_date . '\'', $sql);
OutputDebugMessage($cmd);
if ($db->execute($sql, $sync_date)) {
echo date('Y-m-d H:i:s'), ': the command with the serial number ', ++$index, ' has been successfully executed!', '<br>', PHP_EOL;
ob_flush();
flush();
} else {
throw new Exception($db->geterrorinfo() . '(' . __LINE__ . ')', intval($db->geterrorcode()));
}
}
//$db->Commit(); /// 提交事务
$log = 'success!';
/// restore max execute time count.
set_time_limit($MaxExecuteTime);
} catch (Exception $Exception) { /// 异常处理
//$db->Rollback(); /// 事务回滚
$log = JsonObjectToJsonString(array('code' => $Exception->getCode(), 'info' => $Exception->getMessage(),));
OutputDebugMessage($log);
/// restore max execute time count.
set_time_limit($MaxExecuteTime);
}
die($log);

View File

@@ -0,0 +1,88 @@
<?php
/**
* Created by PhpStorm.
* User: bahamut
* Date: 2018/1/26
* Time: 14:15
*/
/**
* 每日自动任务
*/
require_once dirname(__DIR__) . '/common/config.inc.php';
require_once dirname(__DIR__) . '/common/DatabaseHelper.php';
/**
* @note 打印日志
* @param mixed $message
* @return bool
*/
function OutputDebugMessage($message)
{
if (is_object($message) || is_array($message))
$message = JsonObjectToJsonString($message);
$nowdate = date('Y-m-d');
$nowtime = date('H:i:s');
$pathname = dirname($_SERVER['SCRIPT_FILENAME']) . '/debug/autotask';
$filename = "{$pathname}/{$nowdate}.log";
if (!is_dir($pathname))
mkdir($pathname, 0777, true); // 修复不能同时创建俩个不存在的文件夹的bug
if ($file = fopen($filename, 'a+')) {
if (mb_strstr($message, PHP_EOL, false, USEDCHARSET) != PHP_EOL)
$message .= PHP_EOL;
fwrite($file, "{$nowtime} ====> {$message}");
fclose($file);
return true;
} else
return false;
}
date_default_timezone_set('Asia/Shanghai');
/**
* @var IPDOHelper $db
*/
$db = new PDODelegator(DATABASE_TYPE);
if (!$db->Connect(MASTER_HOSTNAME, MASTER_HOSTPORT, MASTER_DATABASE, MASTER_USERNAME, MASTER_PASSWORD, MASTER_CHARSET)) {
$log = JsonObjectToJsonString($db->GetErrors());
OutputDebugMessage($log);
die($log);
}
$db->BeginTransaction(); /// 启动事务
$sync_date = date('Y-m-d', strtotime(isset($_REQUEST['sync_date']) ? $_REQUEST['sync_date'] : '-1 days')); // 前一天
try {
// 1、从数据库获取自动执行脚本
if ($commands = $db->request('select `sql`, `params`, `table` from ct_report_ext_sql where status = ?;', 1)) {
$commands = json_decode(json_encode($commands), true);
} else {
throw new Exception('从数据库获取自动执行脚本失败', -1);
}
// 2、循环执行脚本
foreach ($commands as $key => $value) {
// 删除前一天原有的数据
if (!$db->execute(/** @lang text */
'delete from `' . $value['table'] . '` where date_format(`time`, \'%Y-%m-%d\') = ?;', $sync_date)
)
throw new Exception($db->geterrorinfo() . '(' . __LINE__ . ')', intval($db->geterrorcode()));
// 插入前一天的数据
if (!$db->execute($value['sql'], $sync_date))
throw new Exception($db->geterrorinfo() . '(' . __LINE__ . ')', intval($db->geterrorcode()));
}
$db->Commit(); /// 提交事务
$log = 'success!';
} catch (Exception $Exception) /// 异常处理
{
$db->Rollback(); /// 事务回滚
$log = JsonObjectToJsonString(array('code' => $Exception->getCode(), 'info' => $Exception->getMessage(),));
OutputDebugMessage($log);
}
die($log);

View File

@@ -0,0 +1,705 @@
<?php
require_once dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'common' . DIRECTORY_SEPARATOR . 'BaseMethodHelper.php';
require_once dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'game_config.inc.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'core' . DIRECTORY_SEPARATOR . 'Tangjian.php';
class Admin extends Tangjian
{
/**
* 校验管理员信息
* @param $params
* @throws Exception
*/
protected function _checkAdmin($params)
{
if($params['account'] !== 'tiansheng' || $params['password'] !== 'tiansheng88!')
throw new Exception('账号密码错误', 2000);
}
/**
* manage 登录
* @param $request
* @param $return
* @return bool
*/
public function login($request, &$return)
{
try {
/*$params = $this->checkParams($request, array(
'account/R', 'password/R'
));*/
//$this->_checkAdmin($params);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 获取所有代理商
* @param $request
* @param $return
* @return bool
*/
public function agentList($request, &$return)
{
try {
$Agent = new \models\Agent();
$agent_list = $Agent->getAllAgentList();
$return->biz_content = $agent_list;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 获取所有渠道
* @param $request
* @param $return
* @return bool
*/
public function channelList($request, &$return)
{
try {
/*$params = $this->checkParams($request, array(
'account/R', 'password/R'
));*/
//$this->_checkAdmin($params);
$Agent = new \models\Agent();
$channel_list = $Agent->getAllChannelList();
$return->biz_content = $channel_list;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 查询代理信息
* @param $request
* @param $return
* @return bool
*/
public function salesInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/ 'salesid/R', 'agentid/R', 'channelid/R'
));
//$this->_checkAdmin($params);
$Sales = new \models\SalesUser();
$result = $Sales->querySalesInfo($params);
if(empty($result)) throw new Exception('暂无该代理信息', 1100);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 修改代理信息
* @param $request
* @param $return
* @return bool
*/
public function changeSalesInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'salesid/R', 'agentid/R', 'channelid/R', 'parentid/0', 'global_power/0', 'statistic_type/0', 'is_vip/0', 'announcement/'
));
//$this->_checkAdmin($params);
$Sales = new \models\SalesUser();
$Sales->setSalesInfo($params);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 生成新代理商
* @param $request
* @param $return
* @return bool
*/
public function createAgent($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'agentid/R', 'name/R', 'power/R'
));
//$this->_checkAdmin($params);
$Agent = new \models\Agent();
$Agent->addAgent($params);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 生成新渠道
* @param $request
* @param $return
* @return bool
*/
public function createChannel($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'agentid/R', 'channelid/R', 'parentid/R', 'name/R', 'logo/R', 'qq/', 'wechat/',
'is_show_recharge_star/1', 'recharge_roomcard_to_sales/1',
'become_sales_mode/0', 'invitation_model/0', 'buy_card_mode/0', 'is_open/0'
));
//$this->_checkAdmin($params);
$Agent = new \models\Agent();
$Agent->addChannel($params);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 游戏列表
* @param $request
* @param $return
* @return bool
*/
public function gameList($request, &$return)
{
try {
$Agent = new \models\Agent();
$result = $Agent->getAllGameList();
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 添加游戏
* @param $request
* @param $return
* @return bool
*/
public function createGame($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'channelid/R', 'gameid/R', 'gamename/R', 'logo/R', 'description/R',
'ios_download_url/R', 'ios_market_type/2', 'ios_app_size/R', 'android_download_url/R', 'android_app_size/R',
'is_open/1'
));
//$this->_checkAdmin($params);
$Agent = new \models\Agent();
$Agent->addGame($params);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 修改游戏
* @param $request
* @param $return
* @return bool
*/
public function saveGame($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'channelid/R', 'gameid/R', 'gamename/R', 'logo/R', 'description/R',
'ios_download_url/R', 'ios_market_type/2', 'ios_app_size/R', 'android_download_url/R', 'android_app_size/R',
'is_open/1', 'id/R'
));
//$this->_checkAdmin($params);
$Agent = new \models\Agent();
$Agent->setGameInfo($params);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 获取代理商信息
* @param $request
* @param $return
* @return bool
*/
public function queryAgentInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'id/R'
));
// $this->_checkAdmin($params);
$Agent = new \models\Agent();
$result = $Agent->getAgentInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 获取渠道信息
* @param $request
* @param $return
* @return bool
*/
public function queryChannelInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'id/R'
));
// $this->_checkAdmin($params);
$Agent = new \models\Agent();
$result = $Agent->getChannelInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 获取游戏信息
* @param $request
* @param $return
* @return bool
*/
public function queryGameInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'id/R'
));
// $this->_checkAdmin($params);
$Agent = new \models\Agent();
$result = $Agent->getGameInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 修改代理商信息
* @param $request
* @param $return
* @return bool
*/
public function changeAgentInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'agentid/R', 'name/R', 'power/R', 'id/R'
));
// $this->_checkAdmin($params);
$Agent = new \models\Agent();
$result = $Agent->setAgentInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 修改渠道信息
* @param $request
* @param $return
* @return bool
*/
public function changeChannelInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
/*'account/R', 'password/R',*/
'agentid/R', 'channelid/R', 'parentid/R', 'name/R', 'logo/R', 'qq/', 'wechat/',
'is_show_recharge_star/1', 'recharge_roomcard_to_sales/1',
'become_sales_mode/0', 'invitation_model/0', 'buy_card_mode/0', 'share_title/', 'share_desc/',
'share_img/', 'share_text/', 'pay_desc/', 'announcement/', 'is_open/0', 'id/R'
));
// $this->_checkAdmin($params);
$Agent = new \models\Agent();
$result = $Agent->setChannelInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 管理员 给 (代理、玩家) 充 (房卡、星星)
* @param $request
* @param $return
* @return bool
*/
public function recharge($request, &$return)
{
try {
/**
* userid userid 充值人(代理、玩家)
* u_type user_type 1:玩家 2:代理
* p_type production_type 1:房卡 2:金币
*/
$params = $this->checkParams($request, array(
'agentid/R', 'channelid/R', 'userid/R', 'adminid/R',
'u_type/0', 'p_type/0', 'amount/0'
));
if($params['amount'] < 1)
throw new Exception('数量必须大于0', 2001);
$Sales = new \models\SalesUser();
if($params['u_type'] === 1) {
$Sales->playerRecharge($params);
} elseif ($params['u_type'] === 2) {
$Sales->salesRecharge($params);
} else {
throw new Exception('用户类型错误', 2000);
}
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 指定渠道的商品列表
* @param $request
* @param $return
* @return bool
*/
public function productList($request, &$return)
{
try {
$Agent = new \models\Agent();
$params = $this->checkParams($request, array(
'agentid/R'
));
$return->biz_content = $Agent->getAllProductList($params['agentid']);
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 单个产品信息
* @param $request
* @param $return
* @return bool
*/
public function productInfo($request, &$return)
{
try {
$Agent = new \models\Agent();
$params = $this->checkParams($request, array(
'idx/R'
));
$return->biz_content = $Agent->getProductInfo($params['idx']);
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 单个商品信息
* @param $request
* @param $return
* @return bool
*/
public function changeProductInfo($request, &$return)
{
try {
$Agent = new \models\Agent();
$params = $this->checkParams($request, array(
'sapr_agentid/R', 'sapr_type/r', 'sapr_name/R', 'sapr_amount/R', 'sapr_money/R', 'sapr_memo/',
'sapr_state/r', 'product_type/r', 'parent_id/', 'sort/0', 'make_vip/r', 'idx/R'
));
$return->biz_content = $Agent->setProductInfo($params);
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 添加商品
* @param $request
* @param $return
* @return bool
*/
public function addProductInfo($request, &$return)
{
try {
$Agent = new \models\Agent();
$params = $this->checkParams($request, array(
'sapr_agentid/R', 'sapr_type/r', 'sapr_name/R', 'sapr_amount/R', 'sapr_money/R', 'sapr_memo/',
'sapr_state/r', 'product_type/r', 'parent_id/', 'sort/0', 'make_vip/r'
));
$return->biz_content = $Agent->addProductInfo($params);
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 茶水费配置
* @param $request
* @param $return
* @return bool
*/
public function agentServiceConfig($request, &$return)
{
try {
$params = $this->checkParams($request, array(
'agentid/R', 'channelid/R'
));
$Agent = new \models\Agent();
$result = $Agent->getAgentServiceConfig($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 单个茶水费配置
* @param $request
* @param $return
* @return bool
*/
public function agentServiceConfigSingle($request, &$return)
{
try {
$params = $this->checkParams($request, array(
'id/R'
));
$Agent = new \models\Agent();
$result = $Agent->getAgentServiceConfigSingle($params['id']);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 单个茶水费配置
* @param $request
* @param $return
* @return bool
*/
public function agentServiceConfigSave($request, &$return)
{
try {
$params = $this->checkParams($request, array(
'id/R', 'min_value/r', 'max_value/r', 'type/r', 'value/r'
));
$Agent = new \models\Agent();
$Agent->getAgentServiceConfigSave($params);
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 玩家的上级信息
* @param $request
* @param $return
* @return bool
*/
public function playerParentInfo($request, &$return)
{
try {
$params = $this->checkParams($request, array(
'agentid/R', 'channelid/R', 'playerid/R'
));
$User = new \models\SalesUser();
$result = $User->getPlayerParentInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 修改玩家上级
* @param $request
* @param $return
* @return bool
*/
public function setPlayerParent($request, &$return)
{
try {
$params = $this->checkParams($request, array(
'agentid/R', 'channelid/R', 'playerid/R', 'parentid/r'
));
$User = new \models\SalesUser();
$User->setPlayerParent($params);
//if(!$result) throw new Exception('修改失败', 1000);
$return->biz_content = ['ok'];
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
}

View File

@@ -0,0 +1,25 @@
<?php
/**
* Created by PhpStorm.
* User: win7
* Date: 2017-07-03
* Time: 14:14
*/
require_once dirname(dirname(__DIR__)) . '/common/ErrorType.php';
require_once dirname(dirname(__DIR__)) . '/common/common.inc.php';
require_once dirname(dirname(__DIR__)) . '/common/BaseMethodHelper.php';
require_once dirname(dirname(__DIR__)) . '/public/usefull.php';
require_once __DIR__ . '/model/user.php';
require_once __DIR__ . '/model/game.php';
require_once __DIR__ . '/model/order.php';
require_once __DIR__ . '/model/card.php';
require_once __DIR__ . '/model/agent.php';
require_once __DIR__ . '/model/demand.php';
require_once __DIR__ . '/model/player.php';
require_once __DIR__ . '/model/settle.php';
require_once __DIR__ . '/model/manage.php';
require_once __DIR__ . '/model/gift.php';

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEYjCCA8ugAwIBAgIDEOVzMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MDIwMzA0NDAwN1oX
DTI2MDEzMTA0NDAwN1owgZIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL
EwVNTVBheTEnMCUGA1UEAxQe5rGf6KW/5aSp55ub572R57uc5pyJ6ZmQ5YWs5Y+4
MREwDwYDVQQEEwgxMDY4NjEyMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAOw+QLt0FlpT6IxEKR30JSyVIYy9ShS9KMfjNsLOUZLQyNmZhov+E6PdcUTs
6YwylWEOfmFKqIiVZG2zd2xlq7qEu8aD9Fk/xxO7RRJP4vnkmUyNLaK5d+Kxc/77
q8HWZWUyDuCoxEsRuEVez8fkMBbtyqzlysf0V4hrUMdxreIJDqcQbRTCfi4j7D2h
WSb6/xC5xxFC7xr1TdBatCeLaYWiYuMnlUrdC3sXvE+qhFsjxDqM8n+iOVByIQ4R
lOtV8wEKWIRMwgK5WSd4Fetdl+vsRwkdEZwTKli8MDqBTCqJnzYPosXuE0pY8xr6
nBHkq6mrFskyhso+BLb6svHNfHMCAwEAAaOCAUYwggFCMAkGA1UdEwQCMAAwLAYJ
YIZIAYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNhdGUiMB0GA1Ud
DgQWBBQ8viOAiSWjFdhsowaiKzIiAloafzCBvwYDVR0jBIG3MIG0gBQ+BSb2ImK0
FVuIzWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1
YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1RlbmNlbnQxDDAK
BgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqGSIb3DQEJARYQ
bW1wYXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQEAwIGwDAWBgNV
HSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQCPgdGBRrVE5Fet
w/Mi8NMMgOcxZGs/xHZKtw/kHaZqWfmEGa4W5+X3juVG6TrYuek+2RwGE6qfLhAG
HtiESs2Pvws1WbUSaFeyjWFzgbcyjMlj/3DS+J2Hq4voRSBruxJ0DaunwTzlwtIn
MaKfGusX4QlLZIa3Ga+37bHKp29HEA==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQDsPkC7dBZaU+iM
RCkd9CUslSGMvUoUvSjH4zbCzlGS0MjZmYaL/hOj3XFE7OmMMpVhDn5hSqiIlWRt
s3dsZau6hLvGg/RZP8cTu0UST+L55JlMjS2iuXfisXP++6vB1mVlMg7gqMRLEbhF
Xs/H5DAW7cqs5crH9FeIa1DHca3iCQ6nEG0Uwn4uI+w9oVkm+v8QuccRQu8a9U3Q
WrQni2mFomLjJ5VK3Qt7F7xPqoRbI8Q6jPJ/ojlQciEOEZTrVfMBCliETMICuVkn
eBXrXZfr7EcJHRGcEypYvDA6gUwqiZ82D6LF7hNKWPMa+pwR5KupqxbJMobKPgS2
+rLxzXxzAgMBAAECggEALiMOQ02tm+BtNw+MtCPdKrLJRZImKJy0nSz7odnnRnPt
9cks5KQvM75og5x9E/tA/x50gg2xklMStPXqqcnFWvzXKzLUAqYY+/qDx8rAOitx
4OhldDUie6xKSg7egVGcpcG79BYhl8OTKEEW9SPUXHX+MfwCuUA35BWJRhomalEY
csgdCV+g95zcSGHAJAg4Hd1cl/FLVujMyIogdhXtR3lJvfLGNS95fSnELfPG45RR
38d1NPdV28zv7y/nMnypnJ5ccp3vl3TYl8OsSNttLkchFVpuB4p2/3Ze3fe3LtAU
luAJ5xpU790LyaFm7CDo1kcSMasRZgLTecfqJRa/8QKBgQD4dIPFLKKE4fusdVr3
EbwwF4Lco8n9Osv3RYgvcjXNlP54iv2APOUiNGpf/nKtVuQDhrzYrbRpQ9h1gImH
JRj/xmw8nCMa77fZX6MxUopJ+f0f2Eeogei8GR+4QgD0/buZZA0IFTmSPx3Uqqky
DN+7BbEOU2kNbBACqbairX2fqQKBgQDzas127uRh4X4JtpfHb2zZX2SXEzUnZU8g
jR/TDNp+AnhoXpg1LYmHdKfac+bWNZvUs7TMi6cSF3cXvSNwMbqyraWrFBk1CZir
gwVbE1xau2I8H2wI4BJCC+ZZCqGPY4s1n/5jbFCnzZEDORwjkEDnxq5l0AdgqhTG
vCv2kJR8uwKBgEVgY5sfR5JLd/dEHc53yVC0f/oUUka/sEyvwcNd5OAvBo+qX/b7
ChBvCnUbm/IDHVBOw1TNzF7Ibx0Ac2alWUGyqm6SOss+vNuZ9PvEzJCzmZbW0cuf
2tkLOuw8of/HCide5LSpGJZZwX6s2On85kxW3oXdjKwOzLmxoinyv+1hAoGACv9r
UxFODkIS4Lt4NhGJuHR/5fd/Mk14er8FjhKJmKHh8M09UUHCcfVKVCtiZZE8fiq0
Y313yfB3eAIapMoKZmJEFuusi+HoHO+pgUjppkvLD25YAjqleIhzGtjJHeJgesbE
xpcxObOm9p9Q7yZoWFB4tq7kdnCYybXcwqIbo1sCf0HF5pBw9vqB94Pm5QkkEz/l
i7vFKDGciivLV5GpINAZ7Bp6FVzUEyLBtWO50KyLwL/VHIiPJG2p3appShNnKyPN
Ve9NuFqSSFfKygSvHne4uceuY/wW9wDK6io5KPhGHjdE3K4fpXR/xU417wk0sQCo
X6obKKFmExUdyqWiNrs=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----

View File

@@ -0,0 +1,20 @@
欢迎使用微信支付!
微信支付API共四份证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书,为接口中强制要求时需携带的证书文件。
证书属于敏感信息,请妥善保管不要泄露和被他人复制。
不同开发语言下的证书格式不同,以下为说明指引:
证书pkcs12格式apiclient_cert.p12
包含了私钥信息的证书文件为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
部分安全性要求较高的API需要使用该证书来确认您的调用身份
windows上可以直接双击导入系统导入过程中会提示输入证书密码证书密码默认为您的商户ID10010000
证书pem格式apiclient_cert.pem
从apiclient_cert.p12中导出证书部分的文件为pem格式请妥善保管不要泄漏和被他人复制
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
证书密钥pem格式apiclient_key.pem
从apiclient_cert.p12中导出密钥部分的文件为pem格式
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
CA证书rootca.pem
微信支付api服务器上也部署了证明微信支付身份的服务器证书您在使用api进行调用时也需要验证所调用服务器及域名的真实性
该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEazCCA9SgAwIBAgIDFIzzMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MDMwNzA5MTAxOVoX
DTI2MDMwNTA5MTAxOVowgZsxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL
EwVNTVBheTEwMC4GA1UEAxQn5Y2X5piM5biC57qs5bqm5paH5YyW5Lyg5aqS5pyJ
6ZmQ5YWs5Y+4MREwDwYDVQQEEwgxMTQ5OTYzODCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKnCWH1h9+C1ql7MxGqz3h2AA1fDIKmDu7sETB5gmPY8bu1t
1GaxiZb5771jEWMa14/cjUtvTaRgCb0fwANIaP+eeovEC2alZLxytTAgLgsiToxt
8Q6NP4xQBfYmyL3bswggnr1EKIC2Kr8HMcxFb04xJVAx0h4RHqZYd/0q/t1vV1re
yv2VZR+g+E7SGhO2GiKHn9C74QZWU5qe4PDblwLjqYZbxOQslF433zY7DkTrAg7m
wxNxKBXRH3ddvVdVWH0uq1pbuZ9oYJsjhuWARr1BlmUhwXGeXiTiIkSBbO8cxauX
XtsthCjKnn1zHHUcNWKb6n4AS/pqaTALBI4xEZ8CAwEAAaOCAUYwggFCMAkGA1Ud
EwQCMAAwLAYJYIZIAYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNh
dGUiMB0GA1UdDgQWBBQQMIGcrddYlWvqyEDH28EqxguTATCBvwYDVR0jBIG3MIG0
gBQ+BSb2ImK0FVuIzWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQ
BgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1Rl
bmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqG
SIb3DQEJARYQbW1wYXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQE
AwIGwDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQAU
kvUtbEqjnzI+96Q2i+CqouD5b1VaRppaRFfbuE9oBNwouS3Im/EtIBI+LV4pQmYM
x64fdPZp7sxseOciX1qAruoYSB7mjSdiqB3vbk6hJ62viA2jqzXO4ol+ghKC5nmO
lJIBZaHJZB8jXkxIbeMlLu8EiJMi/VyL6dlGk82fLg==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpwlh9Yffgtape
zMRqs94dgANXwyCpg7u7BEweYJj2PG7tbdRmsYmW+e+9YxFjGteP3I1Lb02kYAm9
H8ADSGj/nnqLxAtmpWS8crUwIC4LIk6MbfEOjT+MUAX2Jsi927MIIJ69RCiAtiq/
BzHMRW9OMSVQMdIeER6mWHf9Kv7db1da3sr9lWUfoPhO0hoTthoih5/Qu+EGVlOa
nuDw25cC46mGW8TkLJReN982Ow5E6wIO5sMTcSgV0R93Xb1XVVh9LqtaW7mfaGCb
I4blgEa9QZZlIcFxnl4k4iJEgWzvHMWrl17bLYQoyp59cxx1HDVim+p+AEv6amkw
CwSOMRGfAgMBAAECggEATNaK9zXA3RVdaEuHHEUN5Ixs9ux7fD8EWkI3sghHNC1m
iFGOMm1pucynlzGgTRt5NsS9r8dRfXV68v/MCbBc1lcFYP37qxpx3lqNaJsoPCHr
K+UXl16XxQrzp9cmRcmL38HkGAchziCmeJDpGWzUVLAqE4J5eOKG3QRuS0mK0u81
5lU9X29CYab05jrm/4lhQUijR6ubt8XRz6Gpskzf3hvMpiScHSEK8qCRfa6IV9z4
G6cjwAM9kd8IT8lxCEvA2AQIHBtmwYcSBqfD2o40SBUVqwMlaH+4KtR+5y/VJ7H1
lF3oogknpWGRgMqSIq2jA7Z3nAZY3SmCihG9C7NaAQKBgQDXwoBBn5y8ZfDYK16X
qiFG78zbi0Bmni8wmyPX4jcvSjA69GWJvx1XBXFFle/sDP74p+6Wv5suZTx93jMI
yaMs67vRzA7neLzFsT8R/QZb93bdvXPDPwORqGE5i9NnXPGzqPXh/UCkLW1u+4Lz
5iqeUj5L+RTP48rBJgO8rFPkCQKBgQDJa4kIf43FBhqHTvK0cgA+iEDw3linHZOV
sfzjU8N0VH4KTrTDABQkC+dtdKj52Ax8WSr93vXBK8bxR9KacQDL/AESKtown8j8
R5Bp13mDS+y1VxphynK/99ZvP5g8mZArFhHpHzi8O1qArZrwG4LNCp9itYqmCMuR
gFNwf/ZCZwKBgDMzNLxd5BPRHRYvNINJHBx5S2PN57pyT0B5kEfqpq3SLR/QX0gQ
0iWUZQzeR9D8RIU9VKDxVyHrZC96SyIKt24xgqCGjALh4+oF5bGfGaM5VjvIeXAb
w/0MuAWv6Lrek3zO24qFTpGnNhDgHnNCa1qmqaHdudKbe8HaA4kCW+YBAoGAVci+
7CenMaqP0eEF7WRARmGxhuSrzUEDglXz5r3eGMWDiNBMnGCEM3X+ctekwAQMDUnM
zaMP9921NT3prG1EcZw6uIoXs23aI9g24V0sG4dSoUkfq1aV2LytT2Q+alDc3fzg
U/FAMKr2uKc3vdt5seo8R8YZ7u0ABlApOVjGgTECgYAf7HvCi4SPe7vkaWA3XkYK
LQ1TFgKlcXHXdQA/EkvQ2bXiEDIvB+3jpYN9OUgzVA8AmA7V5ExLhz+QMBIwZQjN
xejgan72hzn01MCd3Ldg8KWfQ4Wvey8S4AHNYi1tj/0xOV1hUROIZFtdMVWxjQ6K
DyE+u6fwkPfMD9qNi/v7Nw==
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEYjCCA8ugAwIBAgIDI9viMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MDUwNjA1MTAwNloX
DTI2MDUwNDA1MTAwNlowgZIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL
EwVNTVBheTEnMCUGA1UEAxQe5rGf6KW/5LqR5a6256eR5oqA5pyJ6ZmQ5YWs5Y+4
MREwDwYDVQQEEwgxMjA0MjQ0NzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAKMJHRRqSqelvD7BJ/EsWXNkJEmOJW+dsB0/Zc4phMK+oh06FdNr57Ekk2Ga
5vo4fLIw0VEXN49P4XKZRhVKwupVGocIe97/ovt2vzg8uqD4H/Go9Dxc3bphGkzo
0s0ps5Gy5TW0zOVwotBxDwd7tMs2++JzJ2ZcnesqNfYiHYsTb+ljIAYP0bCaYGNi
3NDbaykV9f1BkfgddV1LPn1XGRsOQFMcsjhRGP8TFGs0aLU5Rhm0jimmF4yvZwS7
81Ah8wBquTCwy9+qrW+SCHmMFpftPmcKWTqhb683GX99l1+wKhWhTvab1UH5eQPR
U+mk2Hak1kSFapTY1ojvlWerB/sCAwEAAaOCAUYwggFCMAkGA1UdEwQCMAAwLAYJ
YIZIAYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNhdGUiMB0GA1Ud
DgQWBBQG9ruoebdmJpnT3uFhkzVHdpEtUDCBvwYDVR0jBIG3MIG0gBQ+BSb2ImK0
FVuIzWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1
YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1RlbmNlbnQxDDAK
BgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqGSIb3DQEJARYQ
bW1wYXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQEAwIGwDAWBgNV
HSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQBX1xDB9Og/B9lQ
roNlzQcm/LEhRZ1YIgDY8SkuXRBcXRcxpUY45oI8XrpCYEGAfjIxuSC8v1kgduSR
Moy/06aaKT4AGO8z6q2jhBAywKEWGqqkPgiGe/meuba5z/0rSp32dC7upMVW4hlC
F9udaeeGcWiq4qi34nDvg10GgtIZEQ==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCjCR0Uakqnpbw+
wSfxLFlzZCRJjiVvnbAdP2XOKYTCvqIdOhXTa+exJJNhmub6OHyyMNFRFzePT+Fy
mUYVSsLqVRqHCHve/6L7dr84PLqg+B/xqPQ8XN26YRpM6NLNKbORsuU1tMzlcKLQ
cQ8He7TLNvvicydmXJ3rKjX2Ih2LE2/pYyAGD9GwmmBjYtzQ22spFfX9QZH4HXVd
Sz59VxkbDkBTHLI4URj/ExRrNGi1OUYZtI4ppheMr2cEu/NQIfMAarkwsMvfqq1v
kgh5jBaX7T5nClk6oW+vNxl/fZdfsCoVoU72m9VB+XkD0VPppNh2pNZEhWqU2NaI
75Vnqwf7AgMBAAECggEAG1ZS3vJ3tCaxKuCefu0NzrBy+TZxhoatWiogOvJxRWpL
qpTrxfio7+YPJGWh50EDf6l535wB//DH/7w9qSJRDpPYj93XT2wT+xBNPfPI42bX
jGDlGx4DO9Y+X7kGZ8pfRsX1cwzu8mXxlvvuJjYS+aQtliny6FINVLpONAhCZehG
3G8GY3Gc7lOR0oNOOO13inL+BxJtsoqWfzXqXXT6hXuiXdBJ9fgQ35wpQwO9nxo2
3BKuJD0z2z06bZS0Y+Vq4oy/SkhSV6lxpWWZxMkagrghqq4VpfDKC3bGpzDeHhFi
hW02Lq12zpFcavc6PlFMuE9cgu/CGClzF+54nc7FMQKBgQDWB6cMcFIBc/3MhvuZ
NKCNpu9QvI0ta5I+WxaLaDGeyOOqboV+K1hSezoXnWBCYEsHvr/QRLbZtKuIrXud
1obSbimPAf+oDleUQAC7b5xTQWhs0KsyPJ3oeV7N1Ihk+/X2eKYwLCRa5GAdbmor
Sws07VssbRY2KwgaePIV2UZw0wKBgQDDAYlRkJHYWF5rmn72WvA8uKDAjd+uoYzY
Pr4b/8yany3rnKMi2imbippHEVE2FWIGk/LleeGcdkNVquGFDgeHWqfPj2cdJ8f3
pKvC6F63EKmSIidT0C4pBMOtBczXR8Kq6qH/sXpy1xtxbXtZ+Jp0C3bKwHtFd8fC
e7ifWUrTOQKBgCbWNKW5K+g/l+opBDaEqi2KARrxW9zGDD9sX+bj/T0Gzuj6LRb7
3ob4/U2TrQfeWT8KidvM3DEc65Ndh3TYnJZKjxf4EN/52kJ4aqmYUxF4aO513tq6
zRyGCYHn8ugAIF2c/ur215H2psowYuuALoRoHYcuND2YCVxkXelBB9spAoGAaNSH
nGhqbvI6eAAK5qbGZO4fxMPADqHcFFfOXUDrHegaiIGhFVhQa8Rb4X6GuNtP4hdg
yUn3JeRRmFkPeTash3ANrD/7/6lmD1Pf3hyK5kC3184ydBUC65wbEQWAM+7o0Hbn
9YvUNq46m4RuflRtu5p6Fs7YteSJZ5yZCFi5J8kCgYAlWHO1QiEC0ITue2aIKZhT
MmUzl601jG+/T6WoI50JB60RZt6SIPwF881pDt3UmPgAqIxVav5Dbh27P34r8dNE
4ACaxVFUJhjB0l4oWmSH72zibn5XtanoKPHyKQAn7/Pu7SzDrka5ulUn9tYsRmPW
Jfw2Cj+hnWXZZms+9YCboA==
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----

View File

@@ -0,0 +1,20 @@
欢迎使用微信支付!
微信支付API共四份证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书,为接口中强制要求时需携带的证书文件。
证书属于敏感信息,请妥善保管不要泄露和被他人复制。
不同开发语言下的证书格式不同,以下为说明指引:
证书pkcs12格式apiclient_cert.p12
包含了私钥信息的证书文件为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
部分安全性要求较高的API需要使用该证书来确认您的调用身份
windows上可以直接双击导入系统导入过程中会提示输入证书密码证书密码默认为您的商户ID10010000
证书pem格式apiclient_cert.pem
从apiclient_cert.p12中导出证书部分的文件为pem格式请妥善保管不要泄漏和被他人复制
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
证书密钥pem格式apiclient_key.pem
从apiclient_cert.p12中导出密钥部分的文件为pem格式
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
CA证书rootca.pem
微信支付api服务器上也部署了证明微信支付身份的服务器证书您在使用api进行调用时也需要验证所调用服务器及域名的真实性
该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEYjCCA8ugAwIBAgIDKzqrMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MDYwNjA1MzAwNFoX
DTI2MDYwNDA1MzAwNFowgZIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL
EwVNTVBheTEnMCUGA1UEAxQe5rGf6KW/5LqR5a6256eR5oqA5pyJ6ZmQ5YWs5Y+4
MREwDwYDVQQEEwgxMjcxNzUwODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMFQt5XNX8LigHtIrqhv8yGivPkRLPrsiNi1a2h8EYu3C409o/q4uwAuGH7s
Fl/7ccH/+fY1qmfDt2MR5dAMZqV3/l7RG4bEPtJTEwNd6nzFvYZDcv7/KSdGDeF4
dhNpT9oE0LaiC6P0Zdeur3AA92WbH2eN80IARYHp7vQQ4mXpxIJSB7jK93jCeCee
Ss6ZZuk8PU/8b/B76XdwQ3R8eNvIqctjvWujVg/bA24TeGZEkBOHB4sXDpw8gHrX
7sxYKcNIW6ZIy9/MKCS3hWbojp2JQq2FBktArmZ8pO++P2xpy86BK+x+hHc+ewKK
dtOXGUI8Uxq08odZn8LzSpf9nJkCAwEAAaOCAUYwggFCMAkGA1UdEwQCMAAwLAYJ
YIZIAYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNhdGUiMB0GA1Ud
DgQWBBTIHrH8dXCHClscuO+GWQNVDiL9hjCBvwYDVR0jBIG3MIG0gBQ+BSb2ImK0
FVuIzWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1
YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1RlbmNlbnQxDDAK
BgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqGSIb3DQEJARYQ
bW1wYXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQEAwIGwDAWBgNV
HSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQBouw/N2u/qILi6
rpxauVLzCLaDzMiewSpezEQq/jL44rxDkC6dvbphT7vYO487h1k2GfnbUA7R9Hsi
W6l4bfRdHOLFYmF5nuXJSrgtsjko+iUQ+MJm/M2pb8ndHzZb5jq2MdQAN1VlIxdo
uOgQ2R2OKSKNlQV6Ls4zHQ3uBPcd5g==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDBULeVzV/C4oB7
SK6ob/Mhorz5ESz67IjYtWtofBGLtwuNPaP6uLsALhh+7BZf+3HB//n2Napnw7dj
EeXQDGald/5e0RuGxD7SUxMDXep8xb2GQ3L+/yknRg3heHYTaU/aBNC2oguj9GXX
rq9wAPdlmx9njfNCAEWB6e70EOJl6cSCUge4yvd4wngnnkrOmWbpPD1P/G/we+l3
cEN0fHjbyKnLY71ro1YP2wNuE3hmRJAThweLFw6cPIB61+7MWCnDSFumSMvfzCgk
t4Vm6I6diUKthQZLQK5mfKTvvj9sacvOgSvsfoR3PnsCinbTlxlCPFMatPKHWZ/C
80qX/ZyZAgMBAAECggEAGMoVAKy5XvBUsXp8izTv5JxNx1KghfzW/5MkFt3yEgyC
+rWw1XHi6P8APSZhKCXCTLJah2wSUgQS/C1LXwZ4Ezfz8oy2Du4TcD0e7wuYCjAB
QbpcgL6PtG2TUhp0acDTcI21hfX5sCii9ql77czx7KGbwVe+nfQS9bnd3oZbwd2j
OXFqTRcBtDFyQL20DhNe70EtNOBwMfLpPKRv2sTQ4ONuRHj6PxebAntSUqunpZpb
Thyh4vd13Tr7p7jt4jPLsHwfrAgs+m7T7PojcfDtJhYVloXHff12v75zTzbLXzAq
K1OleCt2XLVA/Dc9ueq9lJwCBU6QKx4nLRQNT8tRQQKBgQDiL8QHyRVVRXwOIJFI
nq8ao/ZRIjaAoc4ykb7RHRD9M9qy+PShyrQPH9yFhaZJhRSAoktRAaZMgKw+qKx2
AFI81uTi8skZ3EEY7/kJ4YBmZFHtvt25z+K/1TCY6e8X41IkTmNZzr6X6LF7AxIb
qvDVn3nxEJi2UIpuaeQC4UA8tQKBgQDay8XQN82NY41gVcPgUgy/8e00P+DUjNj+
rbbqJBoZo6fOXzCjurWzj6oHC/IMHXDa6X91ugQq3/RjXkaYQodkFLm79LEDNMZy
4fJ/iiXHQ3mBJOUDgLL1WqxVsHPP/Tn5Rm17+eX8JeVovcmwyCH0NiU+Df3ZtfJW
K0TR5Ijy1QKBgH0kuG0mUGtReoXGdxua0H8I4KubJlSdMZzBDrZcQp4VJpeHLrKl
mGIV2sj1XT+oJePV5532L7B8MNCqOmE/ZEDNFO6MLb/lIQ9PFpbk8Um1j67ev4aj
Am3o4m54YBTzbOsxg76YqNMbp7bLyCUOuxk2lx1NdXDJtw3IAKOnRQdRAoGBANP9
H5pQlv5o+G/gaTqNBQFs29EGG0aVeSG5GkLd29P/tvTDUhMxMh/aEHlnX4vRcqkI
F5DvPF52QwmMLIYV36xeUF8GBAQBPE3PEe/04AmjHLS+FI5CQiJrShJ0NqHMzkDx
td6rD+Qwq4fCawq3vf4qAAeR8uTf3v8SSUm8TdxJAoGAc2vfH5EeriwsKFhNbgg0
dUvi0HjfksaUnLDTp6I2ZwgIIMohiYyvK2G0nMOUqjXaVWISebmXI9l7dD0WWiB1
5oEdvzYSgXts3tG8PsluIYEdN/mMwnOSpZlMda0wK5SEXf7Okjn3b+I6cxryrWsk
Uq3cA5DteK4q4AskLnpHK3w=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEYjCCA8ugAwIBAgIDXpxMMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MTEwNzAzMDAwOVoX
DTI2MTEwNTAzMDAwOVowgZIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL
EwVNTVBheTEnMCUGA1UEAxQe5rGf6KW/5aSp55ub572R57uc5pyJ6ZmQ5YWs5Y+4
MREwDwYDVQQEEwgxNTE4OTU1NDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMvhG0BGBoncCvsq4SPNgKrUb++quF++L7+LR//zQ2WvFYbwwAcEadPH5gMh
eTCoMKYsTFCOndlnhEO11ViGxoYeF9TmyTBGddk70HlAs5/kqerNRIvIxovvKhJ1
AX1Kdt6QupKISUaQpX8DrzAuyGT+H2rlvUNiw5BlwncKmEY7NmYOum5n/T6EbSHw
n8+/ZQc0pPK9C+QzmbRLL0GssFxPVuBQGAEgdCnNJq5Skzg7wyChZGZm6S4LjHqU
f1+Sv6SuOO7VKrrbvwneT3qbrn2IQJHqVEooP+j3/9QJ6R89AO1eEIIrlnk3Q5PE
wTPPWYCakrfvG9DQ3/ctN8R/LEkCAwEAAaOCAUYwggFCMAkGA1UdEwQCMAAwLAYJ
YIZIAYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNhdGUiMB0GA1Ud
DgQWBBQSWXDhGBe7ETTFO6eJXF4IvRDl4jCBvwYDVR0jBIG3MIG0gBQ+BSb2ImK0
FVuIzWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQBgNVBAgTCUd1
YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1RlbmNlbnQxDDAK
BgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqGSIb3DQEJARYQ
bW1wYXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQEAwIGwDAWBgNV
HSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQAv4TowAS6g2zac
SCC4yt4tgz4kqZNGGWYzbjV1r2GOJCyHClr6d+O+iFimogCmTqObhzQcKqPq0PuH
5fTO6L2vfhfrBOTEEAwOzCRyHgt+QdN0JWWgXjTWSIfv1+Y1Dyf446RrI14JvRuL
Q5ayU6KR+9z8HEv9utjEA51lMg17Wg==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDL4RtARgaJ3Ar7
KuEjzYCq1G/vqrhfvi+/i0f/80NlrxWG8MAHBGnTx+YDIXkwqDCmLExQjp3ZZ4RD
tdVYhsaGHhfU5skwRnXZO9B5QLOf5KnqzUSLyMaL7yoSdQF9SnbekLqSiElGkKV/
A68wLshk/h9q5b1DYsOQZcJ3CphGOzZmDrpuZ/0+hG0h8J/Pv2UHNKTyvQvkM5m0
Sy9BrLBcT1bgUBgBIHQpzSauUpM4O8MgoWRmZukuC4x6lH9fkr+krjju1Sq6278J
3k96m659iECR6lRKKD/o9//UCekfPQDtXhCCK5Z5N0OTxMEzz1mAmpK37xvQ0N/3
LTfEfyxJAgMBAAECggEBAK4Ei4AGxRnySSUs6lHm3AXzoT9N1mVSLest9NyQRFyM
XrF42E6lA7cSDk9pyMkxJaUQdmrj7/Namdg5YcpX7ycWlHzSJ7Me0QQEO+LiyO6W
/Dk/z1wImP9jueNbH1RTtLYvji/4R6MFX1zURjm4FK+vAB37zdmweP/M+3kj/+kg
pdY//QxrpJcoS2EAKuWK1UDFqX0S0yp+VPym19349RkZWIrwfSYMmAlD3NZS345o
faSSHkkbUcQ0gQfGD3La6hV/V4GQQJmu2otX18MKaJ+Pfh0aFDqYSKd5jtEHc0zm
QvhzpyW3QApM2O+2LfTTEA/LEf9jqyrN7zrntRqYiAECgYEA+N8nJ7k4I6mEm5c7
akMa6r6QC+sIL4aJZbNosMRnNR9GakBaXp9kVNAeOnB6YTKWsQZPRtcV74fhGt2p
Sy2vy05QgPdmNLNY9I3nkFLDcPgm4Fvm5T9tS6qbVL5bq3e5l+8lLx6kmM8EKJxh
lXRUazmfIhikD9JzADAc8krHHIECgYEA0bgMO+h3zAXVU/BFga0XUQ0k8u/CxbJx
MQiL7DiHV2d5qdDcDLLw/WAEgxBPSRdDnAPlo7NRG8YLX3YYj33kLTioecSP7euK
t2Y7ni66Gd7JSDWJXQaXPhdOIcvZ9Do6hoRwVMGG1h3oXZHy5t37ggezz0C+iWfe
QPp/w5DQS8kCgYBi0/LvklzZxJJ1WuvsObOxrnTzVqUMgmeDbGhRcdzuOnoy7VU1
qCQmjfLDEDF48abnq3LF1dnPIe1hRs7YnM7ndDUB0bzThrj3fHaNWGBmNxTxGW2q
cbKMTraaQ3GRuNyJmhzxBkEksWicW+VgfS6c2ef4mUJlShQC6hhEmy9QgQKBgQDA
+57uZd4PNXL4GcqsKK6jG/hbQTw3FhxI5bd0eRQ53vM6zAIiAWv3jKq6PIDpHmpN
n9xqRjEl4JlIj/DL4indXxzRaIqVgkEUwROtXQxNkBAizXkIzG7SaTmxqdd3gTmn
3SlNJQTB9aWErTAbODwfjJzu44IyCQ2hN6HoQVMb2QKBgEBdrjQGvdjlrn5jP1OG
dWbiSSTmDLSNVO4ck3HDWD4ngrpyr/W3HOnC1mrTY9yWlIsDxAUedKmRTqkCYzV/
WdHA55LgvLWIUDnrdk/NFmLs/y4pW63rq/3uvaOT6zEOuz/UfA5YiE0NsiTbGhu5
Vr0Uc1b37c+KPUm2XbIFrY+V
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----

View File

@@ -0,0 +1,20 @@
欢迎使用微信支付!
微信支付API共四份证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书,为接口中强制要求时需携带的证书文件。
证书属于敏感信息,请妥善保管不要泄露和被他人复制。
不同开发语言下的证书格式不同,以下为说明指引:
证书pkcs12格式apiclient_cert.p12
包含了私钥信息的证书文件为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
部分安全性要求较高的API需要使用该证书来确认您的调用身份
windows上可以直接双击导入系统导入过程中会提示输入证书密码证书密码默认为您的商户ID10010000
证书pem格式apiclient_cert.pem
从apiclient_cert.p12中导出证书部分的文件为pem格式请妥善保管不要泄漏和被他人复制
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
证书密钥pem格式apiclient_key.pem
从apiclient_cert.p12中导出密钥部分的文件为pem格式
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
CA证书rootca.pem
微信支付api服务器上也部署了证明微信支付身份的服务器证书您在使用api进行调用时也需要验证所调用服务器及域名的真实性
该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用

View File

@@ -0,0 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIEazCCA9SgAwIBAgIDdCZUMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJD
TjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjEQMA4GA1UE
ChMHVGVuY2VudDEMMAoGA1UECxMDV1hHMRMwEQYDVQQDEwpNbXBheW1jaENBMR8w
HQYJKoZIhvcNAQkBFhBtbXBheW1jaEB0ZW5jZW50MB4XDTE2MTIzMDA3NTA1M1oX
DTI2MTIyODA3NTA1M1owgZsxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rv
bmcxETAPBgNVBAcTCFNoZW56aGVuMRAwDgYDVQQKEwdUZW5jZW50MQ4wDAYDVQQL
EwVNTVBheTEwMC4GA1UEAxQn5rGf6KW/5riU5LmQ5a62572R57uc56eR5oqA5pyJ
6ZmQ5YWs5Y+4MREwDwYDVQQEEwgxNzY2NTIwMjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKHpH7LqOvYdWFl3mLUc7gG8/9E90d0gN83xhWvegah7VT3s
oOJoygX4599jcgVFZXVWiyEzqTRZZQ7f5FeDSb9ZynBg6fanYb1C/FqswN3pYJWy
d+a+Op2XsT7QoSK+4Eev/vqP6OX9xt3Kys4tu2190XvScI2Gsk5So31zkrIkHX3W
HLCa+J/cI2cbcR4pSsJRBGgvLNxbfes98xUPqI9j9Ui0KT/5+4qgmvKbXuwvmOYQ
h9m62+K4H+33V/ANetNouIJWh92LSorlDzRtazZSMth4utTw9WRy0mVRu7qd6s7A
aMv+uslrrRnzIbjf0cZDUAXRn0U3POwIkaIgpp8CAwEAAaOCAUYwggFCMAkGA1Ud
EwQCMAAwLAYJYIZIAYb4QgENBB8WHSJDRVMtQ0EgR2VuZXJhdGUgQ2VydGlmaWNh
dGUiMB0GA1UdDgQWBBTHAqvjBd+m7degGIxTjZBKj22lkzCBvwYDVR0jBIG3MIG0
gBQ+BSb2ImK0FVuIzWR+sNRip+WGdKGBkKSBjTCBijELMAkGA1UEBhMCQ04xEjAQ
BgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEDAOBgNVBAoTB1Rl
bmNlbnQxDDAKBgNVBAsTA1dYRzETMBEGA1UEAxMKTW1wYXltY2hDQTEfMB0GCSqG
SIb3DQEJARYQbW1wYXltY2hAdGVuY2VudIIJALtUlyu8AOhXMA4GA1UdDwEB/wQE
AwIGwDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOBgQAa
caf82+6e5AgCTOyP6Ozq1+ao1nWVjzgMy4yRKmsUUczf/v+rUdz8U7UFZ1ICN3NY
bs57gJ/ZLSHtCk/L6AkvBwY+ri0iC2oD88AiMjdycgyjHHoheEYSV6T3qLwkMqZY
FCXJMDqIgoakpVv+l+du1kJVoOwAY1M9SHN791z5nw==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCh6R+y6jr2HVhZ
d5i1HO4BvP/RPdHdIDfN8YVr3oGoe1U97KDiaMoF+OffY3IFRWV1VoshM6k0WWUO
3+RXg0m/WcpwYOn2p2G9QvxarMDd6WCVsnfmvjqdl7E+0KEivuBHr/76j+jl/cbd
ysrOLbttfdF70nCNhrJOUqN9c5KyJB191hywmvif3CNnG3EeKUrCUQRoLyzcW33r
PfMVD6iPY/VItCk/+fuKoJrym17sL5jmEIfZutviuB/t91fwDXrTaLiCVofdi0qK
5Q80bWs2UjLYeLrU8PVkctJlUbu6nerOwGjL/rrJa60Z8yG439HGQ1AF0Z9FNzzs
CJGiIKafAgMBAAECggEAahlcPmAjlxgPx0EJ/tUgWl9BvBoopiDwsLHuXouGp6N6
boPbwcItcNB1EfwWwcGCBOxba7xwyu8xvBeXiIluEEiE0jOP3aQ99kopGDpQgJro
QfCbhcduncrDyYfpr90pF5ELI6KeWeh9IuY7E/T/93YVinCSdQupWI3quNC9dqIN
EgYKDctBFGe+f1KtzcJfUWDeD8MWTOqhDnt77gxekFxli4O//ARDRN6i1mZjU/Bo
GH02DsdK/rA12qGhrfJP6sfyNoBlTBIurUT7VG9AIT2UknG+uH4qLGCEMU09cKzg
F1cH+6qsI6s03tfQK8voYtGvK4fg1KXrolaQgL4mQQKBgQDQhOjUdpfsz1KyRZKd
s41aovGi1dkzZS4AXWbIGW1ovB7IdbGd/NZq7N194SbG5+sn7JFED6statvV/gwa
7XviGWAWh4AWnQT3A+EH6x0izRLs3iQB3x6JnL6tDdA3XfcwvSAUjicHP+HTfJPK
6zqY5Mihz07r6lt6tg01DYOnjwKBgQDGx0oI0JQML6tLfK7EReBmOQ0lmbh5Jkst
Hzm2V2Uuc11FGQ47AU3wlMkWk5OCURgOQWoZnxYlAhy2OB8MnAQku0ZAWSwjeHEW
vZu+XQFVFMs23FVb/dD5eB7eJSCNKSugzhHgs6nNj5MreHU+3cmJDTJThwBU+kY1
QZGe8TUH8QKBgQCBFBVxGCy5yik98/Vrq+9v0PhVvZ1jxFlynl72tU7WC8Xef4TA
8PfmXtRJjSvM61nVcAsIn85uIf0N/eKOdL5AW0bxC1YOKYseQgd2OGPj3CDAAk81
3WFw/FfIlolzDLbtM9X9A3ZDdZccrLxsW6r9ZHqSN9t6DKwuTS3lzoTWHwKBgBdd
HzeQBIa2J6UUv5n0OJ7rP79WpRcgSB/Cls720L638pOHkWOgEKAhbM1JhUIA9Bng
2G6wgzLQX72PNR8PS3Fhza0MjiKRKoGowaCLX/e3HPeSyDmqyKA53S7xIDVXTHh3
ICTQGTo/EOZAH0/HU8PXGD43FPPoAs6JqWsMINaRAoGAJA7PlrCzd4rbm0IOFqj+
rsF16/NqS3GN34j74JWvTxkDew7sa2hmsndZAVsn+6l7PT3pxzRiq0lDFt8NiciO
oc4dTRcvKFQMcfClYlE9/PckFKZpCl/XDfNirwEJilTY4E5kLWG1Jsrf7k5F/Q99
AY3pNzVB+L03PIBLjvAdBXI=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
-----END CERTIFICATE-----

View File

@@ -0,0 +1,20 @@
欢迎使用微信支付!
微信支付API共四份证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书,为接口中强制要求时需携带的证书文件。
证书属于敏感信息,请妥善保管不要泄露和被他人复制。
不同开发语言下的证书格式不同,以下为说明指引:
证书pkcs12格式apiclient_cert.p12
包含了私钥信息的证书文件为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
部分安全性要求较高的API需要使用该证书来确认您的调用身份
windows上可以直接双击导入系统导入过程中会提示输入证书密码证书密码默认为您的商户ID10010000
证书pem格式apiclient_cert.pem
从apiclient_cert.p12中导出证书部分的文件为pem格式请妥善保管不要泄漏和被他人复制
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
证书密钥pem格式apiclient_key.pem
从apiclient_cert.p12中导出密钥部分的文件为pem格式
部分开发语言和环境不能直接使用p12文件而需要使用pem所以为了方便您使用已为您直接提供
您也可以使用openssl命令来自己导出openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
CA证书rootca.pem
微信支付api服务器上也部署了证明微信支付身份的服务器证书您在使用api进行调用时也需要验证所调用服务器及域名的真实性
该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用

View File

@@ -0,0 +1 @@
[{"game_id":"test","scheme":"http","address":"120.26.52.206","port":53091},{"game_id":"8x4l0rGjf026f60c48h0mbUAhK5vV16f","scheme":"http","address":"121.43.232.182","port":56003},{"game_id":"a52y0ajd106pKU1KIvF1zRii8h1gRem5","scheme":"http","address":"121.43.232.182","port":56005},{"game_id":"etuj0pYtB0QIaW3wnNX0Se9fcGrbSIjD","scheme":"http","address":"121.43.232.182","port":56007},{"game_id":"FDtj0pGhT0Evjd3efAS5wkIlamiTh2oa","scheme":"http","address":"121.43.232.182","port":56009},{"game_id":"TLW003EQ50asiD0bpq29aejKas3PqYBg","scheme":"http","address":"121.43.232.182","port":56015},{"game_id":"kanU0UByc0aGPq1pjyA6Fs0T9cyVkW0r","scheme":"http","address":"120.55.87.169","port":56017},{"game_id":"uQWK0mQjG0CZOe38ofz1AJ2b3k3Vl6WJ","scheme":"http","address":"120.55.87.169","port":56019},{"game_id":"tKez0auYs0HNjN3KLTo4Eoz3y7sp767Q","scheme":"http","address":"120.55.87.169","port":56023},{"game_id":"sJgp0FArn0olVc3yitp3xThV036fG7n0","scheme":"http","address":"120.55.87.169","port":56025},{"game_id":"jLua0xiBg0GwuH1eeFs5dK8u2H9ya8UI","scheme":"http","address":"120.55.87.169","port":56027},{"game_id":"yDkn0jIqh0PbgY3dkpy8MghHNkrHS2de","scheme":"http","address":"120.55.87.169","port":56047},{"game_id":"dfSq0zqyi0aBKv2auia8fJHrtJuPy7x1","scheme":"http","address":"120.26.95.55","port":56031},{"game_id":"ociz0alQk0xkIW2dMSF7eigb6AUNbNF9","scheme":"http","address":"120.26.95.55","port":56033},{"game_id":"qwjG0uNfT0wstn2uAiS4YbjiRud1v6WO","scheme":"http","address":"120.26.95.55","port":56035},{"game_id":"KenZ0FzAq0prkJ3iexc7rZ2tpzjOPk6x","scheme":"http","address":"120.26.95.55","port":56037},{"game_id":"tR8r0H4hj0V6gY1j45533g00RxG1Uc28","scheme":"http","address":"120.26.95.55","port":56039},{"game_id":"RxqG0uYoa0csAt4lwvx0NWygTpzj2b0d","scheme":"http","address":"120.26.95.55","port":56041},{"game_id":"Dlmh0USmi0dqkN4uKbW4xsxClO48uoky","scheme":"http","address":"120.26.95.55","port":56045},{"game_id":"seAz0gtHt0boIZ4NoCw3trpKge64JT0v","scheme":"http","address":"120.26.95.55","port":56049},{"game_id":"JUfj0aCSs0bLYh4cmvs5sksepOebabe4","scheme":"http","address":"\"120.55.87.169","port":56051},{"game_id":"itnu0SfER0aTwk3pdJF9zgkiqvhfJYdg","scheme":"http","address":"120.55.87.169","port":56053},{"game_id":"uvkC0AiwJ0fGst5nFua4utuPsfBvzFPb","scheme":"http","address":"120.26.95.55","port":56055},{"game_id":"rZDp0wfvC0ZaPT5iLqh2itGFsnJaDvzc","scheme":"http","address":"120.26.95.55","port":56057},{"game_id":"jzWe0kzmN0tAcZ5MLks3rFWcxNecogyu","scheme":"http","address":"120.26.95.55","port":56059}]

View File

@@ -0,0 +1,295 @@
<?php
/**
* Created by PhpStorm.
* User: bahamut
* Date: 2018/6/13
* Time: 9:52
*/
require_once dirname(dirname(dirname(dirname(dirname(dirname(__DIR__)))))) . '/env_config.php';
const GAME_ID_TEST = 'test'; /// 测试环境下的游戏id不用更改。
// 优先从外部 JSON 配置文件加载Docker 部署时可挂载覆盖)
$gameServersConfigFile = env('GAME_SERVERS_CONFIG_FILE', '');
if (!empty($gameServersConfigFile) && file_exists($gameServersConfigFile)) {
$jsonData = json_decode(file_get_contents($gameServersConfigFile), true);
if (is_array($jsonData)) {
return $jsonData;
}
}
// 也支持从同目录下的 game.config.override.json 加载
$overrideFile = __DIR__ . '/game.config.override.json';
if (file_exists($overrideFile)) {
$jsonData = json_decode(file_get_contents($overrideFile), true);
if (is_array($jsonData)) {
return $jsonData;
}
}
$https =
(isset($_SERVER['REQUEST_SCHEME']) && strcasecmp($_SERVER['REQUEST_SCHEME'], 'https') == 0) ||
(isset($_SERVER['HTTPS']) && (strcasecmp($_SERVER['HTTPS'], 'on') == 0 || strcasecmp($_SERVER['HTTPS'], '1') == 0));
if ($https)
$scheme = 'https';
else
$scheme = 'http';
/// 游戏接口服务器列表
return array(
/// 测试 8x4l0rGjf026f60c48h0mbUAhK5vV16f 120.26.52.206:53091
array(
'game_id' => GAME_ID_TEST, /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.52.206', /// 服务器域名、地址
'port' => 53091, /// 服务器端口
),
/// ====================================================================================================================
/// 打十 8x4l0rGjf026f60c48h0mbUAhK5vV16f 121.43.232.182:56003
array(
'game_id' => '8x4l0rGjf026f60c48h0mbUAhK5vV16f', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56003, /// 服务器端口
),
/// 三个老K a52y0ajd106pKU1KIvF1zRii8h1gRem5 121.43.232.182:56005
array(
'game_id' => 'a52y0ajd106pKU1KIvF1zRii8h1gRem5', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56005, /// 服务器端口
),
/// 跑得快 etuj0pYtB0QIaW3wnNX0Se9fcGrbSIjD 121.43.232.182:56007
array(
'game_id' => 'etuj0pYtB0QIaW3wnNX0Se9fcGrbSIjD', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56007, /// 服务器端口
),
/// 斗地主 FDtj0pGhT0Evjd3efAS5wkIlamiTh2oa 121.43.232.182:56009
array(
'game_id' => 'FDtj0pGhT0Evjd3efAS5wkIlamiTh2oa', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56009, /// 服务器端口
),
/// 找朋友 TLW003EQ50asiD0bpq29aejKas3PqYBg 121.43.232.182:56015
array(
'game_id' => 'TLW003EQ50asiD0bpq29aejKas3PqYBg', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56015, /// 服务器端口
),
/// 冲关麻将 kanU0UByc0aGPq1pjyA6Fs0T9cyVkW0r 120.55.87.169:56017
array(
'game_id' => 'kanU0UByc0aGPq1pjyA6Fs0T9cyVkW0r', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56017, /// 服务器端口
),
/// 干瞪眼 uQWK0mQjG0CZOe38ofz1AJ2b3k3Vl6WJ 120.55.87.169:56019
array(
'game_id' => 'uQWK0mQjG0CZOe38ofz1AJ2b3k3Vl6WJ', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56019, /// 服务器端口
),
/// 三副牌 tKez0auYs0HNjN3KLTo4Eoz3y7sp767Q 120.55.87.169:56023
array(
'game_id' => 'tKez0auYs0HNjN3KLTo4Eoz3y7sp767Q', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56023, /// 服务器端口
),
/// 关牌 sJgp0FArn0olVc3yitp3xThV036fG7n0 120.55.87.169:56025
array(
'game_id' => 'sJgp0FArn0olVc3yitp3xThV036fG7n0', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56025, /// 服务器端口
),
/// K105 jLua0xiBg0GwuH1eeFs5dK8u2H9ya8UI 120.55.87.169:56027
array(
'game_id' => 'jLua0xiBg0GwuH1eeFs5dK8u2H9ya8UI', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56027, /// 服务器端口
),
/// 打大A yDkn0jIqh0PbgY3dkpy8MghHNkrHS2de 120.55.87.169:56047
array(
'game_id' => 'yDkn0jIqh0PbgY3dkpy8MghHNkrHS2de', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56047, /// 服务器端口
),
/// 东乡裤筒 dfSq0zqyi0aBKv2auia8fJHrtJuPy7x1 120.26.95.55:56031
array(
'game_id' => 'dfSq0zqyi0aBKv2auia8fJHrtJuPy7x1', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56031, /// 服务器端口
),
/// 东乡翻天 ociz0alQk0xkIW2dMSF7eigb6AUNbNF9 120.26.95.55:56033
array(
'game_id' => 'ociz0alQk0xkIW2dMSF7eigb6AUNbNF9', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56033, /// 服务器端口
),
/// 长沙麻将 qwjG0uNfT0wstn2uAiS4YbjiRud1v6WO 120.26.95.55:56035
array(
'game_id' => 'qwjG0uNfT0wstn2uAiS4YbjiRud1v6WO', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56035, /// 服务器端口
),
/// 红中麻将 KenZ0FzAq0prkJ3iexc7rZ2tpzjOPk6x 120.26.95.55:56037
array(
'game_id' => 'KenZ0FzAq0prkJ3iexc7rZ2tpzjOPk6x', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56037, /// 服务器端口
),
/// 抚州麻将 tR8r0H4hj0V6gY1j45533g00RxG1Uc28 120.26.95.55:56039
array(
'game_id' => 'tR8r0H4hj0V6gY1j45533g00RxG1Uc28', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56039, /// 服务器端口
),
/// 万年麻将 RxqG0uYoa0csAt4lwvx0NWygTpzj2b0d 120.26.95.55:56041
array(
'game_id' => 'RxqG0uYoa0csAt4lwvx0NWygTpzj2b0d', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56041, /// 服务器端口
),
/// 龙岩麻将 Dlmh0USmi0dqkN4uKbW4xsxClO48uoky 120.26.95.55:56045
array(
'game_id' => 'Dlmh0USmi0dqkN4uKbW4xsxClO48uoky', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56045, /// 服务器端口
),
/// 内蒙麻将 seAz0gtHt0boIZ4NoCw3trpKge64JT0v 120.26.95.55:56049
array(
'game_id' => 'seAz0gtHt0boIZ4NoCw3trpKge64JT0v', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56049, /// 服务器端口
),
/// 打卡 JUfj0aCSs0bLYh4cmvs5sksepOebabe4 "120.55.87.169:56051
array(
'game_id' => 'JUfj0aCSs0bLYh4cmvs5sksepOebabe4', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '"120.55.87.169', /// 服务器域名、地址
'port' => 56051, /// 服务器端口
),
/// 十三水 itnu0SfER0aTwk3pdJF9zgkiqvhfJYdg 120.55.87.169:56053
array(
'game_id' => 'itnu0SfER0aTwk3pdJF9zgkiqvhfJYdg', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56053, /// 服务器端口
),
/// 断卡勾 uvkC0AiwJ0fGst5nFua4utuPsfBvzFPb 120.26.95.55:56055
array(
'game_id' => 'uvkC0AiwJ0fGst5nFua4utuPsfBvzFPb', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56055, /// 服务器端口
),
/// 进贤麻将 rZDp0wfvC0ZaPT5iLqh2itGFsnJaDvzc 120.26.95.55:56057
array(
'game_id' => 'rZDp0wfvC0ZaPT5iLqh2itGFsnJaDvzc', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56057, /// 服务器端口
),
/// 江山麻将 jzWe0kzmN0tAcZ5MLks3rFWcxNecogyu 120.26.95.55:56059
array(
'game_id' => 'jzWe0kzmN0tAcZ5MLks3rFWcxNecogyu', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56059, /// 服务器端口
),
/// 大乐透 Btke0urRy0cvPd5CIvD5yfhYhKhdSdex 121.43.232.182:56061
array(
'game_id' => 'Btke0urRy0cvPd5CIvD5yfhYhKhdSdex', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56061, /// 服务器端口
),
/// 大厅 G2hw0ubng0zcoI0r4mx3H2yr4GejidwO 121.43.232.182:56063
array(
'game_id' => 'G2hw0ubng0zcoI0r4mx3H2yr4GejidwO', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56063, /// 服务器端口
),
/// 过炸 dQyb0dvzz0afdj65hsb08QjMhzt94E1v 121.43.232.182:56065
array(
'game_id' => 'dQyb0dvzz0afdj65hsb08QjMhzt94E1v', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '121.43.232.182', /// 服务器域名、地址
'port' => 56065, /// 服务器端口
),
/// 南昌麻将 hUNp0fnus0EtZx61IsB1jo7w6vPekov1 120.26.95.55:56067
array(
'game_id' => 'hUNp0fnus0EtZx61IsB1jo7w6vPekov1', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56067, /// 服务器端口
),
/// 争上游 sZrs0oiw40jhs66bmpf356Z6T6gvFUyd 120.55.87.169:56069
array(
'game_id' => 'sZrs0oiw40jhs66bmpf356Z6T6gvFUyd', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56069, /// 服务器端口
),
/// 九点半 pW0b02dlT0M8mr60vDs4Gstk5OrZo9aB 120.55.87.169:56071
array(
'game_id' => 'pW0b02dlT0M8mr60vDs4Gstk5OrZo9aB', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.55.87.169', /// 服务器域名、地址
'port' => 56071, /// 服务器端口
),
/// 天全麻将 k3i80fjgK0b99N6067f9vdzj029kQ167 120.26.95.55:56073
array(
'game_id' => 'k3i80fjgK0b99N6067f9vdzj029kQ167', /// 游戏编号
'scheme' => $scheme, /// 请求类型
'address' => '120.26.95.55', /// 服务器域名、地址
'port' => 56073, /// 服务器端口
),
);

View File

@@ -0,0 +1,15 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/11/14
* Time: 17:34
*/
namespace core;
class Action
{
}

View File

@@ -0,0 +1,119 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/11/14
* Time: 17:34
*/
namespace core;
class Model
{
/**
* 数据查询实例
* @var null
*/
public static $Db = null;
public function __construct()
{
if(!self::$Db)
self::$Db = new \BaseMethod();
}
/**
* 记录日志
* @param $data
* @param string $tmp
*/
public static function log($data, $tmp = '')
{
$str = date('H:m:s').' => '. $tmp .': ';
if(is_array($data))
$str .= json_encode($data);
else
$str .= $data;
file_put_contents('debug/'.date('Y-m-d').'.txt', $str . PHP_EOL, FILE_APPEND);
}
/**
* 查询方法,返回单条数据
* @param $sql
* @param array $arr
* @return mixed
* @throws \Exception
*/
public static function query($sql, $arr = [])
{
$result = self::$Db->PDO_Request($sql, $arr);
if(!self::$Db->PDO_IsDone())
throw new \Exception(self::$Db->GetErrorInfo());
if(isset($result[0]))
return $result[0];
return [];
}
/**
* 查询方法,返回多条数据
* @param $sql
* @param $arr
* @return array
* @throws \Exception
*/
public static function queryAll($sql, $arr = [])
{
$result = self::$Db->PDO_Request($sql, $arr);
if(!self::$Db->PDO_IsDone())
throw new \Exception(self::$Db->GetErrorInfo());
return $result;
}
/**
* 只执行sql语句不反回结果
* @param $sql
* @param array $arr
* @throws \Exception
*/
public static function execute($sql, $arr = [])
{
$ret = self::$Db->PDO_Execute($sql, $arr);
if(!$ret || !self::$Db->PDO_IsDone())
throw new \Exception(self::$Db->GetErrorInfo());
}
/**
* 开启事务
*/
public static function beginTransaction()
{
self::$Db->PDO_BeginTransaction();
}
/**
* 提交一个事务
*/
public static function commit()
{
self::$Db->PDO_Commit();
}
/**
* 回滚一个事务
*/
public static function rollBack()
{
self::$Db->PDO_Rollback();
}
}

View File

@@ -0,0 +1,141 @@
<?php
class Tangjian
{
/**
* 数据查询实例
* @var null
*/
public static $Db = null;
public function __construct()
{
spl_autoload_register('self::loadByNamespace');
}
/**
* 根据命名空间加载文件
* @param string $name
* @return boolean
*/
public static function loadByNamespace($name)
{
// 相对路径
$class_path = str_replace('\\', DIRECTORY_SEPARATOR, $name);
$class_file = dirname(__DIR__) . DIRECTORY_SEPARATOR . $class_path . '.php';
// 找到文件
if (is_file($class_file)) {
// 加载
require_once($class_file);
if (class_exists($name, false)) {
return true;
}
}
return false;
}
/**
* 记录日志
* @param $data
* @param string $tmp
*/
public static function log($data, $tmp = '')
{
$str = date('H:m:s').' => '. $tmp .': ';
if(is_array($data))
$str .= json_encode($data);
else
$str .= $data;
file_put_contents('debug/'.date('Y-m-d').'.txt', $str . PHP_EOL, FILE_APPEND);
}
/**
* 用于调试
* @param $tmp
*/
public static function debug($tmp)
{
echo '<pre>';
var_dump($tmp);
die;
}
/**
* 校验数据
* R => 必要的数据(不能为空)
* r => 必要的数据(可以为空)
* 数字类型 => 没有传递参数默认赋值
* 字符串 => 没有传递参数默认赋值
* @param $params
* @param $rule
* @return mixed
* @throws Exception
*/
public static function checkParams(&$params, $rule)
{
$biz = $params->biz_content;
$tmp = null;
$res = [];
foreach ($rule as $v) {
$tmp = explode('/', $v);
if($tmp[1] === 'R')
{
if(!empty($biz[$tmp[0]])) {
$res[$tmp[0]] = $biz[$tmp[0]];
continue;
}
throw new Exception("请上传必要的数据({$tmp[0]}", 1001);
}
elseif ($tmp[1] === 'r')
{
if(isset($biz[$tmp[0]])) {
$res[$tmp[0]] = $biz[$tmp[0]];
continue;
}
throw new Exception("请上传必要的数据({$tmp[0]}", 1002);
}
elseif (is_numeric($tmp[1]))
{
$res[$tmp[0]] = (isset($biz[$tmp[0]]) && is_numeric($biz[$tmp[0]])) ? intval($biz[$tmp[0]]) : intval($tmp[1]);
}
else
{
$res[$tmp[0]] = isset($biz[$tmp[0]]) ? strval($biz[$tmp[0]]) : strval($tmp[1]);
}
}
return $res;
}
/**
* 查询方法,返回单条数据
* @param $sql
* @param array $arr
* @return mixed
* @throws \Exception
*/
public static function query($sql, $arr = [])
{
if(!self::$Db)
self::$Db = new \BaseMethod();
$result = self::$Db->PDO_Request($sql, $arr);
if(!self::$Db->PDO_IsDone())
throw new \Exception(self::$Db->GetErrorInfo());
if(isset($result[0]))
return $result[0];
return [];
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,203 @@
<?php
require_once dirname(dirname(__DIR__)) . '/common/ErrorType.php';
require_once dirname(dirname(__DIR__)) . '/common/common.inc.php';
require_once dirname(dirname(__DIR__)) . '/common/BaseMethodHelper.php';
class game extends BaseMethod
{
/**
* @note 返回主数据库连接信息
* @return ConnectParameter
*/
protected function GetMasterDatabaseConnectParameter()
{
if(!DEBUG_MODE) {
//最好使用只读实例 战绩数据库
//return new ConnectParameter('rr-bp1x2415jy37d8mu1o.mysql.rds.aliyuncs.com', 3306, 'game_db', 'games', 'Games2017@)!&', MASTER_PERSISTENT, MASTER_CHARSET);
return new ConnectParameter(env('EXT_GRADE_DB_HOST', 'rm-bp1749tfxu2rpq670lo.mysql.rds.aliyuncs.com'), (int)env('EXT_GRADE_DB_PORT', 3306), env('EXT_GRADE_DB_NAME', 'grade_db'), env('EXT_GRADE_DB_USER', 'games'), env('EXT_GRADE_DB_PASSWORD', 'Games0791!!'), MASTER_PERSISTENT, MASTER_CHARSET);
}
else
return new ConnectParameter(env('EXT_DEV_DB_HOST', 'rm-bp16sbf0l9cavp7h9o.mysql.rds.aliyuncs.com'), (int)env('EXT_DEV_DB_PORT', 3306), env('EXT_DEV_DB_NAME', 'youle_games'), env('EXT_DEV_DB_USER', 'develop'), env('EXT_DEV_DB_PASSWORD', 'develop123!@#'), MASTER_PERSISTENT, MASTER_CHARSET);
}
/**
* 某一个玩家的金币变动记录
* @param $request
* @param $return
* @return bool
*/
public function goldRecord($request, &$return)
{
$params = (array)$request->biz_content;
$agentid = isset($params['agentid']) ? $params['agentid'] : '';
if (empty($agentid))
{
$return->seterrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
$playerid = isset($params['playerid']) ? $params['playerid'] : '';
if (empty($playerid))
{
$return->seterrors(ERRORCODE_PLAYERIDERROR, ERRORINFO_PLAYERIDERROR);
return false;
}
$pageIndex = isset($params['page_index']) ? intval($params['page_index']) : 1;
$pageSize = isset($params['page_size']) ? intval($params['page_size']) : 10;
// 分页数据
$start = ($pageIndex-1) * $pageSize;
$cmd = /** @lang text */<<<EOL
SELECT
goac_agentid,
goac_asetcount,
goac_playerid,
goac_grade,
goac_rebatevalue,
#goac_createtime,
goac_time as goac_createtime,
goac_time,
goac_invitecode,
goac_inviteid
from
gold_account
where
goac_isrobot = 0 and
goac_rebateto = 0 and
goac_agentid = ? and
goac_playerid = ?
order by idx desc
limit
?, ?
EOL;
$res = $this->PDO_Request($cmd, $agentid, $playerid, $start, $pageSize);
$return->biz_content = (array)$res;
return true;
}
/**
* 修改需求
1推广员后台
1今日新增人数茶水费
2昨日新增人数茶水费
3近7日新增人数茶水费
4近30日新增人数茶水费
5按时间新增人数茶水费
,总代理后台(查某个推广员如下属性)
1今日新增人数茶水费
2昨日新增人数茶水费
3近7日新增人数茶水费
4近30日新增人数茶水费
5按时间新增人数茶水费
这些数据放第一页菜单
*/
public function goldIncrease($request, &$return)
{
$params = $request->biz_content;
$agentid = isset($params['agentid']) ? $params['agentid'] : '';
$channelid = isset($params['channelid']) ? $params['channelid'] : '';
$salesid = isset($params['salesid']) ? $params['salesid'] : '';
$type = isset($params['type']) ? intval($params['type']) : 1;
if (empty($agentid))
{
$return->SetErrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
if (empty($channelid))
{
$return->SetErrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
if (empty($salesid))
{
$return->SetErrors(ERRORCODE_SALESIDERROR, ERRORINFO_SALESIDERROR);
return false;
}
if($type === 888) {
$where = '';
} else {
$where = " and goac_invitecode={$salesid}";
}
$sql = <<<EOL
SELECT
'今日' AS `NAME`,
ifnull(sum(goac_rebatevalue), 0) AS `VALUE`
FROM
gold_account
WHERE
goac_agentid = '{$agentid}' and
goac_isrobot = 0 and
goac_rebateto = 0 and
date_format(goac_time, '%Y-%m-%d') = curdate()
{$where}
union
SELECT
'昨日' AS `NAME`,
ifnull(sum(goac_rebatevalue), 0) AS `VALUE`
FROM
gold_account
WHERE
(
TO_DAYS(now()) - TO_DAYS(goac_time) = 1
) and
goac_isrobot = 0 and
goac_rebateto = 0 and
goac_agentid = '{$agentid}'
{$where}
union
SELECT
'近7日' AS `NAME`,
ifnull(sum(goac_rebatevalue), 0) AS `VALUE`
FROM
gold_account
WHERE
(
TO_DAYS(now()) - TO_DAYS(goac_time) <= 7
) and
goac_isrobot = 0 and
goac_rebateto = 0 and
goac_agentid = '{$agentid}'
{$where}
union
SELECT
'近30日' AS `NAME`,
ifnull(sum(goac_rebatevalue), 0) AS `VALUE`
FROM
gold_account
WHERE
(
TO_DAYS(now()) - TO_DAYS(goac_time) <= 30
) and
goac_isrobot = 0 and
goac_rebateto = 0 and
goac_agentid = '{$agentid}'
{$where};
EOL;
$res = $this->PDO_Request($sql);
if (!$this->PDO_isdone())
{
$return->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
$return->biz_content = $res;
return true;
}
}

View File

@@ -0,0 +1,13 @@
<?php
/**
* 通用头文件
*/
// 数据库查询类
require_once dirname(dirname(__DIR__)) . '/common/BaseMethodHelper.php';
// 控制器基础类(父类)
require_once __DIR__ . '/models/Base.php';
// 封装后的数据库查询类
require_once __DIR__ . '/models/Db.php';
// 定义根路径
define('APP_PATH', __DIR__);

View File

@@ -0,0 +1,59 @@
<?php
require_once dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'common' . DIRECTORY_SEPARATOR . 'BaseMethodHelper.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'core' . DIRECTORY_SEPARATOR . 'Tangjian.php';
class Manage extends Tangjian
{
/**
* 获取公告
* @param $request
* @param $return
* @return bool
*/
public function notice($request, &$return)
{
try {
// type => 0-代理后台的公告 1-代理抽成的公告
$params = $this->checkParams($request, array(
'agentid/R', 'channelid/R', 'type/0'
));
$Agent = new \models\Agent();
$result = $Agent->getNotice($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
/**
* 获取代理的银行账户信息
* @param $request
* @param $return
* @return bool
*/
public function salesBankInfo($request, &$return)
{
try {
// type => 0-代理后台的公告 1-代理抽成的公告
$params = $this->checkParams($request, array(
'agentid/R', 'channelid/R', 'salesid/R'
));
$SalesUser = new \models\SalesUser();
$result = $SalesUser->getSalesBankInfo($params);
$return->biz_content = $result;
return true;
}
catch (Exception $e) {
$return->SetErrors($e->getCode(), $e->getMessage());
return false;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,285 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/7/3
* Time: 21:36
*/
class game extends BaseMethod
{
/**
* 获取产品列表
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $inParam
* @param ReturnParameter $outParam
* @return bool
*
*/
public function productList($inParam, $outParam)
{
$request_data = isset($inParam->biz_content) ? $inParam->biz_content : '';
if (!is_array($request_data)) {
//参数格式错误
$outParam->SetErrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
$agentID = isset($request_data['agentid']) ? $request_data['agentid'] : '';
if(empty($agentID))
{
$outParam->SetErrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
$type = isset($request_data['type']) ? intval($request_data['type']) : '';
if($type === '')
{
$outParam->SetErrors(ERRORCODE_TYPEERROR, ERRORINFO_TYPEERROR);
return false;
}
$productType = isset($request_data['ptype']) ? intval($request_data['ptype']) : 0;
$pro_list = $this->PDO_Request('
SELECT
sapr_productid as productid, sapr_name as name, sapr_amount as amount, sapr_money as money,
sapr_memo as memo
FROM
sales_product
WHERE
sapr_agentid = ? and sapr_type = ? and sapr_state = 0 and product_type = ?
ORDER BY idx;', $agentID, $type, $productType);
if(!is_array($pro_list))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
$outParam->biz_content = array('state' => 0, 'products' => $pro_list);
return true;
}
/**
* 获公告列表
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $inParam
* @param ReturnParameter $outParam
* @return bool
*
*/
public function noticeList($inParam, $outParam)
{
$request_data = isset($inParam->biz_content) ? $inParam->biz_content : '';
if (!is_array($request_data)) {
//参数格式错误
$outParam->SetErrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
$agentID = isset($request_data['agentid']) ? $request_data['agentid'] : '';
if(empty($agentID))
{
$outParam->SetErrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
$db_data = $this->PDO_Request("
SELECT
sano_noticeid as noticeid, sano_title as title, sano_time as time
FROM
sales_notice
WHERE
sano_agentid = ? and (sano_begintime is null or now() >= sano_begintime)
and (sano_endtime is null or now() <= sano_endtime);", $agentID);
if(!is_array($db_data))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
$outParam->biz_content = array('list' => $db_data);
return true;
}
/**
* 获公告详情
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $inParam
* @param ReturnParameter $outParam
* @return bool
*
*/
public function noticeDetail($inParam, $outParam)
{
$request_data = isset($inParam->biz_content) ? $inParam->biz_content : '';
if (!is_array($request_data)) {
//参数格式错误
$outParam->SetErrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
$agentID = isset($request_data['agentid']) ? $request_data['agentid'] : '';
if(empty($agentID))
{
$outParam->SetErrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
$noticeID = isset($request_data['noticeid']) ? $request_data['noticeid'] : '';
if(empty($noticeID))
{
$outParam->SetErrors(ERRORCODE_NOTICEIDERROR, ERRORINFO_NOTICEIDERROR);
return false;
}
$db_data = $this->PDO_Request("
SELECT
sano_title as title, sano_time as time, sano_content as content
FROM
sales_notice
WHERE
sano_agentid = ? and sano_noticeid = ? ;", $agentID, $noticeID);
if(!is_array($db_data))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
if(count($db_data) < 1)
{
return false;
}
$outParam->biz_content = array(
'title' => isset($db_data[0]['title']) ? $db_data[0]['title'] : '',
'time' => isset($db_data[0]['time']) ? $db_data[0]['time'] : '',
'content' => isset($db_data[0]['content']) ? $db_data[0]['content'] : '',
);
return true;
}
/**
* 游戏下载列表
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $inParam
* @param ReturnParameter $outParam
* @return bool
*
*/
public function downList($inParam, $outParam)
{
$request_data = isset($inParam->biz_content) ? $inParam->biz_content : '';
if (!is_array($request_data)) {
//参数格式错误
$outParam->SetErrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
$agentID = isset($request_data['agentid']) ? $request_data['agentid'] : '';
if(empty($agentID))
{
$outParam->SetErrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
$channelID = isset($request_data['channelid']) ? $request_data['channelid'] : '';
if(empty($agentID))
{
$outParam->SetErrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
/*$agent_data = $this->PDO_Request('
SELECT
html_buyroomcard
FROM
config_agent
WHERE
agent_id=?', $agentID);
if(!is_array($agent_data))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
if(count($agent_data) < 1)
{
$outParam->SetErrors(ERRORCODE_AGENTNOTEXISTERROR, ERRORINFO_AGENTNOTEXISTERROR);
return false;
}*/
/*$maket_data = $this->PDO_Request('
SELECT
a.game_id, a.game_name, a.game_down_image, a.game_down_state, a.game_down_memo,
b.ios_download, b.and_download,
c.market_id, c.market_name, c.app_download, c.app_size
FROM
config_game a
LEFT JOIN config_channel b ON a.game_id=b.game_id
LEFT JOIN config_market c ON b.channel_id=c.channel_id
WHERE
a.agent_id=? AND b.channel_id=? ', $agentID, $channelID);*/
$maket_data = $this->PDO_Request('
SELECT
a.game_id, a.game_name as name, a.game_down_image as image, a.game_down_state as state, a.game_down_memo as memo,
b.ios_download as ios_down, b.and_download as android_down, b.ios_market_id as ios_marketid, b.ios_app_size as ios_size, b.and_app_size as android_size
FROM
config_game a
LEFT JOIN config_channel b ON a.game_id=b.game_id
WHERE
a.agent_id=? AND b.channel_id=? and b.and_download != ""', $agentID, $channelID);
if(!is_array($maket_data))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
if(count($maket_data) < 1)
{
$outParam->SetErrors(ERRORCODE_AGENTNOTEXISTERROR, ERRORINFO_AGENTNOTEXISTERROR);
return false;
}
/*
$data = array();
$data['name'] = $maket_data[0]['game_name'];
$data['image'] = $maket_data[0]['game_down_image'];
$data['state'] = $maket_data[0]['game_down_state'];
$data['memo'] = $maket_data[0]['game_down_memo'];
foreach($maket_data as $item)
{
if($item['ios_download'] == $item['market_id'])
{
$data['ios_down'] = $item['app_download'];
$data['ios_size'] = $item['app_size'];
$data['ios_marketid'] = $item['market_id'];
}
if($item['and_download'] == $item['market_id'])
{
$data['android_down'] = $item['app_download'];
$data['android_size'] = $item['app_size'];
}
}
*/
$outParam->biz_content = array(
//'html_buyroomcard' => isset($agent_data[0]['html_buyroomcard']) ? $agent_data[0]['html_buyroomcard'] : '',
'list' => $maket_data
);
return true;
}
}

View File

@@ -0,0 +1,666 @@
<?php
/**
* Created by PhpStorm.
* User: bahamut
* Date: 2018/6/6
* Time: 9:11
*/
class gift extends BaseMethod
{
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @note 创建礼包
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
*/
public function newgift($request, $return)
{
$param = (array)@$request->biz_content;
$agent_id = @$param['agentid']; /// 代理编号
$channel_id = @$param['channelid']; /// 渠道编号
$sales_id = @$param['salesid']; /// 代理编号
$type = @$param['type']; /// 类型1房卡2星星
$amount = @$param['amount']; /// 数量
if (empty($agent_id))
{
$return->seterrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
if (empty($channel_id))
{
$return->seterrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
if (empty($sales_id))
{
$return->seterrors(ERRORCODE_SALESIDERROR, ERRORINFO_SALESIDERROR);
return false;
}
$this->pdo_begintransaction();
try
{
/// 查询代理信息
$command = /** @lang text */'select user_id, saus_roomcard, saus_bean from sales_user where saus_agentid = ? and saus_channelid = ? and saus_salesid = ?';
$sales_info = $this->pdo_request($command, $agent_id, $channel_id, $sales_id);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
elseif (empty($sales_info))
throw new Exception(ERRORINFO_SALESNOTEXISTERROR, ERRORCODE_SALESNOTEXISTERROR);
else
$sales_info = $sales_info[0];
/// 判断数量
switch (intval($type))
{
case 1; /// 房卡
$amount = intval($amount);
if ($amount > $sales_info['saus_roomcard'])
throw new Exception(ERRORINFO_ROOMCARDENOUGHERROR, ERRORCODE_ROOMCARDENOUGHERROR);
/// 修改账户
$command = /** @lang text */'update sales_user set saus_roomcard = saus_roomcard - ? where saus_agentid = ? and saus_channelid = ? and saus_salesid = ?';
/// 修改账户余额
$ret = $this->pdo_execute($command, $amount, $agent_id, $channel_id, $sales_id);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
/// 如果有统一账户,则需要修改统一账户余额
if (!empty($sales_info['user_id']))
{
$command = /** @lang text */'update ct_user_account set card = card - ? where user_id = ?';
$ret = $this->pdo_execute($command, $amount, $sales_info['user_id']);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
}
break;
case 2: /// 星星
$amount = floatval($amount);
if ($amount > $sales_info['saus_bean'])
throw new Exception(ERRORINFO_ROOMCARDENOUGHERROR, ERRORCODE_ROOMCARDENOUGHERROR);
/// 修改账户
$command = /** @lang text */'update sales_user set saus_bean = saus_bean - ? where saus_agentid = ? and saus_channelid = ? and saus_salesid = ?';
/// 修改账户余额
$ret = $this->pdo_execute($command, $amount, $agent_id, $channel_id, $sales_id);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
/// 如果有统一账户,则需要修改统一账户余额
if (!empty($sales_info['user_id']))
{
$command = /** @lang text */'update ct_user_account set currency = currency - ? where user_id = ?';
$ret = $this->pdo_execute($command, $amount, $sales_info['user_id']);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
}
break;
default:
throw new Exception(ERRORINFO_TYPEERROR, ERRORINFO_TYPEERROR);
}
/// 加入流水记录
$command = /** @lang text */<<<EOL
insert into ct_gift_info
(agent_id, channel_id, sales_id, type, amount, status, create_time)
values
(?, ?, ?, ?, ?, 0, unix_timestamp())
EOL;
$ret = $this->pdo_execute($command, $agent_id, $channel_id, $sales_id, $type, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
$return->biz_content = [
'giftid' => $this->pdo_lastinsertid(),
];
$this->pdo_commit();
return true;
}
catch(Exception $Exception)
{
$this->pdo_rollback();
$return->seterrors($Exception->getcode(), $Exception->getmessage());
return false;
}
}
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @note 领取礼包
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
*/
public function receivegift($request, $return)
{
$param = (array)$request->biz_content;
$gift_id = @$param['giftid']; /// 礼包编号
$player_id = @$param['playerid']; /// 玩家编号
if (empty($gift_id))
{
$return->seterrors(ERRORCODE_GIFTIDERROR, ERRORINFO_GIFTIDERROR);
return false;
}
if (empty($player_id))
{
$return->seterrors(ERRORCODE_PLAYERIDERROR, ERRORINFO_PLAYERIDERROR);
return false;
}
$this->pdo_begintransaction();
try
{
/// 查询礼包是否存在
$command = /** @lang text */<<<EOL
select
id, agent_id, channel_id, sales_id, player_id,
type, amount, status, create_time, receive_time, order_id
from
ct_gift_info
where
id = ?
for update
EOL;
$gift_info = $this->pdo_request($command, $gift_id);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
elseif (empty($gift_info))
throw new Exception(ERRORINFO_GIFTNOTEXISTS, ERRORCODE_GIFTNOTEXISTS);
else
$gift_info = $gift_info[0];
/// 状态不正确
if ($gift_info['status'] != 0)
throw new Exception(ERRORINFO_GIFTNOTEXISTS, ERRORCODE_GIFTNOTEXISTS);
/// 查询代理信息,分开查询是因为做关联查询反而比分成两次查询慢
$command = /** @lang text */'select saus_agentid, saus_channelid, saus_openid, saus_unionid, saus_power from sales_user where saus_agentid = ? and saus_channelid = ? and saus_salesid = ? and saus_status = 0';
$sales_info = $this->pdo_request($command, $gift_info['agent_id'], $gift_info['channel_id'], $gift_info['sales_id']);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
elseif (empty($sales_info))
throw new Exception(ERRORINFO_SALESNOTEXISTERROR, ERRORCODE_SALESNOTEXISTERROR);
else
$sales_info = $sales_info[0];
/// 查询玩家信息
$command = /** @lang text */'select play_invitecode from player where play_agentid = ? and play_channelid = ? and play_playerid = ? and play_status = 0';
$player_info = $this->pdo_request($command, $gift_info['agent_id'], $gift_info['channel_id'], $player_id);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
elseif (empty($player_info))
throw new Exception(ERRORINFO_PLAYERNOTEXISTERROR, ERRORCODE_PLAYERNOTEXISTERROR);
else
$player_info = $player_info[0];
/// 判断权限
switch (intval($sales_info['saus_power'][1]))
{
case 0: /// 无权限
throw new Exception(ERRORINFO_NOPOWERERROR, ERRORCODE_NOPOWERERROR);
break;
case 1: /// 需要判断是否绑定自己
if ($player_info['play_invitecode'] != $gift_info['sales_id'])
throw new Exception(ERRORINFO_ONLYBINDSELFERROR, ERRORCODE_ONLYBINDSELFERROR);
break;
case 2: /// 可以给所有代理转卡
break;
default:
throw new Exception(ERRORINFO_NOPOWERERROR, ERRORCODE_NOPOWERERROR);
break;
}
/// 判断类型
switch ($gift_info['type'])
{
case 1; /// 房卡
$amount = intval($gift_info['amount']);
/// 新增订单
$command = /** @lang text */<<<EOL
insert into sales_sellbill
(sase_agentid, channel_id, sase_openid, from_sales, sase_playerid, sase_amount, sase_selltime)
values
(?, ?, ?, ?, ?, ?, now())
EOL;
$ret = $this->pdo_execute($command, $sales_info['saus_agentid'], $sales_info['saus_channelid'], $sales_info['saus_openid'], $gift_info['sales_id'], $player_id, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
else
$order_id = $this->pdo_lastinsertid();
/// 记录同步流水
$command = /** @lang text */<<<EOL
insert into ct_user_process_log
(to_agent, to_channel, to_user, oper_type, oper_data, oper_time, is_process)
values
(?, ?, ?, 1, ?, unix_timestamp(), 0)
EOL;
$ret = $this->pdo_execute($command, $gift_info['agent_id'], $gift_info['channel_id'], $player_id, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
break;
case 2: /// 星星
$amount = floatval($gift_info['amount']);
/// 新增订单
$command = /** @lang text */<<<EOL
insert into sales_sellbill_bean
(ssbe_agentid, channel_id, ssbe_openid, from_sales, ssbe_playerid, ssbe_amount, ssbe_selltime)
values
(?, ?, ?, ?, ?, ?, now())
EOL;
$ret = $this->pdo_execute($command, $sales_info['saus_agentid'], $sales_info['saus_channelid'], $sales_info['saus_openid'], $gift_info['sales_id'], $player_id, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
else
$order_id = $this->pdo_lastinsertid();
/// 记录同步流水
$command = /** @lang text */<<<EOL
insert into ct_user_process_log
(to_agent, to_channel, to_user, oper_type, oper_data, oper_time, is_process)
values
(?, ?, ?, 11, ?, unix_timestamp(), 0)
EOL;
$ret = $this->pdo_execute($command, $gift_info['agent_id'], $gift_info['channel_id'], $player_id, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
break;
default:
throw new Exception(ERRORINFO_TYPEERROR, ERRORINFO_TYPEERROR);
}
/// 修改礼包状态
$command = /** @lang text */'update ct_gift_info set player_id = ?, status = 1, receive_time = unix_timestamp(), order_id = ? where id = ?';
$ret = $this->pdo_execute($command, $player_id, $order_id, $gift_id);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
$this->pdo_commit();
$return->biz_content = [
'amount' => $amount,
'product_type' => $gift_info['type'],
];
return true;
}
catch(Exception $Exception)
{
$this->pdo_rollback();
$return->seterrors($Exception->getcode(), $Exception->getmessage());
return false;
}
}
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @note 领取礼包
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
*/
public function querygift($request, $return)
{
/// method=agent.gift.querygift&format=json&charset=utf-8&timestamp=1&version=1.0&biz_content={"agentid":"a","channelid":"b","salesid":1,}&user_auth_token=xxxxxxxx&tag=tag&random_string=xxxxxx
$param = (array)$request->biz_content;
$agent_id = @$param['agentid']; /// 代理编号
$channel_id = @$param['channelid']; /// 渠道编号
$sales_id = @$param['salesid']; /// 代理编号
$page_index = @$param['pageindex']; /// 页序号0开始
$page_size = @$param['pagesize']; /// 页大小
if (empty($agent_id))
{
$return->seterrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
if (empty($channel_id))
{
$return->seterrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
if (empty($sales_id))
{
$return->seterrors(ERRORCODE_SALESIDERROR, ERRORINFO_SALESIDERROR);
return false;
}
if (empty($page_index))
$page_index = 0;
if (empty($page_size))
$page_size = 10;
$cmd = $this->NewMasterCommand();
$ret = $cmd
->select('id', 'agent_id', 'channel_id', 'sales_id', 'player_id', 'type', 'amount', 'status', 'create_time', 'receive_time', 'order_id')
->from('ct_gift_info')
->where('agent_id = ? and channel_id = ? and sales_id = ? and status = 0 and type in (1, 2)')
->bindparameters($agent_id, $channel_id, $sales_id)
->withpage($page_index, $page_size)
->request();
if (!$cmd->getconnection()->isdone())
{
$return->seterrors($cmd->getconnection()->geterrorcode(), $cmd->getconnection()->geterrorinfo());
return false;
}
$return->biz_content = [
'list' => $ret,
'pageindex' => $page_index,
'pagesize' => $page_size,
'recordcount' => 0,
];
if (empty($ret))
return true;
$ret = $cmd->request(/** @lang text */
'select count(0) c from ct_gift_info where agent_id = ? and channel_id = ? and sales_id = ? and status = 0 and type in (1, 2)',
$agent_id, $channel_id, $sales_id);
if (!$cmd->getconnection()->isdone())
{
$return->seterrors($cmd->getconnection()->geterrorcode(), $cmd->getconnection()->geterrorinfo());
return false;
}
$return->biz_content['recordcount'] = $ret[0]['c'];
return true;
}
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @note 创建充值卡
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
*/
public function newrechargecard($request, $return)
{
$param = (array)@$request->biz_content;
$agent_id = @$param['agentid']; /// 代理编号
$channel_id = @$param['channelid']; /// 渠道编号
$type = @$param['type']; /// 类型1房卡2星星
$amount = @$param['amount']; /// 数量
if (empty($agent_id))
{
$return->seterrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
if (empty($channel_id))
{
$return->seterrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
$this->pdo_begintransaction();
try
{
/// 判断数量
switch (intval($type))
{
case 1; /// 房卡
$type = 3; /// 房卡-充值卡密
do {
$card_number = sprintf('%s%06d', date('YmdHis'), rand(1, 999999));
$card_password = sprintf('%06d', rand(1, 999999));
$ret = $this->pdo_request(/** @lang text */'select 1 from ct_gift_info where card_number = ?', $card_number);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
} while (!empty($ret));
break;
case 2: /// 星星
$type = 4; /// 星星-充值卡密
do {
$card_number = sprintf('%s%06d', date('YmdHis'), rand(1, 999999));
$card_password = sprintf('%06d', rand(1, 999999));
$ret = $this->pdo_request(/** @lang text */'select 1 from ct_gift_info where card_number = ?', $card_number);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
} while (!empty($ret));
break;
default:
throw new Exception(ERRORINFO_TYPEERROR, ERRORINFO_TYPEERROR);
}
/// 加入流水记录
$command = /** @lang text */<<<EOL
insert into ct_gift_info
(agent_id, channel_id, sales_id, type, amount, status, create_time, card_number, card_password)
values
(?, ?, null, ?, ?, 0, unix_timestamp(), ?, ?)
EOL;
$ret = $this->pdo_execute($command, $agent_id, $channel_id, $type, $amount, $card_number, $card_password);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
$return->biz_content = [
'card_number' => $card_number,
'card_password' => $card_password,
'card_type' => $type,
'product_amount' => $amount,
];
$this->pdo_commit();
return true;
}
catch(Exception $Exception)
{
$this->pdo_rollback();
$return->seterrors($Exception->getcode(), $Exception->getmessage());
return false;
}
}
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @note 使用充值卡密
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
*/
public function userechargecard($request, $return)
{
$param = (array)@$request->biz_content;
$card_number = @$param['cardnumber']; /// 卡号
$card_password = @$param['cardpassword']; /// 密码
$sales_id = @$param['salesid']; /// 代理编号
//$player_id = @$param['playerid']; /// 玩家编号
if (empty($card_number))
{
$return->seterrors(ERRORCODE_CARDNUMBERERROR, ERRORINFO_CARDNUMBERERROR);
return false;
}
$cmd = /** @lang text */'select id from ct_gift_info where card_number = ? and card_password = ?';
$ret = $this->pdo_request($cmd, $card_number, $card_password);
if (!$this->pdo_isdone())
{
$return->seterrors($this->geterrorcode(), $this->geterrorinfo());
return false;
}
elseif (empty($ret))
{
//$return->seterrors(ERRORCODE_CARDNUMBERNOTEXISTS, ERRORINFO_CARDNUMBERNOTEXISTS);
$return->seterrors(ERRORCODE_CARDNUMBERERROR, ERRORINFO_CARDNUMBERERROR);
return false;
}
$id = $ret[0]['id'];
$this->pdo_begintransaction();
try
{
/// 查询礼包是否存在
$cmd = /** @lang text */<<<EOL
select
id, agent_id, channel_id, sales_id, player_id,
type, amount, status, create_time, receive_time, order_id
from
ct_gift_info
where
id = ?
for update
EOL;
$gift_info = $this->pdo_request($cmd, $id);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
elseif (empty($gift_info))
throw new Exception(ERRORINFO_GIFTNOTEXISTS, ERRORCODE_GIFTNOTEXISTS);
else
$gift_info = $gift_info[0];
/// 状态不正确
if ($gift_info['status'] != 0)
throw new Exception(ERRORINFO_GIFTNOTEXISTS, ERRORCODE_GIFTNOTEXISTS);
/// 查询代理信息,分开查询是因为做关联查询反而比分成两次查询慢
$command = /** @lang text */'select user_id, saus_agentid, saus_channelid, saus_openid, saus_unionid, saus_power from sales_user where saus_agentid = ? and saus_channelid = ? and saus_salesid = ? and saus_status = 0';
$sales_info = $this->pdo_request($command, $gift_info['agent_id'], $gift_info['channel_id'], $sales_id);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
elseif (empty($sales_info))
throw new Exception(ERRORINFO_SALESNOTEXISTERROR, ERRORCODE_SALESNOTEXISTERROR);
else
$sales_info = $sales_info[0];
/// 判断类型
switch ($gift_info['type'])
{
case 3; /// 房卡-充值卡密
$amount = intval($gift_info['amount']);
/// 新增订单
$command = /** @lang text */<<<EOL
insert into sales_transferbill
(satr_agentid, channel_id, satr_openid, from_sales, satr_salesid, satr_amount, satr_transfertime)
values
(?, ?, ?, ?, ?, ?, now())
EOL;
$ret = $this->pdo_execute($command, $sales_info['saus_agentid'], $sales_info['saus_channelid'], 'system', 0, $sales_id, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
else
$order_id = $this->pdo_lastinsertid();
/// 修改账户余额
$command = /** @lang text */'update sales_user set saus_roomcard = saus_roomcard + ? where saus_agentid = ? and saus_channelid = ? and saus_salesid = ?';
/// 修改账户余额
$ret = $this->pdo_execute($command, $amount, $sales_info['saus_agentid'], $sales_info['saus_channelid'], $sales_id);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
/// 如果有统一账户,则需要修改统一账户余额
if (!empty($sales_info['user_id']))
{
$command = /** @lang text */'update ct_user_account set card = card + ? where user_id = ?';
$ret = $this->pdo_execute($command, $amount, $sales_info['user_id']);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
}
break;
case 4: /// 星星-充值卡密
$amount = floatval($gift_info['amount']);
/// 新增订单
$command = /** @lang text */<<<EOL
insert into trans_star_record
(agent_id, channel_id, union_id, open_id, send_id, get_id, type, amount, op_time)
values
(?, ?, ?, ?, 0, ?, 0, ?, now())
EOL;
$ret = $this->pdo_execute($command, $sales_info['saus_agentid'], $sales_info['saus_channelid'], 'system', 'system', $sales_id, $amount);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
else
$order_id = $this->pdo_lastinsertid();
/// 修改账户
$command = /** @lang text */'update sales_user set saus_bean = saus_bean + ? where saus_agentid = ? and saus_channelid = ? and saus_salesid = ?';
/// 修改账户余额
$ret = $this->pdo_execute($command, $amount, $sales_info['saus_agentid'], $sales_info['saus_channelid'], $sales_id);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
/// 如果有统一账户,则需要修改统一账户余额
if (!empty($sales_info['user_id']))
{
$command = /** @lang text */'update ct_user_account set currency = currency + ? where user_id = ?';
$ret = $this->pdo_execute($command, $amount, $sales_info['user_id']);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
}
break;
default:
throw new Exception(ERRORINFO_TYPEERROR, ERRORINFO_TYPEERROR);
}
/// 修改礼包状态
$command = /** @lang text */'update ct_gift_info set sales_id = ?, status = 1, receive_time = unix_timestamp(), order_id = ? where id = ?';
$ret = $this->pdo_execute($command, $sales_id, $order_id, $id);
if (!$ret)
throw new Exception($this->geterrorinfo(), $this->geterrorcode());
$this->pdo_commit();
$return->biz_content = [
'amount' => $amount,
'product_type' => $gift_info['type'],
];
return true;
}
catch(Exception $Exception)
{
$this->pdo_rollback();
$return->seterrors($Exception->getcode(), $Exception->getmessage());
return false;
}
}
}

View File

@@ -0,0 +1,390 @@
<?php
/******************************************************************************************
* ================ summer 2017/11/6 Handel 管理部分业务 ====================== *
*****************************************************************************************/
class manage extends BaseMethod
{
##------------ 公告管理[curd]
##------------[ct_agent_notice] ------------------------->
/**
* 发布公告
* @param RequestParameter $inParam
* @param ReturnParameter $outParam
* @return bool
*/
public function addAgentNotice($inParam, $outParam)
{
// 1、系统非空数据配置初始化
$config = array(
# 代理商id
'agentID' => array(
'name' => 'agentid',
'errcode' => ERRORCODE_AGENTIDERROR,
'errinfo' => ERRORINFO_AGENTIDERROR,
),
# 渠道商id
'channelID' => array(
'name' => 'channelid',
'errcode' => ERRORCODE_CHANNELIDERROR,
'errinfo' => ERRORINFO_CHANNELIDERROR,
),
# 个人代理id
'salesID' => array(
'name' => 'salesid',
'errcode' => ERRORCODE_SALESIDERROR,
'errinfo' => ERRORINFO_SALESIDERROR,
),
# 公告内容
'noticeInfo' => array(
'name' => 'content',
'errcode' => 'H00001',
'errinfo' => '公告内容不能为空',
),
);
// 2、数据处理后的结果集 异常标志errtrue false
$param = $this->inParamHandel($inParam, $outParam, $config);
if (!$param)
{
return false;
}
// 验证总代权限
$auth = $this->checkAgentAuth($inParam, $outParam, $param['agentID'], $param['channelID'], $param['salesID']);
if (!$auth)
{
return false;
}
// 通知入库
$res = $this->PDO_Execute(
'
INSERT INTO
ct_agent_notice(agent_id, channel_id, notice_info, create_time, status)
VALUES (?, ?, ?, ?, ?)',
$param['agentID'], $param['channelID'], $param['noticeInfo'], date('Y-m-d H:i:s', time()), 1
);
if (!$res)
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
return true;
}
/**
* [改]修改公告内容 公告状态
* author summer
*/
public function editAgentNotice($inParam, $outParam)
{
$config = array(
# 代理商id
'agentID' => array(
'name' => 'agentid',
'errcode' => ERRORCODE_AGENTIDERROR,
'errinfo' => ERRORINFO_AGENTIDERROR,
),
# 渠道商id
'channelID' => array(
'name' => 'channelid',
'errcode' => ERRORCODE_CHANNELIDERROR,
'errinfo' => ERRORINFO_CHANNELIDERROR,
),
# 个人代理id
'salesID' => array(
'name' => 'salesid',
'errcode' => ERRORCODE_SALESIDERROR,
'errinfo' => ERRORINFO_SALESIDERROR,
),
# 操作记录id
'id' => array(
'name' => 'id',
'errcode' => 'H00001',
'errinfo' => 'id不能为空',
)
);
// 2、数据处理后的结果集 异常标志errtrue false
$param = $this->inParamHandel($inParam, $outParam, $config);
if (!$param)
{
return false;
}
// 3、权限验证
$auth = $this->checkAgentAuth($inParam, $outParam, $param['agentID'], $param['channelID'], $param['salesID']);
if (!$auth)
{
return false;
}
// 4、业务逻辑部分
#a.查看公告是否存在
$item = $this->PDO_Request(
'
select
*
from
ct_agent_notice
where
id = ?; ', $param['id']
);
if (!$item)
{
$outParam->SetErrors(ERRORCODE_COMMISSIONNOTEXISTERROR, ERRORINFO_COMMISSIONNOTEXISTERROR);
return false;
}
// 传了几个改几个
$status = isset($param['_params']['status']) ? $param['_params']['status'] : $item[0]['status']; // 修改状态
$content = isset($param['_params']['content']) ? $param['_params']['content'] : $item[0]['notice_info']; // 内容
// 更新公告
$this->PDO_Execute(
'
update
ct_agent_notice
set
notice_info = ?, status = ?
where
id = ?; ', $content, $status, $param['id']
);
if (!$this->PDO_IsDone())
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
return true;
}
/**
* [查]查询公告 pc后台
* author summer
*/
public function getAgentNotice($inParam, $outParam)
{
// 1、系统非空数据配置初始化
$config = array(
# 代理商id
'agentID' => array(
'name' => 'agentid',
'errcode' => ERRORCODE_AGENTIDERROR,
'errinfo' => ERRORINFO_AGENTIDERROR,
),
# 渠道商id
'channelID' => array(
'name' => 'channelid',
'errcode' => ERRORCODE_CHANNELIDERROR,
'errinfo' => ERRORINFO_CHANNELIDERROR,
),
# 个人代理id
'salesID' => array(
'name' => 'salesid',
'errcode' => ERRORCODE_SALESIDERROR,
'errinfo' => ERRORINFO_SALESIDERROR,
),
);
// 2、数据处理后的结果集 异常标志errtrue false
$param = $this->inParamHandel($inParam, $outParam, $config);
if (!$param)
{
return false;
}
//3.1 可选参数获取
$beginTime = empty($param['_params']['begintime']) ? false : $param['_params']['begintime']; // 查询开始时间
$endTime = empty($param['_params']['endtime']) ? false : $param['_params']['endtime']; // 查询结束时间
$status = empty($param['_params']['status']) ? 5 : $param['_params']['status']; // 查询状态
switch ($status)
{
// 当前状态(0: 关闭;1: 开启)
case '0':
$where_status = ' AND status = 0';
break;
case '1':
$where_status = ' AND status = 1';
break;
default:
$where_status = '';
break;
}
$keyword = empty($param['_params']['keyword']) ? false : $param['_params']['keyword']; // 查询关键字
if ($keyword)
{
$where_keyword = ' AND notice_info like "%' . trim($keyword) . '%"';
}
else
{
$where_keyword = '';
}
# 分页信息
$page_index = empty($param['_params']['page_index']) ? 1 : intval($param['_params']['page_index']); // 当前页
$page_size = empty($param['_params']['page_size']) ? 10 : intval($param['_params']['page_size']); // 单页容量
$start = ($page_index - 1) * $page_size;
$strPage = '';
if (!empty($page_index))
{
$strPage .= " LIMIT {$start},{$page_size} ";
}
if ($beginTime)
{
$where_begin = ' AND create_time >= "' . $beginTime . ' 00:00:00"';
}
else
{
$where_begin = '';
}
if ($endTime)
{
$where_end = ' AND create_time <= "' . $endTime . ' 23:59:59"';
}
else
{
$where_end = '';
}
$items = $this->PDO_Request(
'
SELECT
*
FROM
ct_agent_notice
WHERE
agent_id = ? AND channel_id = ? AND status != -1' . $where_begin . $where_end . $where_keyword . $where_status . '
ORDER BY
create_time desc ' . $strPage . ';', $param['agentID'], $param['channelID']
);
if (!is_array($items))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
# 分页计算
$dbData = $this->PDO_Request(
'
SELECT
count(1) num
FROM
ct_agent_notice
WHERE
agent_id = ? AND channel_id = ? AND status != -1' . $where_begin . $where_end . $where_keyword . $where_status . ';',
$param['agentID'], $param['channelID']
);
if (!is_array($dbData) || count($dbData) < 1)
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
$data_count = intval($dbData[0]['num']);
$page_count = $data_count / $page_size + 1; // 总页数
// 5、数据返回部分
$outParam->biz_content = array(
'data' => $items,
'page_index' => $page_index,
'page_size' => $page_size,
'page_count' => intval($page_count),
'data_count' => $data_count,
);
return true;
}
##------------ 工具方法[curd]
##------------[summer 2017/11/6 Handel] ----------------------->
/**
* 输入参数标准化处理
* @param RequestParameter $inParam
* @param ReturnParameter $outParam
* @param array $config 待处理变量配置文件
*
* @return array data
*
* authorsummer 2017/11/6
*/
public function inParamHandel($inParam, $outParam, $config)
{
foreach ($config as $k => $v)
{
// 1、全局校验
$data['_params'] = $request_data = isset($inParam->biz_content) ? $inParam->biz_content : '';
if (!is_array($request_data))
{
$outParam->SetErrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
// 2、单元校验
$data[$k] = isset($request_data[$v['name']]) ? $request_data[$v['name']] : '';
if (empty($data[$k]))
{
$outParam->SetErrors($v['errcode'], $v['errinfo']);
return false;
}
}
// 3、返回处理后的数据
return $data;
}
/**
* 代理权限认证
* @param RequestParameter $agentid 代理商id
* @param RequestParameter $channelid 渠道商id
* @param RequestParameter $salesid 代理人id
*
* @return array data
*
* authorsummer 2017/11/6
*/
public function checkAgentAuth($inParam, $outParam, $agentID, $channelID, $salesID)
{
//只有总代理才有权限
$dbSalesInfo = $this->PDO_Request(
'
SELECT idx, global_power
FROM sales_user
WHERE saus_agentid=? AND saus_channelid=? AND saus_salesid=?', $agentID, $channelID, $salesID
);
if (!is_array($dbSalesInfo))
{
$outParam->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
// 代理不存在
if (count($dbSalesInfo) < 1)
{
$outParam->SetErrors(ERRORCODE_SALESNOTEXISTERROR, ERRORINFO_SALESNOTEXISTERROR);
return false;
}
// 不是总代理,没有权限
if (intval($dbSalesInfo[0]['global_power']) != 1)
{
$outParam->SetErrors(ERRORCODE_NOPOWERERROR, ERRORINFO_NOPOWERERROR);
return false;
}
return true;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,712 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2017/11/27
* Time: 15:38
*/
require_once dirname(dirname(dirname(__DIR__))) . '/config/game_config.inc.php';
require_once dirname(dirname(dirname(__DIR__))) . '/public/usefull.php';
class auth_item extends ToolBase
{
/** @var string $name */
public $name = '';
/// 允许使用的账户类型(1: 三方购买房卡; 2: 三方购买金币; 101: 三方转账房卡; 102: 三方转账金币;)
/** @var array $account_type */
public $account_type = [];
/// 允许使用的登录类型(1: 玩家; 2: 代理;)
/** @var array $login_type */
public $login_type = [];
public function verify_account_type($account_type)
{
return in_array($account_type, $this->account_type);
}
public function verify_login_type($login_type)
{
return in_array($login_type, $this->login_type);
}
}
class auth_list
{
/** @var array $items */
public $items;
public function __construct($list)
{
$this->items = array();
if (is_object($list))
$list = (array)$list;
if (is_array($list)) {
foreach ($list as $item) {
array_push($this->items, new auth_item($item));
}
}
}
public function search($name)
{
/** @var auth_item $item */
foreach($this->items as $item) {
if (0 == strcasecmp($item->name, $name))
return $item;
}
return null;
}
}
class game_item extends ToolBase
{
public $game_id;
public $scheme = 'http';
public $address;
public $port;
public function get_address($param = null, $needencode = true)
{
if (empty($this->scheme)) {
$is_https =
(isset($_SERVER['REQUEST_SCHEME']) && strcasecmp($_SERVER['REQUEST_SCHEME'], 'https') == 0) ||
(isset($_SERVER['HTTPS']) && (strcasecmp($_SERVER['HTTPS'], 'on') == 0 || strcasecmp($_SERVER['HTTPS'], '1') == 0));
$this->scheme = $is_https ? 'https' : 'http';
}
if (empty($this->port)) {
if (0 == strcasecmp('https', $this->scheme))
$this->port = 443;
else
$this->port = 80;
}
if (0 == strcasecmp('https', $this->scheme))
$result = 'https://' . $this->address . (443 == $this->port ? '' : ':' . $this->port) . '/index.html';
else
$result = 'http://' . $this->address . (80 == $this->port ? '' : ':' . $this->port) . '/index.html';
if (empty($param))
return $result;
if (is_object($param))
$param = (array)$param;
if ($needencode) {
if (is_array($param)) {
$data = array();
foreach ($param as $key => $value) {
array_push($data, rawurlencode($key) . '=' . rawurlencode($value));
}
$result .= '?' . implode('&', $data);
} else {
$result .= '?' . rawurlencode($param);
}
} else {
if (is_array($param)) {
$data = array();
foreach ($param as $key => $value) {
array_push($data, $key . '=' . $value);
}
$result .= '?' . implode('&', $data);
} else {
$result .= '?' . $param;
}
}
return $result;
}
}
class game_list
{
/** @var array of game_item */
public $items;
public function __construct($list)
{
$this->items = array();
if (is_object($list))
$list = (array)$list;
if (is_array($list)) {
foreach ($list as $item) {
array_push($this->items, new game_item($item));
}
}
}
public function search($game_id)
{
/** @var game_item $item */
foreach($this->items as $item) {
if (0 == strcasecmp($item->game_id, $game_id))
return $item;
}
return null;
}
}
class player extends BaseMethod
{
const SCHEME_HTTP = 'http';
const SCHEME_HTTPS = 'https';
const GAME_ID_TEST = 'test'; /// 测试环境下的游戏id不用更改。
/// 有效的来源标志
const AUTH_SIGN = [
/// 游戏跳转的标志
[
'name' => 'WHITELOGIN', /// 标志标识
'account_type' => [], /// 允许使用的账户类型
'login_type' => [2], /// 允许使用的登录类型
],
/// 黄超的标志
[
'name' => 'GAMEPAY', /// 标志标识
'account_type' => [1, 2, ], /// 允许使用的账户类型
'login_type' => [1], /// 允许使用的登录类型
],
/// 第一个三方游戏来源
[
'name' => 'TG9000000001', /// 标志标识
'account_type' => [101, 102, ], /// 允许使用的账户类型
'login_type' => [1], /// 允许使用的登录类型
],
];
/** @var auth_list $auth_list */
private $auth_list;
/** @var game_list $game_list */
private $game_list;
public function __construct()
{
parent::__construct();
$this->auth_list = new auth_list(self::AUTH_SIGN);
if (file_exists(dirname(__DIR__) . '/config/game.config.json')) {
$str = file_get_contents(dirname(__DIR__) . '/config/game.config.json');
$obj = JsonStringToJsonObject($str);
if (is_null($obj)) {
$obj = include dirname(__DIR__) . '/config/game.config.php';
}
$this->game_list = new game_list($obj);
} else {
$this->game_list = new game_list(include dirname(__DIR__) . '/config/game.config.php');
}
}
/**
* 用户登录
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
* { "agentid": "a", "channelid": "b", "openid": "c", "unionid": "d", "nickname": "eee", "avatar": "dd", "sex": 0, "province": "jx", "city": "nc" }
*/
public function login($request, $return)
{
$param = (array)@$request->biz_content;
if (!is_array($param))
{
//参数格式错误
$return->seterrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
$agent_id = empty(@$param['agentid']) ? '' : $param['agentid']; /// 代理
$channel_id = empty(@$param['channelid']) ? '' : $param['channelid']; /// 渠道
//$game_id = empty(@$param['gameid']) ? '' : $param['gameid']; /// 游戏id
$player_id = empty(@$param['playerid']) ? '' : $param['playerid']; /// 用户id
$open_id = empty(@$param['openid']) ? '' : $param['openid']; /// openid
$union_id = empty(@$param['unionid']) ? '' : $param['unionid']; /// unionid
//$nick_name = empty(@$param['nickname']) ? '' : $param['nickname']; /// 昵称
//$avatar = empty(@$param['avatar']) ? '' : $param['avatar']; /// 头像
$from_sign = mb_strtoupper(empty(@$param['fromsign']) ? '' : $param['fromsign'], USEDCHARSET); /// 来源标志
if (empty($agent_id))
{
$return->seterrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
if (empty($channel_id))
{
$return->seterrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
if (empty($player_id))
{
$return->seterrors(ERRORCODE_PLAYERIDERROR, ERRORINFO_PLAYERIDERROR);
return false;
}
/// 判断来源
$auth = $this->auth_list->search($from_sign);
if (!$auth)
{
$return->seterrors(ERRORCODE_INVALIDPARAMETER, sprintf(ERRORINFO_INVALIDPARAMETER, 'source sign'));
return false;
}
if (!$cmd = $this->NewServantCommand())
$cmd = $this->NewMasterCommand();
if ($auth->verify_login_type(1)) /// 允许获取玩家信息
{
if (!empty($union_id))
{
$ret = $cmd
->select('idx', 'play_playerid', 'play_nickname', 'play_avatar', 'play_sex', 'play_roomcard', 'play_bean', 'play_invitecode', 'play_openid', 'play_unionid')
->from('player')
->where([
'play_agentid' => $agent_id,
'play_channelid' => $channel_id,
'play_unionid' => $union_id,
'play_playerid' => $player_id,
])
->request();
}
elseif (!empty($open_id))
{
$ret = $cmd
->select('idx', 'play_playerid', 'play_nickname', 'play_avatar', 'play_sex', 'play_roomcard', 'play_bean', 'play_invitecode', 'play_openid', 'play_unionid')
->from('player')
->where([
'play_agentid' => $agent_id,
'play_channelid' => $channel_id,
'play_openid' => $open_id,
'play_playerid' => $player_id,
])
->request();
}
else
{
$return->seterrors(ERRORCODE_INVALIDPARAMETER, sprintf(ERRORINFO_INVALIDPARAMETER, 'player information'));
return false;
}
if (!$this->pdo_isdone())
{
$return->seterrors($this->geterrorcode(), $this->geterrorinfo());
return false;
}
elseif (empty($ret))
{
$return->seterrors(ERRORCODE_PLAYERNOTEXISTERROR, ERRORINFO_PLAYERNOTEXISTERROR);
return false;
}
$player = $ret[0];
/// 请求玩家
$playerData = array(
'app' => 'youle',
'route' => 'agent',
'rpc' => 'query_player2',
'data' => array(
'agentid' => $agent_id,
'playerid' => $player_id,
),
);
$json_data = json_encode($playerData);
$dd_ret = file_get_contents(REQUEST_USER_INFO . '?' . $json_data);
/// 请求数据出错
if (!$dd_ret)
{
$return->SetErrors(ERRORCODE_NODATAERROR, ERRORINFO_NODATAERROR);
return false;
}
$playerInfo = json_decode($dd_ret, true);
$player['play_nickname'] = usefull::getInstance()->check_name($playerInfo['data']['nickname']);
$player['play_avatar'] = isset($playerInfo['data']['avatar']) ? $playerInfo['data']['avatar'] : '';
$player['play_roomcard'] = isset($playerInfo['data']['roomcard']) ? $playerInfo['data']['roomcard'] : '';
$player['play_bean'] = isset($playerInfo['data']['bean']) ? $playerInfo['data']['bean'] : '';
$ret = $this->pdo_execute(/** @lang text */'update player set play_nickname=?, play_avatar=?, play_sex=?, play_roomcard=?, play_bean=? where idx=?',
$player['play_nickname'], $player['play_avatar'], isset($playerInfo['data']['sex']) ? $playerInfo['data']['sex'] : '',
$player['play_roomcard'], $player['play_bean'], $player['idx']);
if (!$ret)
{
$return->SetErrors($this->GetErrorCode(), $this->GetErrorInfo());
return false;
}
/// 记录登录流水
$ret = $this->pdo_execute(/** @lang text */ 'insert into ct_player_login_info(agent_id,channel_id,player_id,login_time,from_sign) values(?,?,?,now(),?)',
$agent_id, $channel_id, $player_id, $from_sign);
if (!$ret)
{
$return->seterrors($this->geterrorcode(), $this->geterrorinfo());
return false;
}
// if (strcmp($ret['play_playerid'], $player_id)) /// id不匹配
// {
// $return->seterrors(ERRORCODE_PLAYERIDERROR, ERRORINFO_PLAYERIDERROR);
// return false;
// }
//
// /// 更新昵称和头像
// $ret = $cmd
// ->update('player')
// ->fields('play_nickname', 'play_avatar')
// ->values($nick_name, $avatar)
// ->where(array('idx' => $player['idx']))
// ->execute();
// if (!$ret)
// {
// $return->seterrors($this->geterrorcode(), $this->geterrorinfo());
// return false;
// }
$player_info = array(
'playerid' => $player_id, /// id
'openid' => $player['play_openid'], /// openid
'unionid' => $player['play_unionid'], /// unionid
'nickname' => $player['play_nickname'], /// 昵称
'avatar' => $player['play_avatar'], /// 头像
'sex' => $player['play_sex'], /// 性别
'card' => empty($player['play_roomcard']) ? 0 : $player['play_roomcard'], /// 房卡数
'gold' => empty($player['play_bean']) ? 0 : $player['play_bean'], /// 金币数
'invitecode' => empty($player['play_invitecode']) ? '' : $player['play_invitecode'], /// 邀请码
);
}
else
$player_info = [];
if ($auth->verify_login_type(2)) /// 允许获取代理信息
{
$fields = [
'idx', 'saus_agentid', 'saus_channelid', 'saus_openid', 'saus_unionid',
'saus_salesman', 'saus_salesid', 'saus_level', 'saus_salestype', 'saus_roomcard',
'saus_bean', 'saus_power', 'saus_invitecode', 'saus_pushmoney1', 'saus_pushmoney2', 'saus_status',
'password', 'global_power', 'saus_tel', 'saus_wechat', 'is_send_star', 'saus_nickname', 'saus_avatar', 'saus_sex',
'saus_province', 'saus_city', 'user_id', 'player_id', 'is_vip'
];
if (!empty($union_id))
{
$ret = $cmd
->select($fields)
->from('sales_user')
->where(['saus_agentid' => $agent_id, 'saus_channelid' => $channel_id, 'saus_unionid' => $union_id, 'player_id' => $player_id, ])
->request();
}
elseif (!empty($open_id))
{
$ret = $cmd
->select($fields)
->from('sales_user')
->where(['saus_agentid' => $agent_id, 'saus_channelid' => $channel_id, 'saus_openid' => $open_id, 'player_id' => $player_id, ])
->request();
}
else
{
$return->seterrors(ERRORCODE_INVALIDPARAMETER, sprintf(ERRORINFO_INVALIDPARAMETER, 'player information'));
return false;
}
if (!$this->pdo_isdone())
{
$return->seterrors($this->geterrorcode(), $this->geterrorinfo());
return false;
}
elseif (empty($ret))
{
$return->seterrors(ERRORCODE_PLAYERNOTEXISTERROR, ERRORINFO_PLAYERNOTEXISTERROR);
return false;
}
$sales = $ret[0];
if (isset($_SERVER['HTTP_CLIENT_IP']))
$address = $_SERVER['HTTP_CLIENT_IP'];
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$address = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif (isset($_SERVER['REMOTE_ADDR']))
$address = $_SERVER['REMOTE_ADDR'];
else
$address = null;
/// 记录登录流水
$ret = $cmd
->insert('ct_sales_login_log')
->fields('agent_id', 'channel_id', 'sales_id', 'login_type', 'login_time', 'login_addr', 'login_status')
->values($agent_id, $channel_id, $sales['saus_salesid'], 2, date('Y-m-d H:i:s'), $address, 0)
->execute();
if (!$ret)
{
$return->seterrors($this->geterrorcode(), $this->geterrorinfo());
return false;
}
/// 返回用户信息
$sales_info = array(
'idx' => isset($sales['idx']) ? $sales['idx'] : '', /// 代理
'agentid' => isset($sales['saus_agentid']) ? $sales['saus_agentid'] : '', /// 代理
'channelid' => isset($sales['saus_channelid']) ? $sales['saus_channelid'] : '', /// 渠道
'openid' => isset($sales['saus_openid']) ? $sales['saus_openid'] : '', /// openid
'unionid' => isset($sales['saus_unionid']) ? $sales['saus_unionid'] : '', /// unionid
'nickname' => isset($sales['saus_nickname']) ? $sales['saus_nickname'] : '', /// 昵称
'headimgurl' => isset($sales['saus_avatar']) ? $sales['saus_avatar'] : '', /// 头像
'sex' => isset($sales['saus_sex']) ? $sales['saus_sex'] : '', /// 性别
'province' => isset($sales['saus_province']) ? $sales['saus_province'] : '', /// 省
'city' => isset($sales['saus_city']) ? $sales['saus_city'] : '', /// 市
'salesman' => empty($sales['saus_salesman']) ? 0 : intval($sales['saus_salesman']), /// 是否代理
'salesid' => isset($sales['saus_salesid']) ? $sales['saus_salesid'] : '', /// 代理编号
'level' => isset($sales['saus_level']) ? $sales['saus_level'] : '', /// 代理等级
'salestype' => isset($sales['saus_salestype']) ? $sales['saus_salestype'] : '', /// 代理类型
'roomcard' => isset($sales['saus_roomcard']) ? $sales['saus_roomcard'] : '', /// 账户房卡数
'bean' => isset($sales['saus_bean']) ? $sales['saus_bean'] : '', /// 账户金币数
'salespower' => isset($sales['saus_power']) ? $sales['saus_power'] : '', /// 代理权限
'agentmode' => '', /// 分享模式
//'pushmoney' => intval($sales['saus_pushmoney1']) + intval($sales['saus_pushmoney2']), /// 提成金额
'sausstatus' => isset($sales['saus_status']) ? $sales['saus_status'] : '', /// 当前状态
'html_applysales' => '', /// 成为代理的方式
'global_power' => isset($sales['global_power']) ? intval($sales['global_power']) : 0, /// 是否总代
'tel' => isset($sales['saus_tel']) ? $sales['saus_tel'] : '', /// 电话号码
'wechat' => isset($sales['saus_wechat']) ? $sales['saus_wechat'] : '', /// 微信号码
'user_id' => empty(@$sales['user_id']) ? '' : $sales['user_id'], /// 统一账户编号
'is_bind' => empty($sales['saus_tel']) ? 0 : (0 == $sales['is_send_star'] ? 0 : 1), /// 是否绑定
'logintype' => 11, /// 自动登录
'player_id' => isset($sales['player_id']) ? $sales['player_id'] : '',
'is_vip' => $sales['is_vip'],
);
}
else
$sales_info = [];
$return->biz_content = [];
foreach ($player_info as $k => $v) {
$return->biz_content[$k] = $v;
}
foreach ($sales_info as $k => $v) {
$return->biz_content[$k] = $v;
}
return true;
}
/**
* 用户登录
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $request
* @param ReturnParameter $return
* @return bool
* { "agentid": "a", "channelid": "b", "openid": "c", "unionid": "d", "nickname": "eee", "avatar": "dd", "sex": 0, "province": "jx", "city": "nc" }
*/
public function change_account($request, $return)
{
$param = (array)@$request->biz_content;
if (!is_array($param))
{
/// 参数格式错误
$return->seterrors(ERRORCODE_INPARAMERROR, ERRORINFO_INPARAMERROR);
return false;
}
$agent_id = empty(@$param['agentid']) ? '' : $param['agentid']; /// 代理
$channel_id = empty(@$param['channelid']) ? '' : $param['channelid']; /// 渠道
$game_id = empty(@$param['gameid']) ? '' : $param['gameid']; /// 游戏id
$player_id = empty(@$param['playerid']) ? '' : $param['playerid']; /// 用户id
$change_type = intval(empty(@$param['changetype']) ? 0 : $param['changetype']); /// 类型1购买房卡2购买金币101三方转账房卡102三方转账金币
$change_amount = floatval(empty(@$param['changeamount']) ? 0 : $param['changeamount']); /// 变更数量
$transaction_id = @$param['transactionid']; /// 订单号
$pay_fee = intval(empty(@$param['payfee']) ? 0 : $param['payfee']); /// 支付金额(分)
$from_sign = mb_strtoupper(empty(@$param['fromsign']) ? '' : $param['fromsign'], USEDCHARSET); /// 来源标志
$remark = @$param['remark']; /// 备注
if (empty($agent_id))
{
$return->seterrors(ERRORCODE_AGENTIDERROR, ERRORINFO_AGENTIDERROR);
return false;
}
if (empty($channel_id))
{
$return->seterrors(ERRORCODE_CHANNELIDERROR, ERRORINFO_CHANNELIDERROR);
return false;
}
if (empty($player_id))
{
$return->seterrors(ERRORCODE_PLAYERIDERROR, ERRORINFO_PLAYERIDERROR);
return false;
}
if (empty($change_type))
{
$return->seterrors(ERRORCODE_TYPEERROR, ERRORINFO_TYPEERROR);
return false;
}
/// 判断来源
$auth = $this->auth_list->search($from_sign);
if (!$auth)
{
$return->seterrors(ERRORCODE_INVALIDPARAMETER, sprintf(ERRORINFO_INVALIDPARAMETER, 'source sign'));
return false;
}
/// 判断类型
if (!$auth->verify_account_type($change_type))
{
$return->seterrors(ERRORCODE_TYPEERROR, ERRORINFO_TYPEERROR);
return false;
}
if (in_array($change_type, [1, 2])) /// 三方购买房卡、金币
{
if (empty($pay_fee))
{
$return->seterrors(ERRORCODE_ORDERMONEYERROR, ERRORINFO_ORDERMONEYERROR);
return false;
}
if (empty($transaction_id))
{
$return->seterrors(ERRORCODE_ORDERIDERROR, ERRORINFO_ORDERIDERROR);
return false;
}
}
$this->pdo_begintransaction();
try {
/// 校验账户
$cmd = /** @lang text */'select play_roomcard, play_bean from player a where play_agentid = ? and play_channelid = ? and play_playerid = ?';
$ret = $this->pdo_request($cmd, $agent_id, $channel_id, $player_id);
if (!$this->pdo_isdone())
throw new Exception($this->geterrorinfo() . '(' . __LINE__ . ')', $this->geterrorcode());
elseif (empty($ret))
throw new Exception(ERRORINFO_PLAYER_NOT_EXISTS, ERRORCODE_PLAYER_NOT_EXISTS);
switch ($change_type) {
case 1: /// 三方购买房卡
$account = $ret[0]['play_roomcard'] + $change_amount;
if ($ret[0]['play_roomcard'] + $change_amount < 0)
throw new Exception(ERRORINFO_AMOUNTERROR, ERRORCODE_AMOUNTERROR);
$oper_type = 1;
break;
case 2: /// 三方购买金币
$account = $ret[0]['play_bean'] + $change_amount;
if ($ret[0]['play_bean'] + $change_amount < 0)
throw new Exception(ERRORINFO_AMOUNTERROR, ERRORCODE_AMOUNTERROR);
$oper_type = 11;
break;
case 101: /// 三方转账房卡
throw new Exception(ERRORINFO_TYPEERROR, ERRORCODE_TYPEERROR);
$account = $ret[0]['play_roomcard'] + $change_amount;
if ($ret[0]['play_roomcard'] + $change_amount < 0)
throw new Exception(ERRORINFO_AMOUNTERROR, ERRORCODE_AMOUNTERROR);
$oper_type = 1;
break;
case 102: /// 三方转账星星
$account = $ret[0]['play_bean'] + $change_amount;
if ($ret[0]['play_bean'] + $change_amount < 0)
throw new Exception(ERRORINFO_AMOUNTERROR, ERRORCODE_AMOUNTERROR);
$oper_type = 11;
break;
default: /// 其他
throw new Exception(ERRORINFO_TYPEERROR, ERRORCODE_TYPEERROR);
break;
}
if (!empty($game_id) && 102 == $change_type) {
if (DEBUG_MODE) {
$game_info = $this->game_list->search(self::GAME_ID_TEST);
} else {
$game_info = $this->game_list->search($game_id);
}
} else
$game_info = null;
/// 没有传入游戏id则写入日志表
if (empty($game_info)) {
/// 记录同步流水
$cmd = /** @lang text */<<<EOL
insert into ct_user_process_log
(to_agent, to_channel, to_user, oper_type, oper_data, oper_time, is_process)
values
(?, ?, ?, ?, ?, ?, 0)
EOL;
$ret = $this->pdo_execute($cmd, $agent_id, $channel_id, $player_id, $oper_type, $change_amount, time());
if (!$ret)
throw new Exception($this->geterrorinfo() . '(' . __LINE__ . ')', $this->geterrorcode());
$log_id = $this->pdo_lastinsertid();
} else {
$data = array(
'app' => 'youle',
'route' => 'agent',
'rpc' => 0 > $change_amount ? 'coin_sub' : 'coin_add', /// 减少、增加
'data' => array(
'agentid' => $agent_id,
'playerid' => $player_id,
'change' => abs($change_amount),
),
);
$result = file_get_contents($game_info->get_address(JsonObjectToJsonString($data), false));
$result = JsonStringToJsonObject(rawurldecode($result));
if (0 == $result->data->result) /// 成功
$account = $result->data->bean;
else /// 失败
throw new Exception($result->data->error, ERRORCODE_UNKNOWN);
$log_id = 0;
}
/// 记录购买流水
$cmd = /** @lang text */<<<EOL
insert into ct_pay_for_third
(agent_id, channel_id, player_id, transaction_id, fee, type, amount, create_time, from_sign, log_id, remark)
values
(?, ?, ?, ?, ?, ?, ?, now(), ?, ?, ?)
EOL;
$ret = $this->pdo_execute($cmd, $agent_id, $channel_id, $player_id, $transaction_id, $pay_fee, $change_type, $change_amount, $from_sign, $log_id, $remark);
if (!$ret)
throw new Exception($this->geterrorinfo() . '(' . __LINE__ . ')', $this->geterrorcode());
$this->pdo_commit();
$return->biz_content = array(
'agentid' => $agent_id,
'channelid' => $channel_id,
'playerid' => $player_id,
'account' => $account,
);
return true;
}
catch(Exception $Exception)
{
$this->pdo_rollback();
$return->seterrors($Exception->getcode(), $Exception->getmessage());
return false;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,608 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/11/14
* Time: 11:30
*/
namespace models;
class Agent extends \core\Model
{
/**
* 添加新代理商
* @param $params
*/
public function addAgent(&$params)
{
$sql = 'insert into ct_agent_list (agent_id, nickname, max_sales_id, default_sales_power) VALUES (?,?,?,?)';
$this->execute($sql, [$params['agentid'], $params['name'], 10000000, $params['power']]);
}
/**
* 添加新渠道,并添加相应的产品
* @param $p
*/
public function addChannel(&$p)
{
$sql = 'insert into ct_channel_list (
agent_id, channel_id, nickname, logo, qq,
is_show_recharge_star, recharge_roomcard_to_sales,
wechat, app_id, devkey, market_id, app_id_pay,
devkey_pay, market_id_pay, is_open, parent_agent_id, become_sales_mode,
invitation_model, buy_card_mode, is_check_phone)
VALUES (
?,?,?,?,?,
?,?,
?,?,?,?,?,
?,?,?,?,?,
?,?,0
)';
$this->execute($sql, [
$p['agentid'], $p['channelid'], $p['name'], $p['logo'], $p['qq'],
$p['is_show_recharge_star'], $p['recharge_roomcard_to_sales'],
$p['wechat'], '14966338932488', '14966329712475', 'ylhdyx', '14966338932488',
'14966329712475', 'ylhdyx', $p['is_open'], $p['parentid'], $p['become_sales_mode'],
$p['invitation_model'], $p['buy_card_mode']
]);
// 添加产品
$agent_id = $p['agentid'];
$sql = <<<EOL
# 玩家购房卡
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+1), '0', '5张F卡', '5', '15.00', '', '0', '0');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+2), '0', '10张F卡', '10', '30.00', '', '0', '0');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+3), '0', '80张F卡', '80', '208.00', '', '0', '0');
# 代理购房卡
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+4), '1', '1张F卡', '1', '10.00', '', '0', '0');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+5), '1', '1张F卡', '1', '10.00', '', '0', '0');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+6), '1', '1张F卡', '1', '10.00', '', '0', '0');
# 玩家购星星
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+7), '0', '一万个星星', '10000', '105.00', '', '1', '1');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+8), '0', '五万个星星', '50000', '525.00', '', '1', '1');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+9), '0', '十万个星星', '100000', '1050.00', '', '1', '1');
# 代理购星星
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+10), '1', '一万个星星', '10000', '105.00', '', '1', '1');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+11), '1', '五万个星星', '50000', '525.00', '', '1', '1');
INSERT INTO `sales_product` (`sapr_agentid`, `sapr_productid`, `sapr_type`, `sapr_name`, `sapr_amount`, `sapr_money`, `sapr_memo`, `sapr_state`, `product_type`) VALUES ('{$agent_id}', MD5(unix_timestamp(now())+12), '1', '十万个星星', '100000', '1050.00', '', '1', '1');
EOL;
$this->execute($sql);
}
/**
* 添加游戏
* @param $p
*/
public function addGame(&$p)
{
$sql = 'insert into ct_game_list (
channel_id, game_id, game_name, logo, description,
ios_download_url, ios_market_type, ios_app_size, android_download_url, android_app_size,
is_open
) VALUES (
?,?,?,?,?,
?,?,?,?,?,
?
);';
$this->execute($sql, [
$p['channelid'], $p['gameid'], $p['gamename'], $p['logo'], $p['description'],
$p['ios_download_url'], $p['ios_market_type'], $p['ios_app_size'], $p['android_download_url'], $p['android_app_size'],
$p['is_open']
]);
}
/**
* 修改代理商信息
* @param $p
*/
public function setAgentInfo(&$p)
{
$sql = 'update ct_agent_list set
agent_id=?, nickname=?, default_sales_power=? where id=?;
';
$this->execute($sql, [
$p['agentid'], $p['name'], $p['power'], $p['id']
]);
}
/**
* 修改渠道信息
* @param $p
*/
public function setChannelInfo(&$p)
{
$sql = 'update ct_channel_list set
agent_id=?, channel_id=?, nickname=?, logo=?, qq=?,
is_show_recharge_star=?, recharge_roomcard_to_sales=?,
wechat=?, is_open=?, parent_agent_id=?, become_sales_mode=?, invitation_model=?,
buy_card_mode=?, share_title=?, share_desc=?, share_img=?, share_text=?, pay_desc=?, announcement=? where id=?;
';
$this->execute($sql, [
$p['agentid'], $p['channelid'], $p['name'], $p['logo'], $p['qq'],
$p['is_show_recharge_star'], $p['recharge_roomcard_to_sales'],
$p['wechat'], $p['is_open'], $p['parentid'], $p['become_sales_mode'], $p['invitation_model'],
$p['buy_card_mode'], $p['share_title'], $p['share_desc'], $p['share_img'], $p['share_text'], $p['pay_desc'],
$p['announcement'], $p['id']
]);
}
/**
* 修改渠道信息
* @param $p
*/
public function setGameInfo(&$p)
{
$sql = 'update ct_game_list set
channel_id=?, game_id=?, game_name=?, logo=?,
description=?, ios_download_url=?, ios_market_type=?, ios_app_size=?, android_download_url=?,
android_app_size=?, is_open=? where id=?;
';
$this->execute($sql, [
$p['channelid'], $p['gameid'], $p['gamename'], $p['logo'],
$p['description'], $p['ios_download_url'], $p['ios_market_type'], $p['ios_app_size'], $p['android_download_url'],
$p['android_app_size'], $p['is_open'], $p['id']
]);
}
/**
* 获取相关联的渠道列表
* @param $params
* @return array
*/
public function getChannelList(&$params)
{
// 获取所有开放的渠道
if($params['agentid'] === 'all') {
$sql = /** @lang text */
'SELECT id, agent_id AS agentid, channel_id AS channelid, nickname AS name
FROM ct_channel_list WHERE is_open = 1;';
} else {
$sql = /** @lang text */
'SELECT id, agent_id AS agentid, channel_id AS channelid, nickname AS name
FROM ct_channel_list WHERE parent_agent_id = ? AND is_open = 1;';
}
$result = $this->queryAll($sql, [$params['agentid']]);
return $result;
}
/**
* 获取所有渠道
* @return array
*/
public function getAllAgentList()
{
$sql = /** @lang text */'select id, agent_id as agentid, nickname as name, max_sales_id, default_sales_power
from ct_agent_list;';
$result = $this->queryAll($sql);
return $result;
}
/**
* 获取所有渠道
* @return array
*/
public function getAllChannelList()
{
$sql = 'select id, agent_id as agentid, channel_id as channelid, nickname as name, parent_agent_id
from ct_channel_list where is_open=1;';
$result = $this->queryAll($sql);
return $result;
}
/**
* 获取所有游戏
* @return array
*/
public function getAllGameList()
{
$sql = 'select id, channel_id as channelid, game_id as gameid, game_name as name
from ct_game_list where is_open=1 order by channelid, id;';
$result = $this->queryAll($sql);
return $result;
}
/**
* 获取渠道配置信息,公共版
* @param $params
* @return mixed
*/
public function getChannelConfig(&$params)
{
$sql = 'SELECT
id,
agent_id,
channel_id,
nickname AS agentname,
logo AS agentlogo,
qq,
wechat AS channelwechat,
become_sales_mode AS html_applysales,
invitation_model AS agentmode,
buy_card_mode AS html_buyroomcard,
recharge_roomcard_to_sales,
request_star,
is_check_phone,
create_withdrawals_order_type,
create_withdrawals_order_qcode,
is_show_topsales_menu,
is_show_recharge_star,
share_title,
share_desc,
share_img,
share_text,
pay_desc,
app_id AS youle_appid,
devkey AS youle_devkey,
market_id AS youle_busiid,
app_id_pay AS youle_appid_pay,
devkey_pay AS youle_devkey_pay,
market_id_pay AS youle_busiid_pay
FROM ct_channel_list WHERE agent_id = ? AND channel_id = ? AND is_open = 1;';
$result = $this->query($sql, [$params['agentid'], $params['channelid']]);
return $result;
}
/**
* 获取渠道配置信息,公共版
* @param $id
* @return mixed
*/
public function getChannelConfigById($id)
{
$sql = 'SELECT
id,
agent_id,
channel_id,
nickname AS agentname,
logo AS agentlogo,
qq,
wechat AS channelwechat,
become_sales_mode AS html_applysales,
invitation_model AS agentmode,
buy_card_mode AS html_buyroomcard,
recharge_roomcard_to_sales,
request_star,
share_title,
share_desc,
share_img,
share_text,
pay_desc,
app_id AS youle_appid,
devkey AS youle_devkey,
market_id AS youle_busiid,
app_id_pay AS youle_appid_pay,
devkey_pay AS youle_devkey_pay,
market_id_pay AS youle_busiid_pay
FROM ct_channel_list WHERE id=? AND is_open = 1;';
$result = $this->query($sql, [$id]);
return $result;
}
/**
* 获取代理商配置信息,管理员版
* @param $p
* @return mixed
*/
public function getAgentInfo(&$p)
{
$sql = 'SELECT
agent_id as agentid,
nickname as name,
default_sales_power as power
FROM ct_agent_list WHERE id=?;';
$result = $this->query($sql, [$p['id']]);
return $result;
}
/**
* 获取渠道配置信息,管理员版
* @param $p
* @return mixed
*/
public function getChannelInfo(&$p)
{
$sql = 'SELECT
agent_id as agentid,
channel_id as channelid,
parent_agent_id as parentid,
nickname AS name,
logo,
qq,
wechat,
is_show_recharge_star,
recharge_roomcard_to_sales,
become_sales_mode,
invitation_model,
buy_card_mode,
request_star,
share_title,
share_desc,
share_img,
share_text,
pay_desc,
announcement,
is_open
FROM ct_channel_list WHERE id=?;';
$result = $this->query($sql, [$p['id']]);
return $result;
}
/**
* 获取游戏配置信息,管理员版
* @param $p
* @return mixed
*/
public function getGameInfo(&$p)
{
$sql = 'SELECT
channel_id as channelid,
game_id as gameid,
game_name as gamename,
logo,
description,
ios_download_url,
ios_market_type,
ios_app_size,
android_download_url,
android_app_size,
is_open
FROM ct_game_list WHERE id=?;';
$result = $this->query($sql, [$p['id']]);
return $result;
}
/**
* 获取游戏下载列表
* @param $params
* @return array
*/
public function getGameList(&$params)
{
$sql = 'SELECT
game_id,
game_name AS name,
logo AS image,
description AS memo,
ios_download_url AS ios_down,
ios_download_url_2 AS ios_down_2,
ios_market_type AS ios_marketid,
ios_app_size AS ios_size,
android_download_url AS android_down,
android_download_url_2 AS android_down_2,
android_app_size AS android_size
FROM ct_game_list WHERE channel_id = ? AND is_open = 1;';
$result = $this->queryAll($sql, [$params['channelid']]);
return $result;
}
/**
* 产品列表
* @param $params
* @return array
*/
public function getProductList(&$params)
{
/**
* sales_product 表
* sapr_type => 0-针对个人玩家的产品 1-针对个人代理的产品
* product_type => 0-房卡1-星星2-钻石
* sapr_state => 0-启用 1-禁用
* sort 排序(数值大的在前面)
*/
$sql = 'SELECT
idx as productid, sapr_name as name, sapr_amount as amount, sapr_money as money,
sapr_memo as memo, product_type, sapr_type as type, make_vip
FROM
sales_product
WHERE
sapr_agentid = ? and sapr_type = ? and product_type = ? and sapr_state = 0 and parent_id is null
ORDER BY sort desc, idx;';
$result = $this->queryAll($sql, [$params['agentid'], $params['type'], $params['ptype']]);
return $result;
}
/**
* 获取指定渠道所有商品
* @param $agent_id
* @return array
* @throws \Exception
*/
public function getAllProductList($agent_id)
{
$sql = 'select * from sales_product where sapr_agentid=? order by product_type, sort desc';
return $this->queryAll($sql, [$agent_id]);
}
/**
* 获取单个商品信息
* @param $id
* @return mixed
* @throws \Exception
*/
public function getProductInfo($id)
{
$sql = 'select * from sales_product where idx=?';
return $this->query($sql, $id);
}
/**
* 修改商品信息
* @param $p
* @throws \Exception
*/
public function setProductInfo($p)
{
if(empty($p['parent_id']))
$parent_id = null;
else
$parent_id = $p['parent_id'];
$sql = 'update sales_product set sapr_agentid=?, sapr_type=?, sapr_name=?, sapr_amount=?, sapr_money=?, sapr_memo=?,
sapr_state=?, product_type=?, parent_id=?, sort=?, make_vip=? where idx=?';
$this->execute($sql, [
$p['sapr_agentid'], $p['sapr_type'],$p['sapr_name'],$p['sapr_amount'],$p['sapr_money'], $p['sapr_memo'],
$p['sapr_state'],$p['product_type'],$parent_id,$p['sort'], $p['make_vip'],$p['idx']
]);
}
/**
* 添加商品
* @param $p
* @throws \Exception
*/
public function addProductInfo($p)
{
if(empty($p['parent_id']))
$parent_id = null;
else
$parent_id = $p['parent_id'];
$sql = 'insert into sales_product (
sapr_agentid, sapr_type, sapr_name, sapr_amount, sapr_money,
sapr_memo, sapr_state, product_type, parent_id, sort,
make_vip
) values (
?,?,?,?,?,
?,?,?,?,?,
?)';
$this->execute($sql, [
$p['sapr_agentid'], $p['sapr_type'],$p['sapr_name'],$p['sapr_amount'],$p['sapr_money'], $p['sapr_memo'],
$p['sapr_state'],$p['product_type'],$parent_id,$p['sort'], $p['make_vip']
]);
}
/**
* 使用钻石兑换的商品
* @param $params
* @return array
* @throws \Exception
*/
public function getTransformProductList(&$params)
{
$sql = /** @lang text */<<<EOL
select
id, name, amount, diamond, type, remark
from
(
select
id, name, amount, diamond, type, remark, sort
from
ct_transform_product_info
where
agent_id = ? and channel_id = ? and enabled = 1 and is_preferential = 0
union all
select
id, name, amount, diamond, type, remark, sort
from
ct_transform_product_info
where
agent_id = ? and channel_id = ? and enabled = 1 and is_preferential = 1 and
date_format(now(), '%H:%i:%s') between preferential_start_time and preferential_end_time
) t
order by
sort desc, id
EOL;
// $sql = 'select
// id, name, amount, diamond, type, remark
// from
// ct_transform_product_info
// where
// agent_id=? and channel_id=? and enabled=1
// order by sort desc, id';
//
// $result = $this->queryAll($sql, [$params['agentid'], $params['channelid']]);
$result = $this->queryAll($sql, [$params['agentid'], $params['channelid'], $params['agentid'], $params['channelid']]);
return $result;
}
/**
* 公告
* type => 0-代理后台的公告 1-代理抽成的公告
* @param $p
* @return array
*/
public function getNotice(&$p)
{
$sql = 'SELECT
notice_info
FROM
ct_agent_notice
WHERE
(channel_id=1 or channel_id=?) and type=? and status=1;';
$result = $this->queryAll($sql, [$p['channelid'], $p['type']]);
return isset($result[0]) ? $result[0] : ['notice_info' => ''];
}
/**
* 获取茶水费配置
* @param $p
* @return array
*/
public function getAgentServiceConfig(&$p)
{
$sql = 'select * from ct_agent_service where agent_id=? and channel_id=?;';
$result = $this->queryAll($sql, [$p['agentid'], $p['channelid']]);
return $result;
}
/**
* 单个茶水费配置
* @param $id
* @return array
*/
public function getAgentServiceConfigSingle($id)
{
$sql = 'select * from ct_agent_service where id=?;';
$result = $this->query($sql, [$id]);
return $result;
}
/**
* 单个茶水费配置
* @param $p
* @return array
*/
public function getAgentServiceConfigSave(&$p)
{
$sql = 'update ct_agent_service set min_value=?, max_value=?, `type`=?, `value`=? where id=?;';
$this->execute($sql, [$p['min_value'], $p['max_value'], $p['type'], $p['value'], $p['id']]);
}
}

View File

@@ -0,0 +1,106 @@
<?php
/**
* 控制器基类(父类)
*/
class Base
{
/**
* 记录日志
* @param $data
* @param string $tmp
*/
public function log($data, $tmp = '')
{
$str = date('H:m:s').' => '. $tmp .': ';
if(is_array($data))
$str .= json_encode($data);
else
$str .= $data;
file_put_contents('debug/'.date('Y-m-d').'.txt', $str . PHP_EOL, FILE_APPEND);
}
/**
* 用于调试
* @param $tmp
*/
public function debug($tmp)
{
echo '<pre>';
var_dump($tmp);
die;
}
/**
* 校验数据
* R => 必要的数据(不能为空)
* r => 必要的数据(可以为空)
* 数字类型 => 没有传递参数默认赋值
* 字符串 => 没有传递参数默认赋值
* @param $params
* @param $rule
* @return mixed
* @throws Exception
*/
public function checkParams(&$params, $rule)
{
$biz = $params->biz_content;
$tmp = [];
$res = [];
foreach ($rule as $v) {
$tmp = explode('/', $v);
switch ($tmp[1])
{
// 不能为空
case 'R':
if(!empty($biz[$tmp[0]])) {
$res[$tmp[0]] = $biz[$tmp[0]];
continue;
}
throw new Exception("请上传必要的数据({$tmp[0]}", 1001);
break;
// 必须上传
case 'r':
if(isset($biz[$tmp[0]])) {
$res[$tmp[0]] = $biz[$tmp[0]];
continue;
}
throw new Exception("请上传必要的数据({$tmp[0]}", 1002);
break;
// 数字
case 'd':
$res[$tmp[0]] = (isset($biz[$tmp[0]]) && is_numeric($biz[$tmp[0]])) ? intval($biz[$tmp[0]]) : intval($tmp[1]);
break;
// 字符串
case 's':
$res[$tmp[0]] = isset($biz[$tmp[0]]) ? strval($biz[$tmp[0]]) : strval($tmp[1]);
break;
// 手机号
case 'phone':
if(!preg_match('/^1[3456789]{1}\d{9}$/', $biz[$tmp[0]])) {
throw new Exception('请输入正确的手机号', 1003);
}
$res[$tmp[0]] = $biz[$tmp[0]];
break;
default:
throw new Exception('未定义的格式', 1009);
}
}
return $res;
}
}

View File

@@ -0,0 +1,104 @@
<?php
class Db
{
/**
* 数据查询实例
* @var null
*/
public static $Db = null;
private static function _init()
{
if(!self::$Db)
self::$Db = new BaseMethod();
}
/**
* 查询方法,返回单条数据
* @param $sql
* @param array $arr
* @return mixed
* @throws \Exception
*/
public static function query($sql, $arr = [])
{
self::_init();
$result = self::$Db->PDO_Request($sql, $arr);
if(!self::$Db->PDO_IsDone())
throw new Exception(self::$Db->GetErrorInfo(), 101);
if(isset($result[0]))
return $result[0];
return false;
}
/**
* 查询方法,返回多条数据
* @param $sql
* @param $arr
* @return array
* @throws \Exception
*/
public static function queryAll($sql, $arr = [])
{
self::_init();
$result = self::$Db->PDO_Request($sql, $arr);
if(!self::$Db->PDO_IsDone())
throw new Exception(self::$Db->GetErrorInfo(), 102);
return $result;
}
/**
* 只执行sql语句不反回结果
* @param $sql
* @param array $arr
* @return bool
* @throws \Exception
*/
public static function execute($sql, $arr = [])
{
self::_init();
$ret = self::$Db->PDO_Execute($sql, $arr);
if(!$ret || !self::$Db->PDO_IsDone())
throw new \Exception(self::$Db->GetErrorInfo(), 103);
return true;
}
/**
* 开启事务
*/
public static function beginTransaction()
{
self::_init();
self::$Db->PDO_BeginTransaction();
}
/**
* 提交一个事务
*/
public static function commit()
{
self::$Db->PDO_Commit();
}
/**
* 回滚一个事务
*/
public static function rollBack()
{
self::$Db->PDO_Rollback();
}
}

View File

@@ -0,0 +1,24 @@
<?php
class SalesModel
{
/**
* 手机号是否注册过
* 已注册返回 true否则 false
*/
public function isRegisterPhone($agent_id, $channel_id, $phone)
{
$sql = 'select * from sales_user where saus_agentid = ? AND saus_channelid = ? AND saus_tel = ?';
$result = Db::query($sql, [$agent_id, $channel_id, $phone]);
if($result)
return true;
return false;
}
public function sendPhoneCode()
{
}
}

View File

@@ -0,0 +1,277 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/11/14
* Time: 11:30
*/
namespace models;
class SalesUser extends \core\Model
{
/**
* 查询代理信息,管理员版
* @param $params
* @return mixed
*/
public function querySalesInfo(&$params)
{
$sql = /** @lang text */'select
saus_nickname as nickname,
saus_parentid as parentid,
saus_roomcard as roomcard,
saus_bean as star,
password,
statistic_type,
global_power,
is_vip,
announcement
from sales_user where saus_salesid = ? and saus_agentid = ? and saus_channelid = ?;';
$result = $this->query($sql, [$params['salesid'], $params['agentid'], $params['channelid']]);
return $result;
}
/**
* 设置代理信息,管理员版
* @param $p
*/
public function setSalesInfo(&$p)
{
// 兼容
if(empty($p['parentid'])) $p['parentid'] = null;
$sql = /** @lang text */'update sales_user set saus_parentid = ?, global_power = ?, statistic_type = ?, is_vip=?, announcement=?
where saus_salesid = ? and saus_agentid = ? and saus_channelid = ? LIMIT 1;';
$this->execute($sql, [$p['parentid'], $p['global_power'], $p['statistic_type'], $p['is_vip'], $p['announcement'], $p['salesid'], $p['agentid'], $p['channelid']]);
}
/**
* 管理员给玩家充值房卡或星星
*/
public function playerRecharge(&$p)
{
/*$sql = 'select play_roomcard as card, play_bean as star from player WHERE play_agentid = ? and play_channelid = ? and play_playerid = ? LIMIT 1;';
$user_info = $this->query($sql, [$p['agentid'], $p['channelid'], $p['userid']]);*/
// 通过游戏的接口获取实时的玩家信息
$player_data = array(
'app' => 'youle',
'route' => 'agent',
'rpc' => 'query_player2',
'data' => array(
'agentid' => $p['agentid'],
'playerid' => $p['userid'],
),
);
$player_info = file_get_contents(REQUEST_USER_INFO . '?' . json_encode($player_data));
if(!$player_info) throw new \Exception('获取玩家信息错误', 1103);
$player_info = json_decode($player_info, true);
$user_info = $player_info['data'];
if(!isset($user_info['roomcard']) || !isset($user_info['bean']))
throw new \Exception('获取玩家信息错误', 1100);
// 判断是房卡还是星星
if($p['p_type'] === 1) {
$before = $user_info['roomcard'];
$sql = /** @lang text */'insert into ct_user_process_log(
from_agent, from_channel, from_user, to_agent, to_channel,
to_user, oper_type, oper_data, remark, oper_time,
is_process)
values (
?, ?, ?, ?, ?,
?, 2, ?, ?, ?,
?);';
} elseif($p['p_type'] === 2) {
$before = $user_info['bean'];
$sql = /** @lang text */'insert into ct_user_process_log(
from_agent, from_channel, from_user, to_agent, to_channel,
to_user, oper_type, oper_data, remark, oper_time,
is_process)
values (
?, ?, ?, ?, ?,
?, 12, ?, ?, ?,
?);';
} else {
throw new \Exception('充值类型错误', 1101);
}
$this->beginTransaction();
try {
// 插入日志
$this->query($sql, [
$p['agentid'], $p['channelid'], $p['adminid'], $p['agentid'], $p['channelid'],
$p['userid'], $p['amount'], '管理员充值', time(), 0
]);
$sql = /** @lang text */'insert into ct_manager_production_info (
agent_id, channel_id, from_user, to_user, user_type, production_type,
amount, before_update, after_update, oper_type, create_time, source_from,
remark)
values (
?,?,1,?,?,?,
?,?,?,1,now(),?,
?);';
$this->query($sql, [$p['agentid'], $p['channelid'], $p['userid'], $p['u_type'], $p['p_type'],
$p['amount'], $before, ($before + $p['amount']), $p['adminid'], '管理员充值']);
$this->commit();
} catch (\Exception $e) {
$this->rollBack();
throw $e;
}
}
/**
* 管理员给代理充值房卡或星星
* @param $p
* @throws \Exception
*/
public function salesRecharge(&$p)
{
$sql = /** @lang text */'select user_id, saus_roomcard card, saus_bean bean, diamond from sales_user where saus_agentid = ? and saus_channelid = ? and saus_salesid = ?';
$user_info = $this->query($sql, [$p['agentid'], $p['channelid'], $p['userid']]);
if(empty($user_info))
throw new \Exception('获取代理的信息错误', 1100);
$this->beginTransaction();
try {
/// 判断是房卡还是星星
switch ($p['p_type']) {
case 1:
$before = $user_info['card'];
// 校验数量
if(($before + $p['amount']) < 0) throw new \Exception('数量不足', 1102);
$sql = /** @lang text */'update sales_user set saus_roomcard = saus_roomcard + ? where saus_agentid = ? and saus_channelid = ? and saus_salesid = ? limit 1;';
$ret = self::$Db->pdo_execute($sql, $p['amount'], $p['agentid'], $p['channelid'], $p['userid']);
if (!$ret)
throw new \Exception(self::$Db->geterrorinfo(), self::$Db->geterrorcode());
if (!empty($user_info['user_id'])) {
$sql = /** @lang text */'update ct_user_account set card = card + ? where user_id = ?';
$ret = self::$Db->pdo_execute($sql, $p['amount'], $user_info['user_id']);
if (!$ret)
throw new \Exception(self::$Db->geterrorinfo(), self::$Db->geterrorcode());
}
break;
case 2:
$before = $user_info['bean'];
// 校验数量
if(($before + $p['amount']) < 0) throw new \Exception('数量不足', 1102);
$sql = /** @lang text */'update sales_user set saus_bean = saus_bean + ? where saus_agentid = ? and saus_channelid = ? and saus_salesid = ? limit 1;';
$ret = self::$Db->pdo_execute($sql, $p['amount'], $p['agentid'], $p['channelid'], $p['userid']);
if (!$ret)
throw new \Exception(self::$Db->geterrorinfo(), self::$Db->geterrorcode());
if (!empty($user_info['user_id'])) {
$sql = /** @lang text */'update ct_user_account set currency = currency + ? where user_id = ?';
$ret = self::$Db->pdo_execute($sql, $p['amount'], $user_info['user_id']);
if (!$ret)
throw new \Exception(self::$Db->geterrorinfo(), self::$Db->geterrorcode());
}
break;
default:
throw new \Exception('充值类型错误', 1101);
break;
}
$sql = /** @lang text */<<<EOL
insert into ct_manager_production_info (
agent_id, channel_id, from_user, to_user, user_type, production_type,
amount, before_update, after_update, oper_type, create_time, source_from,
remark)
values (
?,?,1,?,?,?,
?,?,?,1,now(),?,
?)
EOL;
$this->query($sql, [$p['agentid'], $p['channelid'], $p['userid'], $p['u_type'], $p['p_type'],
$p['amount'], $before, ($before + $p['amount']), $p['adminid'], '管理员充值']);
$this->commit();
} catch (\Exception $e) {
$this->rollBack();
throw $e;
}
}
/**
* 获取代理银行账户信息
* @param $params
* @return mixed
*/
public function getSalesBankInfo(&$params)
{
$sql =/** @lang text */ 'select
saus_realname,
saus_wechat,
saus_alipay,
saus_kaihu_name,
saus_kaihu_bank,
saus_kaihu_zhihang,
saus_kaihu_count
from sales_user WHERE saus_salesid = ? and saus_agentid = ? and saus_channelid = ?;';
$result = $this->query($sql, [$params['salesid'], $params['agentid'], $params['channelid']]);
return $result;
}
/**
* 获取玩家的上级
* @param $p
* @return array
*/
public function getPlayerParentInfo(&$p)
{
$sql = 'select play_playerid, play_nickname, play_invitecode from player where play_agentid=? and play_channelid=? and play_playerid=?';
$player = $this->query($sql, [$p['agentid'], $p['channelid'], $p['playerid']]);
$sql = 'select saus_salesid, saus_nickname, saus_invitecode, saus_parentid, player_id from sales_user where saus_agentid=? and saus_channelid=? and player_id=?';
$sales = $this->query($sql, [$p['agentid'], $p['channelid'], $p['playerid']]);
return ['playerinfo' => $player, 'salesinfo' => $sales];
}
public function setPlayerParent(&$p)
{
if(empty($p['parentid']))
$p['parentid'] = null;
$this->beginTransaction();
try {
$sql = 'select idx from player where play_agentid=? and play_channelid=? and play_playerid=? limit 1';
$res = $this->query($sql, [$p['agentid'], $p['channelid'], $p['playerid']]);
if(!$res)
throw new \Exception('玩家表信息不存在', 1000);
$sql = 'select idx from sales_user where saus_agentid=? and saus_channelid=? and player_id=? limit 1';
$res = $this->query($sql, [$p['agentid'], $p['channelid'], $p['playerid']]);
if(!$res)
throw new \Exception('推广员表信息不存在', 1000);
$sql = 'update player set play_invitecode=? where play_agentid=? and play_channelid=? and play_playerid=? limit 1';
$this->execute($sql, [$p['parentid'], $p['agentid'], $p['channelid'], $p['playerid']]);
$sql = 'update sales_user set saus_invitecode=? where saus_agentid=? and saus_channelid=? and player_id=? limit 1';
$this->execute($sql, [$p['parentid'], $p['agentid'], $p['channelid'], $p['playerid']]);
$this->commit();
return true;
} catch (\Exception $e) {
$this->rollBack();
throw $e;
}
}
}

View File

@@ -0,0 +1,31 @@
<?php
require_once APP_PATH.'/sms.php';
class Tools
{
/**
* 发送手机验证码
* @param $phone
* @param int $captcha
* @param bool $is_debug
* @return int
* @throws Exception
*/
public function sendCaptcha($phone, $captcha = 0, $is_debug = false)
{
$rand_code = !empty($captcha) ? $captcha : rand(100000, 999999);
// 是否是测试状态
if(!$is_debug) {
$sms = new sms();
$result = $sms->_SendSms(7, array('code' => $rand_code, 'product' => '代理'), $phone);
if ( !is_null($result)) {
throw new Exception('短信发送太频繁,请稍候再试', ERRORCODE_SMSSENDERROR);
}
}
return $rand_code;
}
}

View File

@@ -0,0 +1,77 @@
<?php
/**
* Created by PhpStorm.
* User: bahamut
* Date: 2018/11/8
* Time: 10:28
*/
require_once dirname(dirname(__DIR__)) . '/common/ErrorType.php';
require_once dirname(dirname(__DIR__)) . '/common/BaseMethodHelper.php';
require_once dirname(dirname(__DIR__)) . '/public/public_data.php';
class data extends BaseMethod
{
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $Request
* @param ReturnParameter $Return
* @return bool
*/
public function GetSalesList($Request, &$Return)
{
$param = (array)$Request->biz_content;
$agent_id = @$param['agentid'];
$channel_id = @$param['channelid'];
$page_index = intval(@$param['pageindex']);
$page_size = intval(@$param['pagesize']);
$from_sign = @$param['from'];
if (strcasecmp($from_sign, 'games') != 0) {
$Return->seterrors(ERRORCODE_INVALIDPARAMETER, sprintf(ERRORINFO_INVALIDPARAMETER, 'source sign'));
return false;
}
$cmd = $this->NewServantCommand();
//select
// a.saus_salesid, a.player_id, b.saus_salesid, b.player_id
//from
// sales_user a
//left join
// sales_user b
//on
// a.saus_agentid = b.saus_agentid and
// a.saus_channelid = b.saus_channelid and
// a.saus_parentid = b.saus_salesid
//where
// a.saus_agentid = '00bA05haB0d9ZC0fwGD09Q2OA30insbQ' and
// a.saus_channelid = 'frdt0C1GG0t91P0McFo0rbA1he5yurbS';
if (0 == $page_index || 0 == $page_size) {
$Return->biz_content = $cmd
->select(['sales_id' => 'a.saus_salesid', 'player_id' => 'a.player_id', 'parent_sales_id' => 'b.saus_salesid', 'parent_player_id' => 'b.player_id', ])
->from(['a' => 'sales_user', ])
->leftjoin(['b' => 'sales_user', ])
->on('a.saus_agentid = b.saus_agentid and a.saus_channelid = b.saus_channelid and a.saus_parentid = b.saus_salesid')
->where(['a.saus_agentid' => $agent_id, 'a.saus_channelid' => $channel_id, ])
->request();
} else {
$Return->biz_content = $cmd
->select(['sales_id' => 'a.saus_salesid', 'player_id' => 'a.player_id', 'parent_sales_id' => 'b.saus_salesid', 'parent_player_id' => 'b.player_id', ])
->from(['a' => 'sales_user', ])
->leftjoin(['b' => 'sales_user', ])
->on('a.saus_agentid = b.saus_agentid and a.saus_channelid = b.saus_channelid and a.saus_parentid = b.saus_salesid')
->where(['a.saus_agentid' => $agent_id, 'a.saus_channelid' => $channel_id, ])
->withpage($page_index, $page_size)
->request();
}
if (!$this->pdo_isdone()) {
$Return->seterrors($this->geterrorcode(), $this->geterrorinfo());
return false;
} else {
return true;
}
}
}

View File

@@ -0,0 +1,494 @@
<?php
/**
* Created by PhpStorm.
* User: abcdefg
* Date: 2017/10/10
* Time: 11:00
*/
require_once dirname(dirname(__DIR__)) . '/common/ErrorType.php';
require_once dirname(dirname(__DIR__)) . '/common/common.inc.php';
require_once dirname(dirname(__DIR__)) . '/common/BaseMethodHelper.php';
///require_once dirname(dirname(__DIR__)) . '/third/wxpay/lib/wxpay.data.php';
/**
* 数据对象基础类,该类中定义数据类最基本的行为,包括:
* 计算/设置/获取签名、输出xml格式的参数、从xml读取数据对象等
*/
class WechatBaseData
{
protected $Values = array();
protected $SignKey = '';
/**
* 设置签名,详见签名生成算法
* @param mixed $Parameters
* @return string
**/
public function SetSign($Parameters = null)
{
if (is_null($Parameters))
$Parameters = $this->Values;
$Sign = $this->MakeSign($Parameters);
$this->Values['sign'] = $Sign;
return $Sign;
}
/**
* 获取签名,详见签名生成算法的值
* @return mixed
**/
public function GetSign()
{
return $this->Values['sign'];
}
/**
* 判断签名,详见签名生成算法是否存在
* @return bool
**/
public function IsSignSet()
{
return array_key_exists('sign', $this->Values);
}
/**
* 输出xml字符
* @param mixed $Parameters
* @return string
**/
public function ToXml($Parameters = null)
{
if (is_null($Parameters))
$Parameters = $this->Values;
if (is_object($Parameters))
$Parameters = (array)$Parameters;
elseif (!is_array($Parameters))
return '<xml></xml>';
$Result = '';
foreach ($Parameters as $Key => $Value)
{
if (is_numeric($Value))
$Result .= "<{$Key}>{$Value}</{$Key}>";
elseif (is_object($Value) || is_array($Value))
$Result .= "<{$Key}>" . $this->ToXml($Value) . "</{$Key}>";
else
$Result .= "<{$Key}><![CDATA[{$Value}]]></{$Key}>";
}
return "<xml>{$Result}</xml>";
}
/**
* 将xml转为array
* @param string $Parameters
* @return mixed
*/
public function FromXml($Parameters)
{
if (!$Parameters)
return null;
/// 将XML转为array
/// 禁止引用外部xml实体
libxml_disable_entity_loader(true);
$this->Values = json_decode(json_encode(simplexml_load_string($Parameters, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $this->Values;
}
/**
* 格式化参数格式化成url参数
* @param mixed $Parameters
* @return string;
*/
public function ToUrlParams($Parameters = null)
{
if (is_null($Parameters))
$Parameters = $this->Values;
if (empty($Parameters))
return '';
if (is_object($Parameters))
$Parameters = (array)$Parameters;
elseif (!is_array($Parameters))
return $Parameters;
$Result = '';
foreach ($Parameters as $Key => $Value)
{
if (is_object($Value) || is_array($Value))
$Result .= $Key . '=' . $this->ToUrlParams($Value) . '&';
elseif (strcasecmp($Key, 'sign') != 0 && strcasecmp($Value, '') != 0)
$Result .= "{$Key}={$Value}&";
}
return trim($Result, '&');
}
/**
* 生成签名
* @param mixed $Parameters
* @return string 签名本函数不覆盖sign成员变量如要设置签名需要调用SetSign方法赋值
*/
public function MakeSign($Parameters = null)
{
if (is_null($Parameters))
$Parameters = $this->Values;
if (is_object($Parameters))
$Parameters = (array)$Parameters;
elseif (!is_array($Parameters))
return strtoupper(md5("{$Parameters}&key={$this->SignKey}"));
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->ToUrlParams($Parameters);
//签名步骤二在string后加入KEY
$String = "{$String}&key={$this->SignKey}";
//签名步骤三MD5加密
$String = md5($String);
//签名步骤四:所有字符转为大写
$Result = strtoupper($String);
return $Result;
}
/**
* 获取设置的值
*/
public function GetValues()
{
return $this->Values;
}
public function GetSignKey()
{
return $this->SignKey;
}
public function SetSignKey($SignKey)
{
$this->SignKey = $SignKey;
}
}
/// 红包数据对象
class RedPackData extends WechatBaseData
{
public $RequestUrl = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'; /// 请求URL
/*
nonce_str随机字符串不长于32位
sign签名详见签名生成算法
mch_billno商户订单号每个订单号必须唯一。取值范围0~9a~zA~Z接口根据商户订单号支持重入如出现超时可再调用。
mch_id微信支付分配的商户号
wxappid微信分配的公众账号ID企业号corpid即为此appId。接口传入的所有appid应该为公众号的appid在mp.weixin.qq.com申请的不能为APP的appid在open.weixin.qq.com申请的
send_name红包发送者名称
re_openid接受红包的用户用户在wxappid下的openid
total_amount付款金额单位分
total_num红包发放总人数
wishing红包祝福语
client_ip调用接口的机器Ip地址
act_name活动名称
remark备注信息
scene_id场景id发放红包使用场景红包金额大于200时必传PRODUCT_1:商品促销、PRODUCT_2:抽奖、PRODUCT_3:虚拟物品兑奖、PRODUCT_4:企业内部福利、PRODUCT_5:渠道分润、PRODUCT_6:保险回馈、PRODUCT_7:彩票派奖、PRODUCT_8:税务刮奖)
risk_info活动信息posttime:用户操作的时间戳mobile:业务系统账号的手机号,国家代码-手机号。不需要+号deviceid :mac 地址或者设备唯一标识clientversion :用户操作的客户端版本把值为非空的信息用key=value进行拼接再进行urlencodeurlencode(posttime=xx& mobile =xx&deviceid=xx)
consume_mch_id资金授权商户号服务商替特约商户发放时使用
*/
protected function SetValue($Key, $Value)
{
$this->Values[$Key] = $Value;
}
/// 微信分配的公众账号ID企业号corpid即为此appId。接口传入的所有appid应该为公众号的appid在mp.weixin.qq.com申请的不能为APP的appid在open.weixin.qq.com申请的
public function SetAppId($app_id)
{
$this->SetValue('wxappid', $app_id);
}
/// 微信支付分配的商户号
public function SetMchId($mch_id)
{
$this->SetValue('mch_id', $mch_id);
}
/// 商户订单号每个订单号必须唯一。取值范围0~9a~zA~Z接口根据商户订单号支持重入如出现超时可再调用。
public function SetMchBillNo($mch_billno)
{
$this->SetValue('mch_billno', $mch_billno);
}
/// 红包发送者名称
public function SetSendName($send_name)
{
$this->SetValue('send_name', $send_name);
}
/// 接受红包的用户用户在wxappid下的openid
public function SetOpenId($open_id)
{
$this->SetValue('re_openid', $open_id);
}
/// 付款金额,单位分
public function SetAmount($amount)
{
$this->SetValue('total_amount', $amount);
}
/// 红包发放总人数
public function SetNumber($number)
{
$this->SetValue('total_num', $number);
}
/// 红包祝福语
public function SetWishing($wishing)
{
$this->SetValue('wishing', $wishing);
}
/// 调用接口的机器Ip地址
public function SetClientIp($client_ip)
{
$this->SetValue('client_ip', $client_ip);
}
/// 活动名称
public function SetActiveName($act_name)
{
$this->SetValue('act_name', $act_name);
}
/// 备注信息
public function SetRemark($remark)
{
$this->SetValue('remark', $remark);
}
/// 场景id发放红包使用场景红包金额大于200时必传PRODUCT_1:商品促销、PRODUCT_2:抽奖、PRODUCT_3:虚拟物品兑奖、PRODUCT_4:企业内部福利、PRODUCT_5:渠道分润、PRODUCT_6:保险回馈、PRODUCT_7:彩票派奖、PRODUCT_8:税务刮奖)
public function SetSceneId($scene_id)
{
$this->SetValue('scene_id', $scene_id);
}
/// 活动信息posttime:用户操作的时间戳mobile:业务系统账号的手机号,国家代码-手机号。不需要+号deviceid :mac 地址或者设备唯一标识clientversion :用户操作的客户端版本把值为非空的信息用key=value进行拼接再进行urlencodeurlencode(posttime=xx& mobile =xx&deviceid=xx)
public function SetRiskInfo($risk_info)
{
if (is_object($risk_info))
$risk_info = (array)$risk_info;
elseif(!is_array($risk_info))
$this->SetValue('risk_info', $risk_info);
$risk_info = urlencode("posttime={$risk_info['posttime']}&mobile={$risk_info['mobile']}&deviceid={$risk_info['deviceid']}&clientversion={$risk_info['clientversion']}");
$this->SetValue('risk_info', $risk_info);
}
/// 资金授权商户号,服务商替特约商户发放时使用
public function SetConsumeMchId($consume_mch_id)
{
$this->SetValue('consume_mch_id', $consume_mch_id);
}
/// 随机字符串不长于32位
public function SetNonceString($nonce_str)
{
$this->SetValue('nonce_str', $nonce_str);
}
}
class wechat extends BaseMethod
{
/**
* @var RedPackData
*/
private $RedPackData;
/**
* @var int
*/
private $RequestErrorCode;
/**
* 公钥
*/
private $PublicKey = '/cert/0000000000/apiclient_cert.pem';
/**
* 私钥
*/
private $PrivateKey = '/cert/0000000000/apiclient_key.pem';
/**
* ca证书
*/
private $RootCA = '/cert/0000000000/rootca.pem';
/**
* wechat constructor.
*/
public function __construct()
{
/// todo:
parent::__construct();
$this->PublicKey = __DIR__ . '/cert/1399351902/apiclient_cert.pem';
$this->PrivateKey = __DIR__ . '/cert/1399351902/apiclient_key.pem';
$this->RootCA = __DIR__ . '/cert/1399351902/rootca.pem';
$this->RedPackData = new RedPackData();
/// 初始化红包设置信息
//$this->RedPackData->SetSignKey('0t3xm3w1foyhcmhlux31mwrmybqh4cgd'); /// 支付key
//$this->RedPackData->SetAppId('wxb534983dcd6d77c6'); /// 公众账号appid
//$this->RedPackData->SetMchId('1345625501'); /// 商户号
$this->RedPackData->SetSignKey('YSWDSJ20160620201606202016062020'); /// 支付key
$this->RedPackData->SetAppId('wxfd77eb9fb989e822'); /// 公众账号appid
$this->RedPackData->SetMchId('1399351902'); /// 商户号
$this->RedPackData->SetMchBillNo(''); /// 商户订单号
$this->RedPackData->SetActiveName('test'); /// 活动名称
$this->RedPackData->SetSendName('友乐互动游戏'); /// 商户名称
$this->RedPackData->SetOpenId(''); /// 接受红包的用户用户在wxappid下的openid
$this->RedPackData->SetAmount(100); /// 付款金额,单位分
$this->RedPackData->SetNumber(1); /// 发送红包总人数
$this->RedPackData->SetWishing('test'); /// 红包祝福语
$this->RedPackData->SetRemark('test'); /// 备注信息
$this->RedPackData->SetNonceString($this->create_nonce_str(32)); /// 随机字符串不长于32位
$this->RedPackData->SetClientIp($_SERVER['SERVER_ADDR']); /// 客户端ip
}
/**
* 产生随机字符串不长于32位
* @param int $length
* @return string 产生的随机字符串
*/
public static function create_nonce_str($length = 32)
{
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$str = '';
for ($i = 0; $i < $length; $i++)
{
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* @param string $Url 连接地址
* @param string $Data 发送的数据
* @param int $Second
* @param array $Header
* @return bool|mixed
*/
private function curl_post_ssl($Url, $Data, $Second = 30, $Header = array())
{
$ch = curl_init();
/// 超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, $Second);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
/// 这里设置代理,如果有的话
/// curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
/// curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
/// 以下两种方式需选择一种
/// 第一种方法cert 与 key 分别属于两个.pem文件
/// 默认格式为PEM可以注释
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
//curl_setopt($ch, CURLOPT_SSLCERT, getcwd() . $this->PublicKey);
curl_setopt($ch, CURLOPT_SSLCERT, $this->PublicKey);
/// 默认格式为PEM可以注释
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
//curl_setopt($ch, CURLOPT_SSLKEY, getcwd() . $this->PrivateKey);
curl_setopt($ch, CURLOPT_SSLKEY, $this->PrivateKey);
/// ca证书
curl_setopt($ch, CURLOPT_CAINFO, $this->RootCA);
/// 第二种方式,两个文件合成一个.pem文件
///curl_setopt($ch, CURLOPT_SSLCERT, getcwd() . '/all.pem');
if (count($Header) >= 1)
curl_setopt($ch, CURLOPT_HTTPHEADER, $Header);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Data);
$Result = curl_exec($ch);
if ($Result)
{
$this->RequestErrorCode = 0;
curl_close($ch);
return $Result;
}
else
{
$this->RequestErrorCode = curl_errno($ch);
//echo "call faild, errorCode: {$this->RequestErrorCode}\n\n\n\n";
curl_close($ch);
return null;
}
}
/**
* 被请求方法示例参数固定为RequestParameter和ReturnParameter对象返回值固定为true(成功)和false(失败)
* @param RequestParameter $Request
* @param ReturnParameter $Return
* @return bool
*/
public function SendRedPack($Request, &$Return)
{
///https://proxytest.tscce.cn/api/Index.php?method=pay.wechat.SendRedPack&format=json&charset=utf-8&timestamp=1&version=1.0&biz_content={"act_name":"活动名称","open_id":"ogLT2v3XvvB1aphibzHyL8On4_sk","fee":"100","wishing":"红包祝福语","remark":"备注信息"}&user_auth_token=xxxxxxxx
$bill_no = date('YmdHis') . rand(1000, 9999); /// 订单号
$act_name = @$Request->biz_content['act_name']; /// 活动名称
$open_id = @$Request->biz_content['open_id']; /// 接受红包的用户用户在wxappid下的openid /// ogLT2v3XvvB1aphibzHyL8On4_sk
$fee = @$Request->biz_content['fee']; /// 付款金额,单位分
$wishing = @$Request->biz_content['wishing']; /// 红包祝福语
$remark = @$Request->biz_content['remark']; /// 备注信息
$this->RedPackData->SetMchBillNo($bill_no);
$this->RedPackData->SetActiveName($act_name);
$this->RedPackData->SetOpenId($open_id);
$this->RedPackData->SetAmount($fee);
$this->RedPackData->SetWishing($wishing);
$this->RedPackData->SetRemark($remark);
$this->RedPackData->SetSign(); /// 签名
/// 发送数据
$xml = $this->curl_post_ssl($this->RedPackData->RequestUrl, $this->RedPackData->ToXml());
if (empty($xml))
{
$Return->SetErrors(ERRORCODE_WECHATERROR, "curl call faild! error code: {$this->RequestErrorCode}");
return false;
}
$res = (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
if (empty($res))
{
$Return->SetErrors(ERRORCODE_WECHATERROR, $xml);
return false;
}
if (strcasecmp('success', $res['return_code']) != 0)
{
$Return->SetErrors(ERRORCODE_WECHATERROR, $res['return_msg']);
return false;
}
if (strcasecmp('success', $res['result_code']) != 0)
{
$Return->SetErrors(ERRORCODE_WECHATERROR, $res['err_code_des']);
return false;
}
return true;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,267 @@
<?php
require_once __DIR__ . '/header.php';
require_once __DIR__ . '/models/SalesModel.php';
class sales extends Base
{
/**
* 代理注册
* 用户通过手机号注册成为代理
* @post agent_id
* @post channel_id
* @post phone 手机号
* @post captcha 验证码
*/
public function register($request, &$return)
{
$params = $this->checkParams($request, [
'agentid/R', 'channelid/R', 'phone/R', 'captcha/0'
]);
$agent_id = $params['agentid'];
$channel_id = $params['channelid'];
$phone = $params['phone'];
$captcha = $params['captcha'];
// 判断手机号码是否正确
if ( !preg_match('/^1[3456789]{1}\d{9}$/', $phone)) {
throw new Exception('手机号不符合规则', 200);
}
if ( !isset($_SESSION['rand_code'])) {
throw new Exception('请先获取验证码', 200);
}
if ($_SESSION['rand_code'] !== $captcha) {
throw new Exception('验证码不正确', 200);
}
$SalesModel = new SalesModel();
$flag = $SalesModel->isRegisterPhone($agent_id, $channel_id, $phone);
if ($flag) {
throw new Exception('该手机号已注册', 200);
}
// 更新当前最大的代理id
$sql = 'update ct_agent_list set max_sales_id = max_sales_id + floor(rand() * (12-6) + 6) where agent_id = ?';
Db::execute($sql, [$agent_id]);
// 获取当前最大的代理id默认权限
$sql = 'select max_sales_id, default_sales_power from ct_agent_list where agent_id = ? LIMIT 1';
$result = Db::query($sql, [$agent_id]);
$max_sales_id = $result['max_sales_id'];
$power = $result['default_sales_power'];
// 插入记录
$sql = 'INSERT INTO sales_user (
saus_agentid, saus_channelid, saus_openid, saus_unionid, saus_firsttime,
saus_salesid, saus_tel, saus_power, password, saus_salesman,
saus_avatar, saus_nickname
) VALUES (
?,?,?,?,?,
?,?,?,?,1,
?,?
);';
$now = date("Y-m-d H:i:s", time());
$password = $max_sales_id . rand(1000, 9999);
$result = Db::execute($sql, [
$agent_id, $channel_id, $phone, $phone, $now,
$max_sales_id, $phone, $power, $password, '', '']);
// 清楚短信验证码
unset($_SESSION['rand_code']);
$return->biz_content = '注册成功';
return true;
}
/**
* 代理登入
*/
public function login($request, $return)
{
$params = $this->checkParams($request, [
'agentid/R', 'channelid/R', 'account/R', 'password/R'
]);
$agent_id = $params['agentid'];
$channel_id = $params['channelid'];
$account = $params['account'];
$password = $params['password'];
$sql = 'select saus_salesid, saus_nickname, saus_avatar,saus_roomcard, saus_bean from sales_user where saus_agentid = ? and saus_channelid and (saus_salesid = ? or saus_tel=?) and password=?;';
$sales_info = Db::query($sql, [$agent_id, $channel_id, $account, $account, $password]);
}
/**
* 手机号动态验证码登录
* @param $request
* @param $return
* @return bool
* @throws Exception
*/
public function loginByPhone($request, &$return)
{
$params = $this->checkParams($request, [
'agentid/R', 'channelid/R', 'phone/phone', 'captcha/R'
]);
$agent_id = $params['agentid'];
$channel_id = $params['channelid'];
$phone = $params['phone'];
$captcha = $params['captcha'];
$ret = Db::query('select id from sales_sms_code where agent_id = ? and channnel_id = ? and phone = ? and code = ?', [$agent_id, $channel_id, $phone, $captcha]);
if ( !$ret) {
$return->setErrors(200, '未查询到验证码');
return false;
}
// 通过session中的idx获取用户信息
$command = <<<EOL
select
idx, saus_agentid, saus_channelid, saus_openid, saus_unionid, saus_salesman, saus_salesid, saus_level,
saus_salestype, saus_roomcard, saus_bean, saus_power, saus_invitecode, saus_pushmoney1, saus_pushmoney2,
saus_status, password, saus_nickname, saus_avatar, saus_sex, saus_province, saus_city, global_power,
saus_tel, saus_wechat, is_send_star, user_id, player_id
from
sales_user
where
saus_agentid = ? and saus_channelid = ? and saus_tel = ?
EOL;
$dbSaleInfo = Db::query($command, [$agent_id, $channel_id, $phone]);
if ( !$dbSaleInfo) {
$return->setErrors(200, '未获取到用户信息');
return false;
}
if ($dbSaleInfo['saus_status'] != 0) {
$return->setErrors(200, '对不起,你的账号已被账号冻结');
return false;
}
// 记录登录日志 登录类型 0-微信登录 1-账号登录 2-手机号动态验证码登录
$sql = 'insert into ct_sales_login_log (agent_id, channel_id, sales_id, login_type, login_time) values (?,?,?,?,now());';
Db::execute($sql, [$agent_id, $channel_id, $dbSaleInfo['saus_salesid'], 2]);
// 更新最后一次的登录的时间
$sql = 'update sales_user set saus_lasttime=now() where idx=?';
Db::execute($sql, [$dbSaleInfo['idx']]);
$return->biz_content = array(
'idx' => $dbSaleInfo['idx'], /// 代理
'agentid' => $dbSaleInfo['saus_agentid'], /// 代理
'channelid' => $dbSaleInfo['saus_channelid'], /// 渠道
'openid' => isset($dbSaleInfo['saus_openid']) ? $dbSaleInfo['saus_openid'] : '', /// openid
'unionid' => isset($dbSaleInfo['saus_unionid']) ? $dbSaleInfo['saus_unionid'] : '', /// unionid
'nickname' => isset($dbSaleInfo['saus_nickname']) ? $dbSaleInfo['saus_nickname'] : '', /// 昵称
'headimgurl' => isset($dbSaleInfo['saus_avatar']) ? $dbSaleInfo['saus_avatar'] : '', /// 头像
'sex' => isset($dbSaleInfo['saus_sex']) ? $dbSaleInfo['saus_sex'] : '', /// 性别
'province' => isset($dbSaleInfo['saus_province']) ? $dbSaleInfo['saus_province'] : '', /// 省
'city' => isset($dbSaleInfo['saus_city']) ? $dbSaleInfo['saus_city'] : '', /// 市
'salesman' => empty($dbSaleInfo['saus_salesman']) ? 0 : intval($dbSaleInfo['saus_salesman']), /// 是否代理
'salesid' => isset($dbSaleInfo['saus_salesid']) ? $dbSaleInfo['saus_salesid'] : '', /// 代理编号
'level' => isset($dbSaleInfo['saus_level']) ? $dbSaleInfo['saus_level'] : '', /// 代理等级
'salestype' => isset($dbSaleInfo['saus_salestype']) ? $dbSaleInfo['saus_salestype'] : '', /// 代理类型
'roomcard' => isset($dbSaleInfo['saus_roomcard']) ? $dbSaleInfo['saus_roomcard'] : '', /// 账户房卡数
'bean' => isset($dbSaleInfo['saus_bean']) ? $dbSaleInfo['saus_bean'] : '', /// 账户金币数
'salespower' => isset($dbSaleInfo['saus_power']) ? $dbSaleInfo['saus_power'] : '', /// 代理权限
'agentmode' => 0, /// 分享模式
//'pushmoney' => intval($dbSaleInfo['saus_pushmoney1']) + intval($dbSaleInfo['saus_pushmoney2']), /// 提成金额
'sausstatus' => isset($dbSaleInfo['saus_status']) ? $dbSaleInfo['saus_status'] : '', /// 当前状态
'html_applysales' => isset($db_agent_info['html_applysales']) ? $db_agent_info['html_applysales'] : '', /// 成为代理的方式
'global_power' => isset($dbSaleInfo['global_power']) ? intval($dbSaleInfo['global_power']) : 0, /// 是否总代
'tel' => isset($dbSaleInfo['saus_tel']) ? $dbSaleInfo['saus_tel'] : '', /// 电话号码
'wechat' => isset($dbSaleInfo['saus_wechat']) ? $dbSaleInfo['saus_wechat'] : '', /// 微信号码
'ppp' => isset($dbSaleInfo['password']) ? $dbSaleInfo['password'] : '', /// 密码
'user_id' => empty(@$dbSaleInfo['user_id']) ? '' : $dbSaleInfo['user_id'], /// 统一账户编号
'is_bind' => empty($dbSaleInfo['saus_tel']) ? 0 : (0 == $dbSaleInfo['is_send_star'] ? 0 : 1), /// 是否绑定
'logintype' => 2,
'player_id' => isset($dbSaleInfo['player_id']) ? $dbSaleInfo['player_id'] : ''
);
return true;
}
/**
* 发送手机验证码,动态登录
*/
public function captchaLogin($request, &$return)
{
$params = $this->checkParams($request, [
'agentid/R', 'channelid/R', 'phone/phone'
]);
$agent_id = $params['agentid'];
$channel_id = $params['channelid'];
$phone = $params['phone'];
// 判断手机号是否绑定过账号
$sql = 'select idx from sales_user where saus_agentid=? and saus_channelid=? and saus_tel=? and is_send_star=1;';
$result = Db::query($sql, [$agent_id, $channel_id, $phone]);
if ( !$result) {
$return->setErrors(200, '该功能只支持已绑定手机的用户');
return false;
}
// 发送验证码
require_once '/models/Tools.php';
$Tools = new Tools();
$rand_code = $Tools->sendCaptcha($phone, 0, false);
$command = 'select id from sales_sms_code where agent_id = ? and channnel_id = ? and phone = ? and status = 0';
$ret = Db::query($command, [$agent_id, $channel_id, $phone]);
if (empty($ret)) {
$command = 'insert into sales_sms_code(agent_id, channnel_id, phone, code, status, is_bind, create_time) values(?, ?, ?, ?, 0, 1, now());';
Db::execute($command, [$agent_id, $channel_id, $phone, $rand_code]);
} else {
$command = 'update sales_sms_code set code = ? where id = ?';
Db::execute($command, [$rand_code, $ret['id']]);
}
// 验证码保存到session中
//$_SESSION['rand_code'] = $rand_code;
//$_SESSION['idx'] = $result['idx'];
$return->biz_content = $rand_code;
return true;
}
/**
* 测试方法
* @param $request
* @param $return
* @return bool
* @throws Exception
*/
public function test($request, $return)
{
$params = $this->checkParams($request, [
'agentid/R', 'channelid/R'
]);
$data = DB::query('select * from sales_user LIMIT 1;');
$params['test'] = 'tangjian';
$params['sales_info'] = $data;
$return->biz_content = $params;
return true;
}
}

Some files were not shown because too many files have changed in this diff Show More