不管是支付宝接口好是微信支付接口,回调都分为跳转回调和异步通知回调,跳转回调是不保险的,加入客人支付完成后马上把支付页面关闭,没跳转,就通知不到你这个订单已经支付了,所以我们要用异步通知回调:
php/Index-alipay_notify_ur
l.html";
where(array('name'=>'alipay'))->find(
);
$info=json_decode($info['content'],tru
E);;
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:
https://b.alipay.com/order/pidAndKey.htm
$alipay_config['partner'] = $info['alipay_pid'];
//收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
$alipay_config['seller_id'] = $info['alipay_pid'];
// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:
https://b.alipay.com/order/pidAndKey.htm
$alipay_config['key'] = $info['alipay_key'];
$ss=S('config'
);
// 服务器异步通知页面路径 需
http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['notify_url'] = "".$ss['web_url']."/v.
php/Index-alipay_notify_ur
l.html";
// 页面跳转同步通知页面路径 需
http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['return_url'] = "".$ss['web_url']."/member.
php";
//签名方式
$alipay_config['sign_type'] = strtoupper('MD5'
);
//字符编码格式 目前支持 gbk 或 utf-8
$alipay_config['input_charset']= strtolower('utf-8'
);
//ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert'] = getcwd().'\\cacert.pem';
//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择
https;若不支持请选择
http
$alipay_config['transport'] = '
http';
// 支付类型 ,无需修改
$alipay_config['pa
yment_type'] = "1";
// 产品类型,无需修改
$alipay_config['
service'] = "create_direct_pay_by_user";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 防钓鱼时间戳 若要使用请调用类文件submit中的query_
timestamp函数
$alipay_config['anti_phishing_key'] = "";
// 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
$alipay_config['exter_invoke_ip'] = "";
$alipayNotify = new \AlipayNotify($alipay_config
);
$verify_result = $alipayNotify->verifyNotify(
);
if($verify_result)
{//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参
考)——
//获取支付宝的通知返回参数,可参
考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
$@R_812_1
0586@l_fee=$_POST['@R_812_1
0586@l_fee'];
//if( $info['alipay_pid']
!=$seller_id) return ''; //收款账户不一致
$info=M('order')->where(array('no'=>$out_trade_no))->find(
);
if(!$info) return ''; //订单号不存在
if($_POST['trade_status'] == 'TRADE_FINISHED')
{
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,
并执行商户的业务程序
//请务必判断请求时的@R_812_1
0586@l_fee、seller_id与通知时获取的@R_812_1
0586@l_fee、seller_id为
一致的
//如果有做过处理,不执行商户的业务程序
$data='';
$data['status']=2;
$data['pay_price']=$@R_812_1
0586@l_fee;
$data['pay_type']='支付宝';
$data['buyer']=$_POST['buyer_email'];
$data['trade_no']=$trade_no;
$data['pay_time']=time(
);
M('order')->where(array('no'=>$out_trade_no))->save($data
);
$c=M('smtp_templates')->where(array('id'=>5))->find(
);
if($c['status']==1)
{
$content = str_
replace('
{titlE}',$info['goods_name'],$c['content']
);
$content = str_
replace('
{i
D}',$info['goods_id'],$content
);
$content = str_
replace('
{pric
E}',$@R_812_1
0586@l_fee,$content
);
$content = str_
replace('
{tim
E}',date('Y-m-d H:i:s',time()),$content
);
$c=M('email_note')->where(array('pay_id'=>$out_trade_no))->find(
);
if(!$
C)
{
$e='';
$e['email']=$info['c_email'];
$e['content']=$content;
$e['pay_id']=$out_trade_no;
M('email_note')->add($
E);
$m=explode('|',$c['ather']
);
foreach($m as $mail)
{
if(validate_email($mail))
{
$e['email']=$mail;
M('email_note')->add($
E);
}
}
}
}
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"
);
}
else if ($_POST['trade_status'] == 'TRADE_
succesS')
{
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,
并执行商户的业务程序
//请务必判断请求时的@R_812_1
0586@l_fee、seller_id与通知时获取的@R_812_1
0586@l_fee、seller_id为
一致的
//如果有做过处理,不执行商户的业务程序
$data='';
$data['status']=2;
$data['pay_price']=$@R_812_1
0586@l_fee;
$data['pay_type']='支付宝';
$data['buyer']=$_POST['buyer_email'];
$data['trade_no']=$trade_no;
$data['pay_time']=time(
);
M('order')->where(array('no'=>$out_trade_no))->save($data
);
$c=M('smtp_templates')->where(array('id'=>5))->find(
);
if($c['status']==1)
{
$content = str_
replace('
{titlE}',$c['ather']
);
foreach($m as $mail)
{
if(validate_email($mail))
{
$e['email']=$mail;
M('email_note')->add($
E);
}
}
}
}
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"
);
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参
考)——
echo "
success"; //请不要修改或删除
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else
{
//验证失败
echo "fail";
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录"
);
}
}
因为是异步通知,所以调试是个麻烦事,不能所见即所得,也就是说,一般情况下没办法echo或者print_r打印输出结果,没办法知道他执行到哪里或者执行结果,这个时候,我们就用到log文件输出,代码: