-
10周年大促!注册即领300元优惠券
- 注册/登录
使用人人秀API服务,需要在人人秀平台申请开通该服务,申请地址:人人秀平台(rrx.cn)—>账户设置—>⾼级设置—>API接口。申请通过后,系统会自动分配一个AppKey和AppSecret。
人人秀API接口必须含有下面3个参数
参数名 | 类型 | 说明 |
app_key | string(32) | 人人秀平台分配的AppKey |
time_stamp | string(14) | 1970-01-01开始的时间戳,精确到毫秒 |
sign | string(32) | 根据签名算法计算所得 |
第1步,设所有发送或者接收到的数据为集合M,将集合M内⾮空参数值的参数按照参数名ASCII码 从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
参数名ASCII码从小到⼤排序(字典序);
如果参数的值为空不参与签名;
参数名区分小写;
⼈⼈秀平台主动发起的请求时,传送的sign参数不参与签名,将⽣成的签名与该sign值作校验;
⼈⼈秀平台接⼝可能增加字段,签名验证必须遍历所有参数 ;
第2步,在stringA最后拼接上AppSecret得到stringSignTemp字符串,并对stringSignTemp进⾏MD5运 算,再将得到的字符串所有字符转换为⼤写,得到sign值signValue。
假设已经开通人人秀API功能,并且获得以下信息:
AppKey=96c84928b1dce057d110ea3b3880fc83
AppSecret=eRdLi88c6I6L95PFSX1Nq69Y84xLcD3T
假设某接口需要传送如下信息:
openid: ot1UbuBBzlE6IjEDWfyXQW3dy2S4
transaction_no: 69201704060281699381
time_stamp: 1543999047492
nonce_str: ibuaiVcKdpRxkhJA
order_no: 19201704060281699381
按照API接口规范,实际需要传递信息为:
app_key: 96c84928b1dce057d110ea3b3880fc83
time_stamp: 1543999047492
sign: 待计算
openid: ot1UbuBBzlE6IjEDWfyXQW3dy2S4
transaction_no: 69201704060281699381
nonce_str: ibuaiVcKdpRxkhJA
order_no: 19201704060281699381
按照签名算法计算sign:
第1步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA="app_key=96c84928b1dce057d110ea3b3880fc83&nonce_str= ibuaiVcKdpRxkhJA&openid=ot1UbuBBzlE6IjEDWfyXQW3dy2S4&order_no= 19201704060281699381&time_stamp=1543999047492&transaction_no=69201704060281699381";
第2步:拼接AppSecret: stringSignTemp=stringA+"&app_secret=eRdLi88c6I6L95PFSX1Nq69Y84xLcD3T"
sign=MD5(stringSignTemp).toUpperCase() //得到C17482AB45EA3C724CB648223ED8E2D2
最后得到最终发送的数据:
app_key: 96c84928b1dce057d110ea3b3880fc83
time_stamp: 1543999047492
sign: C17482AB45EA3C724CB648223ED8E2D2
openid: ot1UbuBBzlE6IjEDWfyXQW3dy2S4
transaction_no: 69201704060281699381
nonce_str: ibuaiVcKdpRxkhJA
order_no: 19201704060281699381
必须在服务器端计算签名
客户端⽣成签名地址,可能会导致以下问题:
客户端易被破解,AppSecret有外泄的⻛险,危害严重!
如果⽤户的⼿机端时钟不准,或者不在北京时区,会导致时间验证过期,⽆法访问。 因此签名地址务必在服务器端⽣成。
如不按要求,由此导致的损失,⼈⼈秀概不负责!
签名过期检查
由⼈⼈秀对商户平台发起的请求,请求参数⾥会有time_stamp(时间戳字段),请商户平台务必根据此字段对请求的签名做过期处理,⼈⼈秀平台建议过期时间为10分钟。
签名失败的问题排查
是否为编码异常导致。⼈⼈秀的请求部分参数会带有中⽂字符,第三方开发者需要先对请求参数做URLDecode 解码,可以在签名时遍历签名参数排查是否有字符乱码。
时间戳是否精确到毫秒,部分平台代码⽣成的时间戳是精确到秒的,需要转换⼀下
示例代码
// 计算签名类
class RrxAPI
{
protected $values = array();
public function __construct($data=array())
{
foreach ($data as &$d){
// 参数解码
$d = urldecode($d);
}
$this->values = $data;
}
/**
* 签名生成算法
* @param string $secret API密钥
* @return string 签名
*/
public function makeSign($secret){
//签名步骤一:按字典序排序参数
ksort($this->values);
$string = $this->ToUrlParams();
//签名步骤二:在string后加入app_secret
$string = $string . "&app_secret=".$secret;
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
/**
* 格式化参数格式化成url参数
*/
private function ToUrlParams()
{
$buff = "";
foreach ($this->values as $k => $v)
{
// 排除签名参数sign 、空值 、 数组
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
}
// 调用签名方法,计算签名
$query_data=[
'app_key'=>'test_app_key',
'openid'=>'test_openid',
'time_stamp'=>'1543999047492',
'name'=>'张飞'
];
$apiSdk = new RrxAPI($query_data);
$secret = 'test_secret';
$sign=$apiSdk->makeSign($secret);
得到签名为 8F4CC38010A6F917E788ED99518BD589