<?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的更多相关文章

  1. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  2. supervisor的安装与简单介绍

    1,介绍 Supervisor是一个进程管理工具,官方的说法 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要 ...

  3. iOS学习笔记——键盘处理

    在网上找到的资料比较零散,这部分学起来感觉也有点空虚,内容就只包括隐藏键盘和键盘高度两部分 隐藏键盘其实就在我学习iOS开发的第一个程序里面已经实践过了,不过当时还懵懵懂懂,现在就了解了是什么一回事, ...

  4. Cacti -- Advance Ping

    一.搭建Cacti 1. 安装epel扩展源:yum install -y epel-release 2. 安装lamp环境:yum install -y httpd php php-mysql my ...

  5. snmp ubuntu/centos--

    软件安装 切换到系统管理员帐户 安装snmp确认snmp代理已安装rpm -q net-snmp如果未安装,安装snmpyum install net-snmp 设置开机自动运行snmp/sbin/c ...

  6. Model--汇总

    NSFileManager.NSURL.NSFileHandle.NSData.NSXMLParser.NSUserDefaults.NSKeyedArchiver.NSKeyedUnarchiver ...

  7. 史上最全的常用iOS的第三方框架

    文章来源:http://blog.csdn.net/sky_2016/article/details/45502921 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片 ...

  8. Java总结篇系列:java.lang.Object

    从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...

  9. 【Html5】Html5新特性Notification实现桌面消息推送(2016-05-25)

    序:最近工作使用WorkTile,发现使用Chrome浏览器的时候如果有任务下发给我则会在桌面右下角提示(当前浏览器为最小化模式).感觉这个东西蛮有意思的,感觉可以给用户更好的体验,于是乎就查询了一下 ...

随机推荐

  1. 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

    原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者,你一定会对网络应用如何工作有 ...

  2. iOS应用文件夹

    IOS5多了一个比较重要的功能iCloud,但是同时也出现一个问题,很多的APP都把很大量的数据存在APP底下的Documents(/Documents )文件夹里面,这样苹果会reject掉你的AP ...

  3. tp5 中 model 的聚合查询

    方法 说明 Count 统计数量,参数是要统计的字段名(可选) Max 获取最大值,参数是要统计的字段名(必须) Min 获取最小值,参数是要统计的字段名(必须) Avg 获取平均值,参数是要统计的字 ...

  4. October 22nd Week 43rd Saturday, 2016

    Beware the barrenness of a busy life. 当心忙碌的生活荒芜了人生. Recently I was busy in debugging an equipment, I ...

  5. Ajax请求安全性讨论

    今天我们来讨论一下ajax请求的安全性,我相信各位在系统开发过程中肯定会绞尽脑汁的想怎样可以尽量少的防止伪造ajax请求进行攻击,尤其是开发跟用户交互比较多的互联网系统.那么就请大家来分享讨论一下你在 ...

  6. Requests库练习

    预备知识 字符串方法 用途 string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 ...

  7. cve-2015-5199漏洞分析

    继续之前hackteam的flash漏洞,这次的对象为cve-2015-5199,遂做一下记录. 首先,在该exp中TryExpl函数为漏洞的触发函数,该函数也为本次调试的主要对象,函数的开始首先创建 ...

  8. js查找水仙花数

    所谓水仙花数是满足类似于153=1³+5³+3³: 第一种方式:把这个数当做字符串来实现 <script> for(var i=100;i<=999;i++) { str_i=i.t ...

  9. 10月wish me luck

    10/13 明天开始的三天 就要跟历史地理化学说拜拜了 以诚待之 好运 10/20 P三角形计数:一看就是叉积.因为去年迪子讲过.但是我已经忘记了.所以重新写了一遍.把所有的点有序化,将三角形面积转化 ...

  10. tibble包:高效显示表格数据的结构

    1 tibble包简介 包名: tibble 编码: UTF- 最新版本: 1.2 标题: 简单数据框 描述: 构建一个 'tbl_df' 类,可以比传统的R数据框提供更好的检查和打印功能. 作者: ...