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 相关文章推荐
mysql5写入和读出乱码解决
Nov 25 PHP
PHP XML备份Mysql数据库
May 27 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
Oct 31 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
PHP内核探索:哈希表碰撞攻击原理
Jul 31 PHP
详解WordPress开发中的get_post与get_posts函数使用
Jan 04 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
php 文件上传至OSS及删除远程阿里云OSS文件
Jul 04 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 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
Numpy之reshape()使用详解
2019/12/26 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
小学先进集体事迹材料
2014/05/31 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
MySQL中varchar和char类型的区别
2021/11/17 MySQL