充值系列—充值系统数据库设计(一)

时间:2024-03-16 15:13:57

在我们的游戏充值模块中,接入了支付宝,苹果,Paypal, googleplay , mycard, mol, 360,机锋,91等各种充值渠道。这篇文章(包括接下来的几篇文章)将对充值系统的需求,数据库设计,构架,充值流程,安全处理,各种渠道的详细接入方式等各个方面做出详细的说明。

充值最基本的需求是,玩家付费购买内置商品后得到相应的商品。首先需要解决三个个问题:

(1)购买渠道
(2)商品的数据库设计
(3)订单的数据库设计
购买渠道

这里所指的渠道不是充值平台,而是充值平台提供实现充值的接口,在实现充值模块之前,我们需要对支付的实现方式有一个大致的了解。常见的支付实现有两种方式:SDK和WEB。如支付宝就提供了两种方式。
我们游戏对支付宝的接入,同时实现了这两种方式:游戏内置充值使用了SDK接入,官网充值使用了WEB接入方式。 SDK接入需要游戏服务器和客户端通信,我们使用了android.js。 实现官网充值需要考虑官网服务器和游戏服务器之间的通信方式。这个需要考虑到RPC的设计。关于购买渠道的具体实现以后会有更详细的说明。

商品的数据库设计

不同的商品会对应不同的支付平台。也就是说,每个平台都会有自己定义的商品。还有一点需要注意的是,在实现苹果接入的时候,需要把将要上架的商品在苹果的商店中登记在册,这样就会在苹果的商品中有一个对应的ID号。本地需要保持这个第三方ID,为了之后支付的时候做数据验证。每次购买商品,需要接受一个平台ID,通过这个ID来判断这个商品属于哪个平台。

详细设计结构:
充值系列—充值系统数据库设计(一)

订单的数据库设计

当生成一笔订单的时候,首先要保证的是订单号不能重合。我们的做法是,提供一个自增的数据来和其他的随机字符串组合生成一个订单号:

    /**
     * 生成订单流水号
     *
     * @return string $orderSn
     */
    public static function createSn()
    {
        $setArr = array(
            'create_time' => $GLOBALS['_DATE']
        );
 
        $insertId = Dao('Order_CreateSn')->insert($setArr);
 
        return date('YmdHis') . mt_rand(1000, 9999) . str_pad(substr($insertId, -5), 5, 0, STR_PAD_LEFT);
    }

在我们游戏中,通过玩家的联盟号(user_code)来下单,订单还需要保存的数据如下:

充值系列—充值系统数据库设计(一)