tp框架集成支付宝,中转页变成gbk编码
tp框架中集成支付宝的功能,将支付宝的demo例子存在到下图位置\Extend\Vendor\Alipay
生成支付订单
/**
* 支付订单
*/
public function pay() {
header("Content-Type:text/html; charset=utf-8");
$id = I('post.oid','', 'htmlspecialchars');
$DAO = M('order');
$order = $DAO->where("id=".$id)->find();
$error = "";
if(!isset($order)){
$error = "订单不存在";
}else if($order['PaymentStatus'] == 1){
$error = "此订单已经完成,无需再次支付!";
} else if($order['PaymentStatus'] == 2){
$error = "此订单已经取消,无法支付,请重新下单!";
}
if($error != ""){
$this->_FAIL("系统错误",$error,$this->getErrorLinks());
return ;
}
$payType = I('post.payType','', 'htmlspecialchars');
#支付宝
if($payType == 'alipay'){
$this->payWithAlipay($order);
}
}
支付订单提交
/**
* 以支付宝形式支付
* @param unknown_type $order
*/
private function payWithAlipay($order){ //引入支付宝相关的文件
require_once(VENDOR_PATH."Alipay/alipay.config.php");
require_once(VENDOR_PATH."Alipay/lib/alipay_submit.class.php"); //支付类型
$payment_type = "1";
//必填,不能修改
//服务器异步通知页面路径
$notify_url = C("HOST")."index.php/Alipay/notifyOnAlipay";
//页面跳转同步通知页面路径
$return_url = C("HOST")."index.php/Pay/ok";
//卖家支付宝帐户
$seller_email = $alipay_config['seller_email'];
//必填
//商户订单号, 从订单对象中获取
$out_trade_no = $order['OrderNum'];
//商户网站订单系统中唯一订单号,必填
//订单名称 $subject = "物流服务";
//必填
//付款金额
#正常金额
$price = $order['Price'];
#测试金额
#$price = 0.1; //必填
$body = $subject;
//商品展示地址
$show_url = C('HOST'); //构造要请求的参数数组,无需改动
$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" => $price,
"body" => $body,
"show_url" => $show_url,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
Log::write('支付宝订单参数:'.var_export($parameter,true),Log::DEBUG);
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "去支付");
echo $html_text;
}
支付宝回调接口
<?php
/**
* 支付宝回调接口
*/
class AlipayAction extends Action { /**
* 支付宝异步通知
*/
public function notifyOnAlipay(){
Log::write("notify: ".print_r($_REQUEST, true),Log::DEBUG);
require_once(VENDOR_PATH."Alipay/alipay.config.php");
require_once(VENDOR_PATH."Alipay/lib/alipay_notify.class.php");
$orderLogDao = M('orderlog');
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
Log::write('verify_result:'.var_export($verify_result,true),Log::DEBUG);
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//根据订单号获取订单
$DAO = M('order');
$order = $DAO->where("OrderNum='".$out_trade_no."'")->find();
//如果订单不存在,设置为0
if(!isset($order)){
$orderId = 0;
}
else{
$orderId = $order['id'];
}
//交易状态
$trade_status = $_POST['trade_status'];
$log = "notify from Alipay, trade_status=".$trade_status." alipay sign=".$_POST['sign'].' price ='.$_POST['total_fee'] ;
$orderLog['o_id'] = $orderId;
if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {
#修改订单状态
if ((float)$order['Price'] != (float)$_POST['total_fee']) {
$data['PaymentStatus'] = '2';
} else {
$data['PaymentStatus'] = '1';
}
$DAO ->where('id='.$orderId)->save($data);
}
$orderLog['pay_id'] = $trade_no;
$orderLog['pay_log'] = $log;
$orderLog['pay_type'] = 'alipay';
$orderLog['pay_result'] = 'success'; $orderLogDao->add($orderLog);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
echo "success"; //返回成功标记给支付宝
}
else {
//验证不通过时,也记录下来
$orderLog['pay_log'] = "notify from Alipay, 但是验证不通过,sign=".$_POST['sign'];
$orderLog['o_id'] = -1;
$orderLog['pay_type'] = 'alipay';
$orderLog['pay_result'] = 'fail';
$orderLogDao->add($orderLog); //验证失败
echo "fail";
}
}
}
?>
今天在tp框架中集成支付宝功能,跳转支付宝的时候出现乱码错误。
需要设定header("Content-Type:text/html; charset=utf-8");
如果还有乱码查看日志信息 是否出现
NOTIC: [2] Cannot modify header information - headers already sent by (output started at
上面错误,删除错误文件开始的空格
tp框架集成支付宝,中转页变成gbk编码的更多相关文章
- ***CodeIgniter框架集成支付宝即时到账支付SDK
本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...
- *CodeIgniter框架集成支付宝即时到账SDK
客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...
- tp框架下,数据库和编辑器都是utf-8, 输出中文却还是乱码
输出: array(2) { [0]=> array(4) { ["id"]=> string(1) "1" ["user"]= ...
- GBK 编码
GBK编码范围:8140-FEFE,汉字编码范围见第二节:码位分配及顺序. GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准.GBK编码依然采用双字节编码方案,其编码范围:8 ...
- gbk编码
GBK 编码 GBK编码范围:8140-FEFE,汉字编码范围见第二节:码位分配及顺序. GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准.GBK编码依然采用双字节编码方 ...
- tp集成支付宝担保支付
现在的网站功能越来越全乎了,很多网站都需要做支付功能,而且很多大平台都提供了各式各样的api来扩充自己的用户和开发者.话说,这种使用大平台的api来做支付,无论是从成本上还是从开发效率上都是很好的选择 ...
- Android App集成支付宝
原地址:http://blog.csdn.net/wenbingoon/article/details/7933078 手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统 ...
- tp框架之分页与第三方类的应用
1.先把分页类放在根目录下,比如放在某个模块下 2.在类里面写入命名空间,注意类名的格式(类名要与里面的方法名一致) 3.在需要的方法里面按照路径进行实例化,然后就可以使用了 方法: public f ...
- TP框架实现分页
TP框架自带分页的实现方法,所以使用这个分页方案,不用再重新造轮子 1,先看效果图 2,源码 /** * TODO 基础分页的相同代码封装,使前台的代码更少 * @param $m 模型,引用传递 * ...
随机推荐
- [SQL]当输入表达式得数为一个有效的整数、浮点数、money 或 decimal 类型,那么 ISNUMERIC 返回 1;否则返回 0
ISNUMERIC ( expression ) 当输入表达式得数为一个有效的整数.浮点数.money 或 :否则返回 .返回值为 确保可以将 expression 转换为上述数字类型中的一种. 注意 ...
- [Android疑难杂症]动态改变Background后Padding无效的问题
前言 在Layout中指定好background和padding以后,程序里面动态修改background之后padding就失效了,貌似是一个BUG,这里找到了一篇英文文章,简单翻译分享一下. 声明 ...
- Chapter Configuration
Chapter Configuration 在Web.config 或App.config的configuration节,插入如下配置: <configuration> …… <co ...
- U-boot 之TFTP服务器配置
一.PC端配置1.关闭防火墙 [root@gliethttp root]# /etc/init.d/iptables stop2.使用setup启动tftp [root@gliethttp roo ...
- 关闭linux下的使用的端口
lsof -P -n -i kill pid 另外防火墙 iptables之类的也可以关闭端口
- [转]MFC中UpdateData()函数的使用
当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用 UpdateData(FALSE):如果你希望知道用户在对话框中到底 ...
- 如何安装iso镜像文件
1.使用压缩软件打开iso文件 2.点击setdup.exe文件,双击打开 3.解压缩后等待安装
- OC对象中的getter方法中不能用self.
@interface boy:NSObject { int _age; } - (void)setAge:(int)age; - (int)age; @end @implementation boy ...
- GitHub指南
1.创建新仓库 #创建新文件夹,打开,然后执行 git init #以创建新的 git 仓库. 2.检出仓库 #执行如下命令以创建一个本地仓库的克隆版本: git clone /path/to/rep ...
- Stay Hungry
保持饥饿,从身体上来说,可以随时保持机动状态,所以,今天的早饭.午饭.晚饭,我都没有吃到饱.等到想要放松的时候,就饱餐一顿,未必不是一种幸福!精神上,保持饥饿,我还不清楚是一种什么样的状态,自然也描述 ...