游戏支付 - 充值接口文档
SDK示例下载
一、初级模式(新手小白):
本文档以雷霆传奇H5为例子,其他游戏也是大同小异。
-
第一步,下载接口SDK示例
-
第二步,将下载的接口示例文件解压,放到游戏网站目录下
-
第三步,用Notepad++、sublime text等编辑工具,参照示例里的使用说明.txt,修改config.php配置文件里的商户ID、商户密钥、算法密钥,数据库等信息,商户ID、商户密钥、算法密钥在【商户中心】 →【基本资料】里获取。
-
通过以上配置,即可确定游戏分区通知地址,假如你的游戏网站域名是www.123.com,那么通知地址就是: http://www.123.com/pay/notify.php
-
第四步,创建分组和分区
分区重要参数:
参数 是否必填 说明 分区ID 是 部分游戏充值需要分区ID(游戏服数据库的ID),因此请正确填写 分区数据库名 是 分区(游戏服)的数据库名称 通知地址 是 用于通知服务端完成充值业务 -
第五步,分区配置完成后,先模拟充值,测试配置是否正确,模拟充值成功后,分区充值才真正的实现并对外开放。
-
对接完成后,将分组充值链接或者分区充值链接,添加到游戏网站的充值位置上即可。
二、高级模式(开发人员):
-
创建分组和分区,然后获取分区充值链接,这个充值链接可以作为请求提交地址,提交参数参考下表:
假设分区充值链接为:http://18pay.net/game?id=1,可以使用POST或者GET方式提交Http请求。
提交参数:
参数名称 参数含义 是否必填 说明 account 充值账号 是 玩家充值账号,可以灵活应用,比如拼接分区ID和角色名(5_随便玩玩) money 充值金额 是 玩家充值金额 paytype 支付方式 否 可选,1:支付宝 2:QQ钱包 3:微信支付,不传则默认为1 -
接口回调通知
回调通知作用:
玩家完成付款后,平台会给分区的通知地址发送回调通知,用于完成账号或角色的充值。
回调通知参数:
参数名称 变量名 类型 是否加密传输 说明 商户编号 appid string 否 明文传输 商户密钥 appkey string 是 加密传输,非常安全 充值账号 account string 是 原样返回提交的充值账号 充值金额 money float 是 实际付款金额 游戏币别名 alias string 是 如元宝、钻石等 充值比例 scale int 是 分区ID quid int 是 分区名称 quname string 是 分区数据库名 database string 是 订单编号 ordernumber string 是 附加参数 商户自定义 string 是 原样返回 附加参数示例:
//假设在添加分区时,设置的附加参数为: &dbhost=127.0.0.1&dbname=actor //那么可以直接如下接收: if (empty($_POST)) $_POST = $_GET; $dbhost= $_POST[dbhost]; $dbname= $_POST[dbname];
充值成功后返回:
返回格式 json格式 如果充值成功则返回 {"code":1,"msg":"充值成功"} 如果充值失败则返回 {"code":0,"msg":"失败信息"} 一定要按要求的格式返回,否则会出现通知失败或者重复充值的情况!正确的返回PHP示例:
$arr=array( "code" => 1, "msg" => "充值成功" ); echo json_encode($arr, JSON_UNESCAPED_UNICODE); exit;
SDK接口示例下载
游戏名称 | 接口介绍 | SDK下载 |
---|---|---|
演示例子 | 最简单的示例,看得懂的同学可以自行写出其他游戏的接口 | 点击下载 |
mysql通用 | 利宝、天易、美廉等自定义游戏网关(mssql不能用,仅限mysql),简单转换下就可以了 | 点击下载 |
白日门 | 白日门角色名充值,无需下线直接到账 | 点击下载 |
白娘子 | 白娘子接口示例 | 点击下载 |
雷霆H5 | 雷霆H5帐号充值,无特殊符号的角色名充值接口示例 | 点击下载 |
西游H5 | 西游H5接口示例 | 点击下载 |
悟空传H5 | 悟空传H5接口示例 | 点击下载 |
战神引擎 | 战神引擎接口示例 | 点击下载 |
梦幻古龙 | 梦幻古龙接口示例 | 点击下载 |
龙城天下 | 龙城天下接口示例 | 点击下载 |
神雕侠侣 | 神雕侠侣接口示例 | 点击下载 |
全民奇迹 | 全民奇迹接口示例 | 点击下载 |
剑侠情缘 | 剑侠情缘接口示例 | 点击下载 |
龙途 | 龙途fly3d引擎接口示例 | 点击下载 |
幽冥传奇 | 幽冥传奇角色名充值,无需下线直接到账 | 点击下载 |
聚合支付 - 接口开发文档
SDK示例下载
支付网关地址:
http://18pay.net/pay.html
提示:安全起见,提交方式推荐使用 POST ,请不要用 GET 方式提交。
接口参数说明:
参数名称 | 参数含义 | 是否必填 | 参与签名 | 参数说明 |
---|---|---|---|---|
appid | 商户号 | 是 | 是 | 平台分配商户号 |
payid | 唯一标识 | 是 | 是 | 可以是用户ID,或者订单编号(必须确保是唯一的) |
money | 订单金额 | 是 | 是 | 订单提交的金额 |
type | 支付方式 | 是 | 是 | 1:支付宝 2:QQ钱包 3:微信支付 |
notify_url | 异步通知地址 | 是 | 是 | 付款后POST通知,优先级最高,留空为系统设置中的通知地址 |
return_url | 同步通知地址 | 是 | 是 | 付款后用户跳转页面 |
subject | 商品名称 | 否 | 是 | 商品名称,注意:值为空时不参与签名 |
param | 自定义参数 | 否 | 是 | 原封返回 避免特殊字符,注意:值为空时不参与签名 |
sign | 数据MD5签名 | 否 | 否 | 将需要构造的参数按首字母排序并拼接成url参数,然后进行md5加密签名 |
charset | 编码 | 否 | 否 | utf-8或gb2312,默认utf-8 |
签名算法:
-
第一步
设所有发送或者接收到的数据为集合,将集合内非空参数值的参数按照参数名从小到大排序(ASCII码字典序),使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串 str 。
$urlDatas=array( "appid" => $appid, "money" => $money, "payid" => $payid, "type" => $type, "notify_url" => $notify_url, "return_url" => $return_url ); //ksort()对数组按照键名进行升序排序 ksort($urlDatas); //reset()内部指针指向数组中的第一个元素 reset($urlDatas); $str = ASCII($urlDatas); function ASCII($urlDatas = array()){ $str = '';//初始化 foreach ($urlDatas AS $key => $val) { //遍历参数数组 if ($val == ''||$key == 'sign') continue; //跳过这些不签名 if ($str) $str .= '&'; //第一个字符串签名不加& 其他加&连接起来参数 $str .= "$key=$val"; //拼接为url参数形式 } return $str; }
-
第二步
然后在字符串 str 后面拼接上 appkey(平台商户密钥),得到 stringSignTemp 字符串,最后对stringSignTemp 进行 MD5 运算,得到 sign 值
$str="appid=$appid&money=$money¬ify_url=$notify_url&payid=$payid&type=$type&return_url=$return_url"; $stringSignTemp=$str.$appkey; $sign=md5($stringSignTemp);
支付结果通知:
参数名称 | 参数含义 | 参与签名 | 参数说明 |
---|---|---|---|
pay_id | 唯一标识 | 是 | 提交的的唯一标识,可以是用户ID,或者订单编号 |
pay_money | 订单金额 | 是 | 实际付款金额 |
pay_no | 交易流水号 | 是 | 付款后生成的唯一流水号 |
pay_time | 交易时间 | 是 | 付款的时间戳 |
pay_type | 支付方式 | 是 | 1:支付宝 2:QQ钱包 3:微信支付 |
param | 扩展返回 | 是 | 商户附加数据,原封返回,提交什么就返回什么。注意:值为空时不参与签名 |
sign | 数据签名 | 否 | 验证订单是否为合法 |
通知返回的参数示例如下:
pay_id=admin&pay_money=100.00&pay_no=20200217200042408995&pay_time=1487597795&pay_type=1&sign=c47f3cba123456b6b24542110a8928af
业务处理返回:
返回类型 | 返回数据 |
---|---|
业务处理完成返回 | ok 或者 success |
业务处理失败还需要下次继续通知返回 | fail |
1、业务处理完成返回:ok 或者 success
2、业务处理失败还需要下次继续通知返回:fail
3、注意:一定要验证是否有pay_no参数值,因为只有该值存在,才是付款成功 。
-
notify_url异步通知示例(Thinkphp):
$appkey="平台的商户密钥"; if (empty($_POST)) $_POST = $_GET; //如果为GET方式访问 //ksort()对数组按照键名进行升序排序 ksort($_POST); //reset()内部指针指向数组中的第一个元素 reset($_POST); $sign = '';//初始化 foreach ($_POST AS $key => $val) { //遍历POST参数 if ($val == ''||$key == 'sign') continue; //跳过这些不签名 if ($sign) $sign .= '&'; //第一个字符串签名不加& 其他加&连接起来参数 $sign .= "$key=$val"; //拼接为url参数形式 } $pay_id = $_POST['pay_id']; //需要充值的ID 或订单号 或用户名 $pay_money = (float)$_POST['pay_money']; //实际付款金额 $pay_no = $_POST['pay_no']; //交易流水号 $pay_time = $_POST['pay_time']; //付款的时间戳 $pay_type = (int)$_POST['pay_type']; //支付方式 1:支付宝 2:QQ钱包 3:微信支付 $param = isset($_POST['param'])?$_POST['param']:'';//自定义参数 if (!$_POST['pay_no'] || md5($sign . $appkey) != $_POST['sign']) { //不合法的数据 exit('fail'); //返回失败 继续补单 } else { //合法的数据 /** * 业务处理在这里写 */ exit('success'); //返回成功,业务处理完成,下面不再执行了 }
-
return_url同步通知示例(Thinkphp):
$appkey="平台的商户密钥"; if (empty($_POST)) $_POST = $_GET; //如果为GET方式访问 //ksort()对数组按照键名进行升序排序 ksort($_POST); //reset()内部指针指向数组中的第一个元素 reset($_POST); $sign = '';//初始化 foreach ($_POST AS $key => $val) { //遍历POST参数 if ($val == ''||$key == 'sign') continue; //跳过这些不签名 if ($sign) $sign .= '&'; //第一个字符串签名不加& 其他加&连接起来参数 $sign .= "$key=$val"; //拼接为url参数形式 } $pay_id = $_POST['pay_id']; //需要充值的ID 或订单号 或用户名 $pay_money = (float)$_POST['pay_money']; //实际付款金额 $pay_no = $_POST['pay_no']; //交易流水号 $pay_time = $_POST['pay_time']; //付款的时间戳 $pay_type = (int)$_POST['pay_type']; //支付方式 1:支付宝 2:QQ钱包 3:微信支付 $param = isset($_POST['param'])?$_POST['param']:'';//自定义参数 if (!$_POST['pay_no'] || md5($sign . $appkey) != $_POST['sign']) { //不合法的数据 $result = '支付失败'; } else { //合法的数据 /** * 业务处理在这里写 */ $result = '支付成功'; } $this->assign('pay_id',$pay_id); $this->assign('pay_no',$pay_no); $this->assign('pay_money',$pay_money); $this->assign('pay_type',$pay_type); $this->assign('pay_time',date("Y-m-d H:i:s",$pay_time)); $this->assign('param',$param); $this->assign('result',$result); return view();
SDK接口示例下载