支付宝即时到账接口开发 - 支付宝即时到账接口和TP框架的结合

时间:2022-06-23 13:56:56

第一步:

将核心方法和加密方法放到项目里,Application/Home/common/function.php中即可。方便调用。

把alipay_core.function.php和alipay_md5.function.php2个文件中的函数,拷贝到function.php中。

支付宝即时到账接口开发 - 支付宝即时到账接口和TP框架的结合

第二步:

alipay_notify.class.phpalipay_submit.class.php拷贝到TP框架源码目录ThinkPHP/Libray/Think下,并修改这2个文件的名称为:

AlipayNotify.class.php
AlipaySubmit.class.php
(这是TP框架的命名规范)

然后要在这2个类添加命名空间:

namespace Think;

并且删除下面2句(因为引入的函数都被我们已经拷贝到Application/Home/common/function.php中了):

require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");

支付宝即时到账接口开发 - 支付宝即时到账接口和TP框架的结合

第三步

在项目中调用支付宝接口

1、在配置文件中对支付宝相关参数进行配置
Application/Home/conf/config.php:

<?php
return array(
//'配置项'=>'配置值'

//支付宝配置
'alipay_config'=>array(
//合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
'partner'=>'',
//MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
'key'=>'',
//这里是卖家的支付宝帐号
'seller_email'=>'',
//服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
'notify_url'=>'',
//页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
'return_url'=>'',
//签名方式
'sign_type'=>strtoupper('MD5'),
//字符编码格式 目前支持 gbk 或 utf-8
'input_charset'=>strtolower('utf-8'),
//ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
'cacert'=>getcwd().'\\cacert.pem',
//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
'transport'=>'http',
//支付类型 ,无需修改
'payment_type'=>'1',
//产品类型,无需修改
'service'=>'create_direct_pay_by_user',
),
);

2、创建订单支付控制器,完成支付流程
Application/Home/Controller/CheckoutController.php
支付宝即时到账接口开发 - 支付宝即时到账接口和TP框架的结合

http://mydev.com/index.php/Home/checkout/index 就是确认支付页面:
支付宝即时到账接口开发 - 支付宝即时到账接口和TP框架的结合
此表单提交到Checkout/submit,然后跳转到支付宝页面等待用户支付,支付完成后会更加支付宝配置里的notify_urlreturn_url 发送通知。
所以需要修改对应的配置参数:

//服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
'notify_url'=>'http://www.mydev.com/index.php/Home/Checkout/notifyurl',
//页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
'return_url'=>'http://www.mydev.com/index.php/Home/Checkout/returnurl',

3、CheckoutController.class.php代码如下:

<?php

namespace Home\Controller;
use Think\Controller;
class CheckoutController extends Controller {
//订单确认页面
public function index(){
//这里订单编号已经生成
//要客户确认订单信息
$this->display();
}

//确认支付
//发送请求到支付宝(会跳转到支付宝页面等待用户支付)
public function submit(){
//读取支付宝相关配置参数
$alipay_config = C('alipay_config');

/**************************请求参数**************************/
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $_POST['WIDout_trade_no'];
//订单名称,必填
$subject = $_POST['WIDsubject'];
//付款金额,必填
$total_fee = $_POST['WIDtotal_fee'];
//商品描述,可空
$body = $_POST['WIDbody'];

/************************************************************/

//构造要请求的参数数组,无需改动
$parameter = array(
"service" => $alipay_config['service'],
"partner" => $alipay_config['partner'],
"seller_id" => $alipay_config['partner'],
"payment_type" => $alipay_config['payment_type'],
"notify_url" => $alipay_config['notify_url'],
"return_url" => $alipay_config['return_url'],

"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
//其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1
//如"参数名"=>"参数值"

);

//建立请求
$alipaySubmit = new \Think\AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
echo $html_text;
}

//支付宝异步通知方法
public function notifyurl(){
//计算得出通知验证结果
$alipayNotify = new 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') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序

//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
} else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序

//注意:
//付款完成后,支付宝系统发送该交易状态通知

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

echo "success"; //请不要修改或删除

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
//验证失败
echo "fail";

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}

//支付宝同步通知方法
public function returnurl(){
//读取支付宝相关配置参数
$alipay_config = C('alipay_config');

//计算得出通知验证结果
$alipayNotify = new \Think\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'];
//交易金额
$total_fee = $_GET['total_fee'];
//买家支付宝帐号
$buyer_email = $_GET['buyer_email'];
//通知发送时间
$notify_time = $_GET['notify_time'];
//通知校验ID
$notify_id = $_GET['notify_id'];
////////////////////////////以上数据是支付宝返回给我们的,我们可以根据业务选择性处理///////////////////////////////


if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

//订单支付成,做其他业务处理:比如修改订单状态
//orderHandel...
//然后跳转到一个成功页面,提示用户支付成功...
}else {
echo "trade_status=".$_GET['trade_status'];
//跳转到一个提示用户支付失败的页面
}

//echo "验证成功<br />";

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
echo "验证失败";
//跳转到一个提示用户支付失败的页面
}
}
}

上面代码只是基本示例,网站业务逻辑需要自己更多处理。