Notif
<?php
/**
* 支付宝通知接口
* @author YinKu.Alan
* @date 2016-03-06
*/
class NotifyAction extends CommonAction {
// 后台配的验证KEY
const PAY_PWD = '2015518';
// pay_order表type字段类型:0-购买
const PAY_ORDER_TYPE_BUY = 0;
// pay_order表type字段类型:1-充值
const PAY_ORDER_TYPE_RECHARGE = 1;
// pay_order表order_type充值订单类型: 0-支付宝
const PAY_ORDER_ALIPAY = 0;
// pay_order表order_type充值订单类型: 1-财付通
const PAY_ORDER_TENPAY = 1;
public function _initialize() {
parent::_initialize();
}
public function index() {
try {
// 交易号
$PayNo = trim(I('PayNO', null));
// 付款金额
$PayJe = trim(I('PayJe', null));
// 付款说明
$PayMore = trim(I('PayMore', null));
// 交易时间
$PayTime = trim(I('PayTime', null));
// 验证KEY
$valideKey = trim(I('get.key', null));
//if ($valideKey != self::PAY_PWD) {
// throw new Exception('验证KEY不一致');
//}
if (empty($PayNo)) {
throw new Exception('交易号为空!');
}
if (empty($PayJe)) {
throw new Exception('付款金额为空!');
}
$user = M('user')->find($PayMore);
if ( ! $user['id']) {
throw new Exception("根据付款说明{$PayMore}无法查询到用户数据!" );
}
$map = array('outer_order_no' => $PayNo);
$order = M('pay_order')->where($map)->find();
if (isset($order['id'])) {
throw new Exception("交易号{$PayNo}已经完成了充值,充值信息是:编号({$order['order_no']}), 用户ID({$order['user_id']}), 支付金额({$order['pay_money']})! ");
}
$orderData = array();
$orderData['user_id'] = $user['id'];
$orderData['user_type'] = $user['user_type'];
$orderData['order_no'] = $this->create_orderno('APay');
$orderData['outer_order_no'] = $PayNo;
$orderData['pay_money'] = $PayJe;
$orderData['type'] = self::PAY_ORDER_TYPE_RECHARGE;
$orderData['comm'] = $PayMore;
$orderData['status'] = 1;
$orderData['addtime'] = date('Y-m-d H:i:s');
$orderData['pay_title'] = 'alipay';
$orderData['order_type'] = self::PAY_ORDER_ALIPAY;
M()->startTrans();
$flag = M('pay_order')->add($orderData);
if (false === $flag) {
M()->rollback();
throw new Exception('保存数据到pay_order表失败!');
}
$userData = array();
$userData['id'] = $user['id'];
$userData['money'] = $user['money'] + $PayJe;
$flag = M('user')->save($userData);
if (false === $flag) {
M()->rollback();
throw new Exception('更新用户表失败!');
}
$logData = array();
$logData['user_id'] = $user['id'];
$logData['stage'] = 'recharge';
$logData['money'] = $PayJe;
$logData['remain_money'] = $user['money'];
$logData['comm'] = "(用户充值) 订单号 {$orderData['order_no']}";
$logData['addtime'] = date('Y-m-d H:i:s');
$logData['order_no'] = null;
$flag = M('account_log')->add($logData);
if (false === $flag) {
M()->rollback();
throw new Exception('保存数据到account_log表失败!');
}
M()->commit();
} catch (Exception $e) {
Log::write($e->getMessage());
var_dump($e->getMessage());
}
}
}
Notif的更多相关文章
- 开源 iOS 项目分类索引大全 - 待整理
开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...
- supervisor的安装与简单介绍
1,介绍 Supervisor是一个进程管理工具,官方的说法 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要 ...
- iOS学习笔记——键盘处理
在网上找到的资料比较零散,这部分学起来感觉也有点空虚,内容就只包括隐藏键盘和键盘高度两部分 隐藏键盘其实就在我学习iOS开发的第一个程序里面已经实践过了,不过当时还懵懵懂懂,现在就了解了是什么一回事, ...
- Cacti -- Advance Ping
一.搭建Cacti 1. 安装epel扩展源:yum install -y epel-release 2. 安装lamp环境:yum install -y httpd php php-mysql my ...
- snmp ubuntu/centos--
软件安装 切换到系统管理员帐户 安装snmp确认snmp代理已安装rpm -q net-snmp如果未安装,安装snmpyum install net-snmp 设置开机自动运行snmp/sbin/c ...
- Model--汇总
NSFileManager.NSURL.NSFileHandle.NSData.NSXMLParser.NSUserDefaults.NSKeyedArchiver.NSKeyedUnarchiver ...
- 史上最全的常用iOS的第三方框架
文章来源:http://blog.csdn.net/sky_2016/article/details/45502921 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片 ...
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- 【Html5】Html5新特性Notification实现桌面消息推送(2016-05-25)
序:最近工作使用WorkTile,发现使用Chrome浏览器的时候如果有任务下发给我则会在桌面右下角提示(当前浏览器为最小化模式).感觉这个东西蛮有意思的,感觉可以给用户更好的体验,于是乎就查询了一下 ...
随机推荐
- RobotFrameWork(四)变量运算与Evaluate
一.特殊变量运算: 执行结果: 二.Evaluate使用 函数释义:Evaluate是执行Python表达式,并返回执行结果 示例1: 执行结果: 示例2: 执行结果:
- MySQL 5.7 学习:新增配置参数
背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL ...
- .NET LINQ数据转换
使用 LINQ 进行数据转换 语言集成查询 (LINQ) 不仅可用于检索数据, 而且还是一个功能强大的数据转换工具. 通过使用 LINQ 查询,您可以将源序列用作输入,并采用多种方式修改它以 ...
- 由一段字符串中查找URL引出——正则表达式
需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况: &quo ...
- FileReader:读取本地图片文件并显示
最近忙得比狗还惨,导致长时间没能更新文章,真心对不住啊.抽空整理了下关于在页面上读取和显示本地图片的实例文章,本文通过实例讲解如何使用支持FileReader浏览器的用户将能够通过一个file inp ...
- 51nod1089(最长回文子串之manacher算法)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...
- Git版本控制管理学习笔记1-介绍
几乎所有的版本控制工具都是出于同样的目的:开发以及维护开发出来的代码,方便读取代码的历史,记录所有的修改.这里,介绍的是当前在开源社区内非常流行的版本控制工具Git.它是由Linus Torvalds ...
- JVM相关
内存栅栏 1 what 说白了是一些cpu或编译器的一些同步指令 2 why cpu的cache快,而不去内存中取数据,在多线程并发中会读到cache的数据. 3 how 一般直接用关键字viloti ...
- [Repost]Events and Signals in PyQt4
Reference:http://zetcode.com/gui/pyqt4/eventsandsignals/ Events and Signals in PyQt4 In this part of ...
- python中获取指定目录下所有文件名列表的程序
http://blog.csdn.net/rumswell/article/details/9818001 # -*- coding: utf-8 -*-#~ #------------------- ...