如下是即時到帳的接口整合thinkphp3.2.3 不過一樣適合批量付款接口php
這裏對如下長長的論文總結html
一、下載到支付寶接口源碼-複製 alipay_core.function.php、alipay_md5.function.php、alipay_notify.class.php、alipay_submit.class.php 這四個文件重命名並複製到ThinkPHP/Library/Vendor/Batchpay(本身建立的文件夾)
mysql
二、新建控制器用vendor加載類文件
web
三、去除對應的require_once
sql
四、notify_url.php alipayapi.php 這兩個文件封裝成兩個方法。
thinkphp
===============無情的分割線================數據庫
thinkphp3.2.3 成功對接支付寶接口,thinkphp小巧開源的一款框架 博主仍是比較看好了 今天須要作個項目 看了下 官方的一些文檔 對3.2的支付寶的教程
首先登錄支付寶集成接口的地址 下載你須要的文檔
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1
ok下載下來文檔 壓縮包內 2個文件夾
分別是
MD5簽名版本和 RSA簽名版本
本人愚見 web開發用 md5 app 選擇RSA簽名 因此咱們選擇 md5簽名版本
api
相對於之前 asp 已被成功的拋棄!哈哈哈哈哈 選擇本身的程序 和對應的編碼
我是用的create_direct_pay_by_user-PHP-UTF-8 文件夾下的
ok 下一步 找到你的項目的 ThinkPHP\Library\Vendor\ 下 打開
新建立文件夾 Alipay 注意大小寫
而後 [code]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");
複製代碼
數組
一、在配置文件中Conf/Config.php文件中對支付寶相關參數進行配置:代碼以下服務器
//支付寶配置參數
'alipay_config'=>array(
'partner' =>'20********50', //這裏是你在成功申請支付寶接口後獲取到的PID;
'key'=>'9t***********ie',//這裏是你在成功申請支付寶接口後獲取到的Key
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\\cacert.pem',
'transport'=> 'http',
),
//以上配置項,是從接口包中alipay.config.php 文件中複製過來,進行配置;
'alipay' =>array(
//這裏是賣家的支付寶帳號,也就是你申請接口時註冊的支付寶帳號
'seller_email'=>'pay@xxx.com',
//這裏是異步通知頁面url,提交到項目的Pay控制器的notifyurl方法;
'notify_url'=>'http://www.liuyuyao.com/Pay/notifyurl',
//這裏是頁面跳轉通知url,提交到項目的Pay控制器的returnurl方法;
'return_url'=>'http://www.liuyuyao.com/Pay/returnurl',
//支付成功跳轉到的頁面,我這裏跳轉到項目的User控制器,myorder方法,並傳參payed(已支付列表)
'successpage'=>'User/myorder?ordtype=payed',
//支付失敗跳轉到的頁面,我這裏跳轉到項目的User控制器,myorder方法,並傳參unpay(未支付列表)
'errorpage'=>'User/myorder?ordtype=unpay',
),
複製代碼
二、新建一個PayController代碼以下:位置是你的項目的Controller 下 不懂的本身去看手冊
代碼以下
<?php
namespace Home\Controller;
use Think\Controller;
class PayController extends Controller {
//在類初始化方法中,引入相關類庫
public function _initialize() {
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}
//doalipay方法
/*該方法其實就是將接口文件包下alipayapi.php的內容複製過來
而後進行相關處理
*/
public function doalipay(){
/*********************************************************
把alipayapi.php中複製過來的以下兩段代碼去掉,
第一段是引入配置項,
第二段是引入submit.class.php這個類。
爲何要去掉??
第一,配置項的內容已經在項目的Config.php文件中進行了配置,咱們只需用C函數進行調用便可;
第二,這裏調用的submit.class.php類庫咱們已經在PayAction的_initialize()中已經引入;因此這裏再也不須要;
*****************************************************/
// require_once("alipay.config.php");
// require_once("lib/alipay_submit.class.php");
//這裏咱們經過TP的C函數把配置項參數讀出,賦給$alipay_config;
$alipay_config=C('alipay_config');
/**************************請求參數**************************/
$payment_type = "1"; //支付類型 //必填,不能修改
$notify_url = C('alipay.notify_url'); //服務器異步通知頁面路徑
$return_url = C('alipay.return_url'); //頁面跳轉同步通知頁面路徑
$seller_email = C('alipay.seller_email');//賣家支付寶賬戶必填
$out_trade_no = $_POST['trade_no'];//商戶訂單號 經過支付頁面的表單進行傳遞,注意要惟一!
$subject = $_POST['ordsubject']; //訂單名稱 //必填 經過支付頁面的表單進行傳遞
$total_fee = $_POST['ordtotal_fee']; //付款金額 //必填 經過支付頁面的表單進行傳遞
$body = $_POST['ordbody']; //訂單描述 經過支付頁面的表單進行傳遞
$show_url = $_POST['ordshow_url']; //商品展現地址 經過支付頁面的表單進行傳遞
$anti_phishing_key = "";//防釣魚時間戳 //若要使用請調用類文件submit中的query_timestamp函數
$exter_invoke_ip = get_client_ip(); //客戶端的IP地址
/************************************************************/
//構造要請求的參數數組,無需改動
$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']))
);
//創建請求
$alipaySubmit = new \ AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "確認");
echo $html_text;
}
/******************************
服務器異步通知頁面方法
其實這裏就是將notify_url.php文件中的代碼複製過來進行處理
*******************************/
function notifyurl(){
/*
同理去掉如下兩句代碼;
*/
//require_once("alipay.config.php");
//require_once("lib/alipay_notify.class.php");
//這裏仍是經過C函數來讀取配置項,賦值給$alipay_config
$alipay_config=C('alipay_config');
//計算得出通知驗證結果
$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']; //交易狀態
$total_fee = $_POST['total_fee']; //交易金額
$notify_id = $_POST['notify_id']; //通知校驗ID。
$notify_time = $_POST['notify_time']; //通知的發送時間。格式爲yyyy-MM-dd HH:mm:ss。
$buyer_email = $_POST['buyer_email']; //買家支付寶賬號;
$parameter = array(
"out_trade_no" => $out_trade_no, //商戶訂單編號;
"trade_no" => $trade_no, //支付寶交易號;
"total_fee" => $total_fee, //交易金額;
"trade_status" => $trade_status, //交易狀態
"notify_id" => $notify_id, //通知校驗ID。
"notify_time" => $notify_time, //通知的發送時間。
"buyer_email" => $buyer_email, //買家支付寶賬號;
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){
orderhandle($parameter);
//進行訂單處理,並傳送從支付寶返回的參數;
}
}
echo "success"; //請不要修改或刪除
}else {
//驗證失敗
echo "fail";
}
}
/*
頁面跳轉處理方法;
這裏其實就是將return_url.php這個文件中的代碼複製過來,進行處理;
*/
function returnurl(){
//頭部的處理跟上面兩個方法同樣,這裏不羅嗦了!
$alipay_config=C('alipay_config');
$alipayNotify = new \ 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']; //交易金額
$notify_id = $_GET['notify_id']; //通知校驗ID。
$notify_time = $_GET['notify_time']; //通知的發送時間。
$buyer_email = $_GET['buyer_email']; //買家支付寶賬號;
$parameter = array(
"out_trade_no" => $out_trade_no, //商戶訂單編號;
"trade_no" => $trade_no, //支付寶交易號;
"total_fee" => $total_fee, //交易金額;
"trade_status" => $trade_status, //交易狀態
"notify_id" => $notify_id, //通知校驗ID。
"notify_time" => $notify_time, //通知的發送時間。
"buyer_email" => $buyer_email, //買家支付寶賬號
);
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); //進行訂單處理,並傳送從支付寶返回的參數;
}
$this->redirect(C('alipay.successpage'));//跳轉到配置項中配置的支付成功頁面;
}else {
echo "trade_status=".$_GET['trade_status'];
$this->redirect(C('alipay.errorpage'));//跳轉到配置項中配置的支付失敗頁面;
}
}else {
//驗證失敗
//如要調試,請看alipay_notify.php頁面的verifyReturn函數
echo "支付失敗!";
}
}
}
?>
}
複製代碼
這兒說下 有不少朋友Class 'Home\Controller\AlipaySubmit' not found 發生過如下的錯誤
執行new方法實例化的時候就報錯
Class 'Home\Controller\Alipay' not found
其實這樣的 須要在你的 $alipaySubmit = new AlipaySubmit($alipay_config); 等等 new 後面加一個 /
三、這裏有幾個支付處理過程當中須要用到的函數,我把這些函數寫到了項目的Common/common.php中沒有的本身建立 固然你也開業寫到其餘位置
<?
//在線交易訂單支付處理函數
//函數功能:根據支付接口傳回的數據判斷該訂單是否已經支付成功;
//返回值:若是訂單已經成功支付,返回true,不然返回false;
function checkorderstatus($ordid){
$Ord=M('Orderlist');
$ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus');
if($ordstatus==1){
return true;
}else{
return false;
}
}
//處理訂單函數
//更新訂單狀態,寫入訂單支付後返回的數據
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);
}
/*-----------------------------------
2013.8.13更正
下面這個函數,其實不須要,你們能夠把他刪掉,
具體看我下面的修正補充部分的說明
------------------------------------*/
//獲取一個隨機且惟一的訂單號;
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;
}
}
複製代碼
訪問 Pay下的doalipay 彈出支付錯誤 這樣基本沒有問題了
由於你的 config裏面的簽約的一些信息沒有正確配置 須要本身申請配置之後
還差一個訂單記錄的數據庫
打開你的mysql 運行 sql 記得修改數據庫前綴
CREATE TABLE `liuyuao_orderlist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
`ordid` varchar(255) DEFAULT NULL,
`ordtime` int(11) DEFAULT NULL,
`productid` int(11) DEFAULT NULL,
`ordtitle` varchar(255) DEFAULT NULL,
`ordbuynum` int(11) DEFAULT '0',
`ordprice` float(10,2) DEFAULT '0.00',
`ordfee` float(10,2) DEFAULT '0.00',
`ordstatus` int(11) DEFAULT '0',
`payment_type` varchar(255) DEFAULT NULL,
`payment_trade_no` varchar(255) DEFAULT NULL,
`payment_trade_status` varchar(255) DEFAULT NULL,
`payment_notify_id` varchar(255) DEFAULT NULL,
`payment_notify_time` varchar(255) DEFAULT NULL,
`payment_buyer_email` varchar(255) DEFAULT NULL,
`ordcode` varchar(255) DEFAULT NULL,
`isused` int(11) DEFAULT '0',
`usetime` int(11) DEFAULT NULL,
`checkuser` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
文章來源於: http://www.thinkphp.cn/topic/39616.html