最近在调试微信公众号开发者模式,处理公众号消息,收到如下回调消息内容

<xml><ToUserName><![CDATA[gh_29********21]]></ToUserName>
<FromUserName><![CDATA[o*****4-7Z**************s]]></FromUserName>
<CreateTime>1481769005</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[李建华测试]]></Content>
<MsgId>6364149417119100008</MsgId>
</xml>

转成对象如下

{
"ToUserName":"gh_29********1",
"FromUserName":"oy****j4-7Z**********ys",
"CreateTime":"",
"MsgType":"text",
"Content":"李建华测试",
"MsgId":""
}

因为以前的网站分享业务使用的是另一套AppID,同一个用户在不同的AppID里获取到的OpenID是不同的,但是为了业务上的统一,准备都全部采用UnionID来作为用户唯一标识,所以需要将消息体中的FromUserName,也就是OpenID转成UnionID存储记录。以下是操作步骤:

1、获取Access_Token

                    var url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + 
              AirwayKeeperModel.MPAppID + "&secret=" + AirwayKeeperModel.MPAppSecret;
var getToken = KTHttpRequest._Get(url);
var access_token = Newtonsoft.Json.JsonConvert.DeserializeObject<WxAccessTokenModel>(getToken);
if (access_token == null)
throw new JSJException("获取token返回null"); if (access_token.Errcode != )
throw new JSJException("获取token异常,错误码:" + access_token.Errcode + ",错误信息:" + access_token.Errmsg);

2、拉取用户信息

                    url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token.AccessToken +
"&openid=" + req.OpenID.Trim() + "&lang=zh_CN";
var wxUserInfoJson = KTHttpRequest._Get(url);
var wxUserInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WxUserModel>(wxUserInfoJson);
if (null == wxUserInfo)
throw new JSJException("拉取用户微信信息返回null"); if ( != wxUserInfo.Errcode)
throw new JSJException("拉取用户微信信息异常,错误码:" + wxUserInfo.Errcode + ",错误信息:" + wxUserInfo.Errmsg); if (wxUserInfo.Subscribe != )
{
resp.ViewType = ;
throw new JSJException("您还没有关注空铁管家<i>长按识别关注,即可领取</i>");
}

最终获取到了如下数据

{"subscribe":,"openid":"oeQDZt0n4VCZ70wykBlGpANiXqdM","nickname":"背上吉他去旅行","sex":,"language":"zh_CN","city":"昌平",

"province":"北京","country":"中国",

"headimgurl":"http:\/\/wx.qlogo.cn\/mmopen\/kBwGJuwqK95jdsBeGnNrSn9GVUib491JqY8zlzEOLa920YACUUkJXLLDpVYlpMouRl2RA6vv9ibVUEpgFE90LH3b3uj7AYRjZP\/0",

"subscribe_time":,"unionid":"oGCG8t5SeisHItMA6sMUO0jPQTPw","remark":"","groupid":,"tagid_list":[]}

直观查看如下:

这里我们就取到了想要的UnionID,但是回复公众号消息的时候还是需要用OpenID去回复的,所以需要将对应关系记录在数据库里,以便下次快速获取。

搞定!

【微信公众号】将微信公众号消息里的FromUserName即OpenID转成UnionID的更多相关文章

  1. C#开发微信门户及应用(27)-公众号模板消息管理

    通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消 ...

  2. C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题

    不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有 ...

  3. 使用flask搭建微信公众号:接收与回复消息

    token验证的意义 在看了别人的代码之后对token加密有了些理解了.但又觉得很鸡肋.第一次验证服务器的时候我在那弄了半天的验证其实不写也可以验证成功,只要直接返回echostr这个字段就行了.微信 ...

  4. 微信公众号实现无限制推送模板消息!可向指定openID群发

    微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 以上就是模板消息,只有文字和跳转链接,没有封面图.在服务号的后台添加功能插件-模板消息即可. 模板消息,都是在后台选择一个群发 ...

  5. 微信小程序结合微信公众号进行消息发送

    微信小程序结合微信公众号进行消息发送 由于小程序的模板消息已经废弃了,官方让使用订阅消息功能.而订阅消息的使用限制比较大,用户必须得订阅.需要获取用户同意接收消息的权限.用户必须得和小程序有交互的时候 ...

  6. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  7. C#开发微信门户及应用(26)-公众号微信素材管理

    微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的 ...

  8. [5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  9. 微信硬件平台(一) 公众号 ESP8266 Arduino LED

    微信硬件平台 本文目的,使用微信公众号控制ESP8266的LED开和关.进一步使用微信当遥控器(避免写APP或者IOS或者小程序),控制一切设备.给两个关键的总教程参考. 官网教程  微信硬件平台 微 ...

随机推荐

  1. Vijos P1521 跳舞 贪心

    本来想找一道网络流的题来着,结果这道题越看越不对劲,总觉得这题存在不用网络流的解法 看了题解区以后坚定了自己的猜想 #include <cstdio> #include <cstri ...

  2. c++primerplus(第六版)编程题——第3章(数据类型)

    声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. 工程命名和文件命名可以命名成易识 ...

  3. centos lnmp 安装笔记

    [root@host]# chkconfig nginx on [root@host]# service nginx start [root@host]# service nginx stop [ro ...

  4. php计算时间差/两个时间日期相隔的天数,时,分,秒.

    function timediff( $begin_time, $end_time ) { if ( $begin_time < $end_time ) { $starttime = $begi ...

  5. 利用python建表

    (ENV)carlo@ubuntu:~/flasky$ python hello.py shell >>> from hello import db>>> db.d ...

  6. Ubuntu软件包管理命令全面集锦

    说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法. 一.U ...

  7. Kent Beck揭秘Facebook开发部署流程

    http://www.infoq.com/cn/news/2013/10/facebook-development-deployment Facebook是世界上最大的社交网站,有超过10亿用户每月至 ...

  8. cut 命令使用

    cut -d -f cut -c cut -d分隔符 -f分割后取的第几个字符串 cut -c从哪个字符开始取

  9. BZOJ 1057 棋盘制作

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...

  10. mouseenter 和 mouseleave

    做一个下拉菜单的时候,HTML结构如下: <ul> <li class="red"> <a href="">第一级</ ...