支付宝沙盒环境同步正确返回,但notify_url异步无返回结果的原因有哪些?

以支付宝手机/电脑网站支付为例,return_url同步正确返回结果,但notify_url异步无返回结果的原因有两类:

  1. 支付宝官方demo sdk的问题。
  2. 开发者配置/业务逻辑错误。

第一、支付宝官方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' => ""
);

依次说明要点:

  1. app_id: 注意区分沙盒和生产环境,沙盒环境有独立的app_id。
  2. merchant_private_key商户私钥也称应用私钥。沙盒环境有一套默认的公私钥,方便使用。
  3. notify_url:需要部署在外网。
  4. return_url:需要部署在外网。
  5. charset:不变。
  6. sign_type:不变。
  7. gatewayUrl:固定。注意区分沙盒(https://openapi.alipaydev.com/gateway.do)和生产环境(https://openapi.alipay.com/gateway.do)。
  8. alipay_public_key:非常关键!支付宝公钥由官方提供,而不是开发者的应用公钥。绝大多数接口验签问题是公私钥不正确。

>b. 业务逻辑错误

notify_url.php中有一行代码千万别动,而且在它之前不能有中断的逻辑,比如return语句和语法报错等,实际业务中有许多情况可能要查询用户身份/权限,同样不要中断这里的流程。

	//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
	echo "success";	//请不要修改或删除

参考资料

https://www.daimadog.com/8005.html

(版权归cpury.com所有,转载请注明出处。)