PHP微信接入

1.验证文件,wx_check.php,放入网站根目录,在公众平台进行配置验证

<?php
    //获得接口认证
    $timestamp = $_GET['timestamp'];
    $nonce = $_GET['nonce'];
    $token = 'maozi1988';
    $signature = $_GET['signature'];
    //将参数字典化排序
    $tmpArr = array($timestamp,$nonce,$token);
    sort($tmpArr);
    $judgeArr = implode('',$tmpArr);
    $judge = sha1($judgeArr);
    //判断是否符合
    if($judge == $signature)
    {
        echo $_GET['echostr'];
        exit;
    }
?>

2.微信access_token以及jsapi_ticket的获取及刷新,2小时刷新机制

public function access() { //微信access_token刷新
        $app_info = M('wxconfig')->find();
        $acc_info = M('wxaccess')->find();
        $res = array();
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$app_info['appid']}&secret={$app_info['appsec']}";
        
        if ($acc_info) {
            $diff_time = time() - $acc_info['addtime'];
            if ($diff_time >= 7000) {
                $return = json_decode(sp_getcurl($url), 1);
                $res['access_token'] = $return['access_token'];
                //更新token
                $ins['access_token'] = $return['access_token'];
                $ins['addtime'] = time();
                M('wxaccess')->where("id='{$acc_info['id']}'")->save($ins);
            } else {
                $res['access_token'] = $acc_info['access_token'];
            }
        } else {
            $return = json_decode(sp_getcurl($url), 1);
            $res['access_token'] = $return['access_token'];
            //更新token
            $ins['access_token'] = $return['access_token'];
            $ins['addtime'] = time();
            M('wxaccess')->add($ins);
        }
        
        //jsapi_ticket
        $url2 = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $res['access_token'] . "&type=jsapi";
        $info2 = M('wxjsticket')->find();
        if ($info2) {
            $diff_time = time() - $info2['addtime'];
            if ($diff_time >= 7200) {
                $return = json_decode(sp_getcurl($url2), 1);
                if ($return['errcode'] === 0) {
                    $res['ticket'] = $return['ticket'];
                    //更新token
                    $ins['ticket'] = $return['ticket'];
                    $ins['addtime'] = time();
                    M('wxjsticket')->where("id='{$info2['id']}'")->save($ins);
                }
            } else {
                $res['jstickt'] = $info2['jstickt'];
            }
        } else {
            $return = json_decode(sp_getcurl($url2), 1);
            if ($return['errcode'] === 0) {
                $res['ticket'] = $return['ticket'];
                //更新token
                $ins['ticket'] = $return['ticket'];
                $ins['addtime'] = time();
                M('wxjsticket')->add($ins);
            }
       }
  }

3.网页授权

$appid = M('wxconfig')->getField('appid');
$redirect_uri = urlencode("http://{$url}/index.php?g=Apis&m=Act&a=index");
$response_type = 'code';
$scope = 'snsapi_userinfo';
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appid}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&state={$act}#wechat_redirect";
redirect($url);          

4.跳转页面获取用户信息

$code = sp_checkparam('code', false, 'mysqlWhere');
$state = sp_checkparam('state', false, 'mysqlWhere');

$app_info = M('wxconfig')->find();

//网页授权
$url_page = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$app_info['appid']}&secret={$app_info['appsec']}&code={$code}&grant_type=authorization_code";
$return = json_decode(sp_getcurl($url_page),1);
$res['access_token'] = $return['access_token'];
$res['refresh_token'] = $return['refresh_token'];

//刷新Token
$refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={$app_info['appid']}&grant_type=refresh_token&refresh_token={$res['refresh_token']}";
$refresh_return = sp_getcurl($refresh_url);
$param = json_decode($refresh_return,1);

if (!$param['openid']) { //openid获取失败跳回授权页面
    $webinfo = M('weburl')->find();
    if ($webinfo) {
        $url = $webinfo['url'];
    } else {
        $url = $_SERVER['HTTP_HOST'];
    }
    $redirect_uri = "http://{$url}/index.php?g=Apis&m=Index&a=index&act=".$state;
    redirect($redirect_uri);
} else {
    
    //openid先查询
    $user = $this->usermodel->where("openid='{$param['openid']}'")->find();

    if (!$user) { //添加微信用户

        $uinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$param['access_token']}&openid={$param['openid']}&lang=zh_CN";
        $uinfo = sp_getcurl($uinfo_url);
        $uinfo = json_decode($uinfo,1);

        $data = array();
        $data['avatar'] = $uinfo['headimgurl'];
        $data['user_nicename'] = $uinfo['nickname'];
        $data['user_login'] = $uinfo['nickname'];
        $data['user_pass'] = sp_password("123456"); 
        $data['openid'] = $uinfo['openid'];
        $data['create_time'] = date("Y-m-d H:i:s",time());
        $data['user_type'] = 2;

        $r = $this->usermodel->add($data);
        session('uid',$r); 
        //存入session
    } else {
        //是否存在session
        $uid = session("uid");
        if (!$uid) { //不存在 重新赋值
            session('uid',$user['id']);
        }
    }
}

5.jsapi 签名接口

<?php

/*
 * 自定义菜单接口
 */

namespace Apis\Controller;

use Common\Controller\AppframeController;

class SignatureController extends AppframeController {

    public function _initialize() {
        parent::_initialize();
    }

    public 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;
    }

    public function getSign() {
        $url = $_REQUEST['url'];
        $appinfo = M("wxconfig")->find();
        $jsapiTicket = M('wxjsticket')->getField("ticket");
        $timestamp = time();
        $nonceStr = $this->createNonceStr();
        
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature = sha1($string);
        $signPackage = array(
            "appId" => $appinfo['appid'],
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "signature" => $signature,
        );
        sp_api($signPackage);
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • 微信服务号开发 整体流程 域名报备,服务器搭建 Python开发环境和项目的初始化搭建; 微信公众号注册及开发模式...
    飞行员suke阅读 4,395评论 0 14
  • 久违的新文章发布。。我的锅这篇文章是在写的太长,可以慢慢看一下,伪代码,毕竟简书上面,望大家见谅!!!先看官方文档...
    wyatt_plus阅读 1,519评论 0 2
  • 以前写过一篇《微信公众平台开发的一点收获》,这一篇说说微信公众平台网页开发的知识。微信公众平台应该是国内最大的开放...
    虞大胆的叽叽喳喳阅读 14,659评论 7 13
  • [2017·3·6]春意渐浓的清晨,薄雾缭绕,细雨飞扬,莱花金黄,驱车去重庆两江工业园。这是我做公司的第一个项目,...
    第五根阅读 166评论 0 0
  • 在平时的开发中,我们经常和沙盒打交道,可能平时并不会过多关注沙盒路径下一些文件夹的区别和作用,今天我自己做了一个总...
    赵琛阅读 620评论 0 0