游戏支付 - 充值接口文档 SDK示例下载

初级模式(新手小白)

本文档以雷霆传奇H5为例子,其他游戏也是大同小异。
  • 第一步,下载接口SDK示例

  • 第二步,将下载的接口示例文件解压,放到游戏网站目录下

  • 第三步,用Notepad++、sublime text等编辑工具,参照示例里的使用说明.txt,修改config.php配置文件里的商户ID、商户密钥、算法密钥,数据库等信息,商户ID、商户密钥、算法密钥在【商户中心】 →【基本资料】里获取。

  • 通过以上配置,即可确定游戏分区通知地址,假如你的游戏网站域名是www.123.com,那么通知地址就是: http://www.123.com/pay/notify.php

  • 第四步,创建分组和分区

  • 第五步,分区配置完成后,先模拟充值,测试配置是否正确,模拟充值成功后,分区充值才真正的实现并对外开放。

  • 对接完成后,将分组充值链接或者分区充值链接,添加到游戏网站的充值位置上即可。

高级模式(开发人员)

  • 创建分组和分区,然后获取分区充值链接,这个充值链接可以作为请求提交地址,提交参数如下表:

    假设分区充值链接为:https://www.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 float 实际付款金额
    游戏币别名 alias string 如元宝、钻石等
    充值比例 scale int
    数据库名称 dbname string
    订单编号 ordernumber string
    VIP会员等级 vip int 启用充值送会员功能时,此参数为商户设定的VIP等级
    自定义参数 param string 用于补充处理接口特殊需要,接口提交的param参数,原样返回
    附加参数 分区里添加的附加参数 string 原样返回
    参数名称 变量名 类型 是否加密传输 说明
    分区标识 quid int 平台系统分配的分区唯一标识
    分区名称 quname string
    分区充值链接 url string
    商户密钥 appkey string 平台分配的商户凭证,用于验证数据合法性
    充值账号 account string 原样返回提交的充值账号
    充值金额 money float 实际付款金额
    订单编号 ordernumber 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;
    

网关模式(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下载
冰雪传奇 冰雪传奇和清渊传奇内充接口示例 点击下载
千年 千年聚合支付接口示例 点击下载
阿拉德之怒 阿拉德手游内充接口示例 点击下载
劲舞团 劲舞团接口示例 点击下载
传奇世界 传奇世界角色名充值,需要小退下线才到账 点击下载
养鲲传奇 养鲲传奇接口示例(经典版本和1776版本) 点击下载
我是死神 我是死神接口示例 点击下载
幽冥传奇 幽冥传奇支持经典版本的元宝充值和二开版本的钻石充值 点击下载
龙途 龙途fly3d引擎接口示例 点击下载
剑侠情缘 剑侠情缘接口示例 点击下载
全民奇迹 全民奇迹接口示例 点击下载
神雕侠侣 神雕侠侣接口示例 点击下载
龙城天下 龙城天下接口示例 点击下载
梦幻古龙 梦幻古龙接口示例 点击下载
战神引擎 战神引擎接口示例 点击下载
悟空传H5 悟空传H5接口示例 点击下载
大话西游 大话西游接口示例 点击下载
雷霆传奇 雷霆传奇H5帐号充值,角色名和账号充值接口示例 点击下载
白娘子 白娘子接口示例 点击下载
白日门 白日门角色名充值,无需下线直接到账 点击下载
mysql通用 利宝、天易、美廉等自定义游戏网关,简单转换下就可以了 点击下载
演示例子 最简单的示例,看得懂的同学可以自行写出其他游戏的接口 点击下载