ThinkPHP实现支付宝接口功能实例
ThinkPHP实现支付宝接口功能的方法,实例讲述了支付宝接口的下载及二次开发方法,以及对应的ThinkPHP开发技巧,需要的朋友可以参考下.
最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能,这里我用的是即时到帐的接口,具体实现的步骤如下:
一、下载支付宝接口包
下载地址:/pic/order/productDetail.htm?productId=2012111200373124&tabId=4#ps-tabinfo-hash
具体如何下载,我就不在罗嗦了~~
二、重新整理接口包文件,这一步应该算是比较关键的(个人认为),下载下来的接口包文件有很多语言的源码
我们选择 create_direct_pay_by_user-PHP-UTF-8 这个名称的接口文件,里面包括如下文件:
images文件里是支付宝相关的一些标志的图片,我们暂不管他,lib文件很重要,是整个接口的核心类文件;
alipay.config.php是相关参数的配置文件
alipayapi.php 是支付宝接口入口文件
notify_url.php 是服务器异步通知页面文件;
return_url.php 是页面跳转同步通知文件;
在ThinkPHP的框架文件下,找到Extend 进入,再进入Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引入,然后,复制支付宝接口文件包中lib文件里的所有文件,一共4个文件,如下:
现在对以上文件进行重命名.
alipay_core.function.php重命名为:Corefunction.php;
alipay_md5.function.php重命名为:Md5function.php;
alipay_notify.class.php重命名为:Notify.php;
alipay_submit.class.php重命名为:Submit.php;
然后,打开Submit.php文件,把以下代码去掉;
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");同样,打开Notify.php文件,把以下两段代码去掉require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");为什么要去掉以上两个文件中的这两段代码,因为在项目中调用接口文件的时候,我把所有4个核心文件都通过vendor来进行引入。所以,这不再需要导入。
到此,支付宝接口包相关核心类库的整理基本完成。现在开始在项目中调用;
三、在项目中调用支付宝接口
调用分两步:
1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置
复制代码 代码如下:
/pic/p>
'alipay_config'=>array(
'partner' =>'20********50', /pic/p>
'key'=>'9t***********ie',/pic/p>
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
),
/pic/p>
'alipay' =>array(
/pic/p>
'seller_email'=>'pay@xxx.com',
/pic/p>
'notify_url'=>'/pic/Pay/notifyurl',
/pic/p>
'return_url'=>'/pic/Pay/returnurl',
/pic/p>
'successpage'=>'User/myorder?ordtype=payed',
/pic/p>
'errorpage'=>'User/myorder?ordtype=unpay',
),
2、新建一个PayAction控制器代码如下
复制代码 代码如下:
<?php
class PayAction extends Action{
/pic/p>
public function _initialize() {
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}
/pic/p>
public function doalipay(){
/pic/p>
/pic/alipay_submit.class.php");
/pic/p>
$alipay_config=C('alipay_config');
$payment_type = "1"; /pic/pic/p>
$notify_url = C('alipay.notify_url'); /pic/p>
$return_url = C('alipay.return_url'); /pic/p>
$seller_email = C('alipay.seller_email');/pic/p>
$out_trade_no = $_POST['trade_no'];/pic/p>
$subject = $_POST['ordsubject']; /pic/pic/p>
$total_fee = $_POST['ordtotal_fee']; /pic/pic/p>
$body = $_POST['ordbody']; /pic/p>
$show_url = $_POST['ordshow_url']; /pic/p>
$anti_phishing_key = "";/pic/pic/p>
$exter_invoke_ip = get_client_ip(); /pic/p>
/pic/p>
$parameter = array(
"service" => "create_direct_pay_by_user",
"partner" => trim($alipay_config['partner']),
"payment_type" => $payment_type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"seller_email" => $seller_email,
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"show_url" => $show_url,
"anti_phishing_key" => $anti_phishing_key,
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
/pic/p>
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
echo $html_text;
}
function notifyurl(){
/pic/p>
/pic/alipay_notify.class.php");
/pic/p>
$alipay_config=C('alipay_config');
/pic/p>
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
/pic/p>
/pic/p>
$out_trade_no = $_POST['out_trade_no']; /pic/p>
$trade_no = $_POST['trade_no']; /pic/p>
$trade_status = $_POST['trade_status']; /pic/p>
$total_fee = $_POST['total_fee']; /pic/p>
$notify_id = $_POST['notify_id']; /pic/p>
$notify_time = $_POST['notify_time']; /pic/p>
$buyer_email = $_POST['buyer_email']; /pic/p>
$parameter = array(
"out_trade_no" => $out_trade_no, /pic/p>
"trade_no" => $trade_no, /pic/p>
"total_fee" => $total_fee, /pic/p>
"trade_status" => $trade_status, /pic/p>
"notify_id" => $notify_id, /pic/p>
"notify_time" => $notify_time, /pic/p>
"buyer_email" => $buyer_email, /pic/p>
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
/pic/p>
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){
orderhandle($parameter);
/pic/p>
}
}
echo "success"; /pic/p>
}else {
/pic/p>
echo "fail";
}
}
function returnurl(){
/pic/p>
$alipay_config=C('alipay_config');
$alipayNotify = new AlipayNotify($alipay_config);/pic/p>
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
/pic/p>
/pic/p>
$out_trade_no = $_GET['out_trade_no']; /pic/p>
$trade_no = $_GET['trade_no']; /pic/p>
$trade_status = $_GET['trade_status']; /pic/p>
$total_fee = $_GET['total_fee']; /pic/p>
$notify_id = $_GET['notify_id']; /pic/p>
$notify_time = $_GET['notify_time']; /pic/p>
$buyer_email = $_GET['buyer_email']; /pic/p>
$parameter = array(
"out_trade_no" => $out_trade_no, /pic/p>
"trade_no" => $trade_no, /pic/p>
"total_fee" => $total_fee, /pic/p>
"trade_status" => $trade_status, /pic/p>
"notify_id" => $notify_id, /pic/p>
"notify_time" => $notify_time, /pic/p>
"buyer_email" => $buyer_email, /pic/p>
);
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); /pic/p>
}
$this->redirect(C('alipay.successpage'));/pic/p>
}else {
echo "trade_status=".$_GET['trade_status'];
$this->redirect(C('alipay.errorpage'));/pic/p>
}
}else {
/pic/p>
/pic/p>
echo "支付失败!";
}
}
}
?>
3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中,这样不用手动调用,即可直接使用这些函数,代码如下:
复制代码 代码如下:
/pic/p>
/pic/p>
/pic/p>
/pic/p>
function checkorderstatus($ordid){
$Ord=M('Orderlist');
$ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');
if($ordstatus==1){
return true;
}else{
return false;
}
}
/pic/p>
/pic/p>
function orderhandle($parameter){
$ordid=$parameter['out_trade_no'];
$data['payment_trade_no'] =$parameter['trade_no'];
$data['payment_trade_status'] =$parameter['trade_status'];
$data['payment_notify_id'] =$parameter['notify_id'];
$data['payment_notify_time'] =$parameter['notify_time'];
$data['payment_buyer_email'] =$parameter['buyer_email'];
$data['ordstatus'] =1;
$Ord=M('Orderlist');
$Ord->where('ordid='.$ordid)->save($data);
}
/pic/p>
function getordcode(){
$Ord=M('Orderlist');
$numbers = range (10,99);
shuffle ($numbers);
$code=array_slice($numbers,0,4);
$ordcode=$code[0].$code[1].$code[2].$code[3];
$oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode');
if($oldcode){
getordcode();
}else{
return $ordcode;
}
}
【ThinkPHP实现支付宝接口功能实例】相关文章:
thinkPHP实现的联动菜单功能03-04
php中实现回删功能实例01-26
thinkPHP实现的省市区三级联动功能10-18
Thinkphp 多语言功能完善09-18
Thinkphp的多语言功能完善11-20
php+mysql结合Ajax实现点赞功能完整实例09-19
php支付宝接口用法分析12-08
ThinkPHP表单自动提交验证实例教程03-12