小程序获取openid和unionid服务号获取unionid服务号消息推送
网上很多资料但是都太杂太乱很多是复制过来复制过去,微信官方给的文档也很坑很多地方没说清,自己整理了一下。
首先:要获取unionid服务号和小程序都要绑定到微信开放平台,并且都要认证,认证需要一定费用。
微信开放平台地址:https://open.weixin.qq.com/
绑定服务号和小程序
绑定玩完成后才可以获取用户的unionid,不绑定无法获取
获取小程序的用户unionid要通过小程序授权才可以,获取服务号的用户unionid,要通过用户关注服务号才可以,unionid是开放平台的id,小程序和服务号公众号等等都有自己的id,小程序和服务号使用openid作为用户的唯一标识,小程序openid和服务号(公众号)openid是不同的,属于两个平台,开放平台是用来关联其他平台的开放平台的id是unionid,使用unionid才可以互联所有平台
获取小程序unionid:
需要小程序的appid和appsecret,这两个要在微信公众平台获取,地址https://mp.weixin.qq.com/
小程序和服务号(公众号)地址一样,登录的时候注意区分
小程序端为:
需要wx.log({})和wx.getUserInfo({})两个函数,wx.getUserInfo需要用户授权
wx.login({success: res => {if (res.code) {wx.getSetting({success: res => {if (res.authSetting['scope.userInfo']) {// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框wx.getUserInfo({success: res => {// 可以将 res 发送给后台解码出 unionId//console.log(res)// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回// 所以此处加入 callback 以防止这种情况if (self.userInfoReadyCallback) {self.userInfoReadyCallback(res)}var config = {url: 'api/get_openid',data: {code: res.code,//这个就是微信服务端换取的code,要传给后台encryptedData:res.encryptedData,iv:res.iv}}ajax._get(config, function(res) {console.log(res);}, function(msg) {console.log('获取用户信息失败!' + msg)})}})} else {console.log('授权失败')// self.relaunchToIndex()}}})} else {console.log('登录失败!' + res.errMsg)}// 发送 res.code 到后台换取 openId, sessionKey, unionId}})
代码大体思路,可能有误根据自己的情况修改一下,上面的ajax请求经过了封装不能直接使用根据需要自己改一下,只要换取了code和iv,encryptedData即可
后台获取接口为:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code='.$code.'&grant_type=authorization_code
可以通过php的file_get_contents函数直接获取josn数据
$result = file_get_contents($url);
数据解密可以使用php提供的函数openssl_decrypt来解密
参数为:openssl_decrypt($data, $method, $secret_key, $options, $iv);
//解密加密数据
public function decrypt($data, $method, $secret_key, $options, $iv){return openssl_decrypt($data, $method, $secret_key, $options, $iv);
}
必须的参数为encryptedData(微信服务器端加密的数据)iv(微信服务器端返回的向量)
$encryptedData = $_GET['ncryptedData'];
$iv = $_GET['iv'];
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code='.$code.'&grant_type=authorization_code';
//注意如果没绑定开放平台无法获取unionid但是可以获取小程序的openid和其他信息
$result = file_get_contents($url);
$json_data = json_decode($result);
$key = base64_decode($json_data->session_key);
# iv是微信返回的向量,同样进行base64_decode操作
$iv = base64_decode($iv);
$aes_data = self::decrypt($encryptedData, 'AES-128-CBC', $key, 0, $iv);//可以使用微信平台提供发的加密解密方式
$res_data = json_decode($aes_data);
var_dump($res_data);
$unionid = $res_data->unionId;
$openid = $res_data->openid;
服务号获取用户信息:
需要用到服务好的appid和AppSecret还有ip白名单
需要用到的curl发送方式:
//get:
private function http_request($url, $data = null){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)) {curl_setopt($curl, CURLOPT_POST, TRUE);curl_setopt($curl, CURLOPT_POSTFIELDS,$data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);$output = curl_exec($curl);curl_close($curl);return $output;
}//模拟post请求
private function requestPost($url, $data, $ssl=true) { //curl完成 $curl = curl_init(); //设置curl选项 curl_setopt($curl, CURLOPT_URL, $url);//URL $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0FirePHP/0.7.4'; curl_setopt($curl, CURLOPT_USERAGENT, $user_agent);//user_agent,请求代理信息 curl_setopt($curl, CURLOPT_AUTOREFERER, true);//referer头,请求来源 curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间 //SSL相关 if ($ssl) { curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//禁用后cURL将终止从服务端进行验证 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//检查服务器SSL证书中是否存在一个公用名(common name)。 } // 处理post相关选项 curl_setopt($curl, CURLOPT_POST, true);// 是否为POST请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);// 处理请求数据 // 处理响应结果 curl_setopt($curl, CURLOPT_HEADER, false);//是否处理响应头 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//curl_exec()是否返回响应结果 // 发出请求 $response = curl_exec($curl); if (false === $response) { echo '<br>', curl_error($curl), '<br>';return false; } curl_close($curl); return $response;
}//获取token://获取的地址为https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET//获取服务号token
private function get_token(){ $token_url = 'https://api.weixin.qq.com/cgi-bin/token? grant_type=client_credential&appid=APPID&secret=SECRET';$wx_token = json_decode(self::http_request($token_url),true);$token = $wx_token["access_token"];return $token;
}//完善点的代码可把token保存到redis或者保存到本地文件保存时间为2小时,token是由获取限制的一天最多2000次,业务量大的时候必须要保存否则不够用。//获取服务号openid
private function get_openid($token){$server_openid_url = 'https://api.weixin.qq.com/cgi-bin/user/get? access_token='.$token;$res = json_decode(self::http_request($server_openid_url),true);return $res["data"]['openid'];
}//获取具体的用户信息地址://$member_url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$token.'&openid='.$openid;//获取所有服务号openid(关注过服务号的用户)public function get_userinfo(){set_time_limit(0);$token = self::get_server_token();$res = self::get_server_openid($token);//var_dump($res);$add_time = date("Y-m-d H:i:s");foreach ($res as $key => $v) {$member_url = 'https://api.weixin.qq.com/cgi-bin/user/info? access_token='.$token.'&openid='.$v;$ret = json_decode(self::http_request($member_url),true);var_dump($ret);}
}
推送消息:
设置模板:
设置完就可以在我的模板中看到模版ID
模板很多但是很多不符合自己的需求,可以自己定制提交审核通过后才可以使用。
推送消息:
官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#6
用到的接口:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=
public function send_msg(){ $token = '';//填写获取的token$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$token;$data = ['touser'=>'用户的openid','template_id'=>'你申请的模板id','url' => '','miniprogram' => array(//没有小程序可以不加'appid'=>'小程序appid','pagepath'=>'/pages/index'//跳转页面不需要跳转可以不写保证路径正确),'data' => array('first' => array('value' => '签到提醒'),'keyword1' => array('value' => '签到成功'),'keyword2' => array('value' => date('Y-m-d H:i:s',time())),'remark' => array('value' => '这是备注'),)];$result = $this->requestPost($url, urldecode(json_encode($data)));var_dump($result);$returnData = json_decode($result[1],1);var_dump($returnData);
}
打印的消息如下就说明成功了,如果出错一般就是token过期或者模板id不匹配注意检查。
{"errcode":0,"errmsg":"ok","msgid":1594417945399607298}
如果没有设置行业可以通过如下接口设置:
通过下面的接口设置所属行业好像只能设置两个行业,一个月设置一次。
https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN
使用post提交数据,数据格式为json
数组或其他形式必须转为josn
例如:
$data = array(
"industry_id1"=>"1",
"industry_id2"=>"2",
"industry_id3"=>"3",
);
$data = joson_encode($data);
public function set_indus(){$token = '获取的token';$url = 'https://api.weixin.qq.com/cgi-bin/template/api_set_industry? access_token='.$token;$data = array("industry_id1"=>"1","industry_id2"=>"2",);$ret = self::requestPost($url, json_encode($data));var_dump($ret);
}
设置好可以在服务号上查看也可以通过代码查看
{"errcode"40037,"errmsg""invalid template_id"}错误是模板id不匹配,在服务号中找到我的模板使用上面提供的模版ID
微信开发调试页面:https://mp.weixin.qq.com/debug/
小程序获取openid和unionid服务号获取unionid服务号消息推送相关推荐
- 接入小程序客服(java版教程),处理第一次主动推送会话超时问题
首先小程序开启客服需要的消息推送 工具类下载链接: 重要(处理主动下发第一次错误) 解决办法 1.捕获第一次主动下发错误的异常,记录缓存 2.当用户主动发消息时检查缓存,有则主动下发 1.前提:小程序 ...
- 微信公众号配置 Token 认证以及消息推送功能
前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...
- spring实现mqtt服务端_SpringBoot--实战开发--MQTT消息推送(六十)
一.MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台 ...
- 小程序前端消息推送通知
小程序前端消息推送通知(采用的是HTTPS调用) 应用场景: 用户在支付订单后想要获取支付成功的及金额变动的一个消息通知 1. 小程序后台找到订阅消息和制作我们需要的模版并获取相应的模版ID 2.需要 ...
- 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...
公众号或能在对话框中直接给粉丝推送小程序卡片了,这个功能似乎正在灰度测试中. 微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力 一直以来,微信公众号和微信小程序一直是腾讯基于微信生态的两款明 ...
- java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能
其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送.之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作. 需要你既要会小 ...
- JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能
最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...
- 关于消息推送服务的十问十答
随着移动互联时代进入下半场,寻找流量红利的突破口成为每个互联网人思考的命题.互联网的运营一切都是为了增长,毫无疑问,增长是运营的使命. 为了引出本文的主题,小编都上升到使命的高度了. 言归正传,消息推 ...
- VFP获取微信小程序用户openID,易如反掌
社群的魏总问我,怎么去取用户的微信小程序的唯一ID,昨天也给他解答了.今天把这个答案沉淀下来.于是有了这篇. 这个唯一ID,我们一般叫openid,是唯一标定用户身份的,每个微信在这个小程序中是唯一的 ...
最新文章
- esp32 camera_利用Phyphox和ESP32蓝牙制作欧姆表测电阻
- mysql数据库表的基本操作
- Matlab绘制小波尺度函数和小波函数
- 全球最大AI巨量模型,参数2457亿炼丹16天专注中文,打造者绝对让你意外
- 【Hadoop Summit Tokyo 2016】企业数据分类和治理
- mysql包导入之后idea仍然报错_IDEA连接MySQL报错怎么弄?
- python3读取excel某一列_怎样用python,读取excel中的一列数据!python读取excel某一列数据...
- ACM PKU 2663 Tri Tiling http://acm.pku.edu.cn/JudgeOnline/problem?id=2663
- Spring基础——AOP
- SAS之COMPBL、DEQUOTE函数
- Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)...
- 09年网络工程师考试大纲
- 易筋SpringBoot 2.1 | 第三十三篇:SpringBoot Reactor响应式编程实战二 Redis Lettuce
- 静态HTML网页模板源码——仿男装女装购物商城(40页功能齐全)
- error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“:
- tornado 源码分析 waker
- ​KeePassXC:社区驱动的开源密码管理器​
- 电脑锁屏壁纸提取方法
- 如何实现bat一键关机
- 整型和字符串相互转换