thinkphp3.2支付宝商户收款二维码二维码收款怎么做?

thinkphp3.2.3 微信支付扫码二完整版附源码 - ThinkPHP框架
微信支付 thinkphp整合今天花时间吧昨天发的微信扫码支付二完善了,现在功能完全做好了,只是界面是很简单的那种,有需要的就拿去用吧,可以节省很多时间,另外看在我分享代码的份上,有友友做出了好看的弹框提醒界面也可以发我邮箱,谢谢哦,大家相互交流学习。
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。ThinkPHP 3.2 支付宝即时到账接口开发
时间: 11:26:38
&&&& 阅读:212
&&&& 评论:
&&&& 收藏:0
标签:一、支付流程
构造请求参数
向支付宝网关发送请求
生成支付宝页面
支付宝交易结果
二、构建支付类
&1.官方即时到账文档地址:
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103740&docType=1
&2.支付类:
* Created by PhpStorm.
* User: Tinywan
* Time: 10:44
namespace Common\M
use Think\M
class PayModel
public $alipay_gateway_new = ‘https://mapi.alipay.com/gateway.do?‘;
public $https_verify_url = ‘https://mapi.alipay.com/gateway.do?service=notify_verify&‘;
public $http_verify_url = ‘http://notify.alipay.com/trade/notify_query.do?‘;
private $keys = ‘k2zu8i7h9enbkafsvtfrgdcuy1n273qn‘;
private $partner = ‘9823‘;
private $cacert = ‘http://www.19981.com/cert/cacert.pem‘;
public function alipay($data)
$param = array(
‘service‘ =& ‘create_direct_pay_by_user‘,
‘partner‘ =& $this-&partner,
‘_input_charset‘ =& ‘utf-8‘,
‘notify_url‘ =& ‘http://wechatu.xd107.com/pay/notify/notify_url‘,
//异步通知
//‘return_url‘ =& ‘http://wechatu.xd107.com/pay/notify/return_url‘, //同步通知
‘out_trade_no‘ =& $data[‘out_trade_no‘],
‘subject‘ =& $data[‘subject‘],
‘payment_type‘ =& ‘1‘,
‘total_fee‘ =& $data[‘total_fee‘],
‘seller_email‘ =& ‘‘,
//构造请求参数
$res = $this-&buildRequestPara($param);
$form = $this-&buildRequestForm($res, ‘get‘, ‘提交‘);
return $form;
//echo($form);
* 针对notify_url验证消息是否是支付宝发出的合法消息
* @return 验证结果
public function verifyNotify()
if (empty($_POST)) {//判断POST来的数组是否为空
return false;
//生成签名结果
$isSign = $this-&getSignVeryfy($_POST, $_POST["sign"]);
//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
$responseTxt = ‘false‘;
if (!empty($_POST["notify_id"])) {
$responseTxt = $this-&getResponse($_POST["notify_id"]);
//写日志记录
//if ($isSign) {
$isSignStr = ‘true‘;
$isSignStr = ‘false‘;
//$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";
//$log_text = $log_text.createLinkString($_POST);
//logResult($log_text);
//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
if (preg_match("/true$/i", $responseTxt) && $isSign) {
return true;
return false;
* 针对return_url验证消息是否是支付宝发出的合法消息
* @return 验证结果
public function verifyReturn()
if (empty($_GET)) {//判断POST来的数组是否为空
return false;
//生成签名结果
$isSign = $this-&getSignVeryfy($_GET, $_GET["sign"]);
//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
$responseTxt = ‘false‘;
if (!empty($_GET["notify_id"])) {
$responseTxt = $this-&getResponse($_GET["notify_id"]);
//写日志记录
//if ($isSign) {
$isSignStr = ‘true‘;
$isSignStr = ‘false‘;
//$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
//$log_text = $log_text.createLinkString($_GET);
//logResult($log_text);
//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
if (preg_match("/true$/i", $responseTxt) && $isSign) {
return true;
return false;
* 获取返回时的签名验证结果
* @param $para_temp 通知返回来的参数数组
* @param $sign 返回的签名结果
* @return 签名验证结果
function getSignVeryfy($para_temp, $sign)
//除去待签名参数数组中的空值和签名参数
$para_filter = $this-&paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = $this-&argSort($para_filter);
//把数组所有元素,按照&参数=参数值&的模式用&&&字符拼接成字符串
$prestr = $this-&createLinkstring($para_sort);
$isSgin = false;
switch (strtoupper(trim(‘MD5‘))) {
case "MD5" :
$isSgin = $this-&md5Verify($prestr, $sign, $this-&keys);
$isSgin = false;
return $isSgin;
* 获取远程服务器ATN结果,验证返回URL
* @param $notify_id 通知校验ID
* @return 服务器ATN结果
* 验证结果集:
* invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
* true 返回正确信息
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
function getResponse($notify_id)
$transport = strtolower(trim(‘http‘));
$partner = trim($this-&partner);
$veryfy_url = ‘‘;
if ($transport == ‘https‘) {
$veryfy_url = $this-&https_verify_
$veryfy_url = $this-&http_verify_
$veryfy_url = $veryfy_url . "partner=" . $partner . "&notify_id=" . $notify_id;
$responseTxt = $this-&getHttpResponseGET($veryfy_url, $this-&cacert);
return $responseTxt;
* 建立请求,以表单HTML形式构造(默认)
* @param $para_temp 请求参数数组
* @param $method 提交方式。两个值可选:post、get
* @param $button_name 确认按钮显示文字
* @return 提交表单HTML文本
function buildRequestForm($para_temp, $method, $button_name)
//待请求参数数组
$para = $this-&buildRequestPara($para_temp);
$sHtml = "&form id=‘alipaysubmit‘ name=‘alipaysubmit‘ action=‘" . $this-&alipay_gateway_new . "_input_charset=" . trim(strtolower(‘utf-8‘)) . "‘ method=‘" . $method . "‘&";
while (list ($key, $val) = each($para)) {
$sHtml .= "&input type=‘hidden‘ name=‘" . $key . "‘ value=‘" . $val . "‘/&";
//submit按钮控件请不要含有name属性
$sHtml = $sHtml . "&input type=‘submit‘
value=‘" . $button_name . "‘ style=‘display:‘&&/form&";
$sHtml = $sHtml . "&script&document.forms[‘alipaysubmit‘].submit();&/script&";
return $sHtml;
* 生成要请求给支付宝的参数数组
* @param $para_temp 请求前的参数数组
* @return 要请求的参数数组
function buildRequestPara($para_temp)
//除去待签名参数数组中的空值和签名参数
$para_filter = $this-&paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = $this-&argSort($para_filter);
//生成签名结果
$mysign = $this-&buildRequestMysign($para_sort);
//签名结果与签名方式加入请求提交参数组中
$para_sort[‘sign‘] = $mysign;
$para_sort[‘sign_type‘] = strtoupper(trim(‘MD5‘));
return $para_sort;
* 除去数组中的空值和签名参数
* @param $para 签名参数组
* return 去掉空值与签名参数后的新签名参数组
function paraFilter($para)
$para_filter = array();
while (list ($key, $val) = each($para)) {
if ($key == "sign" || $key == "sign_type" || $val == "") continue;
$para_filter[$key] = $para[$key];
return $para_filter;
* 对数组排序
* @param $para 排序前的数组
* return 排序后的数组
function argSort($para)
ksort($para);
reset($para);
return $para;
* 生成签名结果
* @param $para_sort 已排序要签名的数组
* return 签名结果字符串
function buildRequestMysign($para_sort)
//把数组所有元素,按照&参数=参数值&的模式用&&&字符拼接成字符串
$prestr = $this-&createLinkstring($para_sort);
$mysign = "";
switch (strtoupper(trim(‘MD5‘))) {
case "MD5" :
$mysign = $this-&md5Sign($prestr, $this-&keys);
$mysign = "";
return $mysign;
* 把数组所有元素,按照&参数=参数值&的模式用&&&字符拼接成字符串
* @param $para 需要拼接的数组
* return 拼接完成以后的字符串
function createLinkstring($para)
$arg = "";
while (list ($key, $val) = each($para)) {
$arg .= $key . "=" . $val . "&";
//去掉最后一个&字符
$arg = substr($arg, 0, count($arg) - 2);
//如果存在转义字符,那么去掉转义
if (get_magic_quotes_gpc()) {
$arg = stripslashes($arg);
return $arg;
* 签名字符串
* @param $prestr 需要签名的字符串
* @param $key 私钥
* return 签名结果
function md5Sign($prestr, $key)
$prestr = $prestr . $key;
return md5($prestr);
* 验证签名
* @param $prestr 需要签名的字符串
* @param $sign 签名结果
* @param $key 私钥
* return 签名结果
function md5Verify($prestr, $sign, $key)
$prestr = $prestr . $key;
$mysgin = md5($prestr);
if ($mysgin == $sign) {
return true;
return false;
* 远程获取数据,GET模式
* 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
* 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().‘\\cacert.pem‘
* @param $url 指定URL完整路径地址
* @param $cacert_url 指定当前工作目录绝对路径
* return 远程输出的数据
function getHttpResponseGET($url, $cacert_url)
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
curl_setopt($curl, CURLOPT_CAINFO, $cacert_url);//证书地址
$responseText = curl_exec($curl);
//var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
curl_close($curl);
return $responseText;
三、订单支付
(1)订单显示和异步处理代码:
* Created by PhpStorm.
* User: Tinywan
* Time: 10:44
namespace Pay\C
use Think\C
class IndexController extends Controller
public function index()
$map[‘id‘] = 7;
$info = M(‘alipay‘)-&where($map)-&find();
$this-&assign(‘info‘, $info);
$this-&display();
//echo($form);
public function payTo()
$data[‘subject‘] = $_POST[‘subject‘];
$data[‘out_trade_no‘] = $_POST[‘out_trade_no‘];
$data[‘total_fee‘] = $_POST[‘total_fee‘];
$res = D(‘Common/Pay‘)-&alipay($data);
$this-&ajaxReturn($res);
(2)订单显示和异步请求代码:
&html xmlns="http://www.w3.org/1999/xhtml"&
&meta http-equiv="Content-Type" content="text/ charset=utf-8" /&
&title&购物车&/title&
&script src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"&&/script&
&style type="text/css"&
*{margin:0px;padding:0px;border:0px; font-size:12px;color:#333; font-family:微软雅黑;}
ul li{ list-style:none}
a{ text-decoration:none;}
a:hover{ color:#e46432;}
body{margin:auto;;overflow-x:hidden;}
/*****购物车*********/
.gwc{ width:<span style="background-color: #f5f5f5; color: #px;overflow:hidden;}
.gwc_tb1{ width:<span style="background-color: #f5f5f5; color: #%; border-top:5px solid #48b9e5; background:#d0e7fa; height:38px; margin-top:20px; overflow:hidden;}
.tb1_td1{ width:35px; text-align:center;}
.tb1_td3{ width:<span style="background-color: #f5f5f5; color: #px; text-align:center;}
.tb1_td4{ width:<span style="background-color: #f5f5f5; color: #px; text-align:center;}
.tb1_td5{ width:<span style="background-color: #f5f5f5; color: #px; text-align:center;}
.tb1_td6{ width:<span style="background-color: #f5f5f5; color: #px; text-align:center;}
.tb1_td7{ text-align:center;}
.gwc_tb2{ width:<span style="background-color: #f5f5f5; color: #%; margin-top:20px; background:#eef6ff; border:1px solid #e5e5e5; padding-top:20px; padding-bottom:20px;}
.tb2_td1{ width:60px; text-align:center;}
.tb2_td2{ width:<span style="background-color: #f5f5f5; color: #px; text-align:center;}
.tb2_td2 img{ width:96px; height:96px; border:2px solid #c9c6c7;}
.tb2_td3{ width:<span style="background-color: #f5f5f5; color: #px; padding-left:12px; padding-right:18px;}
.tb2_td3 a{ font-size:14px; line-height:22px;}
.gwc_tb3{ width:<span style="background-color: #f5f5f5; color: #%; border:1px solid #d2d2d2; background:#e7e7e7; height:46px; margin-top:20px; }
.gwc_tb3 tr td{font-size:14px;}
.tb3_td2{ width:<span style="background-color: #f5f5f5; color: #px;text-align:center;}
.tb3_td2 span{ color:#ff5500;font-size:14px; font-weight:bold; padding-left:5px; padding-right:5px; }
.tb3_td3{ width:<span style="background-color: #f5f5f5; color: #px;text-align:center;}
.tb3_td3 span{ font-size:18px; font-weight:bold;}
.tb3_td4{ width:<span style="background-color: #f5f5f5; color: #px;text-align:center;}
.jz2{ width:<span style="background-color: #f5f5f5; color: #px; height:46px; line-height:46px; text-align:center; font-size:18px; color:#fff; background:#ee0000; display:block; float:right;}
#jz1{font-size:18px;}
&div class="gwc" style=" margin:"&
&table cellpadding="0" cellspacing="0" class="gwc_tb1"&
&td class="tb1_td3"&商品&/td&
&td class="tb1_td4"&商品信息&/td&
&td class="tb1_td5"&数量&/td&
&td class="tb1_td6"&单价&/td&
&td class="tb1_td7"&操作&/td&
&table cellpadding="0" cellspacing="0" class="gwc_tb2"&
&td class="tb2_td2"&&/td&
&td class="tb2_td3"&&a href="#"&苹果手机&/a&&/td&
&td class="tb1_td4"&{$info.subject}&/td&
&td class="tb1_td5"&
&input id="min1" name=""
style=" width:20 height:18border:1px solid #" type="button" value="-" /&
&input id="text_box1" name="" type="text" value="1" style=" width:30 text-align: border:1px solid #" /&
&input id="add1" name="" style=" width:20 height:18border:1px solid #" type="button" value="+" /&
&td class="tb1_td6"&&label id="total1" class="tot" style="color:#ff5500;font-size:14 font-weight:"&{$info.total_fee}&/label&&/td&
&td class="tb1_td7"&&a href="#"&删除&/a&&/td&
&table cellpadding="0" cellspacing="0" class="gwc_tb3"&
&td id="subject" style="display:none"&{$info.subject}&/td&
&td id="out_trade_no"
style="display:none"&{$info.out_trade_no}&/td&
&td class="tb3_td3"&合计(不含运费):&span&¥&/span&&span id="total_fee"&{$info.total_fee}&/span&&/td&
&td class="tb3_td4"&&a href="#" style=" display:" onclick="payto()"
class="jz2" id="jz2"&结算&/a&&/td&
&div id="form" style="display:none"&&/div&
&script type=‘text/javascript‘&
var $URL = "__ROOT__/Pay/Index/";
function payto(){
type: "post",
url: $URL+‘payTo‘,
data: {subject:$("#subject").html(), out_trade_no:$("#out_trade_no").html(),total_fee:$("#total_fee").html()},
dataType: "json",
success: function(data){
$(‘#form‘).html(data);
四、同步通知和异步通知
* Created by PhpStorm.
* User: Tinywan
* Time: 10:44
namespace Pay\C
use Think\C
class NotifyController extends Controller {
//同步通知
public function return_url(){
$verify = D(‘Common/Pay‘)-&verifyReturn();
if($verify){
$out_trade_no = $_GET[‘out_trade_no‘];
$trade_no = $_GET[‘trade_no‘];
$trade_status = $_GET[‘trade_status‘];
if($trade_status == ‘TRADE_FINISHED‘ || $trade_status == ‘TRADE_SUCCESS‘) {
$map[‘out_trade_no‘] = $out_trade_no;
$data[‘trade_no‘] = $trade_no;
$res = M(‘alipay‘)-&where($map)-&save($data);
if($res !== false){
echo ‘success,return_url‘.$res;
//异步通知
public function notify_url(){
$verify = D(‘Common/Pay‘)-&verifyNotify();
if($verify){
$out_trade_no = $_POST[‘out_trade_no‘];
$trade_no = $_POST[‘trade_no‘];
$trade_status = $_POST[‘trade_status‘];
if($trade_status == ‘TRADE_FINISHED‘ || $trade_status == ‘TRADE_SUCCESS‘) {
$map[‘out_trade_no‘] = $out_trade_no;
$data[‘trade_no‘] = $trade_no;
$res = M(‘alipay‘)-&where($map)-&save($data);
if($res !== false){
echo ‘success notify_url--$res‘;
五、验证是否是支付宝发来的通知
$verify = D(‘Common/Pay‘)-&verifyNotify();
* 针对return_url验证消息是否是支付宝发出的合法消息
* @return 验证结果
public function verifyReturn()
if (empty($_GET)) {//判断POST来的数组是否为空
return false;
//生成签名结果
$isSign = $this-&getSignVeryfy($_GET, $_GET["sign"]);
//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
$responseTxt = ‘false‘;
if (!empty($_GET["notify_id"])) {
$responseTxt = $this-&getResponse($_GET["notify_id"]);
//写日志记录
//if ($isSign) {
$isSignStr = ‘true‘;
$isSignStr = ‘false‘;
//$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
//$log_text = $log_text.createLinkString($_GET);
//logResult($log_text);
//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
if (preg_match("/true$/i", $responseTxt) && $isSign) {
return true;
return false;
六、RSA商户公钥与支付宝公钥
具体详细代码和说明文档见Github:https://github.com/Tinywan/ThinkPhpStudy
&标签:原文地址:http://www.cnblogs.com/tinywan/p/5876066.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!ThinkPHP3.2.3整合支付宝支付接口类 - ThinkPHP框架
分享个ThinkPHP 3.2.3最新版本整理支付宝类,支付宝接口相信很多人都开发过,但要在框架中自己去整合还是需要时间的,为了减少大家的时间,我把个整合好的支付宝类分享给大家。
注:ThinkPHP使用最新版本才能使用哈,这个是命名空间下使用的支付宝整合类;
直接吧这个解压放在ORG这个文章中就行了;
下载和更多详细地址:
注明:直接通过以上链接去下载,下载需要注册会员,不想注册的就不要去下载了;
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。thinkphp3.2支付宝接口类整合教程 - ThinkPHP框架
thinkphp3.2.3 成功对接支付宝接口,thinkphp小巧开源的一款框架 博主还是比较看好了 今天需要做个项目 看了下 官方的一些文档 对3.2的支付宝的教程 有点少 本人装个13写一个。
首先登陆支付宝集成接口的地址 下载你需要的文档
https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1
ok下载下来文档 压缩包内 2个文件夹
MD5签名版本和 RSA签名版本
本人愚见 web开发用 md5 app 选择RSA签名 所以我们选择 md5签名版本
相对于以前&asp&已被成功的抛弃!哈哈哈哈哈&选择自己的程序&和对应的编码&
我是用的create_direct_pay_by_user-PHP-UTF-8&文件夹下的&
ok&下一步&找到你的项目的&ThinkPHP\Library\Vendor\&下&打开&
新创建文件夹&Alipay&注意大小写&
然后&[code]alipay_core.function.php重命名为:Corefunction.
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&);1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:代码如下&//支付宝配置参数
&&#039;alipay_config&#039;=&array(
&&&&&&&&#039;partner&#039;&=&&#039;20********50&#039;,&&&//这里是你在成功申请支付宝接口后获取到的PID;
&&&&&#039;key&#039;=&&#039;9t***********ie&#039;,//这里是你在成功申请支付宝接口后获取到的Key
&&&&&#039;sign_type&#039;=&strtoupper(&#039;MD5&#039;),
&&&&&#039;input_charset&#039;=&&strtolower(&#039;utf-8&#039;),
&&&&&#039;cacert&#039;=&&getcwd().&#039;\\cacert.pem&#039;,
&&&&&#039;transport&#039;=&&&#039;http&#039;,
&&&&&//以上配置项,是从接口包中alipay.config.php&文件中复制过来,进行配置;
&&#039;alipay&#039;&&&=&array(
&//这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
&&#039;seller_email&#039;=&&#039;&#039;,
&//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
&&#039;notify_url&#039;=&&#039;http://www.liuyuyao.com/Pay/notifyurl&#039;,&
&//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
&&#039;return_url&#039;=&&#039;http://www.liuyuyao.com/Pay/returnurl&#039;,
&//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
&&#039;successpage&#039;=&&#039;User/myorder?ordtype=payed&#039;,&&&
&//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
&&#039;errorpage&#039;=&&#039;User/myorder?ordtype=unpay&#039;,&
&),2、新建一个PayController代码如下:位置是你的项目的Controller 下 不懂的自己去看手册
代码如下&?php
namespace&Home\C
use&Think\C
class&PayController&extends&Controller&{
&&&&&&//在类初始化方法中,引入相关类库&&&&
&&&&&&&public&function&_initialize()&{
&&&&&&&&vendor(&#039;Alipay.Corefunction&#039;);
&&&&&&&&vendor(&#039;Alipay.Md5function&#039;);
&&&&&&&&vendor(&#039;Alipay.Notify&#039;);
&&&&&&&&vendor(&#039;Alipay.Submit&#039;);
&&&&//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(&#039;alipay_config&#039;);&&
&&&&&&&&/**************************请求参数**************************/
&&&&&&&&$payment_type&=&&1&;&//支付类型&//必填,不能修改
&&&&&&&&$notify_url&=&C(&#039;alipay.notify_url&#039;);&//服务器异步通知页面路径
&&&&&&&&$return_url&=&C(&#039;alipay.return_url&#039;);&//页面跳转同步通知页面路径
&&&&&&&&$seller_email&=&C(&#039;alipay.seller_email&#039;);//卖家支付宝帐户必填
&&&&&&&&$out_trade_no&=&$_POST[&#039;trade_no&#039;];//商户订单号&通过支付页面的表单进行传递,注意要唯一!
&&&&&&&&$subject&=&$_POST[&#039;ordsubject&#039;];&&//订单名称&//必填&通过支付页面的表单进行传递
&&&&&&&&$total_fee&=&$_POST[&#039;ordtotal_fee&#039;];&&&//付款金额&&//必填&通过支付页面的表单进行传递
&&&&&&&&$body&=&$_POST[&#039;ordbody&#039;];&&//订单描述&通过支付页面的表单进行传递
&&&&&&&&$show_url&=&$_POST[&#039;ordshow_url&#039;];&&//商品展示地址&通过支付页面的表单进行传递
&&&&&&&&$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[&#039;partner&#039;]),
&&&&&&&&&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[&#039;input_charset&#039;]))
&&&&&&&&);
&&&&&&&&//建立请求
&&&&&&&&$alipaySubmit&=&new&\&AlipaySubmit($alipay_config);
&&&&&&&&$html_text&=&$alipaySubmit-&buildRequestForm($parameter,&post&,&&确认&);
&&&&&&&&echo&$html_
&&&&&&&&/******************************
&&&&&&&&服务器异步通知页面方法
&&&&&&&&其实这里就是将notify_url.php文件中的代码复制过来进行处理
&&&&&&&&*******************************/
&&&&function&notifyurl(){
&&&&&&&&&&&&&&&&/*
&&&&&&&&&&&&&&&&同理去掉以下两句代码;
&&&&&&&&&&&&&&&&*/&
&&&&&&&&&&&&&&&&//require_once(&alipay.config.php&);
&&&&&&&&&&&&&&&&//require_once(&lib/alipay_notify.class.php&);
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&//这里还是通过C函数来读取配置项,赋值给$alipay_config
&&&&&&&&$alipay_config=C(&#039;alipay_config&#039;);
&&&&&&&&//计算得出通知验证结果
&&&&&&&&$alipayNotify&=&new&&\&&AlipayNotify($alipay_config);
&&&&&&&&$verify_result&=&$alipayNotify-&verifyNotify();
&&&&&&&&if($verify_result)&{
&&&&&&&&&&&&&&&//验证成功
&&&&&&&&&&&&&&&&&&&//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
&&&&&&&&&&&$out_trade_no&&&=&$_POST[&#039;out_trade_no&#039;];&&&&&&//商户订单号
&&&&&&&&&&&$trade_no&&&&&&&=&$_POST[&#039;trade_no&#039;];&&&&&&&&&&//支付宝交易号
&&&&&&&&&&&$trade_status&&&=&$_POST[&#039;trade_status&#039;];&&&&&&//交易状态
&&&&&&&&&&&$total_fee&&&&&&=&$_POST[&#039;total_fee&#039;];&&&&&&&&&//交易金额
&&&&&&&&&&&$notify_id&&&&&&=&$_POST[&#039;notify_id&#039;];&&&&&&&&&//通知校验ID。
&&&&&&&&&&&$notify_time&&&&=&$_POST[&#039;notify_time&#039;];&&&&&&&//通知的发送时间。格式为yyyy-MM-dd&HH:mm:ss。
&&&&&&&&&&&$buyer_email&&&&=&$_POST[&#039;buyer_email&#039;];&&&&&&&//买家支付宝帐号;
&&&&&&&&&&&&&&&&&&&$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[&#039;trade_status&#039;]&==&&#039;TRADE_FINISHED&#039;)&{
&&&&&&&&&&&&&&&&&&&&&&&//
&&&&&&&&&&&}else&if&($_POST[&#039;trade_status&#039;]&==&&#039;TRADE_SUCCESS&#039;)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&if(!checkorderstatus($out_trade_no)){
&&&&&&&&&&&&&&&orderhandle($parameter);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&//进行订单处理,并传送从支付宝返回的参数;
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&echo&&success&;&&&&&&&&//请不要修改或删除
&&&&&&&&&}else&{
&&&&&&&&&&&&&&&&//验证失败
&&&&&&&&&&&&&&&&echo&&fail&;
&&&&&&&&}&&&&
&&&&&&&&页面跳转处理方法;
&&&&&&&&这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;&
&&&&&&&&*/
&&&&function&returnurl(){
&&&&&&&&&&&&&&&&//头部的处理跟上面两个方法一样,这里不罗嗦了!
&&&&&&&&$alipay_config=C(&#039;alipay_config&#039;);
&&&&&&&&$alipayNotify&=&new&&\&AlipayNotify($alipay_config);//计算得出通知验证结果
&&&&&&&&$verify_result&=&$alipayNotify-&verifyReturn();
&&&&&&&&if($verify_result)&{
&&&&&&&&&&&&//验证成功
&&&&&&&&&&&&//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
&&&&&&&&$out_trade_no&&&=&$_GET[&#039;out_trade_no&#039;];&&&&&&//商户订单号
&&&&&&&&$trade_no&&&&&&&=&$_GET[&#039;trade_no&#039;];&&&&&&&&&&//支付宝交易号
&&&&&&&&$trade_status&&&=&$_GET[&#039;trade_status&#039;];&&&&&&//交易状态
&&&&&&&&$total_fee&&&&&&=&$_GET[&#039;total_fee&#039;];&&&&&&&&&//交易金额
&&&&&&&&$notify_id&&&&&&=&$_GET[&#039;notify_id&#039;];&&&&&&&&&//通知校验ID。
&&&&&&&&$notify_time&&&&=&$_GET[&#039;notify_time&#039;];&&&&&&&//通知的发送时间。
&&&&&&&&$buyer_email&&&&=&$_GET[&#039;buyer_email&#039;];&&&&&&&//买家支付宝帐号;
&&&&&&&&&&&&
&&&&&&&&$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[&#039;trade_status&#039;]&==&&#039;TRADE_FINISHED&#039;&||&$_GET[&#039;trade_status&#039;]&==&&#039;TRADE_SUCCESS&#039;)&{
&&&&&&&&if(!checkorderstatus($out_trade_no)){
&&&&&&&&&&&&&orderhandle($parameter);&&//进行订单处理,并传送从支付宝返回的参数;
&&&&&&&&$this-&redirect(C(&#039;alipay.successpage&#039;));//跳转到配置项中配置的支付成功页面;
&&&&}else&{
&&&&&&&&echo&&trade_status=&.$_GET[&#039;trade_status&#039;];
&&&&&&&&$this-&redirect(C(&#039;alipay.errorpage&#039;));//跳转到配置项中配置的支付失败页面;
&&&&//验证失败
&&&&//如要调试,请看alipay_notify.php页面的verifyReturn函数
&&&&echo&&支付失败!&;
&&&&}这儿说下 有很多朋友Class &#039;Home\Controller\AlipaySubmit&#039; not found 发生过以下的错误
执行new方法实例化的时候就报错
Class &#039;Home\Controller\Alipay&#039; not found
其实这样的 需要在你的
$alipaySubmit = new
AlipaySubmit($alipay_config); 等等 new 后面加一个 /
3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中没有的自己创建 当然你也开业写到其他位置 &?&
//在线交易订单支付处理函数
&//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
&//返回值:如果订单已经成功支付,返回true,否则返回false;
&function&checkorderstatus($ordid){
&&&&$Ord=M(&#039;Orderlist&#039;);
&&&&$ordstatus=$Ord-&where(&#039;ordid=&#039;.$ordid)-&getField(&#039;ordstatus&#039;);
&&&&if($ordstatus==1){
&&&&&&&&return&
&&&&}else{
&&&&&&&&return&&&&&
&//处理订单函数
&//更新订单状态,写入订单支付后返回的数据
&function&orderhandle($parameter){
&&&&$ordid=$parameter[&#039;out_trade_no&#039;];
&&&&$data[&#039;payment_trade_no&#039;]&&&&&&=$parameter[&#039;trade_no&#039;];
&&&&$data[&#039;payment_trade_status&#039;]&&=$parameter[&#039;trade_status&#039;];
&&&&$data[&#039;payment_notify_id&#039;]&&&&&=$parameter[&#039;notify_id&#039;];
&&&&$data[&#039;payment_notify_time&#039;]&&&=$parameter[&#039;notify_time&#039;];
&&&&$data[&#039;payment_buyer_email&#039;]&&&=$parameter[&#039;buyer_email&#039;];
&&&&$data[&#039;ordstatus&#039;]&&&&&&&&&&&&&=1;
&&&&$Ord=M(&#039;Orderlist&#039;);
&&&&$Ord-&where(&#039;ordid=&#039;.$ordid)-&save($data);
&/*-----------------------------------
下面这个函数,其实不需要,大家可以把他删掉,
具体看我下面的修正补充部分的说明
------------------------------------*/
&//获取一个随机且唯一的订单号;
&function&getordcode(){
&&&&$Ord=M(&#039;Orderlist&#039;);
&&&&$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=&#039;&.$ordcode.&&#039;&)-&getField(&#039;ordcode&#039;);
&&&&if($oldcode){
&&&&&&&&getordcode();
&&&&}else{
&&&&&&&&return&$
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&&#039;0&#039;,
&&`ordprice`&float(10,2)&DEFAULT&&#039;0.00&#039;,
&&`ordfee`&float(10,2)&DEFAULT&&#039;0.00&#039;,
&&`ordstatus`&int(11)&DEFAULT&&#039;0&#039;,
&&`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&&#039;0&#039;,
&&`usetime`&int(11)&DEFAULT&NULL,
&&`checkuser`&int(11)&DEFAULT&NULL,
&&PRIMARY&KEY&(`id`)
)&通过表单 提交处理 搞定 ....后面的就不说了 然后 下载的地址如下
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

我要回帖

更多关于 支付宝花呗收款二维码 的文章

 

随机推荐