PHP微信接入

2017-08-28  本文已影响0人  毛子阿卡西

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

}
上一篇下一篇

猜你喜欢

热点阅读