浏览 24426
游戏支付 - 充值接口文档
SDK示例下载
初级模式(新手小白)
本文档以雷霆传奇H5为例子,其他游戏也是大同小异。
-
第一步,下载接口SDK示例
-
第二步,将下载的接口示例文件解压,放到游戏网站目录下
-
第三步,用Notepad++、sublime text等编辑工具,参照示例里的使用说明.txt,修改config.php配置文件里的商户ID、商户密钥、算法密钥,数据库等信息,商户ID、商户密钥、算法密钥在【商户中心】 →【基本资料】里获取。
-
通过以上配置,即可确定游戏分区通知地址,假如你的游戏网站域名是www.123.com,那么通知地址就是: http://www.123.com/pay/notify.php
-
第四步,创建分组和分区
-
第五步,分区配置完成后,先模拟充值,测试配置是否正确,模拟充值成功后,分区充值才真正的实现并对外开放。
-
对接完成后,将分组充值链接或者分区充值链接,添加到游戏网站的充值位置上即可。
高级模式(开发人员)
-
创建分组和分区,然后获取分区充值链接,这个充值链接可以作为请求提交地址,提交参数如下表:
假设分区充值链接为:https://18pay.net/link/YzaHg1,可以使用POST或者GET方式提交Http请求
提交参数:
参数名称 参数含义 类型 示例值 是否必填 说明 account 充值账号 string qq1234 是 玩家要充值的账号或者角色名 money 充值金额 string 10 是 玩家要充值的金额(单位:元) subject 商品名称 string 充值10元宝 否 商品说明,会显示在支付宝和微信支付的订单信息里 paytype 支付方式 string 1 否 1:支付宝 2:微信支付 3:QQ钱包,不传则默认为1 contact 联系方式 string 79899080 否 玩家联系方式,比如QQ、微信、手机号码 param 自定义参数 string 没有请留空 否 可以灵活应用,比如拼接分区ID和角色名(1_随便玩玩),参数原封返回 hidetitle 隐藏标题 string true 否 hidetitle不为空时,自动隐藏支付页面上的“支付中心”标题栏 codesize 二维码大小 int 150 否 二维码大小默认200px agent 代理账号 string 88888 否 支持三级代理分销,直接传入代理的登录账号 -
接口回调通知
作用:
玩家完成付款后,平台会给分区的通知地址发送回调通知,用于完成账号或角色的充值。
参数:
参数名称 变量名 类型 是否加密传输 说明 商户编号 appid string 否 明文传输 参数集合 parameter string 否 端对端加密传输,非常安全,请参考下文的“端对端加密方式” parameter参数包含信息:
- HTTP(接口)
- TCP(网关)
参数名称 变量名 类型 是否加密传输 说明 分区ID quid int 是 商户自定义添加的分区ID 分区名称 quname string 是 分区充值链接 url string 是 商户密钥 appkey string 是 平台分配的商户凭证,用于验证数据合法性 充值账号 account string 是 原样返回提交的充值账号 总金额 money int 是 充值金额+赠送金额 实际付款金额 realmoney int 是 充值比例 scale int 是 数据库名称 dbname string 是 游戏币别名 alias string 是 如元宝、钻石等 订单编号 ordernumber string 是 VIP会员等级 vip int 是 启用充值送会员功能时,此参数为商户设定的VIP等级 自定义参数 param string 是 用于补充处理接口特殊需要,接口提交的param参数,原样返回 附加参数 分区里添加的附加参数 string 是 原样返回 参数名称 变量名 类型 是否加密传输 说明 商户密钥 appkey string 是 平台分配的商户凭证,用于验证数据合法性 分区标识 quid int 是 平台分配的分区唯一标识 分区名称 quname string 是 分区充值链接 url string 是 充值账号 account string 是 原样返回提交的充值账号 总金额 money int 是 充值金额+赠送金额 实际付款金额 realmoney int 是 订单编号 ordernumber string 是 VIP会员等级 vip int 是 启用充值送会员功能时,此参数为商户设定的VIP等级 充值时间 paytime date 是 时间格式:2024/10/10 21:37 附加参数示例:
//假设在添加分区时,设置的附加参数为: &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;
网关模式(TCP通信)
-
第一步,下载充值网关软件(适用于Windows系统)
点击跳转到网关下载页面
-
第二步,打开充值网关软件,切换到【系统设置】菜单,填写商户信息
-
第三步,先在元宝支付平台添加游戏分组,然后在平台或网关上添加分区
-
第四步,分区添加好后,先进行模拟充值,看分区配置是否正确,然后启动网关
我有话说:
网关里附带详细的使用教程文档,按照使用教程操作即可!
端对端加密方式
- php
- java
- c#
ini_set("error_reporting","E_ALL & ~E_NOTICE");
header('Content-Type:application/json; charset=utf-8');
if (!function_exists('openssl_encrypt')){
exit('请开启php.ini的openssl扩展');
}
$input="123456"; //要加密的字符串
$deskey='QDHPJKOS';//算法密钥
$des = new Des();
$encode=$des->encrypt($input,$deskey);
echo "DES加密结果:".$encode;
$decode=$des->decrypt($encode,$deskey);
echo "\r\nDES解密结果:".$decode;
/**
* DES加解密类
*/
class Des{
/**
*
* 加密函数
* 算法:des
* 加密模式:ecb
* 补齐方法:PKCS5
*
* @param unknown_type $input
*/
public function encrypt($input, $key)
{
//由于php7.1废弃了mcrypt_* 一系列函数,所以采用openssl版本
$str = $this->pkcsPadding($input, 8);
$key = str_pad($key, 8, '0'); //3DES加密将8改为24
$sign = @openssl_encrypt($str, 'DES-ECB', $key,OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
//转为base64,可以有效解决乱码等问题
$sign = base64_encode($sign);
return $sign;
}
/**
* 解密函数
* 算法:des
* 加密模式:ecb
* 补齐方法:PKCS5
* @param unknown_type $input
*/
public function decrypt($input, $key)
{
//由于php7.1废弃了mcrypt_* 一系列函数 所以采用openssl版本
$encrypted = base64_decode($input);
$key = str_pad($key, 8, '0'); //3DES加密将8改为24
$sign = @openssl_decrypt($encrypted, 'DES-ECB', $key,OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
$sign = $this->unPkcsPadding($sign);
$sign = rtrim($sign);
return $sign;
}
/**
* 填充
*
* @param $text
* @param $blocksize
* @return string
*/
private function pkcsPadding($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
/**
* 去填充
*
* @param $text
* @return string
*/
private function unPkcsPadding($text)
{
$pad = ord($text [strlen($text) - 1]);
if ($pad > strlen($text))
return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
return false;
return substr($text, 0, - 1 * $pad);
}
}
package demoSys;
import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String input = "123456";
String deskey = "QDHPJKOS";
String encode = encrypt(input, deskey);
System.out.println("DES加密结果:" + encode);
String decode = decrypt(encode, deskey);
System.out.println("DES解密结果:" + decode);
}
public static String encrypt(String souce, String key) {
try {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));
// 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretkey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, secretkey, sr);
// 获取数据并加密
byte encryptedData[] = cipher.doFinal(souce.getBytes("UTF-8"));
// JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
// Android平台可以使用android.util.Base64
return new String(Base64.getEncoder().encode(encryptedData));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return souce;
}
}
public static String decrypt(String souce, String key) {
try {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretkey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, secretkey, sr);
// 将加密报文用BASE64算法转化为字节数组
byte[] encryptedData = Base64.getDecoder().decode(souce);
// 用DES算法解密报文
byte decryptedData[] = cipher.doFinal(encryptedData);
return new String(decryptedData, "UTF-8");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return souce;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace demo
{
class Program
{
static void Main(string[] args)
{
string message = "123456";//要加密的字符串
string key = "QDHPJKOS"; //算法密钥
string encode = encrypt(message, key);
Console.Write("DES加密结果:" + encode);
string decode = decrypt(encode, key);
Console.Write("\r\nDES解密结果:" + decode);
Console.Read();
}
/// DES算法,加密
/// param message 待加密字符串
/// param key 解密私钥
/// return 加密后的Base64编码字符串
public static string encrypt(string message, string key)
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
byte[] inputByteArray = Encoding.UTF8.GetBytes(message);
des.Key = UTF8Encoding.UTF8.GetBytes(key);
des.IV = UTF8Encoding.UTF8.GetBytes(key);
des.Mode = System.Security.Cryptography.CipherMode.ECB;
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Convert.ToBase64String(ms.ToArray());
ms.Close();
return str;
}
}
/// DES算法,解密
/// param message 待解密字符串
/// param key 解密私钥
/// return 解密后的字符串
public static string decrypt(string message, string key)
{
byte[] inputByteArray = Convert.FromBase64String(message);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = UTF8Encoding.UTF8.GetBytes(key);
des.IV = UTF8Encoding.UTF8.GetBytes(key);
des.Mode = System.Security.Cryptography.CipherMode.ECB;
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return str;
}
}
}
}
SDK接口示例下载
游戏名称 | 接口介绍 | SDK下载 |
---|---|---|
热血屠龙 | 热血屠龙页游内充接口示例 | 点击下载 |
万灵山海之镜 | 万灵山海之镜内充sdk示例 | 点击下载 |
魔域幻兽归来 | 魔域幻兽归来Linux端版本接口示例 | 点击下载 |
冰雪传奇 | 冰雪传奇和清渊传奇内充接口示例 | 点击下载 |
千年 | 千年聚合支付接口示例 | 点击下载 |
阿拉德之怒 | 阿拉德手游内充接口示例 | 点击下载 |
劲舞团 | 劲舞团接口示例 | 点击下载 |
传奇世界 | 传奇世界角色名充值,需要小退下线才到账 | 点击下载 |
养鲲传奇 | 养鲲传奇接口示例(经典版本和1776版本) | 点击下载 |
我是死神 | 我是死神接口示例 | 点击下载 |
幽冥传奇 | 幽冥传奇支持经典版本的元宝充值和二开版本的钻石充值 | 点击下载 |
龙途 | 龙途fly3d引擎接口示例 | 点击下载 |
剑侠情缘 | 剑侠情缘接口示例 | 点击下载 |
全民奇迹 | 全民奇迹接口示例 | 点击下载 |
神雕侠侣 | 神雕侠侣接口示例 | 点击下载 |
龙城天下 | 龙城天下接口示例 | 点击下载 |
梦幻古龙 | 梦幻古龙接口示例 | 点击下载 |
战神引擎 | 战神引擎接口示例 | 点击下载 |
悟空传H5 | 悟空传H5接口示例 | 点击下载 |
大话西游 | 大话西游接口示例 | 点击下载 |
雷霆传奇 | 雷霆传奇H5帐号充值,角色名和账号充值接口示例 | 点击下载 |
白娘子 | 白娘子接口示例 | 点击下载 |
白日门 | 白日门角色名充值,无需下线直接到账 | 点击下载 |
mysql通用 | 利宝、天易、美廉等自定义游戏网关,简单转换下就可以了 | 点击下载 |
演示例子 | 最简单的示例,看得懂的同学可以自行写出其他游戏的接口 | 点击下载 |