支付SDK客户端文档(非趣核版)

1. 环境配置

解压SDK包,可以看到 lib4399MGSDK 其中包含 inclib 两个目录,inc 包含所需的头文件,lib 包含Win32以及 x64 相对于的DLL以及库文件。

1.1 VS配置

①拷贝lib4399MGSDK到游戏项目工程中,并配置依赖关系。

② 引入头文件

#include "PC4399SDK.h"
#pragma comment(lib, "PC4399SDK.lib")

③ 将lib目录下对应的PC4399SDK.dll与游戏exe放在一起

1.2 Unity3D配置

1. 在Assets目录下创建Plugins目录

2. 针对 Unity5.x 版本,需在 Plugins 下创建 x86 / x86_64 ,将 PC499SDK.dll 拷贝到对应的目录下

3. 针对 Unity2017 版本,将需要的 PC4399SDK.dll 拷贝到目录下即可

2. SDK初始化

SDK使用前,必须先进行初始化操作,SDK初始化完成后,若用户已登录,服务器端会进行验证后返回用户信息给客户端,未登录则返回空。 

特别注意:SDK初始化必须在游戏启动时进行

 API:

/**
* 初始化回调
* @param userInfo 初始化成功返回用户信息,失败则返回空
*/
typedef void(*InitResultCallback)(const char* userInfo);

/**
* SDK初始化接口
* @param appKey 游戏ID
* @param unionId 充值ID(申请后获取)
* @param InitResultCallback 初始化回调,成功则返回已登录用户信息,失败返回空
*/
void InitMGSDK(const char* appKey, const char *unionId, InitResultCallback callback)

返回值:

username=test&time=1124454&fcm=1&uid=123456789&token=daffaewwewee

描述:

username 用户名(UrlEncode编码过) 

time 登录时间 fcm 防沉迷(0 表示该用户为成年人,2代表为儿童,1代表未填写) 

uid 用户id 

token 加密串规则:

$loginSecret = "秘钥,找渠道申请";
//规则信息
//md5(md5(用户UID + 用户账号 + 秘钥 + 时间) +秘钥)

$token = md5(md5($uid.$username.$loginSecret.$time).loginSecret);

username可能出现中文,客户端返回的username是经过urlencode编码后的值,故在服务器端校验签名时,不要进行urldecode后在进行校验,其他地方使用可以进行urldecode

示例

const char* app_key = "游戏id";//游戏id
const char* union_id = "充值id"; //充值id
//SDK初始化
InitMGSDK(app_key,union_id, CPC4399SDKCppDemoDlg::InitCallback);
void CPC4399SDKCppDemoDlg::InitCallback(const char* result)
{
    CString res(result);

    p_Instance->UpdateData(True);
    if (res.IsEmpty())
    {
        p_Instance->m_resultText = "初始化返回结果:未登录";
    }
    else
    {
        p_Instance->m_resultText = "初始化返回结果:已登录";
        //显示登录的用户信息
        AfxMessageBox(res);
    }

    p_Instance-> UpdateData(False);
    return;
}

3. 内嵌登录页制作

3.1 样式参考

游戏方提供微端样式,例:

微端界面制作要求:

      - 有4399标识;

      - 包含:活动中心、官网首页、游戏论坛、官方客服几个子栏目;

      - 要有健康忠告标语。

3.2 接入方式

渠道方制作微端登录框界面,并提供地址让游戏方嵌入微端

3.3 接口对接

关于登录,SDK暂不提供登录接口,由渠道会提供登录内嵌页链接给CP,CP需提供登录器相应素材给渠道进行制作。内嵌页会在对应的对接组中进行对接。 

内嵌页面登录后,会调用c++提供的external自定义的fnEnterGame接口进行返回用户登录信息。

PS:使用webbroswer进行加载内嵌登录页,然后提供fnEnterGame函数接口。游戏服务器端根据返回的结果进行用户合法性验证。 

代码如下:

<script> 
window.external.fnEnterGame('username=test&time=1124454&fcm=1&uid=123456789&token=daffaewwewee'); 
</script>

描述:

username 用户名(UrlEncode编码过) 

time 登录时间 

fcm 防沉迷(0 表示该用户为成年人,2代表为儿童,1代表未填写) 

uid 用户id 

token 加密串规则

 $loginSecret = "秘钥,找渠道申请";
//规则信息
//md5(md5(用户UID + 用户账号 + 秘钥 + 时间) +秘钥)

$token = md5(md5($uid.$username.$loginSecret.$time).loginSecret);

username可能出现中文,客户端返回的username是经过urlencode编码后的值,故在服务器端校验签名时,不要进行urldecode后在进行校验,其他地方使用可以进行urldecode

4. 设置SDK登录状态

登录内嵌页登录成功后,需要设置SDK登录状态,此接口必接,否则无法进行充值操作

API:

/**
* 设置登录信息
* @param userId 4399用户id
* @param userName 4399用户名称
*/
void SetMGLogin(const char* userId, const char* userName);

5. 支付调用

在发起支付前,必须保证游戏已经接入登录接口(PS:必须先接入内嵌登录页),登录完成后方可使用该接口。

PS: 

 为方便开发测试联调,SDK从V1.0.7起增加测试模式功能。 

1.测试模式由SDK后台控制。在SDK申请参数审核后,会先开通测试模式进行联调,联调成功后转换为正式模式。 

2.测试模式下调用支付接口,无充值选项界面,直接模拟充值,SDK服务端将立即回调游戏服务器。 

3.测试模式需要使用指定的账号进行登录测试,由运营在对接组中提供。

API:

/**
*支付信息结构体
*/
typedef struct MGPayInfo { 
    const wchar_t* goodsName; //商品名称
    int money; //充值金额
    const wchar_t* server;  //分服id标识
    const wchar_t* mark; //附加字段,只允许32位字符
} MGPayInfo;

/**
* 支付回调
* @param code 返回值
*/
typedef void(*PayResultCallBack) (int code);
/**
* 支付接口
* @param payInfo 用于支付的物品等信息
* @param callback 充值回调
*/
void DoMGPay(MGPayInfo const& payInfo, PayResultCallBack callback)

示例:

 MGPayInfo payInfo;
    payInfo.goodsName = L"商品名称"
    payInfo.money = 1;
    payInfo.server = L"1"; //分服标识,无分服请设置为空   
    payInfo.mark = L"xxx";  //附加信息,可以是自定义的订单号,最大长度32位

    DoMGPay(payInfo, OnPayCallBack); //发起支付

支付回调:

void OnPayCallBack(int code)
{
   //回调结果处理
}

SDK返回码:

const int kMGResultFailed = 90001;//支付失败
const int kMGResultSucceed = 90002;//支付成功
const int kMGResultErrorUnion = 90003;//unionid不存在或已失效
const int kMGResultErrorUser = 90004;//用户未登录或已过期
const int kMGResultErrorNotTestUser = 90008;//测试模式-非测试账号