Example #1
0
 public function returnResult($rst)
 {
     $api_response_xml = $rst;
     $rst = Helpers::xmlToArray($rst);
     if (!empty($rst['return_code'])) {
         if ($rst['return_code'] == 'FAIL') {
             throw new \Exception($rst['return_msg']);
         } else {
             if ($rst['result_code'] == 'FAIL') {
                 throw new \Exception($rst['err_code'] . ":" . $rst['err_code_des']);
             } else {
                 $rst['api_response_xml'] = $api_response_xml;
                 return $rst;
             }
         }
     } else {
         throw new \Exception("网络请求失败");
     }
 }
Example #2
0
 /**
  * 获取信息接收信息
  *
  * @return array
  */
 public function recieve()
 {
     $postStr = file_get_contents('php://input');
     $datas = (array) simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
     $datas = Helpers::object2array($datas);
     if (isset($datas['Event']) && $datas['Event'] === 'LOCATION') {
         $Latitude = isset($datas['Latitude']) ? floatval($datas['Latitude']) : 0;
         $Longitude = isset($datas['Longitude']) ? floatval($datas['Longitude']) : 0;
         $datas['coordinate'] = array($Latitude, $Longitude);
     }
     if (isset($datas['MsgType']) && $datas['MsgType'] === 'location') {
         $Location_X = isset($datas['Location_X']) ? floatval($datas['Location_X']) : 0;
         $Location_Y = isset($datas['Location_Y']) ? floatval($datas['Location_Y']) : 0;
         $datas['coordinate'] = array($Location_X, $Location_Y);
     }
     return $datas;
 }
Example #3
0
 public function unbind($params)
 {
     $params = ["mch_id" => $this->getMchid(), "appid" => $this->getAppId(), "plan_id" => $params['plan_id'], "contract_code" => $params['contract_code'], "contract_id" => $params['contract_id'], "contract_termination_remark" => $params['contract_termination_remark'], "version" => self::version];
     $sign = $this->getSign($para);
     $para['sign'] = $sign;
     $xml = Helpers::arrayToXml($para);
     $rst = $this->post(self::pay_base_url, $xml);
     return $rst;
 }
Example #4
0
 /**
  * 下载多媒体文件
  * 公众号可调用本接口来获取多媒体文件。请注意,调用该接口需http协议。
  */
 public function get($media_id)
 {
     // 接口调用请求说明
     // http请求方式: GET
     // http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
     // 请求示例(示例为通过curl命令获取多媒体文件)
     // curl -I -G "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
     // 参数说明
     // 参数 是否必须 说明
     // access_token 是 调用接口凭证
     // media_id 是 媒体文件ID
     $access_token = $this->weixin->getToken();
     $params = array();
     $params['access_token'] = $access_token;
     $params['media_id'] = $media_id;
     $url = $this->_url . 'get';
     // 获取oAuthRequest对象
     $weixinOAuthRequest = new WeixinOAuthRequest();
     $weixinOAuthRequest->decode_json = false;
     $content = $weixinOAuthRequest->get($url, $params);
     if (Helpers::isJson($content)) {
         $rst = json_decode($content, true);
     } else {
         $rst = array();
         $rst['content'] = base64_encode($content);
     }
     // 返回说明
     if (!empty($rst['errcode'])) {
         // 错误情况下的返回JSON数据包示例如下(示例为无效媒体ID错误)::
         // {"errcode":40007,"errmsg":"invalid media_id"}
         throw new WeixinException($rst['errmsg'], $rst['errcode']);
     } else {
         // 正确情况下的返回HTTP头如下:
         // HTTP/1.1 200 OK
         // Connection: close
         // Content-Type: image/jpeg
         // Content-disposition: attachment; filename="MEDIA_ID.jpg"
         // Date: Sun, 06 Jan 2013 10:20:18 GMT
         // Cache-Control: no-cache, must-revalidate
         // Content-Length: 339721
         // curl -G "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
         return $rst;
     }
 }
Example #5
0
 private function returnResult($rst)
 {
     $rst = Helpers::xmlToArray($rst);
     if (!empty($rst['return_code'])) {
         if ($rst['return_code'] == 'FAIL') {
             throw new \Exception($rst['return_msg']);
         } else {
             if ($rst['result_code'] == 'FAIL') {
                 throw new \Exception($rst['err_code'] . ":" . $rst['err_code_des']);
             } else {
                 return $rst;
             }
         }
     } else {
         throw new \Exception("网络请求失败");
     }
 }
Example #6
0
 /**
  * 签名算法
  *
  * 签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
  *
  *
  * 即signature=sha1(string1)。 示例:
  *
  * noncestr=Wm3WZYTPz0wzccnW
  * jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
  * timestamp=1414587457
  * url=http://mp.weixin.qq.com
  *
  * 步骤1. 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:
  *
  * jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com
  *
  * 步骤2. 对string1进行sha1签名,得到signature:
  *
  * f4d90daf4b3bca3078ab155816175ba34c443a7b
  * 注意事项
  *
  * 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
  * 签名用的url必须是调用JS接口页面的完整URL。
  * 出于安全考虑,开发者必须在服务器端实现签名的逻辑。
  *
  * @return array
  */
 public function getSignPackage($url, $jsapiTicket = "")
 {
     if (empty($jsapiTicket)) {
         // 重新生成
         $ret = $this->getJsApiTicket();
         $jsapiTicket = $ret['ticket'];
     }
     // $url = "{$http}://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
     $timestamp = time();
     $nonceStr = Helpers::createNonceStr();
     // 这里参数的顺序要按照 key 值 ASCII 码升序排序
     $string = "jsapi_ticket={$jsapiTicket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
     $signature = sha1($string);
     $signPackage = array("appId" => $this->getAppId(), "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string);
     return $signPackage;
 }
Example #7
0
 /**
  * 支付签名(paySign)生成方法
  *
  * @param array $para            
  * @throws Exception
  * @return string
  */
 public function getPaySign(array $para)
 {
     // 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,
     // 使用URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
     // 这里需要注意的是所有参数名均为小写字符,例如appId 在排序后字符串则为appid;
     // 将所有key改为小写字符
     $paraFilter = array();
     foreach ($para as $key => $value) {
         $paraFilter[strtolower($key)] = $value;
     }
     // 除去数组中的空值和签名参数
     $paraFilter = Helpers::paraFilter($paraFilter);
     // 增加或修改appkey
     $paraFilter['appkey'] = $this->getPaySignKey();
     // 对数组排序
     $paraFilter = Helpers::argSort($paraFilter);
     $string1 = Helpers::createLinkstring($paraFilter);
     // 对string1 作签名算法,字段名和字段值都采用原始值(此时package 的value 就对应了
     // 使用2.6 中描述的方式生成的package),不进行URL 转义。
     // 具体签名算法为paySign =SHA1(string1)。
     $paySign = sha1($string1);
     return $paySign;
 }
Example #8
0
 /**
  * 签名(Sign)生成方法
  *
  * @param array $para            
  * @throws Exception
  * @return string
  */
 public function getSign(array $para)
 {
     // a.除sign 字段外,对所有传入参数按照字段名的ASCII 码从小到大排序(字典序)后,
     // 使用URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1;
     // 除去数组中的空值和签名参数
     $paraFilter = Helpers::paraFilter($para);
     // 对数组排序
     $paraFilter = Helpers::argSort($paraFilter);
     $string1 = Helpers::createLinkstring($paraFilter);
     // b. 在string1 最后拼接上key=paternerKey 得到stringSignTemp 字符串,
     // 并对stringSignTemp 进行md5 运算,再将得到的字符串所有字符转换为大写,得到sign 值signValue。
     $sign = $string1 . '&key=' . $this->getPartnerKey();
     $sign = strtoupper(md5($sign));
     return $sign;
 }