yii2 支付宝支付教程 [ 2.0 版本 ]
yii2 支付宝支付教程 [ 2.0 版本 ]
支付宝支付流程个人理解大致就这三步
1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层
2.在订单处理层引用支付宝的接口 将支付数据写入 支付宝会抛出一个from表单 action 到支付宝的付款页面
3.用户完成付款后会调用到同步回调和异步回调进行业务逻辑的处理
第一步 前端界面
/*支付按钮点击*/
$('body').on('click', '.payBtn', function () {
var money = $('.moneylist .current').attr('data-money');
var author_id = $(this).attr('data-author-id');
var itemid = $(this).attr('data-itemid');
var pay_type = $('.payType .current').attr('data-pay-type');
//pay_type 是区分微信和支付宝的 先无视掉pay_type ==1 的
if (pay_type == 1) {
//pay_type 是区分微信和支付宝的 先无视掉pay_type ==1 的
} else {
$.ajax({
type: "POST",
url: "/alipay/pay",//这个就是进入到第二步将数据带入支付宝类库进行处理
data: params,//数据
async: false,
success: function success(data) {
$('#payform').html(data);
}
});
}
});
第二步 将支付数据带入到支付宝类库中处理
先放一张数据库字段的图片
<?php
/**
* Created by PhpStorm.
* User: jayrui612
* Date: 2017/5/11
* Time: 14:27
*/
namespace frontend\controllers;
use frontend\components\payment\alipay\lib\AlipaySubmit;
use frontend\components\payment\alipay\lib\AlipayNotify;
use common\models\SanDbSponsor;
use yii\web\Controller;
use Yii;
class AlipayController extends Controller
{
public $enableCsrfValidation = false;
public function actionPay()
{
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $_POST['WIDout_trade_no'];
//订单名称,必填
$subject = $_POST['WIDsubject'];
//付款金额,必填
$total_fee = $_POST['WIDtotal_amount'];
//商品描述,可空
$body = $_POST['WIDbody'];
//创建支付订单
$db = Yii::$app->db;
try {
$sponsorData = $_POST['sponsor_params'];
$sponsorData['pay_type'] = 2; // 支付方式。(1:微信 ,2:支付宝)
$sponsorData['pay_status'] = 0; // 支付状态。(0:未支付,1:支付成功,2:支付失败)
$sponsorData['price'] = $total_fee;
$sponsorData['out_trade_no'] = $out_trade_no;
$sponsorData['create_time'] = time();
$db->createCommand()->insert('supe_sponsor', $sponsorData)->execute();
} catch(\Exception $e) {
//throw $e;
return $this->redirect(Yii::$app->urlManager->createUrl(["news/detail", 'itemid' => $_POST['sponsor_params']['itemid']]))->send();
}
$parameter = array(
"service" => Yii::$app->params['pc_alipay']['service'],
"partner" => Yii::$app->params['pc_alipay']['partner'],
"seller_id" => Yii::$app->params['pc_alipay']['seller_id'],
"payment_type" => Yii::$app->params['pc_alipay']['payment_type'],
"notify_url" => Yii::$app->params['pc_alipay']['notify_url'],
"return_url" => Yii::$app->params['pc_alipay']['return_url'],
"anti_phishing_key"=>Yii::$app->params['pc_alipay']['anti_phishing_key'],
"exter_invoke_ip"=>Yii::$app->params['pc_alipay']['exter_invoke_ip'],
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"_input_charset" => trim(strtolower(Yii::$app->params['pc_alipay']['input_charset']))
);
//建立请求
$alipaySubmit = new AlipaySubmit(Yii::$app->params['pc_alipay']);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
echo $html_text;
}
第三步 用户付款 同步回调和异步回调
这里做下说明 支付付款页面 用户付款后会自动调用 同步回调actionReturn_sync_ali 和异步回调actionReturn_async_ali
同步回调是做页面跳转之类的事情 异步回调是主要的 做订单状态的逻辑操作
下面的方法也是 在class AlipayController extends Controller下面
/**
* 支付宝同步回调通知
*/
public function actionReturn_sync_ali()
{
$alipayNotify = new AlipayNotify(Yii::$app->params['pc_alipay']);
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = htmlspecialchars($_GET['out_trade_no']);
//收款方id
$seller_id = htmlspecialchars($_GET['seller_id']);
//支付宝交易号
$trade_no = $_GET['trade_no'];
//交易状态
$trade_status = $_GET['trade_status'];
if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
return $this->redirect(Yii::$app->urlManager->createUrl(["news/detail"]))->send();
} else {
echo '<script>window.close();</script>';
}
}
else {
echo "验证失败";
}
}
/**
* 支付宝异步回调地址
*/
public function actionReturn_async_ali()
{
$alipayNotify = new AlipayNotify(Yii::$app->params['pc_alipay']);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {//验证成功
// 本站订单号
$out_trade_no = $_POST['out_trade_no'];
// 支付宝交易号
$trade_no = $_POST['trade_no'];
// 交易状态
$trade_status = $_POST['trade_status'];
// 订单金额
$total_amount = $_POST['total_fee'];
// 实收金额
$receipt_amount = $_POST['price'];
// 回调通知的发送时间
$notify_time = $_POST['notify_time'];
if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
if ($_POST['seller_id'] == Yii::$app->params['pc_alipay']['seller_id']
&& $receipt_amount != 0 && ($total_amount == $receipt_amount))
{
$hasRecord = SanDbSponsor::find()
->where(['out_trade_no' => $out_trade_no])
->one();
// update
if ($hasRecord && $hasRecord->pay_status != 1)
{
$hasRecord->pay_status = 1; // 支付状态。(1:支付成功 )
$hasRecord->create_time = strtotime($notify_time);
$hasRecord->save();
}
}
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "success"; //请不要修改或删除
} else {
//验证失败
echo "fail"; //请不要修改或删除
}
}
大致就是这样了 还有配置文件和支付宝的类库文件没有贴上
<?php
return [
// PC 端 赞赏支付宝配置
'pc_alipay' => [
// 签约账号
'partner' => '111111',
// 收款支付宝账号,一般情况下收款账号就是签约账号
'seller_id' => '111111',
//商户的私钥,
'private_key' => 'xxxxxxxx',
//支付宝的公钥
'alipay_public_key' => 'yyyyyyyyyyyyyy',
// 异步通知页面路径
'notify_url' => 'http://www.jay.com/alipay/return_async_ali.php',
// 页面跳转同步通知页面路径
'return_url' => "http://www.jay.com/alipay/return_sync_ali.php",
//签名方式
'sign_type' => strtoupper('RSA'),
//字符编码格式 目前支持 gbk 或 utf-8
'input_charset' => strtolower('utf-8'),
// ca证书路径地址,用于curl中ssl校验
// 请保证cacert.pem文件在当前文件夹目录中
'cacert' => getcwd().'\\cacert.pem',
// 访问模式
'transport' => 'http',
// 支付类型 ,无需修改
'payment_type' => '1',
// 产品类型,无需修改
'service' => "create_direct_pay_by_user",
// 以下防钓鱼信息,如果没开通防钓鱼功能,为空即可
'anti_phishing_key' => '',
'exter_invoke_ip' => ''
],
];
类库文件的截图
文章转自他人,文章写的很清晰,只供本人学习之用
yii2 支付宝支付教程 [ 2.0 版本 ]的更多相关文章
- TinkPHP框架开发的CRMEB小程序商城v4.0二次开发集成支付宝支付
前言 大家都知道支付宝支付和微信支付宝都只能局限在自己的平台,微信内支付宝支付是根本就不能使用,即使是公众号支付也需要跳转到外部浏览器才可以唤起支付宝支付,并且QQ浏览器唤起支付宝支付还是问题很多,所 ...
- 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结
前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...
- ThinkPHP5.0 实现 app支付宝支付功能
前几天做项目,要求要用到支付宝接口,第一次做,弄了好几天 各种坑啊,简单写一下我做支付宝支付的过程,希望对也是第一次做支付宝支付的童鞋有帮助, 不懂的可以先去支付平台看一下支付宝支付的文档,我是下的d ...
- asp.net core 支付宝支付( 电脑2.0)
支付宝电脑支付实测在手机浏览器也可以唤醒手机支付宝进行支付,因此也可以作为支付宝手机web支付方式.支付宝电脑支付流程为使用支付宝官方sdk通过获取的支付宝参数构造DefaultAopClient实例 ...
- 商家 APP 如何接入新版支付宝支付,老版本商家如何升级
代码地址如下:http://www.demodashi.com/demo/14006.html 前言 支付宝移动支付2.0版本对比1.0版本做了较大更新,新申请的商家都需要采用最新2.0版本 SDK ...
- MySQL5.0版本的安装图解教程
MySQL5.0版本的安装图解教程是给新手学习的,当前mysql5.0.96是最新的稳定版本. mysql 下载地址 http://www.jb51.net/softs/2193.html 下面的是M ...
- thinkphp5.0 微信公众号接入支付宝支付
---恢复内容开始--- 真是无力吐槽这个需求了,想骂客户,好端端的非要在微信公众号接入支付宝,都知道微信公众号是拒绝支付宝的,屏蔽了支付宝,所以在微信公众号接入支付宝的话就必须手动复制链接跳出微信内 ...
- Thinkphp5.0支付宝支付扩展库类库大全
Thinkphp5.0支付宝支付扩展库类库大全,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单等. Thinkphp5.0支付宝调用方法: 电脑网站支付 Pagepay.php 调用 ...
- Yii2使用Redis - 从安装redis到使用 [ 2.0 版本 ]
Yii2使用Redis - 从安装redis到使用 [ 2.0 版本 ] 一.安装Redis和简单配置 1. 下载Redis安装包 地址:http://redis.io/download , 本文选择 ...
随机推荐
- IOS 获取的时间显示为NAN 解决方法
var regTime= item.BeginDate.replace(/\-/g, "/"); ------ item.BeginDate 我的日期年月日的 (/\-/g, ...
- 设计模式之命令模式(Command )
命令模式是我们能够实现发送者和接收者之间的完全解耦,发送者是调用操作的对象,而接收者是接收请求并执行特定操作的对象.通过解耦,发送者无需了解接收者的接口.在这里,请求的含义是需要被执行的命令. 作用 ...
- ES6学习之变量的解构赋值
前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.- ...
- Spark机器学习——模型选择与参数调优之交叉验证
spark 模型选择与超参调优 机器学习可以简单的归纳为 通过数据训练y = f(x) 的过程,因此定义完训练模型之后,就需要考虑如何选择最终我们认为最优的模型. 如何选择最优的模型,就是本篇的主要内 ...
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- 你不可不知的Java引用类型之——弱引用
定义 弱引用是使用WeakReference创建的引用,弱引用也是用来描述非必需对象的,它是比软引用更弱的引用类型.在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收. 说明 弱 ...
- 记一次nginx php配置的心路历程
1.本来搞好了php的配置,想把目录下移一层 从 www.abc.com 变成 www.abc.com/wxapi ,由于我的真实文件目录比路由少了一层public 尝试了很多办法都不行 甚至想到了u ...
- python格式化字符串format函数
1. format可以接受无限个的参数,位置可以不按顺序: In [1]: "{} {}".format("hello","world") ...
- 洗礼灵魂,修炼python(40)--面向对象编程(10)—定制魔法方法+time模块
定制魔法方法 1.什么是定制魔法方法 首先定制是什么意思呢?其实就是自定义了,根据我们想要的要求来自定义.而在python中,其实那些所谓的内置函数,内置方法,内置属性之类的其实也是自定义出来的,不过 ...
- 3.2Python数据处理篇之Numpy系列(二)--- ndarray数组的创建与变换
目录 (一)ndarray数组的创建 1.从列表以元组中创建: 2.使用函数创建: (二)ndarray数组的变换 1.维度的变换: 2.类型的变换: 目录: 1.ndarray数组的创建 2.nda ...