laravel+guzzle微信网页授权登录

1 第一步:用户同意授权,获取code

2 第二步:通过code换取网页授权access_token

3 第三步:刷新access_token(如果需要)

4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

1.因为没有直接操作公众号。所以在建立了视图login.为了调起用户授权,获取code


<html>
    <head>
        <title>login</title>
    </head>
    <body>
        <div class="container">
            <input type="button" name="login" id="login" value="登录">
        </div>
        <script src="{{asset('js/jquery-1.10.2.min.js')}}"></script>
        <script>
            function getUrlParam(name) {

                var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
                var r = window.location.search.substr(1).match(reg);
                if (r != null) return unescape(r[2]);
                return null;
            }

            $('#login').click(function (callback) {
                var appId = 'wxdecc14c9870858d6';
                var oauth_url = 'http://wxfuwuhao.jamyooo.com/api/page/testindex';
                var url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + oauth_url + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"

                // https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdecc14c9870858d6&redirect_uri=http://wxfuwuhao.jamyooo.com/api/page/testindex&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

                var code = getUrlParam("code");
                if (!code) {
                    window.location = url;
                }
                else {
                    console.log(code);
                    $.ajax({
                        type: 'POST',
                        url: oauth_url,
                        dataType: 'json',
                        data: {
                            code: code
                        },
                        success: function (data) {
                            if (data.code === 200) {
                                callback(data.data)
                            }
                        },
                        error: function (error) {
                            throw new Error(error)
                        }
                    })
                }
            })
        </script>
    </body>
</html>
2.安装guzzle依赖详细查看http://guzzle-cn.readthedocs.io/zh_CN/latest/overview.html#installation;
3.获取access_token与openid;
private function Token($code){

        $appId = env('WECHAT_OFFICIAL_ACCOUNT_APPID');
        $secret = env('WECHAT_OFFICIAL_ACCOUNT_SECRET');

        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appId."&secret=".$secret."&code=".$code."&grant_type=authorization_code";

        $client = new GuzzleClient();

        $response = $client->get($url);

        $Tokendata =json_decode($response->getBody()->getContents());

        $token = $Tokendata->access_token;
        //echo token会报错
        echo "<p style='display: none;'>".$token."</p>";

        $openid = $Tokendata->openid;
        $comp = compact('token','openid');
        return $comp;

    }
//获取用户数据
 public function testindex(Request $request){
        $code = $request->code;
        //获取Token返回数据
        $comp =  $this->Token($code);

        $token = $comp['token'];
        $openid = $comp['openid'];

        $userinfo_url ="https://api.weixin.qq.com/sns/userinfo?access_token=".$token."&openid=".$openid."&lang=zh_CN";

        $client = new GuzzleClient();

        $response = $client->get($userinfo_url);
        $userinfo = json_decode($response->getBody()->getContents());
//        dd($userinfo);
        $unionid = $userinfo->unionid;
        $nickname = $userinfo->nickname;
        $sex = $userinfo->sex;
        $headimgurl = $userinfo->headimgurl;
//        echo "<p style='display: none;'>".$unionid.$sex.$nickname.$headimgurl."</p>";

        //判断数据是否存在用户
        $check_user = User::where('openId', $openid)->first();
        if (empty($check_user)){
            //不存在则存入用户数据
            $user = new User();
            $user->openId = $openid;
            $user->unionId = $unionid;
            $user->nickName = $nickname;
            $user->sex = $sex;
            $user->avatar = $headimgurl;
            $user->save();
            return response()->json([
                'status'=>1000,
                'msg'=>'success',
            ]);
        }else{
            return response()->json([
               'status'=>1001,
               'msg'=>'用户'.$nickname.'已存在',
            ]);
        }

    }

遇到的坑:

1.login的路由不能在微信开发工具调试,因为不能触发登录回调。需要把微信开发工具授权登录页的路由复制到微信客户端访问。

2.不知道是微信api的问题还是laravel dd()输出的原因。function Token()中

 $Tokendata =json_decode($response->getBody()->getContents());

这里有个bug:dd()输出的话,在苹果机中是可以打印出完整信息。但是在安卓机中一直显示code已经被使用。但是使用echo ,print_r()输出。无论在苹果机中还是安卓机中都是可以打印出完整的信息。所以在function Token()中需要加上以下语句。否则显示stdClass错误,原因不详。

echo "<p style='display: none;'>".$token."</p>";

 




Laravel 中使用 GuzzleHttp/Guzzle 发送邮件可以通过以下步骤实现: 1. 安装 GuzzleHttp/Guzzle 可以使用 Composer 进行安装: ``` composer require guzzlehttp/guzzle ``` 2. 创建邮件发送类 在 app 目录下创建一个名为 MailSender 的类,代码如下: ```php <?php namespace App; use GuzzleHttp\Client; class MailSender { protected $client; public function __construct() { $this->client = new Client([ 'base_uri' => 'https://api.sendgrid.com/v3/', 'headers' => [ 'Authorization' => 'Bearer ' . env('SENDGRID_API_KEY'), 'Content-Type' => 'application/json' ] ]); } public function send($to, $subject, $content) { $response = $this->client->request('POST', 'mail/send', [ 'json' => [ 'personalizations' => [ [ 'to' => [ [ 'email' => $to ] ] ] ], 'from' => [ 'email' => 'sender@example.com' ], 'subject' => $subject, 'content' => [ [ 'type' => 'text/plain', 'value' => $content ] ] ] ]); return $response->getStatusCode(); } } ``` 其中,使用 GuzzleHttp\Client 创建一个 HTTP 客户端,设置 base_uri 为 SendGrid 邮件服务的 API 地址,headers 中包含 Authorization 和 Content-Type 信息。send() 方法接受收件人邮箱地址、邮件主题和邮件内容,使用 HTTP POST 请求发送邮件。 3. 在控制器中使用 MailSender 发送邮件 在需要发送邮件的控制器中,使用 MailSender 类发送邮件,示例代码如下: ```php <?php namespace App\Http\Controllers; use App\MailSender; use Illuminate\Http\Request; class MailController extends Controller { public function send(Request $request) { $to = $request->input('to'); $subject = $request->input('subject'); $content = $request->input('content'); $mailSender = new MailSender(); $statusCode = $mailSender->send($to, $subject, $content); return response()->json(['status' => $statusCode]); } } ``` 在 send() 方法中,从请求中获取收件人邮箱地址、邮件主题和邮件内容,然后实例化 MailSender 类并调用 send() 方法发送邮件。 4. 配置 SendGrid API 密钥 在 .env 文件中添加 SendGrid API 密钥: ``` SENDGRID_API_KEY=your_api_key_here ``` 至此,使用 GuzzleHttp/Guzzle 发送邮件的配置就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值