## 服務器異步通知
支付成功之后, 驪店支付會進行 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;
}
~~~