//填写微信分配的公众账号ID * 'mch_id' => //填写微信支付分配的商户号 * 'notify_url'=> //填写微信支付结果回调地址 * 'key' => //填写微信商户支付密钥 * ); * 统一下单方法 * $WechatAppPay = new wechatAppPay($options); * $params['body'] = '商品描述'; //商品描述 * $params['out_trade_no'] = '1217752501201407'; //自定义的订单号,不能重复 * $params['total_fee'] = '100'; //订单金额 只能为整数 单位为分 * $params['trade_type'] = 'APP'; //交易类型 JSAPI | NATIVE |APP | WAP * $wechatAppPay->unifiedOrder( $params ); */ class weixin_public { private $appid; private $seceret; private $uri; public function __construct($appid, $seceret, $uri) { $this->appid = $appid; $this->seceret = $seceret; $this->uri = $uri; } //获取code public function redirectWithCode() { $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid ."&redirect_uri=".urlencode($this->uri) ."&response_type=code&scope=snsapi_userinfo&state=".time()."#wechat_redirect"; return $url; } private function getAcessTokenAndOpenId($code) { $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid ."&secret=".$this->seceret."&code=".$code."&grant_type=authorization_code"; $jsonInfo = file_get_contents($url); return json_decode($jsonInfo, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 } private function getBaseToken() { $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->seceret; $jsonInfo = file_get_contents($url); return json_decode($jsonInfo, true); } private function getJsTicket($access_token) { $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; // 两小时有效 $jsonInfo = file_get_contents($url); return json_decode($jsonInfo,true); } private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private function getSignPackage($jsToken, $jsUrl) { // 注意 URL 一定要动态获取,不能 hardcode. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; //$jsUrl = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; //$jsUrl = "$protocol$_SERVER[HTTP_HOST]/front-page/fission-page.html"; $nonceStr = self::createNonceStr(); $timestamp = time(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsToken&noncestr=$nonceStr×tamp=$timestamp&url=$jsUrl"; $signature = sha1($string); $signPackage = array( "appId" => $this->appid, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $jsUrl, "signature" => $signature, "rawString" => $string ); return $signPackage; } public function getAllInfo($code, $jsUrl) { $reader = array(); $info = self::getAcessTokenAndOpenId($code); if (empty($info['access_token']) || empty($info['openid'])) { return $reader; } $baseTokenInfo = self::getBaseToken(); if (empty($baseTokenInfo['access_token'])) { return $baseTokenInfo; } $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$baseTokenInfo['access_token']."&openid=".$info['openid']."&lang=zh_CN"; $jsonInfo = file_get_contents($url); //$jsonInfo = iconv('ISO-8859-1', 'UTF-8', $jsonInfo); $rs = json_decode($jsonInfo, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 if(empty($rs['openid'])) { return $rs; } $attr['country'] = $rs['country']; $attr['province'] = $rs['province']; $attr['city'] = $rs['city']; $attr['headimgurl'] = $rs['headimgurl']; $attr['openid'] = $rs['openid']; $attr['nickname'] = $rs['nickname']; $attr['sex'] = $rs['sex']; $attr['subscribe'] = $rs['subscribe']; $attr['subscribe_time'] = $rs['subscribe_time']; $reader = Reader::getInfoByOpenId($info['openid']); Reader::addOrUpdate($reader['id'], $attr); $reader = Reader::getInfoByOpenId($info['openid']); $jsTokenInfo = self::getJsTicket($baseTokenInfo['access_token']); if (empty($jsTokenInfo['ticket'])) { return $jsTokenInfo; } $signPackage = self::getSignPackage($jsTokenInfo['ticket'], $jsUrl); $reader['js_sign'] = $signPackage; return $reader; } }