网上很多资料但是都太杂太乱很多是复制过来复制过去,微信官方给的文档也很坑很多地方没说清,自己整理了一下。

首先:要获取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服务号消息推送相关推荐

  1. 接入小程序客服(java版教程),处理第一次主动推送会话超时问题

    首先小程序开启客服需要的消息推送 工具类下载链接: 重要(处理主动下发第一次错误) 解决办法 1.捕获第一次主动下发错误的异常,记录缓存 2.当用户主动发消息时检查缓存,有则主动下发 1.前提:小程序 ...

  2. 微信公众号配置 Token 认证以及消息推送功能

    前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...

  3. spring实现mqtt服务端_SpringBoot--实战开发--MQTT消息推送(六十)

    一.MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台 ...

  4. 小程序前端消息推送通知

    小程序前端消息推送通知(采用的是HTTPS调用) 应用场景: 用户在支付订单后想要获取支付成功的及金额变动的一个消息通知 1. 小程序后台找到订阅消息和制作我们需要的模版并获取相应的模版ID 2.需要 ...

  5. 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...

    公众号或能在对话框中直接给粉丝推送小程序卡片了,这个功能似乎正在灰度测试中. 微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力 一直以来,微信公众号和微信小程序一直是腾讯基于微信生态的两款明 ...

  6. java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能

    其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送.之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作. 需要你既要会小 ...

  7. JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

    最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...

  8. 关于消息推送服务的十问十答

    随着移动互联时代进入下半场,寻找流量红利的突破口成为每个互联网人思考的命题.互联网的运营一切都是为了增长,毫无疑问,增长是运营的使命. 为了引出本文的主题,小编都上升到使命的高度了. 言归正传,消息推 ...

  9. VFP获取微信小程序用户openID,易如反掌

    社群的魏总问我,怎么去取用户的微信小程序的唯一ID,昨天也给他解答了.今天把这个答案沉淀下来.于是有了这篇. 这个唯一ID,我们一般叫openid,是唯一标定用户身份的,每个微信在这个小程序中是唯一的 ...

最新文章

  1. esp32 camera_利用Phyphox和ESP32蓝牙制作欧姆表测电阻
  2. mysql数据库表的基本操作
  3. Matlab绘制小波尺度函数和小波函数
  4. 全球最大AI巨量模型,参数2457亿炼丹16天专注中文,打造者绝对让你意外
  5. 【Hadoop Summit Tokyo 2016】企业数据分类和治理
  6. mysql包导入之后idea仍然报错_IDEA连接MySQL报错怎么弄?
  7. python3读取excel某一列_怎样用python,读取excel中的一列数据!python读取excel某一列数据...
  8. ACM PKU 2663 Tri Tiling http://acm.pku.edu.cn/JudgeOnline/problem?id=2663
  9. Spring基础——AOP
  10. SAS之COMPBL、DEQUOTE函数
  11. Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)...
  12. 09年网络工程师考试大纲
  13. 易筋SpringBoot 2.1 | 第三十三篇:SpringBoot Reactor响应式编程实战二 Redis Lettuce
  14. 静态HTML网页模板源码——仿男装女装购物商城(40页功能齐全)
  15. error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“:
  16. tornado 源码分析 waker
  17. ​KeePassXC:社区驱动的开源密码管理器​
  18. 电脑锁屏壁纸提取方法
  19. 如何实现bat一键关机
  20. 整型和字符串相互转换

热门文章

  1. c语言对sht11编程,SHT11数字温湿度传感器 含源代码和仿真图
  2. Lua操作系统库、流、文件库
  3. java向匿名内部类传递参数
  4. MongoDB 最新安装教程
  5. 私有仓库Gitlab的安装与汉化
  6. springcloud微服务架构开发实战:分布式消息总线
  7. Flash JEDEC 查看
  8. pyinstaller打包torch运行后报错
  9. C语言程序的考试方式,全国计算机二级考试之C语言程序设计考试方式
  10. 广州app定制:IO定制游APP