提交订单接口


接口URL: https://api.rawanbazar.cn/api/index/huafei
请求方式: POST(application/x-www-form-urlencoded)
参数
名称 必填 描述 示例
account_id 是 商户ID 10000
out_trade_no 是 商户订单号 20260616515550989770
mobile 是 充值手机号 18199355741
amount 是 充值金额(必须为商户后台已配置的充值面值之一,否则返回“金额不合法”) 1.00
callback_url 是 异步通知地址(充值结果推送到该地址,必须返回 success) https://你的域名/api/demo/callback
sign 是 签名 签名算法见下方“签名规则”
签名规则 — 签名算法 1. 将 sprintf("%.2f", amount) 与 out_trade_no 直接拼接(例:1.00 . 20260616515550989770); 2. 对拼接结果执行 MD5,得到32位小写字符串; 3. 使用商户KEY(s_key),按 RC4 算法对上述32位字符串进行流加密; 4. 对加密结果再次执行 MD5,得到最终签名值 sign。
返回参数
名称 类型 说明
code int 1 = 成功;0 = 失败
msg string 成功为“订单创建成功”;失败为具体原因,如:商户余额不足、签名失败、手机号在黑名单中、不允许的地区
data.trade_no string 平台订单号,用于查单与对账
data.amount string 充值面值
data.kh_amount string 实际扣款金额(商户结算价)
time int 服务器时间戳
返回示例
{"code":1,"msg":"订单创建成功","time":1728345600,"data":{"trade_no":"4862220260616266124","amount":"1","kh_amount":"0.98"}}
{"code":0,"msg":"商户余额不足","time":1728345600,"data":null}
正文
 <\?php

namespace app\api\controller;
use think\Request;

/**
 * 示例接口
 */ 
class Demo
{

      private $account_id = '商户ID';
      private $key = '商户KEY';

     public function huafei()
    {
       $data['account_id']= $this->account_id;   //商户ID
       $data['out_trade_no']='20260616515550989770';  //商户订单号
       $data['mobile']='18199355741';   //充值的手机号码
       $data['amount']=1;   //充值金额
       $data['callback_url']='https://你自己域名/api/demo/callback';  //回调通知地址
       $data['sign']=$this->sign($this->key, ['amount'=>$data['amount'],'out_trade_no'=>$data['out_trade_no']]);  //签名
 
       $apiurl = 'https://api.rawanbazar.cn/api/index/huafei';
       $post = $this->https_request($apiurl,$data);
        
       $postInfo = json_decode($post,true);
       $code = $postInfo['code'];
       $trade_no = $postInfo['data']['trade_no'];
      
       if($code == 1){
          //可以把RawanBazar平台返回的订单号存到数据库里 查询订单状态 , 也可以不用保存, 平台充值成功时会传过来
          echo $trade_no;
       }
     
    } 


    public function callback(Request $request){
        
         $param = $request->param();
         
        //支付时间戳  
        $pay_time  = $param['pay_time'];
        //支付状态
        $status  = $param['status'];   //返回success 充值成功    error 充值失败
        //支付金额
        $amount  = $param['amount'];
        //充值金额
        $cz_amount  = $param['cz_amount'];
        //支付时提交的订单信息
        $out_trade_no  = $param['out_trade_no'];
        //平台订单交易流水号
        $trade_no  = $param['trade_no'];
        //签名算法
        $sign  = $param['sign']; 
        //回调时间戳
        $callback_time  = $param['callback_time'];
        
        
        //验证签名是否一致
        if ($this->sign($this->key, ['amount'=>$cz_amount,'out_trade_no'=>$out_trade_no]) != $sign) exit('签名验证失败');
         
           //这里写话费的充值成功或充值失败等操作
           
         echo 'success';
        
    }
     
        /**
     * 签名算法
     * @param unknown $s_key(商户KEY)
     * Author: Mardan
     * @param unknown $array 例子:$array = array('amount'=>'1.00','out_trade_no'=>'20260616515550989770');
     * @return string
     */
    public function sign ($s_key, $array)
    {
        $cipher = '';
        $data = md5(sprintf("%.2f", $array['amount']) . $array['out_trade_no']);
        $key[] ="";
        $box[] ="";
        $pwd_length = strlen($s_key);
        $data_length = strlen($data);
        for ($i = 0; $i < 256; $i++)
        {
            $key[$i] = ord($s_key[$i % $pwd_length]);
            $box[$i] = $i;
        }
        for ($j = $i = 0; $i < 256; $i++)
        {
            $j = ($j + $box[$i] + $key[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        for ($a = $j = $i = 0; $i < $data_length; $i++)
        { 
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            
            $k = $box[(($box[$a] + $box[$j]) % 256)];
            $cipher .= chr(ord($data[$i]) ^ $k);
        }
        return md5($cipher);
    }


    /**
     * http请求
     * @param string $url 请求的地址
     * @param array $data 发送的参数
     */
   public function https_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
 
}

                                              

查询接口


接口URL: https://api.rawanbazar.cn/api/index/huafeiOrderQueryOut?trade_no=商户订单号
请求方式: GET
请求参数
名称 必填 描述 示例
trade_no 是 商户订单号(即提交订单时传入的 out_trade_no) 20260616515550989770
返回参数
名称 类型 说明
code int 1 = 查询成功;0 = 订单号有误(订单不存在)
msg string 提示信息
data string 订单状态:充值中 / 充值成功 / 退款成功
time int 服务器时间戳
返回示例
{"code":1,"msg":"","time":1728345600,"data":"充值成功"}
{"code":0,"msg":"订单号有误","time":1728345600,"data":null}

商户余额查询


接口URL: https://api.rawanbazar.cn/api/index/userbalance
请求方式: POST(application/x-www-form-urlencoded)
请求参数
名称 必填 描述 示例
account_id 是 商户ID 10000
sign 是 签名:md5(account_id . 商户KEY),32位小写 d41d8cd98f00b204e9800998ecf8427e
返回参数
名称 类型 说明
code int 1 = 成功;0 = 失败(商户不存在 / 用户已禁用 / 签名失败)
msg string 提示信息
data string 当前账户余额
time int 服务器时间戳
签名说明
// 注意:余额查询签名与提交订单的 RC4 签名不同
$sign = md5($account_id . $s_key);
返回示例
{"code":1,"msg":"","time":1728345600,"data":"1988.50"}

异步通知(回调)


平台以 POST(application/x-www-form-urlencoded)方式向 callback_url 推送充值结果;商户处理完成后必须输出 success(不区分大小写),否则平台判定通知失败。
通知参数
名称 描述
pay_time支付时间戳
statussuccess = 充值成功;error = 充值失败(已退款)
mobile充值手机号
amount实际扣款金额(商户结算价)
cz_amount充值面值
out_trade_no商户订单号
trade_no平台订单号
sign签名:使用 cz_amount + out_trade_no 按提交订单的签名算法生成
callback_time回调时间戳
验签示例
// 注意:回调验签使用的是充值面值 cz_amount
if ($this->sign($this->key, ['amount' => $cz_amount, 'out_trade_no' => $out_trade_no]) !== $sign) {
    exit('签名验证失败');
}
echo 'success';