<?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. soundtouch变速wsola算法之改进

    soundtouch变速算法很类似sola算法,细看才知道是wsola算法. 上个星期有个需求,将该变速应用到直播的包处理,有点类似于webrtc的netEQ处理机制. 直接使用soundtouch, ...

  2. C# FromBase64String 解码换行问题

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如 ...

  3. ffmpeg-20160901-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  4. poj 3280 Cheapest Palindrome

    链接:http://poj.org/problem?id=3280 思路:题目给出n种m个字符,每个字符都有对应的添加和删除的代价,求出构成最小回文串的代价 dp[i][j]代表区间i到区间j成为回文 ...

  5. em换算px,rem换算px

    <body> <style type="text/css" rel="stylesheet"> html,body{ font-size ...

  6. ENode 1.0 - Saga的思想与实现

    开源地址:https://github.com/tangxuehua/enode 因为enode框架的思想是,一次修改只能新建或修改一个聚合根:那么,如果一个用户请求要涉及多个聚合根的新建或修改该怎么 ...

  7. MVC Controller Dependency Injection for Beginners【翻译】

    在codeproject看到一篇文章,群里的一个朋友要帮忙我翻译一下顺便贴出来,这篇文章适合新手,也算是对MEF的一个简单用法的介绍. Introduction In a simple stateme ...

  8. div滚动底部加载li,window滚动底部加载li

    DIV固定高度滚动条滚动最底部,加载新的li <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  9. haohantech浩瀚盘点机“PDA无线订货开单”终端 移动现场下单APP(打印扫描一体)

    手持PDA盘点机,订货的时候,用PDA上自带的激光扫描头扫描(或手输)样品的条码,然后,只需输入该款产品不同尺码的数量即可自动(或手动)发送订货数据到总部服务器.盘点机“PDA无线订货”终端功能: 1 ...

  10. Java 根据两个经纬度坐标计算距离

    public class Distance{ private static final double EARTH_RADIUS = 6378137;    private static double  ...