| 名称 | 必填 | 描述 | 示例 |
|---|---|---|---|
| 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;
}
}
| 名称 | 必填 | 描述 | 示例 |
|---|---|---|---|
| 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}
| 名称 | 必填 | 描述 | 示例 |
|---|---|---|---|
| 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"}
| 名称 | 描述 |
|---|---|
| pay_time | 支付时间戳 |
| status | success = 充值成功;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';