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("网络请求失败"); } }
/** * 获取信息接收信息 * * @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; }
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; }
/** * 下载多媒体文件 * 公众号可调用本接口来获取多媒体文件。请注意,调用该接口需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; } }
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("网络请求失败"); } }
/** * 签名算法 * * 签名生成规则如下:参与签名的字段包括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×tamp=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}×tamp={$timestamp}&url={$url}"; $signature = sha1($string); $signPackage = array("appId" => $this->getAppId(), "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string); return $signPackage; }
/** * 支付签名(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; }
/** * 签名(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; }