Esempio n. 1
0
 /**
  * @return string
  */
 public static function handle()
 {
     $api = self::getApi();
     $url = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     //验证token
     if (!$api->checkSignature()) {
         Log::error('signature error. url:' . $url);
         return 'signature error';
     }
     //公众号接入(微信平台修改服务器配置)
     if (isset($_GET['echostr'])) {
         Log::debug('echostr. url:' . $url);
         self::getDispatcher()->dispatch('echostr', new WechatEvent($api));
         return $_GET['echostr'];
     }
     $message = $api->getMessage();
     //事件名称与Message类中的常量对应
     $eventName = $message->MsgType;
     if ($message->MsgType === 'event') {
         $eventName = $eventName . '.' . $message->Event;
     }
     //派发事件
     Log::debug('dispatch event:' . $eventName);
     $event = self::getDispatcher()->dispatch($eventName, new WechatEvent($api));
     $reply = $event->getResponse();
     return (string) $api->buildReply($reply);
 }
Esempio n. 2
0
 /**
  * 获取微信支付异步通知。(支付金额单位已转为元)
  * 成功返回通知信息数组,失败返回null
  *
  * @return array
  * [
  *      $mch_id          //微信支付分配的商户号
  *      $appid           //微信分配的公众账号ID
  *      $openid          //用户在商户appid下的唯一标识
  *      $transaction_id  //微信支付订单号
  *      $out_trade_no    //商户订单号
  *      $total_fee       //订单总金额单位默认为分,已转为元
  *      $is_subscribe    //用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效
  *      $attach          //商家数据包,原样返回
  *      $time_end        //支付完成时间
  * ]
  */
 public static function notify()
 {
     $config = self::getConfig();
     $postStr = file_get_contents('php://input');
     /*
     $postStr = '<xml>
     <appid><![CDATA[wx00e5904efec77699]]></appid>
     <attach><![CDATA[支付测试]]></attach>
     <bank_type><![CDATA[CMB_CREDIT]]></bank_type>
     <cash_fee><![CDATA[1]]></cash_fee>
     <fee_type><![CDATA[CNY]]></fee_type>
     <is_subscribe><![CDATA[Y]]></is_subscribe>
     <mch_id><![CDATA[1220647301]]></mch_id>
     <nonce_str><![CDATA[a0tZ41phiHm8zfmO]]></nonce_str>
     <openid><![CDATA[oU3OCt5O46PumN7IE87WcoYZY9r0]]></openid>
     <out_trade_no><![CDATA[550bf2990c51f]]></out_trade_no>
     <result_code><![CDATA[SUCCESS]]></result_code>
     <return_code><![CDATA[SUCCESS]]></return_code>
     <sign><![CDATA[F6F519B4DD8DB978040F8C866C1E6250]]></sign>
     <time_end><![CDATA[20150320181606]]></time_end>
     <total_fee>1</total_fee>
     <trade_type><![CDATA[JSAPI]]></trade_type>
     <transaction_id><![CDATA[1008840847201503200034663980]]></transaction_id>
     </xml>';
     */
     $postObj = @simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
     if ($postObj === false) {
         Log::error('parse xml error: ' . $postStr);
         return;
     }
     if ($postObj->return_code != 'SUCCESS') {
         Log::error($postObj->return_msg);
         return;
     }
     if ($postObj->result_code != 'SUCCESS') {
         Log::error($postObj->result_code);
         return;
     }
     $arr = (array) $postObj;
     unset($arr['sign']);
     if (self::getSign($arr, $config['key']) === "{$postObj->sign}") {
         // $mch_id = $postObj->mch_id;  //微信支付分配的商户号
         // $appid = $postObj->appid; //微信分配的公众账号ID
         // $openid = $postObj->openid; //用户在商户appid下的唯一标识
         // $transaction_id = $postObj->transaction_id;//微信支付订单号
         // $out_trade_no = $postObj->out_trade_no;//商户订单号
         // $total_fee = $postObj->total_fee; //订单总金额,单位为分
         // $is_subscribe = $postObj->is_subscribe; //用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效
         // $attach = $postObj->attach;//商家数据包,原样返回
         // $time_end = $postObj->time_end;//支付完成时间
         echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
         //金额单位转为元
         $postObj->total_fee = self::calc($postObj->total_fee, 100, '/', 2);
         return $postObj;
     } else {
         Log::error('sign error');
     }
 }