【开源微信】微信登入公众号、小程序

1、概述

基于用户的微信信息进行登入是常用用户登入方法,支持在微信公众号、微信小程序等不同终端进行微信登入。设计统一微信登入框架,实现一套PHP前后端分离开源框架奇辰Open-API

2、登入框架

 不管是微信公众号或是微信小程序,微信登入分为两个步骤:

  • 获取登入code:在微信公众号平台,通过1.1.1步骤跳转到微信公众号平台的授权域名,在回调的微信公众号官方后台指定域名可以在回调url参数里面获取code,如图1.1.2步骤;在微信小程序平台可以直接在小程序端调用wx.login函数获取code参数,如图1.2步骤。
  • 通过code进行登入授权:利用获得的code可以调用微信基础API、SDK获取用户微信信息,主要是用户微信针对相应公众号或小程序的唯一openid。在开源框架奇辰Open-API里已封装好第三方微信基础API、SDK的调用回调工作。

3、开 源实现

 3.1微信公众平台登入

  • 前端网页授权
export function authLogin(mode, callback_page) {
	mpConf().then(res => {
		var appid = res.data.appid
		let href = window.location.href
		var url = new URL(href)
		var local = encodeURIComponent(url.origin + callback_page); // 当前H5页面的url

		var wxUrl =
			'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' +
			appid +
			'&redirect_uri=' +
			local +
			'&response_type=code' +
			'&scope=snsapi_' + (mode === 'userinfo' ? 'userinfo' : 'base') +
			'&state=STATE#wechat_redirect';
		window.location.href = wxUrl;
	}).catch(err => {
		console.log("获取code失败")
	})
}

 callback_page设置授权回调页面url,获取授权成功回调url携带参数code。

  • 微信公众号请求后端登入
export function login() {
	return new Promise((resolve, reject) => {
		const url_params = getUrlCode()
		const openid = url_params.openid
		if (openid !== '' && openid != null && openid != undefined) {
			request('/auth/mp/openid', {
				openid: openid
			}, 'POST').then(res => {
				//成功回调
				if (res.errorCode == 200) {
					uni.setStorageSync('token', res.data.token);
					resolve(res);
				} else {
					reject('non login!');
				}
			}).catch(err => {
				//请求失败
				console.log("openid 登入失败!")
				reject(err)
			})
		} else {
			const code = url_params.code;
			if (code !== null && code !== '' && code !== undefined) {
				request('/auth/mp/code', {
					code: code
				}, 'POST').then(res => {
					if (res.errorCode == 200) {
						uni.showToast({
							title: '微信登入成功',
							icon: 'none'
						})
						uni.setStorageSync('token', res.data.token);
						resolve(res);
					} else {
						console.log(res)
						reject('non login!');
					}
				}).catch(err => {
					console.log("login error: code2session 错误!")
					reject('code auth error')
				})
			} else {
				reject('no code')
			}
		}
	})
}

第24行调用后端auth/mp/code接口进行登入授权,如下:

  • 后端微信公众号授权登入
public function code(Request $request)
    {
        $conf = ConfMpModel::first();
        $http = new GuzzleHttp\Client;
        $params = [
            'appid' => $conf->appid,
            'secret' => $conf->secret,
            'code' => $request->code,
            'grant_type' => 'authorization_code'
        ];
        $response = $http->get('https://api.weixin.qq.com/sns/oauth2/access_token', [
            'query' => $params
        ]);
        $result = json_decode($response->getBody(), true);
        if (array_key_exists('errcode', $result) && $result['errcode'] != 0) {
            $res = ResultTool::fail();
            $res['errorCode'] = $result['errcode'];
            $res['errorMsg'] = $result['errmsg'];
            return $res;
        }
        if (array_key_exists('openid', $result) && $result['openid'] != '') {
            $fans = FansModel::where('openid', '=', $result['openid'])->where('platform', '=', 'mp')->first();
            if (!is_null($fans)) {
                if (!($fans->uid > 0)) {
                    $uid = $this->user_service->registerForFans($fans->fid);
                    $fans->uid = $uid;
                    $fans->save();
                }
            } else {
                $fid = $this->fans_service->registerOpenid('mp', $result['openid']);
                $fans = FansModel::where('openid', '=', $result['openid'])->first();
                $uid = $this->user_service->registerForFans($fid);
                $fans->uid = $uid;
                $fans->save();
            }
            $user = UserModel::where('uid', '=', $fans->uid)->first();
            $token = Auth::login($user);
            $res = ResultTool::success();
            $res['data']['token'] = $token;
            return $res;
        }
        $res = ResultTool::fail();
        $res['errorMsg'] = '微信公众号用户登入失败!';
        return $res;
    }

3.2微信小程序登入

  • 微信小程序端获取code,并请求后端授权登入
export function login() {
	try {
		return new Promise((resolve, reject) => {
			uni.login({
				provider: 'weixin',
				success: (loginRes) => {
					let data = {
						code: loginRes.code
					}
					request(
						'auth/miniapp/login', data,
						'POST'
					)
						.then((res) => {
							//成功回调
							if (res.errorCode == 200) {
								uni.setStorageSync('token', res.data.token);
								userOfMiniapp().then(res => {
									uni.setStorageSync('user_info', res.data)
								})
								resolve(res.data.token);
							} else {
								reject(res)
							}
						})
						.catch((err) => {
							//请求失败
							reject(err);
						});
				},
			});
		});
	} catch (e) {
		// error
	}
}

在第4行调用前端函数获取code,在第10行请求后端进行授权登入。

  • 后端微信小程序登入
public function login(Request $request)
    {
        $conf = ConfModel::first();
        $http = new GuzzleHttp\Client;
        $params = [
            'appid' => $conf->miniapp_appid,
            'secret' => $conf->miniapp_secret,
            'js_code' => $request->code,
            'grant_type' => 'authorization_code'
        ];
        $response = $http->get('https://api.weixin.qq.com/sns/jscode2session', [
            'query' => $params
        ]);
        $result = json_decode($response->getBody(), true);
        if (array_key_exists('errcode', $result) && $result['errcode'] != 0) {
            $res = ResultTool::fail();
            $res['errorCode'] = $result['errcode'];
            $res['errorMsg'] = $result['errmsg'];
            return $res;
        }
        if (array_key_exists('openid', $result) && $result['openid'] != '') {
            $fans = FansModel::where('openid', '=', $result['openid'])->where('platform', '=', 'miniapp')->first();
            if (!is_null($fans)) {
                if (!($fans->uid > 0)) {
                    $uid = $this->user_service->registerForFans($fans->fid);
                    $fans->uid = $uid;
                    $fans->save();
                }
            } else {
                $fid = $this->fans_service->registerOpenid('miniapp', $result['openid']);
                $fans = FansModel::where('openid', '=', $result['openid'])->first();
                $uid = $this->user_service->registerForFans($fid);
                $fans->uid = $uid;
                $fans->save();
            }
            $user = UserModel::where('uid', '=', $fans->uid)->first();
            $token = Auth::login($user);
            $res = ResultTool::success();
            $res['data']['token'] = $token;
            return $res;
        }
        $res = ResultTool::fail();
        $res['errorMsg'] = '小程序用户登入失败!';
        return $res;
    }

 4、更多

开源项目:Open-Api

更多信息:www.lokei.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
phpWeChat微信公共号开发框架 v1.1.6更新日志 1、修复诺干文字错误; 2、修复微信支付可能出现订单过期提示的bug; 3、修复模块在线更新功能; 4、其他重要更新。 phpWeChat微信公共号开发框架简介 phpWechat 是由一个具有多年行业开发经验的前端 UI 设计师、PHP开发工程师组成的团队设计、研发的一套的微信公众平台管理系统,您可以瞬间完成一个公共号或者PC站或者两者皆有的平台搭建。 phpWeChat 微信 网站开发框架功能亮点: 1、100%开源,没有任何加密文件 phpWeChat核心文件100%开源,没有任何加密文件,开发者可以放心使用而无需担心留有后门程序等。 2、程序轻量级,一天读完所有代码 核心框架压缩包只有2.66M,十分利于开发者迅速阅读全部代码。 3、代码严谨,结构清晰 phpWeChat使用MVC开发模式,各个功能模块之间独立并目录结构统一。开发者可迅速掌握phpWeChat的框架结构。 4、二次开发文档十分完善 我们提供了完善的phpWeChat二次开发文档,便于开发者学习与查阅。 5、高度集成微信接口 phpWeChat高度集成了微信公共号的自动回复、菜单管理、素材管理、模板消息、粉丝管理、微信支付等常用接口,您只需一个函数或2/3行代码即可实现原本需要很费时费力才能开发的功能。 6、phpWeChat也是一个PC(网站)开发框架和CMS 慢慢您会发现,phpWeChat是一个更接近CMS功能的框架。 7、高度封装常用开发功能 只需一两行固定的代码,您便可以写出列表分页、微信支付、文件上传、邮件发送、短信发送等功能。 8、数据结构合理,负载强劲 phpWeChat集成了常见的内存级缓存(MemCache)、文件缓存处理方案,使得系统更符合大数据、大并发的公共号或网站使用。 9、集成应用市场,功能拓展一瞬间 phpWeChat集成了应用市场并在线安装应用的功能,您可以在一瞬间安装完成其他开发者开发的功能模块。 phpWeChat安装方法: 将下载的程序压缩包(zip格式)解压后,将全部文件和文件夹上传至网站根目录。然后输入域名/install.php 即可进入安装程序。 注意:安装phpWeChat前请先创建好phpWeChat所需的数据库。 phpWeChat 目录结构: addons 功能模块目录 admin 公用后台目录 api 插件目录 data 数据缓存目录 install 安装程序目录,安装后请改名或删除 include 公用操作类目录 statics 静态文件目录 template 视图(模板)目录 upload 上传文件存放目录 phpWeChat微信公共号开发框架前台页面 phpWeChat微信公共号开发框架后台管理 后台路径:域名/phpwechat.php 用户名与密码:安装是可设置 后台页面 相关阅读 同类推荐:CMS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值