支付宝沙盒环境同步正确返回,但notify_url异步无返回结果的原因有哪些?
2022-06-30
以支付宝手机/电脑网站支付为例,return_url同步正确返回结果,但notify_url异步无返回结果的原因有两类:
- 支付宝官方demo sdk的问题。
- 开发者配置/业务逻辑错误。
第一、支付宝官方demo sdk的问题
截至今日(2022-6-30),从官网下载的demo,版本是2.0,修改日期是:2017-05-01。
/* *
* 功能:支付宝服务器异步通知页面
* 版本:2.0
* 修改日期:2017-05-01
* ...
*/
支付宝向notify_url地址发出的POST请求,参数fund_bill_list中存在转义字符,这个不应该参与验签,推荐直接移除,添加一行代码即可:
文件:/pay/alipay/notify_url.php
// 补充内容 - begin
$_POST['fund_bill_list'] = str_replace('\\', '', $_POST['fund_bill_list']);
// 补充内容 - end
$arr=$_POST;
$alipaySevice = new AlipayTradeService($config);
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);
这也是接口校验失败的原因之一。
第二、开发者配置/业务逻辑错误
>a. 配置文件
<?php
/**
* 沙箱环境
*/
$config = array (
//应用ID,您的APPID。
'app_id' => "",
//商户私钥
'merchant_private_key' => "",
//异步通知地址
'notify_url' => "https://我的域名/alipay_notify",
//同步跳转
'return_url' => "https://我的域名/alipay_return",
//编码格式
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => ""
);
依次说明要点:
- app_id: 注意区分沙盒和生产环境,沙盒环境有独立的app_id。
- merchant_private_key:商户私钥也称应用私钥。沙盒环境有一套默认的公私钥,方便使用。
- notify_url:需要部署在外网。
- return_url:需要部署在外网。
- charset:不变。
- sign_type:不变。
- gatewayUrl:固定。注意区分沙盒(https://openapi.alipaydev.com/gateway.do)和生产环境(https://openapi.alipay.com/gateway.do)。
- alipay_public_key:非常关键!支付宝公钥由官方提供,而不是开发者的应用公钥。绝大多数接口验签问题是公私钥不正确。
>b. 业务逻辑错误
notify_url.php中有一行代码千万别动,而且在它之前不能有中断的逻辑,比如return语句和语法报错等,实际业务中有许多情况可能要查询用户身份/权限,同样不要中断这里的流程。
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success"; //请不要修改或删除
参考资料
https://www.daimadog.com/8005.html
(版权归cpury.com所有,转载请注明出处。)