## 服务器异步通知
支付成功之后, 骊店支付会进行 server-server 的通知, 字段如下:
* charge\_id - 支付单号
* order\_no - 创建支付单时传入的订单id
* bank - 付款方银行名称
* amount - 支付金额
* real\_amount - 实际到款金额(扣除支付费率)
* buyer - 支付方信息,根据不同的支付渠道,返回不同的买家信息,微信支付为相关 id,支付宝支付为手机号码或者邮件地址
* channel - 支付方式
* device\_info - 付款设备信息
* status - 调用状态
* is\_success - 是否成功
* pay\_time - 付款时间
* charge\_fee - 支付手续费
* payment\_no - 第三方支付单号
* metadata - 附加信息,额外数据(json 格式,会在支付成功后回调接口传回)如果用户请求时传递了该参数,则返回给商户时会回传该参数。
* timestamp - 系统时间戳,骊店支付服务器发起请求的时间
* sign - 签名,用于验证通知参数的签名
###### 注意事项
* 根据商家在提交支付参数中设定的 notify\_url 参数进行请求
* 请按照本文档“签名与验签”中的签名方法对返回参数进行签名并比对返回的签名判断数据是否由骊店支付返回,确保业务安全
### 重试机制
48小时内重试10次,每次通知时间间隔为5, 10, 120, 300, 600, 1800, 3600, 7200, 21600, 810000 秒
### 应答格式
骊店支付服务端在收到支付通知后,会推送给开发者创建订单时填写的notify\_url(异步回调地址),开发者在接收到通知后,必须返回
~~~null
SUCCESS
~~~
如果开发者不对消息和事件进行任何处理,骊店支付服务端会对notify\_url进行重复通知
### 签名和验签
签名用于向骊店支付服务器提交信息,验签用于验证骊店支付服务器发送的支付状态参数,验签的方法是对返回参数按签名方式进行签名,并比对返回参数中的 sign 参数,判断是否一致签名方法如下
1、排序
签名:对所有 API 请求参数(包括系统级参数和业务参数,但除去 sign 参数和 byte\[\]类型的参数),根据参数名称的 ASCII 码表的顺序排序。如:foo=1, bar=2, foo\_bar=3, foobar=4 排序后的顺序是 bar=2, foo=1, foo\_bar=3,foobar=4。
验签:对所有通知返回参数(除去sign参数),使用同样的排序规则
2、 拼接
将排序好的参数名和参数值以…方式首尾相椄成连续字符 串,根据上面的示例得到的结果为: bar2foo1foo\_bar3foobar4。
3、 签名
在排序字符串首尾分别拼接 app\_secret 后,进行 Md5 计算所得字符串进行大写处理得到最终 的 sign
### 验签规则
~~~null
//验签 $params 为通知参数集合,$secret为用户的app_secret
function checkSign($params,$secret){
$sign = array(
$secret,
isort($params),
$secret
);
$sign = implode('', $sign);
return strtoupper(md5($sign));
}
//参数排序
function isort($params) {
if(is_array($params)) {
ksort($params);
$result = array();
foreach($params as $key=>$value){
if ($value === false)
$value = 0;
if ($value !== null)
$result[] = $key.$value;
}
return implode('', $result);
}
}
~~~
### 验签方法
~~~
/**
* [signVerfiy 验签方法]
* @param [type] $params [回调的所有参数]
* @param [type] $app_secret [调起支付的appsecret]
* @return [type] [description]
*/
function signVerfiy($params, $app_secret)
{
if (isset($params['sign'])) {
$sign = $params['sign'];
unset($params['sign']);
} else {
return false;
}
$key_arr = [];
foreach ($params as $k => $v) {
array_push($key_arr, $k);
}
//排序
array_multisort($key_arr);
$string = '';
foreach ($key_arr as $v) {
$string .= $v . $params[$v];
}
$verify = strtoupper(md5($app_secret . $string . $app_secret));
return $verify == $sign;
}
~~~