最近做系统,需要做支付宝支付接口,自从支付宝接口升级后,以前的老版本接口无法签约,具体实现的步骤如下:
下载支付宝手机支付实例
https://docs.open.alipay.com/203/105910/
AlipayTradeService.php 原位置在alipay.trade.wap.pay-PHP-UTF-8\wappay\service
删除AlipayTradeService.php文件中的
require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'./../../AopSdk.php';
require dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'./../../config.php';
然后在该文件中添加
date_default_timezone_set('PRC');
修改完毕后移动其他文件与文件夹按照截图排列
并且吧该文件夹命名为Alipay,移动至ThinkPHP\Library\Vendor文件夹
修改配置参数:
添加完毕配置信息
写支付接口类控制器
<?php
namespace Home\Controller;
use Think\Controller;
class PayController extends Controller {
//在类初始化方法中,引入相关类库
public function index(){
该方法用于显示支付页面,并且提交支付请求
$uid = session('uid');
if(!I('POST.'))
{
$this->assign('uid',$uid);
$this->display();
}
header("Content-type: text/html; charset=utf-8");
if (!empty($_POST['WIDout_trade_no'])&& trim($_POST['WIDout_trade_no'])!=""){
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $_POST['WIDout_trade_no'];
//订单名称,必填
$subject = $_POST['WIDsubject'];
//付款金额,必填
$total_amount = $_POST['WIDtotal_amount'];
//商品描述,可空
$body = $_POST['WIDbody'];
//超时时间
$timeout_express="1m";
if($uid=="")
{
$this->error('登陆失效请重新登陆');
}
$Czjl = M('Czjl');
$data['ddh'] = $out_trade_no;
$data['uid'] = $uid;
$data['money'] = $total_amount;
$data['time'] = time();
$Czjl->data($data)->add();
vendor('Alipay.AlipayTradeService');
vendor('Alipay.AopSdk');
vendor('Alipay.wappay.buildermodel.AlipayTradeWapPayContentBuilder');
$payRequestBuilder = new \AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setTimeExpress($timeout_express);
$alipaySevice = new \AlipayTradeService(C('alipayconfig'));
$config=C('alipayconfig');
$result=$alipaySevice->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);
return ;
}
}
public function return_url(){
//同步跳转类
$uid = session('uid');
$arr=I('GET.');
vendor('Alipay.AlipayTradeService');
vendor('Alipay.AopSdk');
$alipaySevice = new \AlipayTradeService(C('alipayconfig'));
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {//验证成功
/
//请在这里加上商户的业务逻辑程序代码
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
//商户订单号
$out_trade_no = htmlspecialchars($_GET['out_trade_no']);
//支付宝交易号
$trade_no = htmlspecialchars($_GET['trade_no']);
//echo "验证成功<br />外部订单号:".$out_trade_no;
$Czjl = M("Czjl"); // 实例化User对象// 查找status值为1name值为think的用户数据
$data['status'] = 1;//表示充值成功
$data['zfbddh'] = $trade_no;
$data['shddh'] = $out_trade_no;
$re1=$Czjl->where('ddh="'.$out_trade_no.'"')->save($data); // 根据条件更新记录
$jieguo=$Czjl->where('ddh="'.$out_trade_no.'" AND status=1')->find(); // 根据条件更新记录
if(!$re1)
{
if($jieguo)
{
$this->success('充值成功', U('home/index/user'));
exit;
}ELSE
{
$this->error('亲您的充值出现特殊情况了,如果发现已被扣费请联系客服处理');
}
}else
{
$User = M("User");
$zhangmu = M("zhangmu");
$User->startTrans();
$zhangmu->startTrans();
$re[]=$User->where('id='.$jieguo['uid'])->setInc('money',$jieguo['money']); // 班长分红
$zmdata['uid'] = $jieguo['uid'];
$zmdata['bzlx'] = 5;
$zmdata['bzsl'] = $jieguo['money'];
$zmdata['beizhu'] = "充值订单编号:".$out_trade_no.":用户".$jieguo['uid']."充值:".$jieguo['money'];
$zmdata['time'] = time();
$re[]=$zhangmu->add($zmdata);
if(chkArr($re))
{
$User->commit();
$zhangmu->commit();
$this->success('充值成功', U('home/index/user'));
exit;
}ELSE
{
$User->rollback();
$zhangmu->rollback();
$this->error('亲您的充值出现特殊情况了,如果发现已被扣费请联系客服处理');
}
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/
}
else {
//验证失败
echo "验证失败";
}
}
public function notify_url(){
//异步跳转
vendor('Alipay.AlipayTradeService');
vendor('Alipay.AopSdk');
$arr=$_POST;
$alipaySevice = new \AlipayTradeService(C('alipayconfig'));
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {//验证成功
/
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
$Czjl = M("Czjl"); // 实例化User对象// 查找status值为1name值为think的用户数据
$User = M("User");
$zhangmu = M("zhangmu");
$User->startTrans();
$zhangmu->startTrans();
$Czjl->startTrans();
$data['status'] = 1;//表示充值成功
$data['zfbddh'] = $trade_no;
$data['shddh'] = $out_trade_no;
$re[]=$Czjl->where('ddh="'.$out_trade_no.'"')->save($data); // 根据条件更新记录
$jieguo=$Czjl->where('ddh="'.$out_trade_no.'" AND status=1')->find(); // 根据条件更新记录
if($jieguo)
{
$re[]=$User->where('id='.$jieguo['uid'])->setInc('money',$jieguo['money']); // 班长分红
$zmdata['uid'] = $jieguo['uid'];
$zmdata['bzlx'] = 5;
$zmdata['bzsl'] = $jieguo['money'];
$zmdata['beizhu'] = "充值订单编号:".$out_trade_no.":用户".$jieguo['uid']."充值:".$jieguo['money'];
$zmdata['time'] = time();
$re[]=$zhangmu->add($zmdata);
if(chkArr($re))
{
$User->commit();
$zhangmu->commit();
$Czjl->commit();
echo "success"; //请不要修改或删除
exit;
}ELSE
{
$User->rollback();
$zhangmu->rollback();
$Czjl->rollback();
echo "fail"; //请不要修改或删除
}
}else {
//验证失败
echo "fail"; //请不要修改或删除
}
}
}
}
具体文件以打包,下载后稍微修改一下就可以用了
http://pan.baidu.com/s/1hsDtTlE