在互联网业务中,支付、充值、退款、提现等涉及到资金交易的场景必不可少。这就要求系统能够进行异步通知,告知交易双方交易结果。在这些场景中,PHP 作为一种非常流行的后端开发语言,有着广泛的应用,在本文中我们将讲解如何使用 PHP 实现异步通知。
一、什么是异步通知?
在用户进行交易后,支付或者收款方会收到一条交易成功的通知,以便双方及时了解交易结果。在该场景下,如果采用同步通知,可能会导致交易时间变长,用户体验差,容易造成交易失败,影响到交易的可靠性。因此,我们使用异步通知的方式,即利用回调函数方式来通知交易结果。
二、PHP 实现异步通知的步骤
我们以支付场景为例,介绍如何使用 PHP 实现异步通知。
发起支付请求:当用户在应用中发起支付请求时,后端会向支付平台发送支付请求,并接收到支付平台的响应,并从响应中获取支付 URL。
PHP 示例代码:
1
2
3
4
5
6
7
8
9
10
11
$data = [
amount => 10.00,
body => 测试订单,
channel => alipay_wap,
currency => cny,
return_url => http://example.com/return,
notify_url => http://example.com/notify,
];
$result = curl_post(https://api.payment.com/payments, $data);
$payment_url = isset($result[payment_url]) ? $result[payment_url] : ;
通过 cURL 发送 POST 请求,调用支付平台的接口,向支付平台发送支付请求,并获取支付平台返回的响应结果。
PHP 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function curl_post($url, $data = [], $header = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
Content-Type: application/json,
Accept: application/json,
) + $header);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
在接口中设置返回 URL,用于在支付成功或失败的时候,将后台的支付结果通知给应用,同时也可用于查询交易状态。
PHP 示例代码:
1
2
3
4
5
6
7
8
$data = [
amount => 10.00,
body => 测试订单,
channel => alipay_wap,
currency => cny,
return_url => http://example.com/return,
notify_url => http://example.com/notify,
];
notify_url 参数用于传递接收支付结果的地址,由支付平台发送异步通知的地址。
接收异步通知的回调函数当支付平台收到用户的支付请求并完成了交易后,会发送异步通知到指定的 notify_url,通知支付结果。因此,我们需要在回调函数中进行验签和处理业务逻辑,并在最后返回确认信息。
PHP 示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
function notify()
{
$data = $_POST;
$time_now = time();
// 验证签名
if (!openssl_verify(json_encode($data), base64_decode($data[signature]), $public_key)) {
return false;
}
// 更新订单状态
update_order($data[order_id]);
return success;
}
由于支付平台发送的结果需要保证其可靠性,我们需要对支付平台返回的数据进行验签。在验签过程中,我们需要使用支付平台提供的公钥对签名进行验证,以确保其为支付平台发出的合法结果。
PHP 示例代码:
1
2
3
if (!openssl_verify(json_encode($data), base64_decode($data[signature]), $public_key)) {
return false;
}
支付成功后,需要更新订单的状态信息,以便应用了解订单的实际情况。在此步骤中,我们可以调用业务逻辑进行更新。
PHP 示例代码:
1
2
3
4
function update_order($order_id)
{
// 调用业务逻辑处理订单状态更新
}
在处理完成后,需向支付平台返回确认信息,以表明我们尽已确认处理过支付结果,以及返回码(如 200)表示处理成功。
PHP 示例代码:
1
return success;
三、避免异步通知的漏洞
在使用异步通知的过程中,为了确保安全性,我们需要避免以下漏洞:
只处理一次异步通知,否则会造成多次请求,并带来不必要的安全隐患。确保在处理异步通知时对结果进行签名验证,避免被第三方篡改请求。确保异步通知结果处理的功能逻辑不会失败并导致数据不一致。确保异步通知 URL 在提供给第三方时不被篡改,以免被攻击者恶意篡改地址并进行 CSRF 攻击。四、总结
本文介绍了使用 PHP 实现异步通知的过程,并提出了安全防范措施,希望对大家有所帮助。异步通知在资金交易场景下特别重要,尤其需要注意安全性,其中签名、重复处理、安全隐患等问题都需要在设计时考虑周全,避免出现漏洞和错误。
以上就是php实现异步通知的详细内容,更多请关注php中文网其它相关文章!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布投稿,分享有佣金分成!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码为"www.77ym.top",如遇到无法解压的请联系管理员!
7. 本站部分文章、资源来自互联网,版权归原作者及网站所有,如果侵犯了您的权利,请及时联系我站删除。免责声明
暂无评论内容