本文为CI集成支付宝即时到账支付接口
1、下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1
2、登录支付宝https://www.alipay.com/ 下载CA证书。将证书放在下载的demo文件夹的根目录下。
2、将下载的create_direct_pay_by_user-php-UTF-8文件夹改为AliPay;并到到CI框架libraries/ 目录下。
3、在libraries/ 目录下新建CI_Alipay.php 文件,内容如下:
- <?php
- defined(‘BASEPATH‘) OR exit(‘No direct script access allowed‘);
- // 加载支付宝支付
- require_once APPPATH.‘libraries/AliPay/lib/alipay_submit.class.php‘;
- /**
- * 为CI扩展支付宝支付类
- */
- class CI_Alipay extends AlipaySubmit {
- public function __construct(){
- parent::__construct();
- }
- }
4、在CI框架application/config/目录下 新建alipay_config.php 内容如下:
- <?php
- defined(‘BASEPATH‘) OR exit(‘No direct script access allowed‘);
- /* *
- * 配置文件
- * 版本:3.4
- * 修改日期:2016-03-08
- * 说明:
- * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
- * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
- * 安全校验码查看时,输入支付密码后,页面呈灰色的现象,怎么办?
- * 解决方法:
- * 1、检查浏览器配置,不让浏览器做弹框屏蔽设置
- * 2、更换浏览器或电脑,重新登录查询。
- */
- //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
- //合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
- $config[‘partner‘] = ‘‘;
- //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
- $config[‘seller_id‘] = $config[‘partner‘];
- // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
- $config[‘key‘] = ‘‘;
- // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
- $config[‘notify_url‘] = ‘http://‘.$_SERVER[‘HTTP_HOST‘].‘/order/alipayNotifyUrl‘;
- // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
- $config[‘return_url‘] = ‘http://‘.$_SERVER[‘HTTP_HOST‘].‘/order/alipayReturnUrl‘;
- //签名方式
- $config[‘sign_type‘] = strtoupper(‘MD5‘);
- //字符编码格式 目前支持 gbk 或 utf-8
- $config[‘input_charset‘]= strtolower(‘utf-8‘);
- //ca证书路径地址,用于curl中ssl校验
- //请保证cacert.pem文件在当前文件夹目录中
- $config[‘cacert‘] = APPPATH.‘libraries/AliPay/cacert.pem‘;
- //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
- $config[‘transport‘] = ‘http‘;
- // 支付类型 ,无需修改
- $config[‘payment_type‘] = "1";
- // 产品类型,无需修改
- $config[‘service‘] = "create_direct_pay_by_user";
- //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
- //↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
- // 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数
- $config[‘anti_phishing_key‘] = "";
- // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
- $config[‘exter_invoke_ip‘] = "";
- //↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
5、在项目控制器controllers/ 目录下新建order.php 内容如下:
- <?php
- defined(‘BASEPATH‘) OR exit(‘No direct script access allowed‘);
- /**
- * Order Controller
- * 订单控制器
- */
- class Order extends MY_Controller {
- public function __construct(){
- $this->isNeedLogin = TRUE;
- parent::__construct();
- }
- /**
- * aliPay 【支付宝支付接口】
- * @param int $id 订单ID
- * @author lyne
- */
- public function aliPay($id){
- // 调用支付宝支付接口配置信息
- $this->load->config(‘alipay_config‘,TRUE);
- /*>>>>>>>>>>>>> 查预先生成的订单信息,根据自己情况 <<<<<<<<<<<<<<
- 根据订单ID查询预订单信息
- 包括:
- 订单总额、订单编号、订单商品等。
- >>>>>>>>>>>>> 根据自己情况 END <<<<<<<<<<<<<<<<<*/
- // 加载支付宝支付请求类库
- $this->load->library(‘CI_Alipay‘,$this->config->item(‘alipay_config‘));
- $parameter = array(
- ‘service‘ => $this->config->item(‘service‘,‘alipay_config‘),
- ‘partner‘ => $this->config->item(‘partner‘,‘alipay_config‘),
- ‘payment_type‘ => $this->config->item(‘payment_type‘,‘alipay_config‘),
- ‘notify_url‘ => $this->config->item(‘notify_url‘,‘alipay_config‘),
- ‘return_url‘ => $this->config->item(‘return_url‘,‘alipay_config‘),
- ‘seller_id‘ => $this->config->item(‘seller_id‘,‘alipay_config‘),
- ‘out_trade_no‘ => ‘订单编号‘, // 订单编号
- ‘subject‘ => ‘填写订单商品‘, // 订单商品
- ‘total_fee‘ => ‘订单总额‘, // 订单总额
- ‘body‘ => ‘商品描述‘, // 商品描述
- ‘show_url‘ => ‘‘, // 选填
- ‘anti_phishing_key‘ => ‘‘, // 选填
- ‘exter_invoke_ip‘ => ‘‘, // 选填
- ‘_input_charset‘ => $this->config->item(‘input_charset‘,‘alipay_config‘)
- );
- $body = $this->ci_alipay->buildRequestForm($parameter,"get","确认");
- echo $body;
- }
- }
6、以上步骤完成,下面支付就交给支付宝了。可以选择直接扫二维码支付,可以登录支付宝账号后操作
7、支付完成后,支付宝会通过异步通知地址(即alipay_config.php文件中的$config[‘notify_url‘]地址),随后支付宝通过同步通知地址(即alipay_config.php文件中的$config[‘return_url‘]地址)。
7-1、那么一般情况我们会在异步通知内接收到支付成功信息后处理业务逻辑。注意:在异步通知内收到通知后,一定要返回success告知支付宝我已经收到你的通知,让它闭嘴。否则它会在25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
7-2、通过同步通知下收到成功信息后处理一些简单验证后跳转或提示成功信息。
8、异步通知 内容如下:我也写在了order控制器内了。看你心情哈
- /**
- * alipayNotifyUrl 异步(处理支付成功后逻辑)
- */
- public function alipayNotifyUrl(){
- require_once(APPPATH."/libraries/AliPay/lib/alipay_notify.class.php");
- // 调用支付宝支付接口配置信息
- $this->load->config(‘alipay_config‘);
- $alconfig[‘partner‘]=$this->config->item(‘partner‘); // 合作身份者ID
- $alconfig[‘seller_id‘]=$this->config->item(‘seller_id‘); // 收款支付宝账号
- $alconfig[‘key‘]=$this->config->item(‘key‘); // MD5密钥,安全检验码
- $alconfig[‘notify_url‘]=$this->config->item(‘notify_url‘); // 服务器异步通知页面路径
- $alconfig[‘return_url‘]=$this->config->item(‘return_url‘); // 页面跳转同步通知页面路径
- $alconfig[‘input_charset‘]=$this->config->item(‘input_charset‘); // 字符编码格式
- $alconfig[‘cacert‘]=$this->config->item(‘cacert‘); // ca证书路径地址
- $alconfig[‘transport‘]=$this->config->item(‘transport‘); // 访问模式
- $alconfig[‘payment_type‘]=$this->config->item(‘payment_type‘); // 支付类型
- $alconfig[‘service‘]=$this->config->item(‘service‘); // 产品类型
- $alconfig[‘sign_type‘]=$this->config->item(‘sign_type‘); // 签名方式
- //计算得出通知验证结果
- $alipayNotify = new AlipayNotify($alconfig);
- $verify_result = $alipayNotify->verifyNotify();
- // log_message(‘error‘,$verify_result); 可以用ci自带日志调试或使用支付宝的logResult();
- if($verify_result) {//验证成功
- //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
- //商户订单号
- $out_trade_no = $_POST[‘out_trade_no‘];
- //支付宝交易号
- $trade_no = $_POST[‘trade_no‘];
- //交易状态
- $trade_status = $_POST[‘trade_status‘];
- if($_POST[‘trade_status‘] == ‘TRADE_SUCCESS‘) {
- // 支付成功处理业务逻辑,例如修改订单支付状态等等
- // >>>>>>>>>>>>>>>> 根据自身情况,处理业务逻辑 <<<<<<<<<<<<<<<<<<<
- }
- echo "success"; //请不要修改或删除
- } else {
- //验证失败
- echo "fail";
- //调试用,写文本函数记录程序运行情况是否正常
- //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
- }
- }
9、同步通知 内容如下:我也写在了order控制器内了。看你心情哈
- /**
- * alipayReturnUrl 支付宝页面跳转同步通知页面(处理支付成功后提示页面)
- * @author lyne
- */
- public function alipayReturnUrl(){
- require_once(APPPATH."/libraries/AliPay/lib/alipay_notify.class.php");
- // 调用支付宝支付接口配置信息
- $this->load->config(‘alipay_config‘);
- $alconfig[‘partner‘]=$this->config->item(‘partner‘); // 合作身份者ID
- $alconfig[‘seller_id‘]=$this->config->item(‘seller_id‘); // 收款支付宝账号
- $alconfig[‘key‘]=$this->config->item(‘key‘); // MD5密钥,安全检验码
- $alconfig[‘notify_url‘]=$this->config->item(‘notify_url‘); // 服务器异步通知页面路径
- $alconfig[‘return_url‘]=$this->config->item(‘return_url‘); // 页面跳转同步通知页面路径
- $alconfig[‘input_charset‘]=$this->config->item(‘input_charset‘); // 字符编码格式
- $alconfig[‘cacert‘]=$this->config->item(‘cacert‘); // ca证书路径地址
- $alconfig[‘transport‘]=$this->config->item(‘transport‘); // 访问模式
- $alconfig[‘payment_type‘]=$this->config->item(‘payment_type‘); // 支付类型
- $alconfig[‘service‘]=$this->config->item(‘service‘); // 产品类型
- $alconfig[‘sign_type‘]=$this->config->item(‘sign_type‘); // 签名方式
- //计算得出通知验证结果
- $alipayNotify = new AlipayNotify($alconfig);
- $verify_result = $alipayNotify->verifyReturn();
- if($verify_result) {//验证成功
- //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
- //商户订单号
- $out_trade_no = $_GET[‘out_trade_no‘];
- //支付宝交易号
- $trade_no = $_GET[‘trade_no‘];
- //交易状态
- $trade_status = $_GET[‘trade_status‘];
- if($_GET[‘trade_status‘] == ‘TRADE_FINISHED‘ || $_GET[‘trade_status‘] == ‘TRADE_SUCCESS‘) {
- //判断该笔订单是否在商户网站中已经做过处理
- //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
- // echo ‘交易成功!跳转成功页面‘;
- //如果有做过处理,不执行商户的业务程序
- }else {
- echo "trade_status=".$_GET[‘trade_status‘];
- }
- } else {
- //验证失败
- //如要调试,请看alipay_notify.php页面的verifyReturn函数
- echo "验证失败";
- }
- }
10、即时到账有密退款接口也都差不多,我这里就不多说了。想必做到这里你也玩转支付宝支付了吧。是不是so easy~
转:http://blog.csdn.net/lyne_007/article/details/51752068