PHP接入支付宝接口失效流程详解


Posted in PHP onNovember 10, 2020

最近在写个需要简单支付的小项目,用到了支付宝接口,现已完成。把php接入支付宝的流程写在这里供像我一样的小白参考。

1.首先要有一个创建一个应用(选好自己想要的功能,关于支付的功能,貌似都需要签约)

PHP接入支付宝接口失效流程详解

2.下载SDK&Dome网址

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.CBtzBF&treeId=203&articleId=105910&docType=1

PHP接入支付宝接口失效流程详解 

我选择的是MD5签名方式,下面红框内就是做好的php Demo

PHP接入支付宝接口失效流程详解

  • lib文件很重要,是整个接口的核心类文件;
  • alipay.config.php是相关参数的配置文件
  • alipayapi.php 是支付宝接口入口文件
  • notify_url.php 是服务器异步通知页面文件;
  • return_url.php 是页面跳转同步通知文件;

3.打开alipay.config.php

PHP接入支付宝接口失效流程详解

4.配置完成后这个小例子就能直接访问了

 PHP接入支付宝接口失效流程详解
PHP接入支付宝接口失效流程详解 
通过这个例子,我们就能灵活运用了 开发文档: 

https://doc.open.alipay.com/docs/doc.htm?treeId=203&articleId=105288&docType=1

嵌入thinkphp3.2.3 我保留了

PHP接入支付宝接口失效流程详解

重新命名为 

PHP接入支付宝接口失效流程详解

分别给这五个文件加上命名空间

PHP接入支付宝接口失效流程详解

这四个文件的命名空间改为

PHP接入支付宝接口失效流程详解

Alipay.class.php 有改动

?php
namespace Extend\Alipay;
class Alipay {
  public function pay($alipay_config,$args){
    /**************************请求参数**************************/
    //支付类型
  $payment_type = "1";
  //必填,不能修改
  //服务器异步通知页面路径
  $notify_url = $args['notify_url'];
  //需http://格式的完整路径,不能加?id=123这类自定义参数
  //页面跳转同步通知页面路径
  $return_url = $args['return_url'];
  //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/
    //商户订单号
  $out_trade_no = $args['out_trade_no'];
  //商户网站订单系统中唯一订单号,必填
  //订单名称
  $subject = "测试";
  //必填
  //付款金额
  $total_fee = $args['total'];
  //必填
  //订单描述
  $body = "test";
  //需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html
  //防钓鱼时间戳
  $anti_phishing_key = "";
  //若要使用请调用类文件submit中的query_timestamp函数
  //客户端的IP地址
  $exter_invoke_ip = "";
  //非局域网的外网IP地址,如:221.0.0.1
  /************************************************************/
  //构造要请求的参数数组,无需改动
  $parameter = array(
    "service" => "create_direct_pay_by_user",
    "partner" => trim($alipay_config['partner']),
    "seller_id" => trim($alipay_config['seller_id']),
    "payment_type" => $payment_type,
    "notify_url"  => $notify_url,
    "return_url"  => $return_url,
    "out_trade_no" => $out_trade_no,
    "subject"    => $subject,
    "total_fee"   => $total_fee,
    "body" => $body,
    "show_url"   => $show_url,
    "anti_phishing_key"   => $anti_phishing_key,
    "exter_invoke_ip"    => $exter_invoke_ip,
    "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
  );
  //建立请求
  $alipaySubmit = new lib\AlipaySubmit($alipay_config);
    $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
    echo $html_text;
  }
}

在config.php配置文件里配置参数

PHP接入支付宝接口失效流程详解

然后新建控制器TextController.class.php

<?php
namespace Home\Controller;
use Think\Controller;
use \Extend\Alipay as Alipays;
class TextController extends Controller {
  public function index(){
    $this->display();
  }
  public function dobuy(){
    $out_trade_no = date('YmdHis');
    $baseurl = 'http://'.$_SERVER['HTTP_HOST'];
    $args = array(
      'out_trade_no'=>$out_trade_no,
      'notify_url'=> $baseurl.'/index.php/Home/Text/notifyurl.html',
      'return_url'=> $baseurl.'/index.php/Home/Text/returnurl.html',
      'total'=> $_POST['WIDtotal_fee'],
      );
    $s = new Alipays\Alipay();
    $s->pay(C('alipay'),$args);
  }
  // 同步跳转
  public function returnurl(){
    $alipay_config = C('alipay');
    //计算得出通知验证结果
    $alipayNotify = new Alipays\lib\AlipayNotify($alipay_config);
    $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') {
        //交易成功        
      }else {
       echo "trade_status=".$_GET['trade_status'];
      }  
      echo "验证成功<br />";
      }else {
      //验证失败
      //如要调试,请看alipay_notify.php页面的verifyReturn函数
      echo "验证失败";
    }
  }
  // 异步跳转
  public function notifyurl(){
    $alipay_config = C('alipay');
    //计算得出通知验证结果
    $alipayNotify = new Alipays\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'];
      if($_POST['trade_status'] == 'TRADE_FINISHED'||$_POST['trade_status'] == 'TRADE_SUCCESS') {
       //交易成功
      }
      echo "success";   //请不要修改或删除
      
    }
    else {
      //验证失败
      echo "fail";
      //调试用,写文本函数记录程序运行情况是否正常
      //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
    }
  }
}

然后

PHP接入支付宝接口失效流程详解

这样就成功完成简单的支付功能了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP新手上路(十二)
Oct 09 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
PHP关联链接常用代码
Nov 05 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
php判断IP地址是否在多个IP段内
Aug 18 PHP
基于PHP实现用户在线状态检测
Nov 10 #PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 #PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 #PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 #PHP
PHP中的异常处理机制深入讲解
Nov 10 #PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 #PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 #PHP
You might like
php反射应用示例
2014/02/25 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
PHP 类与构造函数解析
2017/02/06 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python科学计算之Pandas详解
2017/01/15 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python修改列表值问题解决方案
2020/03/06 Python
python对一个数向上取整的实例方法
2020/06/18 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
学生会干部自荐信
2014/02/04 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers