Files
dafuweng/app/service/game/CSServiceInterface.php
2026-03-02 13:44:38 +08:00

371 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
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暂时停止暂停时间大约510分钟若提早完毕会提早解放',
'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()
{
}
}