支付宝网页即时到账功能,可让用户在线向开发者的支付宝账号支付资金,交易资金即时到账,帮助开发者快速回笼资金。

当用户进行支付操作时候可以直接跳转到支付宝支付页面进行支付

1. 准备

关于支付宝签约即时到账和PID获取、密钥生成这里不做叙述,官方文档步骤也很清楚:传送门

支付宝即时到账DEMO下载:下载

2. DEMO目录结构

简单使用需要的文件说明

./alipay.config.php --- 配置文件

./alipayapi.php ------- 接口文件

./notify_url.php ------ 服务器异步通知文件

./return_url.php ----- 服务器同步跳转文件

./log.txt -------------- 日志

3. 配置alipay.config.php

在配置文件中有详细的说明,主要配置有

$alipay_config['partner']        = '208862160xxxxxxx'; // 合作者身份ID
$alipay_config['private_key'] = "xxxxxxxxxxxxx”; // 商户的私钥,此处填写原始私钥去头去尾
$alipay_config['notify_url'] = "http://xxxx/alipay/notify_url.php"; // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['return_url'] = "http://xxxx/alipay/return_url.php"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

其他配置按实际情况配置

4. 前端支付请求

请求一般都是form表单post请求alipayapi.php,涉及到金钱操作的我们都要小心严谨,这种请求代码需要封装到后端,不能前端展示出来

例如,我们可以后端封装个方法来进行处理,请求这个方法将代码echo到页面直接进行二次跳转

    /**
     * 支付宝支付
     * @param string $id ID
     */
    public function getAlipayParam($id)
    {
$form = <<<FORM
                <form style='display: none;' action='提交URL' name='payForm' method='post'>
                    <input  name='WIDout_trade_no' value='订单编号'>
                    <input  name='WIDsubject' value='订单名称'>
                    <input  name='WIDtotal_fee' value='金额'>
                    <input  name='WIDbody' value='商品描述'>
                    <input  name='extra_common_param' value='公共回参'>
                </form>
                <script>
                    function submitForm() {
                      document.payForm.submit();
                    }
                    submitForm();
                </script>
FORM;
                echo $form;
    }

在DEMO中(alipay.php)接受的请求参数并不多,实际上请求参数是很全面的:请求参数列表

我们可以根据实际需求进行扩展,实际开发中为了安全,请求的name可以适当的进行改变

/**************************请求参数**************************/
        //商户订单号,商户网站订单系统中唯一订单号,必填
        $out_trade_no = $_POST['WIDout_trade_no'];

        //订单名称,必填
        $subject = $_POST['WIDsubject'];

        //付款金额,必填
        $total_fee = $_POST['WIDtotal_fee'];

        //商品描述,可空
        $body = $_POST['WIDbody'];

        //公共回传参数
        $extra_common_param = $_POST['extra_common_param'];

5. 支付

跳转到支付页面进行支付

6. 支付结果异步处理

关于异步通知的参数:服务器异步通知参数列表

前面提到异步通知请求到notify_url.php(根据个人配置)

异步通知主要负责处理支付结果的业务逻辑,这个需要自己根据项目需求更改编写

例如

<?php
/* *
 * 功能:支付宝服务器异步通知页面
 * 版本:3.5
 * 日期:2016-06-25
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

 *************************页面功能说明*************************
 * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
 */

require_once("alipay.config.php");
require_once("admin.config.php");
require_once("lib/alipay_notify.class.php");
require_once("log.php");

//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();

//初始化日志
$logHandler = new CLogFileHandler('logs/'.date('y-m-d').'.log');
$log = Log::Init($logHandler, 15);

if($verify_result) {//验证成功
    Log::DEBUG(json_encode($_POST));
    // 操作类型
    $extra_common_param = $_POST['extra_common_param'];
    // 订单编号
    $code = $_POST['out_trade_no'];
    // 支付宝交易号
    $trade_no = $_POST['trade_no'];
    // 交易状态
    $trade_status = $_POST['trade_status'];

    /**
     * 判断交易状态
     * ------------------------------------------------------------------------
     * 判断该笔订单是否在商户网站中已经做过处理
     * 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
     * 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
     * 如果有做过处理,不执行商户的业务程序
     * ------------------------------------------------------------------------
     * 调试用,写文本函数记录程序运行情况是否正常
     * logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
     */
    if ($trade_status == 'TRADE_FINISHED') {

        //注意:退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知

    } elseif ($trade_status == 'TRADE_SUCCESS') {

        //注意:付款完成后,支付宝系统发送该交易状态通知

        switch ($extra_common_param) {
            case AdminConfig::OPER_PLACE_ORDER:
                // 判断该订单是否处理过
                $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no;
                $is_order = request($url);
                if ($is_order == 'success') { // 订单未处理
                    // 修改订单的相关状态为已支付
                    $url = AdminConfig::BACKOFFICE_URL . 'xxx/xxx/xxx/' . $code . '/outtradeNo/' . $trade_no;
                    request($url);
                }
                break;
            case AdminConfig::OPER_RECHARGE:
                //修改充值订单支付状态为已支付
                $id = $_POST['out_trade_no'];
                $outtrade_no = $_POST['trade_no'];
                $money = $_POST['total_fee'];
                $url = AdminConfig::ORDER_URL . 'xxx/xxx/id/'.$id.'/money/'.$money.'/outtradeno/'.$outtrade_no;
                request($url);
                break;
        }
    }

    echo "success";        //请不要修改或删除
}
else {
    //验证失败
    echo "fail";
}

/**
 * 发送请求
 * @param  string  $url  请求地址
 * @param  array   $data 请求数据
 * @param  string  $type 请求类型
 * @param  boolean $ssl  是否是HTTPS请求
 * @return string  响应主体Content
 */
function request($url, $data=array(), $type='get', $ssl=false)
{
    // curl请求
    $curl = curl_init();
    // 设置curl选项
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_AUTOREFERER, true); // referer 请求来源
    curl_setopt($curl, CURLOPT_TIMEOUT, 10); // 设置超时时间
    // SSL相关
    if ($ssl) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 是否在服务端进行验证
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, '2'); // 检查服务器SSL证书中是否存在一个公用名
    }
    // POST请求
    if ($type == 'post') {
        curl_setopt($curl, CURLOPT_POST, true); // 是否为post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 处理请求数据
    }
    // 处理响应结果
    curl_setopt($curl, CURLOPT_HEADER, false); // 是否处理响应头
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 是否返回响应结果
    // 发送请求
    $response = curl_exec($curl);
    if (false === $response) {
        return false;
    }
    return $response;
}

?>

7. 支付结果同步处理

关于同步通知的参数:服务器同步通知参数列表

前面提到同步通知请求到return_url.php(根据个人配置)

同步通知主要负责处理支付结果的结果展示,这个需要自己根据项目需求更改编写

例如

    /**
     * 判断该笔订单是否在商户网站中已经做过处理
     * 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
     * 如果有做过处理,不执行商户的业务程序
     */
    if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
        // 交易成功或交易成功且订单结束
        switch ($extra_common_param) {
            case AdminConfig::OPER_PLACE_ORDER: // 订单支付
                $url = AdminConfig::ORDER_URL . 'xxx/orderPaySuccessShow';
                header("Location:$url");
                break;
            case AdminConfig::OPER_RECHARGE:
                $url = AdminConfig::ORDER_URL . 'xxx/rechargeSuccessShow';
                header("Location:$url");
                break;
            default:
                echo 'Undefined operation type!!';
                break;
        }
    }
    else {
        // 交易状态未成功
        switch ($extra_common_param) {
            case AdminConfig::OPER_PLACE_ORDER: // 订单支付
                $url = AdminConfig::ORDER_URL . 'xxx/orderPayFailShow';
                header("Location:$url");
                break;
            case AdminConfig::OPER_RECHARGE:
                $url = AdminConfig::ORDER_URL . 'xxx/rechargeFailShow';
                break;
            default:
                echo 'Undefined operation type!!';
                break;
        }
    }

8. 关于交易状态

其他一些细节性问题请大家参阅官方文档,文档永远是最好的教程!

支付宝即时到账DEMO配置与使用的更多相关文章

  1. ***CodeIgniter框架集成支付宝即时到账支付SDK

    本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...

  2. PHP 接入支付宝即时到账功能

    首先请到支付宝那边申请一个及时到账的接口账户,需要提交相关材料申请.然后根据即时到账的API文档进行接入.API文档提供了各种语言版本的demo,我这里是下的php版demo,然后再进行相关修改操作. ...

  3. PHP实现支付宝即时到账功能

    本文实例为大家分享了PHP支付宝即时到账功能的实现代码,供大家参考,具体内容如下 首先需要下载即时到账交易接口,传送门https://doc.open.alipay.com/doc2/detail?t ...

  4. *CodeIgniter框架集成支付宝即时到账SDK

    客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...

  5. 实战 Spring MVC接入支付宝即时到账 (部分代码)

    下面就拿我项目中的部分代码来实践一下. 支付请求 首先,是提交表单 fund.jsp(这里我表单只需要用户填交易金额,其他的订单号之类的全部后台生成) <form id="deposi ...

  6. PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)

    PHP九大接口视频教程(  支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程(  支付宝,QQ,短信接口 ...

  7. 支付宝即时到账接口开发 - DEMO讲解

    支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...

  8. ThinkPHP 3.2 支付宝即时到账接口开发

    前言: 一.支付流程 构造请求参数 向支付宝网关发送请求 生成支付宝页面 支付宝交易结果 二.构建支付类 1.官方即时到账文档地址: https://doc.open.alipay.com/doc2/ ...

  9. thinkphp框架对接支付宝即时到账接口回调的代码

    关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...

随机推荐

  1. 蓝桥杯-第一个数字-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  2. 使用canvas进行图片裁剪简单功能

    1.html部分 使用一个input[type="file"]进行图片上传: canvas进行图片的裁剪展示 <div> <input type="fi ...

  3. Lucene5.5.4入门以及基于Lucene实现博客搜索功能

    前言 一直以来个人博客的搜索功能很蹩脚,只是自己简单用数据库的like %keyword%来实现的,所以导致经常搜不到想要找的内容,而且高亮显示.摘要截取等也不好实现,所以决定采用Lucene改写博客 ...

  4. 关于IT创业和反思

    2016年8月的某一天本是世上平凡的一天,对于我而言却并不平凡. 这一天,我离开了待了近四年的创业公司.从它成立前的筹备开始,伴随着它的起起伏伏到完成C轮融资,从来没想过以这种方式离开,然而人生总是充 ...

  5. Hashtable、ConcurrentHashMap源码分析

    Hashtable.ConcurrentHashMap源码分析 为什么把这两个数据结构对比分析呢,相信大家都明白.首先二者都是线程安全的,但是二者保证线程安全的方式却是不同的.废话不多说了,从源码的角 ...

  6. 用ng-view创建单页APP

    我们假设我们有一个单页面的程序,并且想为这个页面添加动画效果.点击某一个链接会将一个试图滑出,同时将另一个试图滑入. 我们将会使用: 使用 ngRoute 来为我们的页面路由 使用 ngAnimate ...

  7. GPIO控制LED

    一.LED灯的亮灭控制的配置步骤(GPIO4_D3): 1.GPIO4的CRU_CLKGATE_CON31时钟使能配置(用来保证GPIO4可写): io -4 0xff76037c 0xffff019 ...

  8. DevCloud让代码检查更科学

    代码检查是软件开发工作中不可或缺的一部分,众所周知,规范化的编码是一个优质项目的保证.华为软件开发云(DevCloud)便提供了专业科学的自动化代码检查工作. 一.华为软件开发云(DevCloud)目 ...

  9. <<、>>、>>>移位操作

    <<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐. int leftShift = 10; System.out.println("十进制:" + l ...

  10. C语言中,隐藏结构体的细节

    我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装 ...