/miniGameServer

Primary LanguagePHPMIT LicenseMIT

一、miniGameServer概述

单机游戏服务端是用于单机游戏使用AnySDK时,能够方便地接入已有的渠道SDK。模拟AnySDK流程闭环中的游戏服务器,提供登陆验证转发、支付结果回调、订单状态查询等接口。单机游戏服务端本身不提供手机网游服务端的功能,只提供和AnySDK支付结果异步通知,用户登陆验证相关的功能。 适用范围

miniGameServer只适用于单机手机游戏在没有游戏服务器的情况下,想接入AnySDK提供的各个渠道的网游SDK的手机单机游戏,单机游戏服务端充当游戏服务器接收AnySDK服务器的支付充值结果的异步通知消息。

二、miniGameServer目录结构(基于 PHP CodeIgniter 框架,此处只说明不属于 CI 框架的文件)

application
  +-- config
  |     +-- settings.php            保存安装过程中填写的配置参数,需要写权限,使用过程中可手动修改错误的参数
  +-- controllers
  |     +-- api                     接口相关的控制器
  |     |     +-- payment.php           接收支付通知接口,订单查询接口
  |     |     +-- user.php              登录验证转发接口
  |     +-- install.php             安装程序
  +-- core
  |     +-- MY_Controller.php       预留的控制器父类
  |     +-- MY_Model.php            预留的模型父类
  +-- helpers
  |     +-- options_helper.php      选项辅助函数
  +-- libraries
  |     +-- http_request.php        http请求库
  +-- models
  |     +-- options_mdl.php         基于数据库的kv配置
  |     +-- pay_notify_mdl.php      支付通知接口日志记录
  +-- views
        +-- install                 安装程序页面视图文件

web-conf
  +-- nginx.conf                    nginx配置示例

.htaccess                           apache url 重写示例
index.php
robots.txt
license.txt

三、运行环境需求

PHP 版本 5.1.6 或更新;要求安装curl,mysql扩展
当前支持的数据库为:MySQL 4.1 +

四、更新说明

如果您使用git clone的方式部署代码到您的生产环境,更新的时候请记得备份您的 /path/to/application/config/settings.php 文件。

五、安装miniGameServer

5.1、将代码上传到服务器

nginx

代码需要上传到web服务器的根目录,如果web服务器是nginx,可以参照代码目录中的web-conf/nginx.conf来配置nginx的虚拟主机。

假设以 /var/www/html/mobgame 为web根目录,将项目代码上传到此目录下,项目的index.php的路径应为 /var/www/html/mobgame/index.php ,此时nginx虚拟主机的urlrewrite规则为:

rewriterules

假设程序不是上传到nginx虚拟主机的根目录,则需要修改nginx配置文件的url rewrite规则。例如:以 /var/www/html/mobgame 为web根目录,代码放在/var/www/html/mobgame/webapi/目录下(则index.php的路径为 /var/www/html/mobgame/webapi/index.php),则使用如下urlrewrite规则:

rewriterules

apache

假设web服务器是apache,以 /var/www/html/mobgame 为web根目录,程序不是上传到apache虚拟主机的web根目录,则需要修改程序目录下的.htaccess文件。为了使UrlRewrite配置生效,您可能需要将apache配置文件中对应目录或者对应虚拟主机的AllowOverrideNone改为All

例如,代码放在/var/www/html/mobgame/webapi/目录下,则index.php的路径为 /var/www/html/mobgame/webapi/index.php,参照下图修改程序目录下的.htaccess文件:

rewriterules-for-apache

5.2、安装MySQL,并创建数据库

单机游戏服务器端需要使用MySQL数据库,您需要在服务器上安装MySQL,并创建数据库,记录下MySQL的主机地址,用户名和密码(不能为空),创建好的数据库名,接下来的安装过程会需要这些参数。

5.3、执行安装程序

打开浏览器,访问 http://{url:port}/[path/to/]install 进行安装。

其中:

{url:port}表示nginx虚拟主机的访问地址,即域名或ip地址(推荐使用ip地址,域名有被劫持的危险),若端口不是默认的80,则还需要加上端口号;

[path/to/] 表示相对于web根目录的子目录,以5.1的/var/www/html/mobgame 下的子目录 webapi为例,则地址是 http://{url:port}/webapi/install

**注意:**若安装过程中出现为配置文件(/path/to/application/config/settings.php)赋予写权限失败的情况,请检查是否是SELinux限制了PHP的读写权限。

六、接口使用

6.1、登陆转发接口 api/user/login (单机游戏调用)

接口完整地址(仅为示例):

http://{url:port}/api/user/login

或者:

http://{url:port}/webapi/api/user/login

参考AnySDK文档:http://docs.anysdk.com/OauthLogin

6.2、支付结果回调 api/payment/callback (AnySDK 服务端调用)

接口完整地址(仅为示例):

http://{url:port}/api/payment/callback

或者:

http://{url:port}/webapi/api/payment/callback

参考AnySDK文档:http://docs.anysdk.com/PaymentNotice

6.3、查询订单支付结果 api/payment/check_order (单机游戏调用)

接口完整地址:http://{url:port}/api/payment/check_order

调用角色:单机游戏

请求方式:HTTP POST

请求参数:

参数名 类型 说明
order_id String 订单号
time String 时间, yyyy-mm-dd HH:ii:ss 如: 2014-08-05 09:05:07
ver Int 版本号: 按照此文档接入的固定为1
app_key String 安装的时候生成的app_key参数
sign String 签名,Md5(app_key+order_id+time)

返回格式:json

返回参数:

参数名 作用 说明
errno 错误码 0 表示查询成功, 其他表示查询失败, 这个状态不代表订单状态, 详情见 附录C
time String 时间, yyyy-mm-dd HH:ii:ss 如: 2014-08-05 09:05:07
errmsg 错误描述
data 订单数据 安装的时候生成的app_key参数
sign 签名 订单信息签名;为了保证订单信息的真实性,请对服务器返回的订单信息做sign验证。详情请参考附录B

data参数解析:

参数名 类型 说明
order_id String 订单号
product_count String 要购买的商品数量
amout String 支付金额,单位元
pay_status String 支付状态,1为成功,2为失败
pay_time String 支付时间,YYYY-mm-dd HH:ii:ss
order_type String 支付方式
source String 渠道服务器通知 AnySDK 时请求的参数
user_id String 用户id,用户系统的用户id
game_user_id String 游戏内用户Id,支付时传入的Role_id
game_id String 游戏id
server_id String 服务器id,支付时传入的server_id
product_id String 商品id,支付时传入的product_id
product_name String 商品名称product_name,支付时传入的product_name
private_data String 自定义参数,支付时传入的EXT参数
channel_number String 渠道编号

返回示例:

成功返回示例:

api result success

失败返回示例:

api result fail

6.4、接口的使用方式

6.1和6.2的接口只需将相应的接口填写到AnySDK打包工具客户端-参数配置界面响应的输入框内。示例如下:

api usage

附录A:查询订单签名算法

Md5(app_key+order_id+time) 不包含+号

附录B:验证订单合法性 - 签名算法

此处需要使用到的app_secret是安装过程第三步的时候生成的app_secret。 将接收到的参数的data部分内容,按key的字典序进行排序,然后将值value串接成字符串,加上app_secret再计算字符串的md5值,sign值不区分大小写,全部用小写字母。 例如: 原始的数据为

data[‘b’] = 2
data[‘c’] = 3
data[‘a’] = 1

按字典序排序后

data[‘a’] = 1
data[‘b’] = 2
data[‘c’] = 3

拼接后得到字符串:

sign_str = ‘123’

计算md5:

md5(sign_str+app_secret)  #不包含+号

计算得到的md5和接收到的sign值进行对比

附录C:错误码

错误码 错误描述
0 查询成功
100 订单不存在
101 order_id不能为空
102 时间超时
103 缺少签名sign
104 app_key无效
105 签名sign无效