时间仓促,暂时记录一下,有问题请留言

背景:目前客户项目有两套系统。一套暂时定为A系统,另一套为B系统,两套系统下有不同的公众号,小程序。

需求:B系统为用户端系统,需要发送公众号模板消息,所以需要用户openid,但A系统是80端口,B系统是3000端口,公众号网页授权域名不能带端口,所以只能在A系统的公众号获取到用户openid,推送到B系统数据库里。通过unionid 和小程序用户绑定起来

unionid:如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。(借鉴文档说明)

unionid文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html

公众号开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#1

公众号模板消息:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

公众号跳转小程序:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html#%E5%BC%80%E6%94%BE%E6%A0%87%E7%AD%BE

一、准备工作

1. 在微信公众平平台,配置ip白名单,否则请求官方接口受限

2. 配置网页授权域名,下面用户授权接口中的redirect_uri,需要在此授权域名下才可以

二、开始编写代码

  获取用户openid过程和推送

  1. 前端:添加授权页面,
  2. 前端:用户同意授权,获取到code,拼接成一个获取access_token的url,发送给后端
  3. 后端:通过code换取网页授权access_token
  4. 后端:用前端的url,进行请求,解析出来access_token和openid
  5. 后端:拉取用户信息

  

  1.  前端:添加授权页面,用于用户授权,获取code,拼接成一个获取access_token的url,发送给后端

  2.  后端:通过code换取网页授权access_token

   获取到前端给的url,request请求之后,进行解析access_token和openid

  3. 拉取用户信息,

1. 在A系统公众号下,添加一个授权页面,里面有一个简易的授权按钮就足够了,

<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=redirect_uri&response_type=code&scope=snsapi_base&state=1&connect_redirect=1#wechat_redirect">
授权按钮
</a>

  a标签url参数说明:

url https://open.weixin.qq.com/connect/oauth2/authorize
appid 公众号appid (唯一标识)
redirect_uri 授权后重定向的回调链接地址(需要网页授权域名下的链接地址)
response_type code
scope

snsapi_base(不弹出授权页面,直接跳转,只能获取用户openid)

snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

2. 获取code

当点击了此授权按钮之后,会重定向到redirect_uri,此时的url上是带着code的,需要截取下来

  截取参数方法:
  function getUrlParms(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null)
return unescape(r[2]);
return null;
}
  
  调用方法获取code,
let code = getUrlParms('code')
if (code != null && code != undefined) {
     当获取的code不是undefined的,就去调用获取access_token函数
getAccessToken(code)
}

3. 通过code 获取 access_token

在前台生成获取access_token的url,发送给后端,直接request就可以了

  参数说明:

appid 公众号appid
secret 公众号密钥
code 第二步获取到的code

因为要从A系统去请求B系统的方法,存在跨域,这里使用ajax的jsonp,来解决。
  <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  /**
* 1. 获取code
* 2. code 换取 access_token
*/
function getAccessToken(code) {
let url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${secret}&code=${code}&grant_type=authorization_code`
console.log(url)
let url2 = `https://test.com/getAccessToken`
$.ajax({
type: 'post',
url: url2,
dataType: "jsonp",//数据类型为jsonp
data: { url: url },//传递的值
jsonpCallback: "callback",//服务端用于接收callback调用的function名的参数
success: (res) => {
console.log(res)
},
fail: (err) => {
console.log(err)
}
})
}

4. 获取用户信息

let getUserInfo = async (accessToken, openid, callback) => {
let url = `https://api.weixin.qq.com/sns/userinfo?access_token=${accessToken}&openid=${openid}&lang=zh_CN)`
let data = await getRequest(url)
return data
}

5. 获取小程序用户的信息,

小程序调用wx.login, 获取到code,然后调用获取openid的接口即可,回调数据里就有unionid

获取openid异常错误:

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: Vffd863Vf-Vlc6 ]"}

有可能造成这个错误的原因:

1.  拉取用户信息请用snsapi_userinfo,不能使用snsapi_base

2. 需要刷新access_token,https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#2

获取公众号openid,通过unionid 和小程序用户绑定起来的更多相关文章

  1. JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

    一,首先说明下这个微信的openid 为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开 ...

  2. 新增线下、APP、公众号多处入口,小程序会再火起来么?

    现在,大多数互联网创业者最缺的是流量,第二缺的是钱.之前开发者们追捧小程序的重要原因就是在于认为这可能是下一个微信公众号体量的流量入口,因为大家都想从微信的8亿多用户中收获自己的一部分用户. 近期部分 ...

  3. python如何获取公众号下面粉丝的openid

    如何获取公众号下面粉丝的openid呢,首先要获取一个access_token,这个token可不是令牌(Token),如何获取这个access_token呢?有两种方法,方法如下: # -*- co ...

  4. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  5. 50行Python代码,教你获取公众号全部文章

    > 本文首发自公众号:python3xxx 爬取公众号的方式常见的有两种 - 通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章 - 通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自 ...

  6. 微信应用号来了,微信小程序开发教程!

    关注,QQ群,微信应用号社区 511389428,511389428 微信应用开放的服务和组件包含如下: 视图容器:视图(View).滚动视图.Swiper 基础内容:图标.文本.进度条 表单组件:按 ...

  7. 微信小程序之怎样识别一个小程序用户

    本节主要是说下怎样识别一个小程序的用户,需要用什么数据来做标识呢: 我们应该都知道判断是不是一个用户大部分都是通过userid来判断,如果这个用户访问的应用发送了一个请求,把userid之类的数据发给 ...

  8. PHP实现支付宝小程序用户授权的工具类

    背景 最近项目需要上线支付宝小程序,同时需要走用户的授权流程完成用户信息的存储,以前做过微信小程序的开发,本以为实现授权的过程是很简单的事情,但是再实现的过程中还是遇到了不少的坑,因此记录一下实现的过 ...

  9. 微信公众号openid处理的一些笔记

    每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同.如果公司有多个公众号,可以通过开放平台关联,这样同一用户,对同一个微信开放平台下的不同应用,unionid是相同 ...

  10. JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)

    package com.weixin.sendmessage; import org.apache.commons.lang.StringUtils; import org.apache.http.H ...

随机推荐

  1. T2回家(home)题解

    T2回家(home) 现在啥也不是了,虽然会了逆元,但是对期望概率题还是一窍不通,赛时相当于只推出了 \(n=1\) 的情况,结果运用到所有情况,理所应当只有20分. 题目描述 小Z是个路痴.有一天小 ...

  2. 宝塔部署java后端项目

    1. 安装插件 宝塔面板找到软件商店然后搜索 Java java项目管理安装 安装后点击设置准备安装 tomcat 2. 添加项目

  3. 21 如何写出一篇高质量的sci水文

    博客配套视频链接: https://www.bilibili.com/video/BV1fW4y1W7dS/ b 站直接看 模型确定, 结果正在跑(或已结束), 目标期刊已定,一般可以定顶刊 从目标期 ...

  4. Oracle问题:alter update modify 的区别是什么?

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486480&idx=1 ...

  5. 云原生周刊:Docker 推出 Docker Build Cloud

    开源项目推荐 Kube-Vip Kube-Vip 旨在为 Kubernetes 集群提供高可用性和负载均衡功能.它提供了一个可插拔的 VIP(虚拟 IP)管理器,可以为集群中的服务分配一个虚拟 IP ...

  6. Python实现火柴人的设计与实现

    1.引言 火柴人(Stick Figure)是一种极简风格的图形,通常由简单的线段和圆圈组成,却能生动地表达人物的姿态和动作.火柴人不仅广泛应用于动画.漫画和涂鸦中,还可以作为图形学.人工智能等领域的 ...

  7. linux 基础(3)基本文件操作

    目录的基本操作 在 linux 文件系统里,以斜杠 / 开头的路径是绝对路径,从根目录开始寻找:其他的路径则都是相对路径,从当前目录(working directory)开始寻找. 相对目录中常用的符 ...

  8. Go语言学习 _基础03 _数组和切片

    Go语言学习 _基础03 _数组和切片 1.数组 package array_test import "testing" func TestArrayInit(t *testing ...

  9. WinDbg调试命令之线程操作

    WinDbg的线程操作命令可以帮助开发人员诊断和解决多线程应用程序中的问题,常用的命令有以下这些. ~*e - 列出当前进程中的所有线程 这个命令会列出当前进程中的所有线程,包括它们的线程ID.状态. ...

  10. 本地文件包含漏洞详解与CTF实战

    1. 本地文件包含简介 1.1 本地文件包含定义 本地文件包含是一种Web应用程序漏洞,攻击者通过操控文件路径参数,使得服务器端包含了非预期的文件,从而可能导致敏感信息泄露. 常见的攻击方式包括: 包 ...