福禄API对接文档
  1. 接口规范
  • 产品介绍
  • 快速指引
    • API应用操作说明
    • 对接流程
    • 商品模版指引说明
    • 测试环境模拟数据
    • 常见问题
  • 接口规范
    • 签名规则
    • 卡密解密说明
    • 返回码说明
    • 免责声明
  • 业务场景
    • 在线直充
    • 话费充值
    • 卡密采购
  • API列表
    • 商品API
      • 获取商品列表接口 fulu.goods.list.get
      • 获取商品信息接口 fulu.goods.info.get
      • 获取商品模板接口 fulu.goods.template.get
      • 商品库存校验接口 fulu.goods.stock.check
    • 订单API
      • 直充下单接口 fulu.order.direct.add
      • 卡密下单接口 fulu.order.card.add
      • 话费下单接口 fulu.order.mobile.add
      • 订单查询接口 fulu.order.info.get
      • 订单扩展信息查询接口 fulu.order.extend.get
    • 商户API
      • 获取商户信息接口 fulu.user.info.get
    • 其他API
      • 对账单申请接口 fulu.order.record.get
      • 手机号归属地查询接口 fulu.mobile.info.get
    • 回调通知
      • 订单充值结果回调
      • 售后退款状态回调
      • 商品信息变动回调
      • 对账单通知回调
      • 订单充值结果回调-在线调试
      • 售后退款状态回调-在线调试
      • 商品信息变动回调-在线调试
    • 特殊品类API
      • 微信红包
        • 订单充值结果回调
        • 微信红包直充下单接口 fulu.order.direct.addredpacket
        • 微信红包订单查询接口 fulu.order.info.getredpacket
  1. 接口规范

签名规则

请求签名规则

基础数据

仅限测试使用

{
    "app_key":"i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB",
    "method":"fulu.order.direct.add",
    "timestamp":"2019-12-30 14:23:06",
    "version":"2.0",
    "format":"json",
    "charset":"utf-8",
    "sign_type":"md5",
    "sign":"d2ca1003c1852e1846c9466adec18b68",
    "app_auth_token":"",
    "biz_content":"{\"customer_order_no\":\"20191230142306472\",\"product_id\":10000585,\"buy_num\":1,\"charge_account\":\"888888\",\"charge_ip\":\"\",\"charge_password\":\"\",\"charge_game_name\":\"\",\"charge_game_role\":\"\",\"charge_game_region\":\"\",\"charge_game_srv\":\"\",\"charge_type\":\"\",\"contact_tel\":\"\",\"contact_qq\":\"\"}"
}

签名说明

1)将除sign参数之外的所有参数包装成Dictionary<string,string>字典;(接口响应的签名直接使用result的内容从第3步操作开始)
2)将Dictionary<string,string>字典进行Json序列化;
3)将Json字符串转化为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;
4)将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
5)将第4步拼接了应用密钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
6)注意:退款回调签名时,order_money和refund_money需先转字符串再签名;
在线Md5参照地址:http://tool.chinaz.com/tools/md5.aspx

.NET示例

1)将除sign参数之外的所有参数包装成Dictionary<string,string>字典;

Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("app_key", "i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB");
dictionary.Add("method", "fulu.order.direct.add");
dictionary.Add("timestamp", "2019-12-30 14:23:06");
dictionary.Add("version", "2.0");
dictionary.Add("format", "json");
dictionary.Add("charset", "utf-8");
dictionary.Add("sign_type", "md5");
dictionary.Add("app_auth_token", "");
dictionary.Add("biz_content", "{\"customer_order_no\":\"20191230142306472\",\"product_id\":10000585,\"buy_num\":1,\"charge_account\":\"888888\",\"charge_ip\":\"\",\"charge_password\":\"\",\"charge_game_name\":\"\",\"charge_game_role\":\"\",\"charge_game_region\":\"\",\"charge_game_srv\":\"\",\"charge_type\":\"\",\"contact_tel\":\"\",\"contact_qq\":\"\"}");

2)将字典进行Json序列化;

string jsonData = JsonConvert.SerializeObject(dictionary);

序列化后的结果:

{ 
    "app_key": "i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB", 
    "method": "fulu.order.direct.add", 
    "timestamp": "2019-12-30 14:23:06", 
    "version": "2.0", 
    "format": "json", 
    "charset": "utf-8", 
    "sign_type": "md5", 
    "app_auth_token": "", 
    "biz_content": "{\"customer_order_no\":\"20191230142306472\",\"product_id\":10000585,\"buy_num\":1,\"charge_account\":\"888888\",\"charge_ip\":\"\",\"charge_password\":\"\",\"charge_game_name\":\"\",\"charge_game_role\":\"\",\"charge_game_region\":\"\",\"charge_game_srv\":\"\",\"charge_type\":\"\",\"contact_tel\":\"\",\"contact_qq\":\"\"}"
}

3)将Json字符串转化为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;

var chars = jsonData.ToCharArray();
Array.Sort(chars);

4)将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;

string data = new string(chars) + secret;

结果:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""+++,,,,,,,,,,,,,,,,,,,,---....///000000000000111111111112222222223333344445556667777888888889999::::::::::::::::::::::::AABBCFFGGGJLNNOOQQTVWXXY\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_______________________aaaaaaaaaaaaaaaaaaaaaaaaabbcccccccccccccccccccddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffgggggggggggggggghhhhhhhhhhhiiiiiiiiiijkklllllmmmmmmmmmmmmmnnnnnnnnnnnnnooooooooooooooooooppppppppppqqqqqrrrrrrrrrrrrrrrrrrrrrrssssssssssstttttttttttttttttttttuuuuuuuuuuvvvwwyyyyz{{}}0a091b3aa4324435aab703142518a8f7

5)将第4步拼接了应用秘钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;

var chars = jsonData.ToCharArray();
Array.Sort(chars);

结果:

d2ca1003c1852e1846c9466adec18b68

Md5方法(.NET版本)

public string Md5(string str){
    Encoding encode = Encoding.UTF8;
    var cl = str;
    var md5 = MD5.Create(); 
    var s = md5.ComputeHash(encode.GetBytes(cl));
    return s.Aggregate("", (current, t) => current + t.ToString("x2"));
}

JAVA示例

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.sf.json.JSONObject;

public class InputParamSign {
	public static void main(String[] args) {
		String sysSecret = "0a091b3aa4324435aab703142518a8f7";
        	String sign = Sign(sysSecret);
	}
	
	public static String Sign(String sysSecret){
        Map<String, String> map = new HashMap<String, String>();
        map.put("app_key","i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB");
        map.put("method", "fulu.user.info.get");
        map.put("timestamp", "2019-07-24 09:45:11");
        map.put("version", "2.0");
        map.put("format", "json");
        map.put("charset", "utf-8");
        map.put("sign_type", "md5");
        map.put("app_auth_token", "");
        map.put("biz_content", "{}");
      
        JSONObject resultJson = JSONObject.fromObject(map);
        char[] s = JSONObject.toJSONString(resultJson, SerializerFeature.WriteMapNullValue).toCharArray();
        Arrays.sort(s);       
       
        String outputSignOriginalStr = new String(s) + sysSecret;
        String sign = MD5Utils.MD5(outputSignOriginalStr);
        return sign;		
	}
}

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {  /**
     * 获取MD5加密
     * 
     * @param pwd
     *            需要加密的字符串
     * @return String字符串 加密后的字符串
     */
    public static String MD5(String pwd) {
        try {
            // 创建加密对象
            MessageDigest digest = MessageDigest.getInstance("md5");

            // 调用加密对象的方法,加密的动作已经完成
            byte[] bs = digest.digest(pwd.getBytes());
            // 第一步,将数据全部转换成正数:
            String hexString = "";
            for (byte b : bs) {
                // 第一步,将数据全部转换成正数:
                // 解释:为什么采用b&255
                /*
                 * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节)
                 * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
                 * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
                 * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000
                 * 0000 0000 1001 1100 此时的temp是一个int类型的整数
                 */
                int temp = b & 255;
                // 第二步,将所有的数据转换成16进制的形式
                // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数
                // 因此,需要对temp进行判断
                if (temp < 16 && temp >= 0) {
                    // 手动补上一个“0”
                    hexString = hexString + "0" + Integer.toHexString(temp);
                } else {
                    hexString = hexString + Integer.toHexString(temp);
                }
            }
            return hexString;
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }
}

PHP示例

/**
* php签名方法
*/
public function getSign($Parameters)
{
   //签名步骤一:把字典json序列化
   $json = json_encode( $Parameters, 320 );
   //签名步骤二:转化为数组
   $jsonArr = $this->mb_str_split( $json );
   //签名步骤三:排序
   sort( $jsonArr );
   //签名步骤四:转化为字符串
   $string = implode( '', $jsonArr );
   //签名步骤五:在string后加入secret
   $string = $string . $this->AppSecret;
   //签名步骤六:MD5加密
   $result_ = strtolower( md5( $string ) );
   return $result_;
}
/**
* 可将字符串中中文拆分成字符数组
*/
function mb_str_split($str){
   return preg_split('/(?<!^)(?!$)/u', $str );
}

响应签名规则

基础数据

仅限测试使用

{
    "code":0,
    "message":"接口调用成功",
    "result":"{\"order_id\":\"19123033155353051423\",\"product_id\":10000585,\"product_name\":\"视频/文娱直充测试商品-返回充值失败\",\"charge_account\":\"888888\",\"customer_order_no\":\"20191230142306472\",\"create_time\":\"2019-12-30 14:23:04\",\"buy_num\":1,\"order_price\":1.0300,\"order_state\":\"untreated\",\"finish_time\":null,\"area\":\"\",\"server\":\"\",\"type\":\"\",\"order_type\":4,\"operator_serial_number\":\"\"}",
    "sign":"e9d393b03df909feb7f687a49ad1952a"
}

签名说明

示例仅供参考
1)将response响应结果中的result的值转换为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;
2)将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
3)将第4步拼接了应用密钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
在线Md5参照地址:http://tool.chinaz.com/tools/md5.aspx

.NET示例

示例:

var chars = jsonData.ToCharArray();
Array.Sort(chars);

将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;
示例:

string data = new string(chars) + secret;

结果:

"""""""""""""""""""""""""""""""""""""""""""""""""",,,,,,,,,,,,,,---./000000000000000111111111111122222222233333333333444444555555678888888999:::::::::::::::::______________aaaaaaaaaabbccccccccddddddddddeeeeeeeeeeeeeeeeeeeeeeeefghhiiiiiiiilllmmmmmmnnnnnnnnoooooooooooopppppprrrrrrrrrrrrrrrrrrrrrrrrsssssttttttttttttttuuuuuuuuuvyyy{}值充充品商回失娱文测直视试败返频0a091b3aa4324435aab703142518a8f7

将第4步拼接了应用秘钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
示例:

string sign = Md5(data).ToLower();

结果:

e9d393b03df909feb7f687a49ad1952a

Md5方法(.NET版本)

public string Md5(string str){
    Encoding encode = Encoding.UTF8;
    var cl = str;
    var md5 = MD5.Create(); 
    var s = md5.ComputeHash(encode.GetBytes(cl));
    return s.Aggregate("", (current, t) => current + t.ToString("x2"));
}
上一页
常见问题
下一页
卡密解密说明
Built with