소스 검색

add wxnotify interface

stanley-king 9 년 전
부모
커밋
dd4d615e20
5개의 변경된 파일273개의 추가작업 그리고 51개의 파일을 삭제
  1. 15 2
      fcgi_run.php
  2. 60 46
      mobile/control/app_pay.php
  3. 125 0
      mobile/control/log.php
  4. 4 3
      mobile/util/errcode.php
  5. 69 0
      mobile/wxnotify.php

+ 15 - 2
fcgi_run.php

@@ -4,6 +4,14 @@ define('BASE_ROOT_PATH',str_replace('\\','/',dirname(__FILE__)));
 
 require_once (BASE_ROOT_PATH . '/fooder.php');
 
+function pays_execute($file)
+{
+    static $exfiles = array('wxnotify.php');
+    $name = basename($file);
+
+    return in_array($name,$exfiles);
+}
+
 function run_fcgi()
 {
     require_once(BASE_ROOT_PATH.'/mobile/index.php');
@@ -20,8 +28,13 @@ function run_fcgi()
         {
             init_request();
             $file = request_helper::script_file();
-            if(file_exists($file)) {
-                Base::mobile_control();
+            if(file_exists($file))
+            {
+                if(pays_execute($file)) {
+                    require $file;
+                } else {
+                    Base::mobile_control();
+                }
             }
         } catch (Exception $ex) {
             joutput_error($ex->getCode(),$ex->getMessage().'@@@@@'.$ex->getTraceAsString());

+ 60 - 46
mobile/control/app_pay.php

@@ -14,43 +14,43 @@ require_once (WXPAY_PATH . '/lib/WxPay.Data.php');
 require_once (WXPAY_PATH . '/lib/WxPay.Exception.php');
 require_once (WXPAY_PATH . '/lib/WxPay.Notify.php');
 
+
 class app_payControl extends mobileHomeControl
 {
+    static $pay_types = array('wxpay','alipay');
+    const wx_notifyurl = 'http://t.lrlz.com/mobile/control/wxnotify.php';
 
     public function uniorderOp()
     {
-//        $desc = $_POST['desc'];
-//        $attach = $_POST['attatch'];
-        $total_fee = 1;//intval($_POST['fee']) * 100;
+        $pay_sn = $_GET['paysn'];
+        $payment = $_GET['payment'];
+        if(in_array($payment,self::pay_types) == false) {
+            return joutput_error(errcode::ErrPayment,'err paytype : wxpay,alipay');
+        }
 
-        $input = new WxPayUnifiedOrder();
-        $input->SetBody("test"); //商品或支付单简要描述
-        $input->SetAttach("test"); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
-        $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
-        $input->SetTotal_fee("1");//订单总金额,单位为分,详见支付金额
-        $input->SetTime_start(date("YmdHis")); //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
-        $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
-        $input->SetGoods_tag("test");
-        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
-        $input->SetTrade_type("APP");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里,MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口
-        $order = WxPayApi::unifiedOrder($input);
+        $logic_payment = Logic('payment');
+        //重新计算所需支付金额
+        $result = $logic_payment->getRealOrderInfo($pay_sn, $this->member_info['member_id']);
 
-        //$ret = $this->handle_order($order);
+        if(!$result['state']) {
+            return joutput_error(errcode::ErrPayment,$result['msg']);
+        }
 
-        $ret = array();
-        $ret['appid'] = $order["appid"];
-        $ret['noncestr'] = WxPayApi::getNonceStr();
-        $ret['package'] = 'Sign=WXPay';
-        $ret['partnerid'] = WxPayConfig::MCHID;
-        $ret['prepayid'] = $order['prepay_id'];
-        $timeStamp = time();
-        $ret['timestamp'] = "$timeStamp";
+        $ret = $this->api_pay($result['data'], $payment);
+        joutput_data($ret);
+    }
 
-        $sign = $this->make_sign($ret);
-        $ret['sign'] = $sign;
+    private function api_pay($pay_info,$payment)
+    {
+        $subject = $pay_info['subject'];
+        $pay_sn = $pay_info['pay_sn'];
+        $fee = $pay_info['pay_amount'];
 
+        if($payment == 'wxpay') {
+            return $this->uniorder($subject,$pay_sn,1);
+        } else {
 
-        joutput_data($ret);
+        }
     }
 
     /**
@@ -84,27 +84,41 @@ class app_payControl extends mobileHomeControl
         return $result;
     }
 
-//    private function handle_order($order)
-//    {
-//        $jsapi = new WxPayJsApiPay();
-//        $jsapi->SetAppid($order["appid"]);
-//        $timeStamp = time();
-//        $jsapi->SetTimeStamp("$timeStamp");
-//        $jsapi->SetNonceStr(WxPayApi::getNonceStr());
-//        $jsapi->SetPackage('Sign=WXPay');
-//        //$jsapi->SetPackage("prepay_id=" . $order['prepay_id']);
-//        //$jsapi->SetSignType("MD5");
-//        $jsapi->SetPaySign($jsapi->MakeSign());
-//        //$sign = $jsapi->MakeSign();
-//        $jsapi->SetSign();
-//
-//        $jsapi->SetPaySign($jsapi->MakeSign());
-//
-//        return $jsapi->GetValues();
-//    }
-
-    public function notifyOp()
+    public function wxnotifyOp()
     {
 
+
+    }
+
+    /**
+     * @return array
+     * @throws WxPayException
+     */
+    private function uniorder($body,$paysn,$fee)
+    {
+        $input = new WxPayUnifiedOrder();
+        $input->SetBody($body); //商品或支付单简要描述
+        $input->SetAttach($paysn); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
+        $input->SetOut_trade_no(WxPayConfig::MCHID . date("YmdHis"));//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
+
+        $input->SetTotal_fee("$fee");//订单总金额,单位为分,详见支付金额
+        $input->SetTime_start(date("YmdHis")); //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
+        $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
+        $input->SetNotify_url(self::wx_notifyurl);
+        $input->SetTrade_type("APP");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里,MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口
+        $order = WxPayApi::unifiedOrder($input);
+
+        $ret = array();
+        $ret['appid'] = $order["appid"];
+        $ret['noncestr'] = WxPayApi::getNonceStr();
+        $ret['package'] = 'Sign=WXPay';
+        $ret['partnerid'] = WxPayConfig::MCHID;
+        $ret['prepayid'] = $order['prepay_id'];
+        $timeStamp = time();
+        $ret['timestamp'] = "$timeStamp";
+
+        $sign = $this->make_sign($ret);
+        $ret['sign'] = $sign;
+        return $ret;
     }
 }

+ 125 - 0
mobile/control/log.php

@@ -0,0 +1,125 @@
+<?php
+//以下为日志
+
+interface ILogHandler
+{
+	public function write($msg);
+	
+}
+
+class CLogFileHandler implements ILogHandler
+{
+	private $handle = null;
+	
+	public function __construct($file = '')
+	{
+		$this->handle = fopen($file,'a');
+	}
+	
+	public function write($msg)
+	{
+		fwrite($this->handle, $msg, 4096);
+	}
+	
+	public function __destruct()
+	{
+		fclose($this->handle);
+	}
+}
+
+class wxLog
+{
+	private $handler = null;
+	private $level = 15;
+
+	private static $instance = null;
+
+	private function __construct(){}
+
+	private function __clone(){}
+
+	public static function Init($handler = null,$level = 15)
+	{
+		if(!self::$instance instanceof self)
+		{
+			self::$instance = new self();
+			self::$instance->__setHandle($handler);
+			self::$instance->__setLevel($level);
+		}
+		return self::$instance;
+	}
+
+
+	private function __setHandle($handler){
+		$this->handler = $handler;
+	}
+
+	private function __setLevel($level)
+	{
+		$this->level = $level;
+	}
+
+	public static function DEBUG($msg)
+	{
+		self::$instance->write(1, $msg);
+	}
+
+	public static function WARN($msg)
+	{
+		self::$instance->write(4, $msg);
+	}
+
+	public static function ERROR($msg)
+	{
+		$debugInfo = debug_backtrace();
+		$stack = "[";
+		foreach($debugInfo as $key => $val){
+			if(array_key_exists("file", $val)){
+				$stack .= ",file:" . $val["file"];
+			}
+			if(array_key_exists("line", $val)){
+				$stack .= ",line:" . $val["line"];
+			}
+			if(array_key_exists("function", $val)){
+				$stack .= ",function:" . $val["function"];
+			}
+		}
+		$stack .= "]";
+		self::$instance->write(8, $stack . $msg);
+	}
+
+	public static function INFO($msg)
+	{
+		self::$instance->write(2, $msg);
+	}
+
+	private function getLevelStr($level)
+	{
+		switch ($level)
+		{
+		case 1:
+			return 'debug';
+		break;
+		case 2:
+			return 'info';
+		break;
+		case 4:
+			return 'warn';
+		break;
+		case 8:
+			return 'error';
+		break;
+		default:
+
+		}
+	}
+
+	protected function write($level,$msg)
+	{
+		if(($level & $this->level) == $level )
+		{
+			$msg = '['.date('Y-m-d H:i:s').']['.$this->getLevelStr($level).'] '.$msg."\n";
+			$this->handler->write($msg);
+		}
+	}
+}

+ 4 - 3
mobile/util/errcode.php

@@ -20,10 +20,12 @@ class errcode extends SplEnum
     const ErrCart  = 10200;
     const ErrOrder  = 10300;
     const ErrAddress  = 10400;
-    const ErrInvoice  = 10400;
+    const ErrInvoice  = 10500;
+    const ErrPayment = 10600;
 
     const ErrDB      = 11000;
     const ErrSms 	 = 12000;
+
     static function msg($code) 
     {
         switch ($code) {
@@ -37,10 +39,9 @@ class errcode extends SplEnum
             case errcode::ErrSmscode: return 'ErrSmscode';
             case errcode::ErrIDbinded: return 'ErrIDbinded id has been binded.';
             case errcode::ErrSpecial: return 'ErrSpecial.';
-
+            case errcode::ErrPayment: return 'ErrPayment.';
 
             case errcode::ErrDB : return 'ErrorDB';
-
             case errcode::ErrSms : return 'ErrSms,Send sms error.';
             default : return 'Unknown Error.';
         }      

+ 69 - 0
mobile/wxnotify.php

@@ -0,0 +1,69 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 15/12/10
+ * Time: 下午6:01
+ */
+
+ini_set('date.timezone','Asia/Shanghai');
+error_reporting(E_ERROR);
+
+define(WXPAY_PATH,BASE_DATA_PATH.'/api/wxpay');
+require_once (WXPAY_PATH . '/lib/WxPay.Api.php');
+require_once (WXPAY_PATH . '/lib/WxPay.Config.php');
+require_once (WXPAY_PATH . '/lib/WxPay.Data.php');
+require_once (WXPAY_PATH . '/lib/WxPay.Exception.php');
+require_once (WXPAY_PATH . '/lib/WxPay.Notify.php');
+require_once (BASE_MOBILE_PATH . '/control/log.php');
+
+//初始化日志
+$logHandler= new CLogFileHandler(BASE_ROOT_PATH . "/logs/wx-".date('Y-m-d').'.log');
+$log = wxLog::Init($logHandler, 15);
+
+class PayNotifyCallBack extends WxPayNotify
+{
+    //查询订单
+    public function Queryorder($transaction_id)
+    {
+        $input = new WxPayOrderQuery();
+        $input->SetTransaction_id($transaction_id);
+        $result = WxPayApi::orderQuery($input);
+        wxLog::DEBUG("query:" . json_encode($result));
+        if(array_key_exists("return_code", $result)
+            && array_key_exists("result_code", $result)
+            && $result["return_code"] == "SUCCESS"
+            && $result["result_code"] == "SUCCESS")
+        {
+            return true;
+        }
+        return false;
+    }
+
+    //重写回调处理函数
+    public function NotifyProcess($data, &$msg)
+    {
+        wxLog::DEBUG("call back:" . json_encode($data));
+        $notfiyOutput = array();
+
+        if(!array_key_exists("transaction_id", $data)){
+            $msg = "输入参数不正确";
+            return false;
+        }
+        //查询订单,判断订单真实性
+        if(!$this->Queryorder($data["transaction_id"])){
+            $msg = "订单查询失败";
+            return false;
+        }
+        return true;
+    }
+}
+
+//wxLog::DEBUG("begin notify");
+//$notify = new PayNotifyCallBack();
+//$notify->Handle(false);
+
+foreach($_POST as $key => $val)
+{
+    wxLog::DEBUG($key."=".$val."\r\n");
+}