371 lines
14 KiB
PHP
371 lines
14 KiB
PHP
<?php
|
||
|
||
namespace app\service\game;
|
||
|
||
use addons\webman\model\Game;
|
||
use addons\webman\model\GamePlatform;
|
||
use addons\webman\model\Player;
|
||
use addons\webman\model\PlayerGamePlatform;
|
||
use addons\webman\model\PlayerWalletTransfer;
|
||
use app\exception\GameException;
|
||
use Exception;
|
||
use support\Log;
|
||
use support\Response;
|
||
|
||
class CSServiceInterface extends GameServiceFactory implements GameServiceInterface
|
||
{
|
||
public $method = 'POST';
|
||
public $successCode = '0';
|
||
/** @var PlayerGamePlatform $playerGamePlatform */
|
||
public $playerGamePlatform;
|
||
public $gameType = [
|
||
'CB' => 'CARD & BOARDGAME',
|
||
'ES' => 'E-GAMES',
|
||
'SB' => 'SPORTBOOK',
|
||
'LC' => 'LIVE-CASINO',
|
||
'SL' => 'SLOTS',
|
||
'LK' => 'LOTTO',
|
||
'FH' => 'FISH HUNTER',
|
||
'PK' => 'POKER',
|
||
'MG' => 'MINI GAME',
|
||
'OT' => 'OTHERS'
|
||
];
|
||
public $failCode = [
|
||
'61' => '货币不兼容',
|
||
'70' => '集成系统余额不足',
|
||
'71' => '单据号不正确',
|
||
'72' => '余额不足',
|
||
'73' => '转账金额不正确',
|
||
'74' => '转账金额不能多过两个小数点 0.00',
|
||
'75' => '不允许在游戏中进行转移',
|
||
'81' => '会员账号不存在',
|
||
'82' => '会员账号已存在',
|
||
'83' => '代理号已存在',
|
||
'90' => '请求参数不正确',
|
||
'91' => '代理号不正确',
|
||
'92' => '供应商代号不正确',
|
||
'93' => '请求参数类型不正确',
|
||
'94' => '账号不正确',
|
||
'95' => '密码不正确',
|
||
'96' => '旧密码不正确',
|
||
'97' => '请求链接/域名不正确',
|
||
'98' => '账号/密码错误',
|
||
'99' => '加密错误',
|
||
'600' => '前期检验失败。 存款/取款 操作已被无视',
|
||
'601' => '此产品的存款 功能暂时停用维修',
|
||
'602' => '此产品的取款 功能暂时停用维修',
|
||
'603' => '即将执行在线系统维护,为了避免维护时导致的系统不稳定,转账API暂时停止(暂停时间大约5~10分钟,若提早完毕会提早解放)',
|
||
'992' => '平台不兼容请求的游戏类型',
|
||
'991' => '代理号已冻结',
|
||
'994' => '接口访问被禁止',
|
||
'995' => '平台未开通',
|
||
'996' => '平台不支持',
|
||
'998' => '请联系客服',
|
||
'999' => '系统维护中',
|
||
'9999' => '未知错误',
|
||
'-987' => '交易单号不存在;产品不支持',
|
||
'-997' => '系统错误,请联络客服。',
|
||
'-998' => '集成系统接口余额不足',
|
||
'-999' => '接口错误',
|
||
];
|
||
private $apiDomain;
|
||
private $providerCode;
|
||
private $appId;
|
||
private $appSecret;
|
||
private $path = [
|
||
'createPlayer' => '/createMember.aspx',
|
||
'getGameList' => '/getGameList.aspx',
|
||
'getBalance' => '/getBalance.aspx',
|
||
'getLoginH5' => '/launchGames.aspx',
|
||
'getDLoginH5' => '/launchDGames.ashx',
|
||
'changePassword' => '/changePassword.aspx',
|
||
'checkAgentCredit' => '/checkAgentCredit.aspx',
|
||
'checkMemberProductUsername' => '/checkMemberProductUsername.aspx',
|
||
'launchAPP' => '/launchAPP.ashx',
|
||
'checkTransaction' => '/checkTransaction.ashx',
|
||
'setBalanceTransfer' => '/makeTransfer.aspx',
|
||
'getDailyWager' => '/getDailyWager.ashx',
|
||
'fetchArchieve' => '/fetchArchieve.aspx',
|
||
'markbyjson' => '/markbyjson.aspx',
|
||
'markArchieve' => '/markArchieve.ashx',
|
||
'getGameRecord' => '/fetchbykey.aspx',
|
||
];
|
||
private $lang = [
|
||
'zh-CN' => 'zh-ch',
|
||
'en' => 'en_us',
|
||
'zh_tc' => 'zh_tc',
|
||
'en-us' => 'en-us',
|
||
'id' => 'id',
|
||
'th' => 'th',
|
||
'my' => 'my',
|
||
'vi' => 'vi',
|
||
'fi_fi' => 'fi_fi',
|
||
'kr_ko' => 'kr_ko',
|
||
'hi_hi' => 'hi_hi',
|
||
'br_po' => 'br_po',
|
||
'lo_la' => 'lo_la',
|
||
'cam_dia' => 'cam_dia', // 柬埔寨语
|
||
];
|
||
|
||
/**
|
||
* @param Player|null $player
|
||
* @param $type
|
||
* @throws Exception
|
||
*/
|
||
public function __construct($type, Player $player = null)
|
||
{
|
||
$config = config('game_platform.' . $type);
|
||
$this->appId = $config['app_id'];
|
||
$this->appSecret = $config['app_secret'];
|
||
$this->apiDomain = $config['api_domain'];
|
||
$this->providerCode = $config['provider_code'];
|
||
$this->platform = GamePlatform::query()->where('name', $type)->first();
|
||
if (!empty($player)) {
|
||
$this->player = $player;
|
||
/** @var PlayerGamePlatform $playerGamePlatform */
|
||
$playerGamePlatform = $this->player->playerGamePlatform->where('platform_id', $this->platform->id)->first();
|
||
if (empty($playerGamePlatform)) {
|
||
$this->createPlayer();
|
||
} else {
|
||
$this->playerGamePlatform = $playerGamePlatform;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 创建玩家 MD5(operatorcode + username +secret_key)
|
||
* @return array|mixed|Response
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function createPlayer()
|
||
{
|
||
$userName = mb_strtolower($this->providerCode . generateUniqueUsername());
|
||
$params = [
|
||
'operatorcode' => $this->appId,
|
||
'username' => $userName,
|
||
];
|
||
$params['signature'] = mb_strtoupper(md5($this->appId . $userName . $this->appSecret));
|
||
$res = dogGetCurl($this->createUrl('createPlayer'), $params);
|
||
if ($res['errCode'] != $this->successCode) {
|
||
throw new GameException($this->failCode[$res['errCode']], 0);
|
||
}
|
||
$playerGamePlatform = new PlayerGamePlatform();
|
||
$playerGamePlatform->player_id = $this->player->id;
|
||
$playerGamePlatform->platform_id = $this->platform->id;
|
||
$playerGamePlatform->player_name = $this->player->name;
|
||
$playerGamePlatform->player_code = $userName;
|
||
$playerGamePlatform->player_password = generateRandomPassword();
|
||
$playerGamePlatform->save();
|
||
$this->playerGamePlatform = $playerGamePlatform;
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 生成请求url
|
||
* @param $method
|
||
* @return string
|
||
*/
|
||
public function createUrl($method): string
|
||
{
|
||
return $this->apiDomain . $this->path[$method];
|
||
}
|
||
|
||
/**
|
||
* 查询玩家游戏平台帐号接口 MD5(operatorcode + providercode + username + secret_key)
|
||
* @return array|mixed|Response
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function getPlayer()
|
||
{
|
||
$params = [
|
||
'operatorcode' => $this->appId,
|
||
'providercode' => $this->providerCode,
|
||
'username' => $this->playerGamePlatform->player_code,
|
||
];
|
||
$params['signature'] = mb_strtoupper(md5($this->appId . $this->providerCode . $this->playerGamePlatform->player_code . $this->appSecret));
|
||
$res = dogGetCurl($this->createUrl('checkMemberProductUsername'), $params);
|
||
if ($res['errCode'] != $this->successCode) {
|
||
throw new GameException($this->failCode[$res['errCode']], 0);
|
||
}
|
||
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 获取游戏列表 MD5(operatorcode.toLower() + providercode.toUpper() + secret_key)
|
||
* @return array|mixed|Response
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function getSimpleGameList()
|
||
{
|
||
$params = [
|
||
'providercode' => $this->providerCode,
|
||
'operatorcode' => $this->appId,
|
||
'lang' => 'en',
|
||
'html' => '0',
|
||
'reformatJson' => 'yes',
|
||
];
|
||
$params['signature'] = strtoupper(md5(mb_strtolower($this->appId) . mb_strtoupper($this->providerCode) . $this->appSecret));
|
||
$data = dogGetCurl($this->createUrl('getGameList'), $params);
|
||
if ($data['errCode'] != $this->successCode) {
|
||
throw new GameException($this->failCode[$data['errCode']], 0);
|
||
}
|
||
if (!empty($data['gamelist'])) {
|
||
$gameList = json_decode($data['gamelist'], true);
|
||
foreach ($gameList as $game) {
|
||
try {
|
||
Game::query()->updateOrCreate(
|
||
[
|
||
'platform_id' => $this->platform->id,
|
||
'game_code' => $game['g_code']
|
||
],
|
||
[
|
||
'platform_game_type' => $game['p_type'],
|
||
'game_data' => json_encode($game),
|
||
'name' => $game['gameName']['gameName_enus'] ?? '',
|
||
'game_image' => $game['imgFileName'] ?? '',
|
||
]
|
||
);
|
||
} catch (Exception $e) {
|
||
Log::error($e->getMessage());
|
||
}
|
||
}
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* 登录游戏MD5(operatorcode + password + providercode + type + username + secret_key)
|
||
* @param array $data
|
||
* @return string
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function login(array $data = []): string
|
||
{
|
||
$params = [
|
||
'operatorcode' => $this->appId,
|
||
'providercode' => $this->providerCode,
|
||
'username' => $this->playerGamePlatform->player_code,
|
||
'password' => $this->playerGamePlatform->player_password,
|
||
'type' => $data['platformGameType'],
|
||
'gameid' => $data['gameCode'] ?? 0,
|
||
'lang' => 'en',
|
||
'html5' => 1,
|
||
];
|
||
$params['signature'] = mb_strtoupper(md5($this->appId . $this->playerGamePlatform->player_password . $this->providerCode . $data['platformGameType'] . $this->playerGamePlatform->player_code . $this->appSecret));
|
||
$res = dogGetCurl($this->createUrl('getLoginH5'), $params);
|
||
|
||
if ($res['errCode'] != $this->successCode) {
|
||
Log::error($this->failCode[$res['errCode']], ['res' => $res]);
|
||
throw new GameException($this->failCode[$res['errCode']], 0);
|
||
}
|
||
return $res['gameUrl'];
|
||
}
|
||
|
||
|
||
/**
|
||
* 玩家钱包转入游戏平台
|
||
* @return array|mixed|null
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function balanceTransferOut()
|
||
{
|
||
|
||
return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, intval($this->player->wallet->money));
|
||
}
|
||
|
||
/**
|
||
* 资金转账接口MD5(amount + operatorcode + password + providercode + referenceid + type + username + secret_key)
|
||
* @param $type
|
||
* @param float $amount
|
||
* @return array|mixed|null
|
||
* @throws GameException
|
||
* @throws \think\Exception
|
||
*/
|
||
protected function setBalanceTransfer($type, float $amount = 0)
|
||
{
|
||
if ($type == PlayerWalletTransfer::TYPE_OUT) {
|
||
$platformType = 0;
|
||
} else {
|
||
$platformType = 1;
|
||
}
|
||
|
||
$no = createOrderNo();
|
||
$params = [
|
||
'operatorcode' => $this->appId,
|
||
'providercode' => $this->providerCode,
|
||
'username' => $this->playerGamePlatform->player_code,
|
||
'password' => $this->playerGamePlatform->player_password,
|
||
'referenceid' => $no,
|
||
'type' => $platformType,
|
||
'amount' => $amount
|
||
];
|
||
$params['signature'] = mb_strtoupper(md5($amount . $this->appId . $this->playerGamePlatform->player_password . $this->providerCode . $no . $platformType . $this->playerGamePlatform->player_code . $this->appSecret));
|
||
$res = dogGetCurl($this->createUrl('setBalanceTransfer'), $params);
|
||
if ($res['errCode'] != $this->successCode) {
|
||
throw new GameException($this->failCode[$res['errCode']], 0);
|
||
}
|
||
// 记录玩家钱包转出转入记录
|
||
$this->createWalletTransfer($type, $amount, 0, $res['innerCode'] ?? '');
|
||
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 玩家钱包转入游戏平台
|
||
* @return array|mixed|null
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function balanceTransferIn()
|
||
{
|
||
$balance = $this->getBalance();
|
||
return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, $balance['balance'] ?? 0);
|
||
}
|
||
|
||
/**
|
||
* 獲取玩家餘額信息
|
||
* 簽名密鑰方式 MD5(operatorcode + password + providercode + username + secret_key)
|
||
* @return array|mixed|Response
|
||
* @throws GameException|\think\Exception
|
||
*/
|
||
public function getBalance()
|
||
{
|
||
$params = [
|
||
'operatorcode' => $this->appId,
|
||
'providercode' => $this->providerCode,
|
||
'username' => $this->playerGamePlatform->player_code,
|
||
'password' => $this->playerGamePlatform->player_password
|
||
];
|
||
$params['signature'] = mb_strtoupper(md5($this->appId . $this->playerGamePlatform->player_password . $this->providerCode . $this->playerGamePlatform->player_code . $this->appSecret));
|
||
$res = dogGetCurl($this->createUrl('getBalance'), $params);
|
||
if ($res['errCode'] != $this->successCode) {
|
||
throw new GameException($this->failCode[$res['errCode']], 0);
|
||
}
|
||
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 依據時間獲取遊戲紀錄
|
||
* MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey)
|
||
* @param int $pageIndex
|
||
* @param string $startTime
|
||
* @param string $endTime
|
||
* @return array|mixed|null
|
||
* @throws GameException
|
||
*/
|
||
public function getGameRecordByTime(int $pageIndex = 1, string $startTime = '', string $endTime = '')
|
||
{
|
||
|
||
}
|
||
|
||
/**
|
||
* 獲取玩家遊戲歷史紀錄
|
||
* MD5 (Id+Method+SN+APISecretKey)
|
||
* @return array|mixed|null
|
||
* @throws GameException
|
||
*/
|
||
public function getGameRecord()
|
||
{
|
||
}
|
||
} |