发卡君的异步通知需要校验请求的真实性,签证签名的算法和创建支付的算法一致。
下面说一下PHP的,PHP需要将所有POST过来的数据加入并进行签名,POST数据中必须包含sign,PHP获得sign的写法是$_POST['sign'],验证签名方法,比如验证发卡君支付通知:
<?php
/**
* 签名算法
* @param array $params 请求参数
* @param string $app_key AppKey
* @return string 签名字符串
*/
function sign($params, $app_key)
{
// $app_key = $params['app_key'];
unset($params['app_key'], $params['sign'], $params['sign_type']);
ksort($params);
return strtoupper(md5(urldecode(http_build_query($params)).$app_key));
}
// 判断是否有POST数据
if (isset($_POST)) {
// 生成签名
$app_key = '你的API签名密钥';
$sign = sign($_POST, $app_key);
// 如果POST过来的签名数据和验证签名数据一致则通过
if ($_POST['sign'] == $sign) {
// 判断账单编号和金额跟系统记录的是否一致,一致就处理,否则不处理
if ($_POST['out_trade_no'] === 'asdas' && $_POST['total_amount'] == '1.00') {
// 执行相应的业务逻辑,比如开通产品、邮件通知
} else {
// 数据不一致,忽略不处理或者记录错误报告管理员
}
}
} else {
die('验证签名失败,无数据请求');
}