alipay的支付通知有两类。异步通知(notify_url)与return_url.前面是post异步通知,后面的return_url 是get返回url只返回一次。
A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式
B页面跳转通知,对应的参数为return_url,支付宝通知使用GET方式 (通知地址不需要像以前一样去账户内设置,而是由客户在支付的时候通过参数传递给我地址)。
类似 notify_url=http://www.cnwenhui.cn/notify_alipay.php 注意:www.cnwenhui.cn是您网站的域名,也可以用ip地址代替。对于服务器通知,ip地址一定是公网的,私有地址获取不到alipay的返回数据
一、 文件结构
1 由两部分组成,支付接口与支付成功返回接口部分。支付宝快捷支付接口一般为url直接发起网页支付。返回就是支付宝服务器对该笔订单处理完毕后,通知与返回该笔订单的详细信息到你填写的notify_url地址,服务器接收到后,对返回数据处理对应订单状态。
2 以PHP代码中的程序为例。
接入部分的页面文件包含:配置页alipay_Config.php、方法详细页alipay/Alipay_Payto.php、程序入口页index.php以及MD5加密方法类页alipayto/Alipay_md5.php。通知返回部分的页面文件包含:方法详细页alipay/Alipay_Payto.php、MD5加密方法类页alipayto /Alipay_md5.php、支付完成后(支付宝处理完毕后)自动跳转回的自定义页面return_Alipay_Notify.php、两方服务器间相互交互(无法直接看到)通知页Alipay_Notify.php。
-----------------------------------------------------------------
工作原理
对结构有所了解之后,就可以开始研究具体是如何运行的了
a) 接入部分原理
i. 第一步——配置文件参数信息:
public function config() { $alipay_config = array(); $alipay_config['partner'] = '2088***********'; //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 $alipay_config['seller_id'] = '2088***********'; // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm $alipay_config['key'] = '12345679810111213141516'; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['notify_url'] = "http://www.cnwenhui.cn/notify_url"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['return_url'] = "http://www.cnwenhui.cn/return_url"; //签名方式 $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['payment_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'] = ""; //↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ return $alipay_config; }
配置完成之后,直接调用封装好的执行代码:
a) 以php程序代码为例:
$out_trade_no = $_POST['WIDout_trade_no']; //订单名称,必填 $subject = $_POST['WIDsubject']; //付款金额,必填 $total_fee = '0.01'; //商品描述,可空 $body = $_POST['WIDbody']; /************************************************************/ //构造要请求的参数数组,无需改动 $parameter = array( "service" => $alipay_config['service'], "partner" => $alipay_config['partner'], "seller_id" => $alipay_config['seller_id'], "payment_type" => $alipay_config['payment_type'], "notify_url" => $alipay_config['notify_url'], "return_url" => $alipay_config['return_url'], "anti_phishing_key"=>$alipay_config['anti_phishing_key'], "exter_invoke_ip"=>$alipay_config['exter_invoke_ip'], "out_trade_no" => $out_trade_no, "subject" => $subject, "total_fee" => $total_fee, "body" => $body, "_input_charset" => trim(strtolower($alipay_config['input_charset'])) ); //建立请求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认"); echo $html_text;
封装的demo中已经将对应的方法封装成了PHP函数,demo中直接调用就可以发起alipay支付请求。
a) 不可缺少的参数
i. service服务参数,这个是用来区别这个接口是用的什么接口,所以绝对不能修改。
ii. partner合作身份者ID、key安全校验码或称私钥这一组参数是签约合同生效后才能拿的到,partner是来鉴别是哪个商家与支付宝签约,而这个Key它如同钥匙般相当重要。
iii. seller_email收款人支付宝账号,支付宝中有手机类型、电子邮件类型的支付宝账号是都可以用这个参数的。
iv. subject在支付宝的收银台里是直接与商品名称关联在一起的,但是说的更准确些的话,这个参数是这笔交易的名称,因为这笔交易不一定只买一件商品。它的作用不仅是在收银台里可以清晰的显示出来,而且在支付宝的账
--------------------------------------------------------
通知返回
a) 返回页
传递给支付宝时的return_url参数所对应的页面文件。
具备的属性:
1、发起支后,买家已经成功付款以后流,页面会自动跳转回配置文件中填写的 return_url 地址中。
2、支付完成后跳转
3、参数以get方式传输。
4、网址只跳转一次,不能重复跳转。
b) 通知页
传递给支付宝时的notify_url参数所对应的页面文件
具备的属性:
1、被支付宝调用才能启动。
2、服务器间的传递,看不见执行操作。
3、参数以post方式传输。
4、支付宝中的该笔交易存在,且该笔交易状态发生了变更,就会被调用。
5、被调用程序判断(if(sign = mysign and responseTxt = true)),若我们自己在该判断中有做程序编写,成功则不再被调用,不成功则会反复被调用。
6、异步的,第一次收到订单信息(以下都称之为“通知”)是与返回页近乎等同或等同的同步时间,在判断不成功的情况下,会收到第二次第三次等次数的通知,时间间隔从最先的一两分钟,到后面的几个小时。失效时间是4
8小时。
7、程序必须在服务器上调试、运行。
8、程序编写时必须采用程序执行成功,才写页面echo(“success”);,不成功则写页面echo(“fail”); 支付宝根据success来判定是否要重新再次发送通知该页面的Html页面中必须是空白、无任何Html标签、无任何空格、不允许做页面跳转。