yii2 支付宝支付教程 [ 2.0 版本 ]

支付宝支付流程个人理解大致就这三步
1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层
2.在订单处理层引用支付宝的接口 将支付数据写入 支付宝会抛出一个from表单 action 到支付宝的付款页面
3.用户完成付款后会调用到同步回调和异步回调进行业务逻辑的处理

第一步 前端界面

  1. /*支付按钮点击*/
  2. $('body').on('click', '.payBtn', function () {
  3. var money = $('.moneylist .current').attr('data-money');
  4. var author_id = $(this).attr('data-author-id');
  5. var itemid = $(this).attr('data-itemid');
  6. var pay_type = $('.payType .current').attr('data-pay-type');
  7. //pay_type 是区分微信和支付宝的 先无视掉pay_type ==1 的
  8. if (pay_type == 1) {
  9. //pay_type 是区分微信和支付宝的 先无视掉pay_type ==1 的
  10. } else {
  11. $.ajax({
  12. type: "POST",
  13. url: "/alipay/pay",//这个就是进入到第二步将数据带入支付宝类库进行处理
  14. data: params,//数据
  15. async: false,
  16. success: function success(data) {
  17. $('#payform').html(data);
  18. }
  19. });
  20. }
  21. });

第二步 将支付数据带入到支付宝类库中处理

先放一张数据库字段的图片

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: jayrui612
  5. * Date: 2017/5/11
  6. * Time: 14:27
  7. */
  8. namespace frontend\controllers;
  9. use frontend\components\payment\alipay\lib\AlipaySubmit;
  10. use frontend\components\payment\alipay\lib\AlipayNotify;
  11. use common\models\SanDbSponsor;
  12. use yii\web\Controller;
  13. use Yii;
  14. class AlipayController extends Controller
  15. {
  16. public $enableCsrfValidation = false;
  17. public function actionPay()
  18. {
  19. //商户订单号,商户网站订单系统中唯一订单号,必填
  20. $out_trade_no = $_POST['WIDout_trade_no'];
  21. //订单名称,必填
  22. $subject = $_POST['WIDsubject'];
  23. //付款金额,必填
  24. $total_fee = $_POST['WIDtotal_amount'];
  25. //商品描述,可空
  26. $body = $_POST['WIDbody'];
  27. //创建支付订单
  28. $db = Yii::$app->db;
  29. try {
  30. $sponsorData = $_POST['sponsor_params'];
  31. $sponsorData['pay_type'] = 2; // 支付方式。(1:微信 ,2:支付宝)
  32. $sponsorData['pay_status'] = 0; // 支付状态。(0:未支付,1:支付成功,2:支付失败)
  33. $sponsorData['price'] = $total_fee;
  34. $sponsorData['out_trade_no'] = $out_trade_no;
  35. $sponsorData['create_time'] = time();
  36. $db->createCommand()->insert('supe_sponsor', $sponsorData)->execute();
  37. } catch(\Exception $e) {
  38. //throw $e;
  39. return $this->redirect(Yii::$app->urlManager->createUrl(["news/detail", 'itemid' => $_POST['sponsor_params']['itemid']]))->send();
  40. }
  41. $parameter = array(
  42. "service" => Yii::$app->params['pc_alipay']['service'],
  43. "partner" => Yii::$app->params['pc_alipay']['partner'],
  44. "seller_id" => Yii::$app->params['pc_alipay']['seller_id'],
  45. "payment_type" => Yii::$app->params['pc_alipay']['payment_type'],
  46. "notify_url" => Yii::$app->params['pc_alipay']['notify_url'],
  47. "return_url" => Yii::$app->params['pc_alipay']['return_url'],
  48. "anti_phishing_key"=>Yii::$app->params['pc_alipay']['anti_phishing_key'],
  49. "exter_invoke_ip"=>Yii::$app->params['pc_alipay']['exter_invoke_ip'],
  50. "out_trade_no" => $out_trade_no,
  51. "subject" => $subject,
  52. "total_fee" => $total_fee,
  53. "body" => $body,
  54. "_input_charset" => trim(strtolower(Yii::$app->params['pc_alipay']['input_charset']))
  55. );
  56. //建立请求
  57. $alipaySubmit = new AlipaySubmit(Yii::$app->params['pc_alipay']);
  58. $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
  59. echo $html_text;
  60. }

第三步 用户付款 同步回调和异步回调

这里做下说明 支付付款页面 用户付款后会自动调用 同步回调actionReturn_sync_ali 和异步回调actionReturn_async_ali
同步回调是做页面跳转之类的事情 异步回调是主要的 做订单状态的逻辑操作

下面的方法也是 在class AlipayController extends Controller下面

  1. /**
  2. * 支付宝同步回调通知
  3. */
  4. public function actionReturn_sync_ali()
  5. {
  6. $alipayNotify = new AlipayNotify(Yii::$app->params['pc_alipay']);
  7. $verify_result = $alipayNotify->verifyReturn();
  8. if($verify_result) {//验证成功
  9. //商户订单号
  10. $out_trade_no = htmlspecialchars($_GET['out_trade_no']);
  11. //收款方id
  12. $seller_id = htmlspecialchars($_GET['seller_id']);
  13. //支付宝交易号
  14. $trade_no = $_GET['trade_no'];
  15. //交易状态
  16. $trade_status = $_GET['trade_status'];
  17. if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
  18. return $this->redirect(Yii::$app->urlManager->createUrl(["news/detail"]))->send();
  19. } else {
  20. echo '<script>window.close();</script>';
  21. }
  22. }
  23. else {
  24. echo "验证失败";
  25. }
  26. }
  27. /**
  28. * 支付宝异步回调地址
  29. */
  30. public function actionReturn_async_ali()
  31. {
  32. $alipayNotify = new AlipayNotify(Yii::$app->params['pc_alipay']);
  33. $verify_result = $alipayNotify->verifyNotify();
  34. if($verify_result) {//验证成功
  35. // 本站订单号
  36. $out_trade_no = $_POST['out_trade_no'];
  37. // 支付宝交易号
  38. $trade_no = $_POST['trade_no'];
  39. // 交易状态
  40. $trade_status = $_POST['trade_status'];
  41. // 订单金额
  42. $total_amount = $_POST['total_fee'];
  43. // 实收金额
  44. $receipt_amount = $_POST['price'];
  45. // 回调通知的发送时间
  46. $notify_time = $_POST['notify_time'];
  47. if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
  48. //判断该笔订单是否在商户网站中已经做过处理
  49. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  50. //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
  51. //如果有做过处理,不执行商户的业务程序
  52. //注意:
  53. //付款完成后,支付宝系统发送该交易状态通知
  54. if ($_POST['seller_id'] == Yii::$app->params['pc_alipay']['seller_id']
  55. && $receipt_amount != 0 && ($total_amount == $receipt_amount))
  56. {
  57. $hasRecord = SanDbSponsor::find()
  58. ->where(['out_trade_no' => $out_trade_no])
  59. ->one();
  60. // update
  61. if ($hasRecord && $hasRecord->pay_status != 1)
  62. {
  63. $hasRecord->pay_status = 1; // 支付状态。(1:支付成功 )
  64. $hasRecord->create_time = strtotime($notify_time);
  65. $hasRecord->save();
  66. }
  67. }
  68. }
  69. //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
  70. echo "success"; //请不要修改或删除
  71. } else {
  72. //验证失败
  73. echo "fail"; //请不要修改或删除
  74. }
  75. }

大致就是这样了 还有配置文件和支付宝的类库文件没有贴上

  1. <?php
  2. return [
  3. // PC 端 赞赏支付宝配置
  4. 'pc_alipay' => [
  5. // 签约账号
  6. 'partner' => '111111',
  7. // 收款支付宝账号,一般情况下收款账号就是签约账号
  8. 'seller_id' => '111111',
  9. //商户的私钥,
  10. 'private_key' => 'xxxxxxxx',
  11. //支付宝的公钥
  12. 'alipay_public_key' => 'yyyyyyyyyyyyyy',
  13. // 异步通知页面路径
  14. 'notify_url' => 'http://www.jay.com/alipay/return_async_ali.php',
  15. // 页面跳转同步通知页面路径
  16. 'return_url' => "http://www.jay.com/alipay/return_sync_ali.php",
  17. //签名方式
  18. 'sign_type' => strtoupper('RSA'),
  19. //字符编码格式 目前支持 gbk 或 utf-8
  20. 'input_charset' => strtolower('utf-8'),
  21. // ca证书路径地址,用于curl中ssl校验
  22. // 请保证cacert.pem文件在当前文件夹目录中
  23. 'cacert' => getcwd().'\\cacert.pem',
  24. // 访问模式
  25. 'transport' => 'http',
  26. // 支付类型 ,无需修改
  27. 'payment_type' => '1',
  28. // 产品类型,无需修改
  29. 'service' => "create_direct_pay_by_user",
  30. // 以下防钓鱼信息,如果没开通防钓鱼功能,为空即可
  31. 'anti_phishing_key' => '',
  32. 'exter_invoke_ip' => ''
  33. ],
  34. ];

类库文件的截图

文章转自他人,文章写的很清晰,只供本人学习之用

yii2 支付宝支付教程 [ 2.0 版本 ]的更多相关文章

  1. TinkPHP框架开发的CRMEB小程序商城v4.0二次开发集成支付宝支付

    前言 大家都知道支付宝支付和微信支付宝都只能局限在自己的平台,微信内支付宝支付是根本就不能使用,即使是公众号支付也需要跳转到外部浏览器才可以唤起支付宝支付,并且QQ浏览器唤起支付宝支付还是问题很多,所 ...

  2. 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

    前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...

  3. ThinkPHP5.0 实现 app支付宝支付功能

    前几天做项目,要求要用到支付宝接口,第一次做,弄了好几天 各种坑啊,简单写一下我做支付宝支付的过程,希望对也是第一次做支付宝支付的童鞋有帮助, 不懂的可以先去支付平台看一下支付宝支付的文档,我是下的d ...

  4. asp.net core 支付宝支付( 电脑2.0)

    支付宝电脑支付实测在手机浏览器也可以唤醒手机支付宝进行支付,因此也可以作为支付宝手机web支付方式.支付宝电脑支付流程为使用支付宝官方sdk通过获取的支付宝参数构造DefaultAopClient实例 ...

  5. 商家 APP 如何接入新版支付宝支付,老版本商家如何升级

    代码地址如下:http://www.demodashi.com/demo/14006.html 前言 支付宝移动支付2.0版本对比1.0版本做了较大更新,新申请的商家都需要采用最新2.0版本 SDK ...

  6. MySQL5.0版本的安装图解教程

    MySQL5.0版本的安装图解教程是给新手学习的,当前mysql5.0.96是最新的稳定版本. mysql 下载地址 http://www.jb51.net/softs/2193.html 下面的是M ...

  7. thinkphp5.0 微信公众号接入支付宝支付

    ---恢复内容开始--- 真是无力吐槽这个需求了,想骂客户,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内 ...

  8. Thinkphp5.0支付宝支付扩展库类库大全

    Thinkphp5.0支付宝支付扩展库类库大全,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单等. Thinkphp5.0支付宝调用方法: 电脑网站支付 Pagepay.php 调用 ...

  9. Yii2使用Redis - 从安装redis到使用 [ 2.0 版本 ]

    Yii2使用Redis - 从安装redis到使用 [ 2.0 版本 ] 一.安装Redis和简单配置 1. 下载Redis安装包 地址:http://redis.io/download , 本文选择 ...

随机推荐

  1. python学习笔记02--列表和元组

    一.简介 数据结构是通过某种方式组织在一起的数据元素的集合. 序列是python中最基本的数据结构,python中包含6种内建的序列,分别是列表.元组.字符串.Unicode字符串.buffer对象和 ...

  2. c++语言的输入输出流库

    1.c++语言标准输入输出流 <1>控制符的用法 #include <iostream> #include <iomanip> using namespace st ...

  3. 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。

    WebService中发布之后出现这个错误, 解决方法: web.config文件中的 <system.web> 节点下加入:<webServices>    <prot ...

  4. Sample Means(耶鲁大学教材)

    Sample Means The sample mean from a group of observations is an estimate of the population mean. Giv ...

  5. 表数据量影响MySQL索引选择

    现象 新建了一张员工表,插入了少量数据,索引中所有的字段均在where条件出现时,正确走到了idx_nap索引,但是where出现部分自左开始的索引时,却进行全表扫描,与MySQL官方所说的最左匹配原 ...

  6. Netty网络聊天(一) 聊天室实战

    首发地址; Netty网络聊天(一) 聊天室实战 之前做过一个IM的项目,里面涉及了基本的聊天功能,所以注意这系列的文章不是练习,不含基础和逐步学习的部分,直接开始实战和思想引导,基础部分需要额外的去 ...

  7. springboot整合freemarker----一点小小的错误

    最近小弟正在学习springboot,没办法,现在微服务太火了.小弟也要顺应时代的潮流啊 :( 好了,废话不多说了!!!! 首先在springboot的pom.xml添加freemarker的依赖 & ...

  8. idea not found for the web module

    intellij  IDEA  的tomcat 配置项里面没有的app web:war exploded  没有配置/路径

  9. Fiddler抓包使用教程-Https

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72956016 本文出自[赵彦军的博客] 开启 Https 抓包 Fiddler 默 ...

  10. Redis系列(一):Redis的简介与安装

    原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...