Thinkphp 支付宝插件的引入 和调用
本文版权归本宝宝所有 未得允许不得转载
下载地址传送门 https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.twLYka&treeId=62&articleId=103566&docType=1
1 文件 demo 的下载 后 选择 md5版本或者是RDA版本 我这儿选择MD5版本 php utf8 版本 更改一下 文件名
2 文件的放入 在 Thinkphp/library/vendor

二 : 关键点技术分析
1 配置参数的 分析 于讲解
找到alipay.config.php
//合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config['partner'] = ''; //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
$alipay_config['seller_id'] = $alipay_config['partner']; // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config['key'] = ''; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['notify_url'] = "http://商户网址/create_direct_pay_by_user-PHP-UTF-8/notify_url.php"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['return_url'] = "http://商户网址/create_direct_pay_by_user-PHP-UTF-8/return_url.php"; //签名方式
$alipay_config['sign_type'] = strtoupper('MD5'); //字符编码格式 目前支持 gbk 或 utf-8
$alipay_config['input_charset']= strtolower('utf-8'); //ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert'] = getcwd().'\\cacert.pem'; //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
$alipay_config['transport'] = 'http'; // 支付类型 ,无需修改
$alipay_config['payment_type'] = "1"; // 产品类型,无需修改
$alipay_config['service'] = "create_direct_pay_by_user";
通过 查看 这些 基本配置参数 我们 可以将参数 配置到config.php文件中
'ALIPAY_CONFIG' => array(
'partner' => '', //身份信息 (必填)
'seller_id' => '', //id (必填)
'key' => '', //key值(必填)
'notify_url' => '', //必须是外网可以访问到的地址
'return_url' => '', //支付宝返回后的同步跳转地址
'sign_type' => strtoupper('MD5'),
'input_charset' => strtolower('utf-8'),
'transport' => 'http',
'cacert' => VENDOR_PATH.'Alipay/cacert.pem',
'payment_type' => '1',
'service' => 'create_direct_pay_by_user',
'anti_phishing_key' => '', //钓鱼 可以不填写
'exter_invoke_ip' => '', //可以不填写
),
2 php方法的写入 可以放入 function 中方便我们的使用
function subPayment($tradeNo, $amount, $subject, $body="")
{
$alipayConfig = C('ALIPAY_CONFIG');
//发起请求时的参数
$requestParam = $alipayConfig;
$requestParam['out_trade_no'] = $tradeNo;
$requestParam['subject'] = $subject;
$requestParam['total_fee'] = $amount;
$requestParam['body'] = $body;
$requestParam['_input_charset'] = trim(strtolower($alipayConfig['input_charset'])); vendor('Alipay/lib/alipay_submit','','.class.php');
$alipaySubmitObj = new \AlipaySubmit($alipayConfig);
$htmlText = $alipaySubmitObj->buildRequestForm($requestParam, "get", "确定");
echo $htmlText;
}
3内部控制器的调用
subPayment($orderData['order_no'], $orderData['amount'], NOW_TIME.'支付测试', NOW_TIME.'支付描述');
//参数1 生成 唯一的编号 参数2 金额 参数3: 支付的subject 参数 4 支付描述信息
4 根据返回结果信息做相应的更改 创建一个控制器
①支付宝返回同步地址的体现
private $_config;
private $_notifyObj;
function _initialize(){
vendor('Alipay/lib/alipay_notify','','.class.php');
$this->_config = C('ALIPAY_CONFIG');
$this->_notifyObj = new \AlipayNotify($this->_config);
}
//同步的通知地址
public function returnUrl()
{
$checkResult = $this->_notifyObj->verifyReturn();
if ($checkResult) {
if ($_GET['is_success'] == "T" && $_GET['trade_status'] == "TRADE_SUCCESS") {
$this->success('对订单'.$_GET['out_trade_no'].'支付成功',U('User/index'));
return;
}else{
$this->error('支付失败,请进订单中心查看!');
return;
}
}else{
$this->error('支付通知验证失败,请联系管理员!');
return;
}
}
②异步地址的修改 ps:必须在外网才能够生效 成功 后必须echo "success" 这个字符串 否则支付宝监听不到 会在24小时20分钟一直提醒
//异步的通知地址
public function notifyUrl()
{
$checkResult = $this->_notifyObj->verifyNotify();
if ($checkResult) {
$tradeStatus = $_POST['trade_status'];
$outTradeNo = $_POST['out_trade_no'];
$tradeNo = $_POST['trade_no'];
if ($tradeStatus == "TRADE_SUCCESS") {
$orderData = D('Order')->where(array('order_no'=>$outTradeNo))->find();
if (empty($orderData)) {
M('log')->add(array(
'ser_type' => 1,
'code' => 'ORDER_EXC',
'ser_data' => serialize(array('order_no'=>$outTradeNo,'trade_no'=>$tradeNo)),
'create_time'=>NOW_TIME,
));
exit;
} if ($orderData['status'] != 0) {
M('log')->add(array(
'ser_type' => 2,
'code' => 'ORDER_EXC',
'ser_data' => serialize(array('order_no'=>$outTradeNo,'trade_no'=>$tradeNo))
));
exit;
} D('Order')->where(array('order_no'=>$outTradeNo))->save(array('status'=>1)); echo "success";
}else{
D('Order')->where(array('order_no'=>$outTradeNo))->save(array('status'=>2));
}
}else{
echo "fail";
} }
Thinkphp 支付宝插件的引入 和调用的更多相关文章
- Mac支付宝插件风波
1.前言 首先我喜欢看一些创业的书,很多书里都会有马云的身影,马云也算是对我有一定的影响,从而我对淘宝也产生了一定的好感.但是关于这次插件事情,我对阿里产生了一些排斥的心里作用.我并不想吐槽淘宝,也不 ...
- nopCommerce 3.9 大波浪系列 之 可退款的支付宝插件(上)
一.简介 nop通过插件机制可以支持更多的支付扩展,我们通过编写支持退款的支付宝插件来更好的理解支付插件的扩展. 先分享下支付宝插件源码点击下载,由于时间原因,本篇只介绍使用该插件,下一篇结合插件进行 ...
- nopCommerce 3.9 大波浪系列 之 可退款的支付宝插件(下)
一.回顾 支付宝插件源码下载地址:点击下载 上篇介绍了使用支付宝插件进行支付,全额退款,部分退款还有插件的多店铺配置,本文介绍下如何实现的. 二.前期准备 插件主要有3个功能: 多店铺插件配置 支付功 ...
- KoaHub平台基于Node.js开发的Koa 连接支付宝插件代码信息详情
KoaHub平台基于Node.js开发的Koa 链接支付宝插件代码信息详情 easy-alipay alipay payment & notification APIs easy-alipay ...
- 最新zencart支付宝插件(支持1.5)
最新zencart支付宝插件(支持1.5) 最新zencart支付宝插件(支持1.5) 支付宝接口的兼容性真不错,时至今日还能用,想利用zencart来做国内时长还真是方便多了,朋友们可以试试. ...
- 支付宝移动支付之IOSApp调用支付宝钱包
近期客户提出要开发一个IOS上的app作为訪问他们站点的途径之中的一个.为什么说之中的一个呢.因为眼下PC和Mobile这两个站眼下都已经上线了. 所以问题就简单了,我们仅仅须要把mobile站UI改 ...
- TP5 中实现支付宝支付 利用model层调用支付宝类库
<?php /** * Created by PhpStorm. * User: admin * Date: 2017/8/16 * Time: 09:16 */ namespace app\a ...
- ThinkPHP 3.2.2跨控制器调用方法
所谓跨控制器调用,指的是在一个控制器中调用另一个控制器的某个方法.在ThinkPHP中有三种方式实现跨控制器调用: 直接实例化: A()函数实例化; R()函数实例化. (1)直接实例化 直接实例 ...
- 如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)
前段时间由于工作的关系,需要编写一个将数据插入到 Sql server 2012 的桌面软件. 由于之前使用的是MFC,偶然间接触到了Qt后,被它的简洁惊艳到了,于是便毅然而然的转投到了Qt的怀抱,哈 ...
随机推荐
- Git远程推送文件太大的error解决
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errfno 10054 方法1: 改成ssh推送 方法2: 把推送的缓 ...
- js 和C# ashx之间数组参数传递问题
js在进行ajax提交时,如果提交的参数是数组,js无法直接进行提交,及时提交上去,解析也是比较麻烦 ajax在提交数组时,需要设置参数: traditional: true, //参数作为数组传 ...
- iis mvc html
iis mvc项目显示view文件夹下的html <system.webServer><handlers> <add name="JavaScriptHandl ...
- 整理:sql server 中sql语句执行顺序
SQL Server 查询处理中的各个阶段(SQL执行顺序) SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是 ...
- UICollectionView笔记2
WWDC 2012 Session笔记——219 Advanced Collection Views and Building Custom Layouts 这是博主的WWDC2012笔记系列中的一篇 ...
- 多个activity之间的数据共享
Activity之间的数据共享问题起初一看并没有那么纠结,原因在于两点,一来两个Activity之间可以通过回传的方式进行数据的共享,而哪怕是多个Activity之间,也可以通过静态类进行数据的共享. ...
- git从安装到应用的学习
本文内容是对廖雪峰老师Git教程做的笔记,外加一些自己的学习心得,还抱着学以致用的心态来实践一番 Git学习笔记 分布式版本控制与集中式版本控制的最大区别 集中式的版本控制,本地没有历史记录,完整的仓 ...
- agc015F - Kenus the Ancient Greek(结论题)
题意 题目链接 $Q$组询问,每次给出$[x, y]$,定义$f(x, y)$为计算$(x, y)$的最大公约数需要的步数,设$i \leqslant x, j \leqslant y$,求$max( ...
- winform中获取当前周次
/*方法一*/ var dt = DateTime.Now; //找到今年的第一天是周几 int firstWeekend = Convert.ToInt32(DateTime.Parse(dt.Ye ...
- linux 命令——43 killall(转)
Linux 系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进 程,如果要找到我们需要杀死的进程,我们还需 ...