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.appidlet href = window.location.hrefvar url = new URL(href)var local = encodeURIComponent(url.origin + callback_page); // 当前H5页面的urlvar 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.openidif (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

【开源微信】微信登入公众号、小程序相关推荐

  1. 啦啦外卖公众号+小程序 V43.0开源至尊独立版+独家用户授权升级+小程序端+APP源码+小程序端VUE源码安装教程

    啦啦外卖跑腿平台开源至尊独立稳定版公众号+小程序 V43.0版系统为独立开源版,最大优势全开源,使用的都知道该系统功能非常强大,是目前外卖平台功能最全的一套系统.拿来即用,也非常合适做二开的朋友,包括 ...

  2. crmeb打通版开源微信公众号小程序商城框架源码

    crmeb是什么? crmeb是一套客户管理加电商营销系统,基于ThinkPhp6.0+Vue采用前后端分离模式开发,前后台都具有非常标准的API接口,是一款非常优秀的开源微信端及小程序商城框架,能够 ...

  3. 最新在线客服系统php代码微信软件公众号小程序app二维码聊天网站源码

    最新在线客服系统php代码微信软件公众号小程序app二维码聊天网站源码 管理界面 独家长期更新日志(欢迎反馈BUG) 1.添加手机端前后台声音提示 2.添加后台客户管理显示在线离线 3.添加清空当前对 ...

  4. 微信公众号小程序外卖返利分销系统美团饿了么外卖cps软件源码

    饿了么美团外卖返利程序对接公众号发单机器人分销系统返利源码 美团/饿了么外卖CPS联盟返利公众号小程序裂变核心源码 源代码地址 http://y.mybei.cn 成品展示 截图 步骤 下载以上源代码 ...

  5. 如何对接微信公众号/小程序的在线客服

    第一步:下载在线客服软件 二.开启微信客服功能并扫码绑定 第一次登进后默认是没有微信客服项目的,需要在左边先找到"微信客服"模块,然后"开启客服功能"(点击按钮 ...

  6. .NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?

    前言 获取UnionID是开发微信公众号/小程序中很有必要的一个环节,特别是针对一个公司拥有多个公众号小程序而推出的机制,实现打通账户一体化,用UnionID来区分多平台的唯一性. 官方的解释:如果开 ...

  7. 微信,支付宝支付,微信公众号小程序授权等

    微信,支付宝支付,微信公众号小程序授权等 前言 微信支付 微信授权 maven依赖(更新) 前言 最近在公司也做了很多移动端项目,如今微信公众号,小程序又特别火爆,免不了要接触支付,授权这类的业务需求 ...

  8. 微信公众号/小程序注册认证

    本篇文章主要从注册微信小程序的角度讲如何注册小程序账号. 作为一名小程序开发者,可能您不用操心注册账号和微信认证的事情,这种事情一般可以交由客户去注册. 但当您的客户需要您自己去注册账号时,您可能需要 ...

  9. python爬虫爬取微信公众号小程序信息

    python爬虫爬取微信公众号小程序信息 爬取内容 某汽车维修信息提供的维修店名称,地点以及电话(手机)号码 爬取步骤 啥也别管,先抓包看看,在这里,博主使用的抓包软件是charles 抓包:将网络传 ...

  10. 微信公众号 小程序 开放平台是什么鬼

    三个东西,公众号,小程序,微信开放平台 公众号,小程序,微信开放平台都要申请及认证 1)公众号申请需要填写企业详情,对公小额转帐验证会退回,不要钱,审核营业资质.最后认证费用300  2)如果你要开通 ...

最新文章

  1. iis7.5配置.net mvc注意事项
  2. 同类型结构体之间赋值不一定有效
  3. Leetcode 133. 克隆图 解题思路及C++实现
  4. ftp 工具_ftp,ftp工具多大
  5. matlab 地埋管温度场,地埋管换热器周围土壤冻结温度场的模拟研究
  6. 怎么打散铺铜_装修辅材有哪些?怎么选?元老级工头:照这样去买你家多住50年...
  7. Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
  8. 多线程—线程池Executor框架及四种常用线程池
  9. Linux网站大杂烩《自己查阅》
  10. SQL日期与时间函数
  11. C++ #include iostream #include iostream.h #include string.h区别及作用
  12. 阶段3 1.Mybatis_09.Mybatis的多表操作_9 mybatis多对多操作-查询用户获取用户所包含的角色信息...
  13. 《算法图解》之狄克斯特拉算法
  14. 如何理解《信号与系统》?
  15. html调整浏览器兼容性,浏览器兼容性问题整理
  16. 一天搞懂深度学习—学习笔记4(knowledge and tricks)
  17. 无法启动计算机打印机服务程序,Windows10下使用打印机时提示打印后台处理程序服务没有运行怎么办...
  18. word2016画函数曲线图
  19. scala程序启动时,Could not locate executable null\bin\winutils.exe in the Hadoop binaries解决方案...
  20. winform中当laber标签字段过长时

热门文章

  1. Win8电脑插入耳机 无声音
  2. 纯碱增仓10%上涨,PTA认沽大涨10倍,玻璃-纯碱继续下探2022.6.29
  3. 中了勒索病毒如何自救?20220105
  4. flutter 自带方法获取视频缩略图
  5. 知识分享:进销存管理系统记录有效库存让销售更有保障
  6. 异步请求(多种方式)
  7. PyQt5 pushButton clicked 点击事件绑定
  8. Oracle JDK 与 OpenJDK
  9. 《人性的优点全集》--戴尔·卡耐基
  10. React-native开发-Unrecognized font family ‘Ionicons’