create_direct_pay_by_user-php-UTF-8 │ ├lib┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈类文件夹 │ │ │ ├alipay_core.function.php ┈┈┈┈┈┈支付宝接口公用函数文件 │ │ │ ├alipay_notify.class.php┈┈┈┈┈┈┈支付宝通知处理类文件 │ │ │ ├alipay_submit.class.php┈┈┈┈┈┈┈支付宝各接口请求提交类文件 │ │ │ └alipay_md5.function.php┈┈┈┈┈┈┈支付宝接口MD5函数文件 │ ├log.txt┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈日志文件 │ ├alipay.config.php┈┈┈┈┈┈┈┈┈┈┈┈基础配置类文件 │ ├alipayapi.php┈┈┈┈┈┈┈┈┈┈┈┈┈┈支付宝接口入口文件 │ ├notify_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈服务器异步通知页面文件 │ ├return_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈页面跳转同步通知文件 │ ├cacert.pem ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈用于CURL中校验SSL的CA证书文件 │ └readme.txt ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈使用说明文本
4. 结构分为两部分:接入部分与通知 返回 部分。接入部分即为传递参数等信息组合成超级连接,并用该连接来进行跳转。通知返回部分则是支付宝服务器对该笔订单处理完毕后,通知与返回该笔订单的详细信息到商户服务器,商
户服务器接收到后,并对其进行数据处理。php
5. 接入部分: html
在 alipay.config.php中对须要配置的参数信息已经有详细说明, 具体在项目中通常会在config.php中配置好,将lib下的类文件(能够重命名)以及cacert.pem 放置在项目的合适位置,确保可以正确引入。数据库
构造 alipayapi.php中$parameter须要的参数 api
/**************************请求参数**************************/ //商户订单号,商户网站订单系统中惟一订单号,必填 $out_trade_no = $_POST['WIDout_trade_no']; //订单名称,必填 $subject = $_POST['WIDsubject']; //付款金额,必填 $total_fee = $_POST['WIDtotal_fee']; //商品描述,可空 $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'])) //其余业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1 //如"参数名"=>"参数值" ); //创建请求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认"); echo $html_text;
die;
须要注意的是开发支付接口须要在公网(服务器必须能够经过外网访问)才能够完成整个调试过程,若是服务器在外网访问不到,则没法接收到支付通知。数组
$notify_url和$return_url 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问 。服务器
6. 通知 返回 (具体业务逻辑在通知返回页面处理)网络
参考:http://www.cnblogs.com/blodfox777/archive/2009/11/03/1595223.html异步
a) 返回页
传递给支付宝时的return_url参数所对应的页面文件。
具有的属性:
一、支付接口中买家的购买流程已经走到支付宝里且支付宝提示支付成功时,页面会自动跳转回自身网站的这个页面里来。
二、同步的,无时差
三、得到参数的方法是用get方式获取。
四、不论跳转回来程序判断是真仍是假($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS')只跳转回来一次,不重复。
五、这个并非支付宝服务器调用了该页面,而是经过与组合拼接各参数造成的URL连接原理等同,拼接出来的URL连接,以后程序上作自动跳转。
六、基于5的缘由,该页面的程序调试可没必要在服务器上而是本机上调试、运行。
b) 通知页
传递给支付宝时的notify_url参数所对应的页面文件
具有的属性:
一、这个通知页就是被支付宝调用才能启动的。
二、服务器间的互动,不像返回页肉眼能够看到,这个是看不到的。
三、得到参数的方法是用POST方式获取。
四、支付宝中的该笔交易存在,且该笔交易状态发生了变动,就会被调用。
五、被调用程序判断(if(sign = mysign and responseTxt = true)),若咱们本身在该判断中有作程序编写,成功则再也不被调用,不成功则会反复被调用。
六、异步的,第一次收到订单信息(如下都称之为“通知”)是与返回页近乎等同或等同的同步时间,在判断不成功的状况下,会收到第二次第三次等次数的通知,时间间隔从最早的一两分钟,到后面的几个小时。失效时间是4
8小时。
七、基于6的缘由,该页面的程序调试必须在服务器上调试、运行。
八、程序编写时必须采用程序执行成功,才写页面response.Write(“success”);,不成功则写页面response.Write(“fail”); 支付宝根据success来断定是否要从新再次发送通知。
九、该页面的Html页面中必须是空白、无任何Html标签、无任何空格。函数
c) 在支付宝的众多接口中,不是全部的接口都拥有通知页与返回页的。
有的接口只有返回页;有的接口有通知页且用XML格式的内容显示在当前页面中;有的没有通知页也没有返回页仅仅只以XML格式的内容显示在当前页面中。因此,咱们要根据各接口的技术文档与程序实例来作相应的数据处
理。
d) 你们这里存在一个疑问,通常你们的作法都是把数据库更新些在返回页中,可是不少状况下出现了订单不一样步即掉单现象。这是为何?
答:返回页是当前页面自动跳转的,这虽然跳转的反应速度不错,但人的手动关闭该页面操做绝对可使之在没有跳转回来以前就关掉了该页面,此时本来该数据库更新的程序并无被启动,这样直接致使了掉单,因此通常大商
户,尤为是网络游戏行业的即时到账充值的技术作法是:返回页中有订单处理程序,通知页中也有,当返回页中的订单没作过处理时,通知页中的数据处理程序便启动;这样便可近乎100%解决掉单问题(还有种掉单缘由是你们本身的服务器出现问题,好比MS3XML.DLL问题,这个问题至今没有什么能够解决的办法,只能重装或是更换服务器,也有的服务器由于中毒才致使的)。网站
还有不少细节没有描述 只是大概思路 待之后补充
另 最近刷屏的一个截图软件 感受还不错 记录下官网地址 :http://zh.snipaste.com/。