第三方开放平台的网址是:https://open.weixin.qq.com

公众号第三方平台的申请资料说明

怎么获取公众号用户openid(公众号第三方平台开发)(1)

怎么获取公众号用户openid(公众号第三方平台开发)(2)

授权发起页域名:指公众号在登录授权给第三方平台方时的授权回调域名,在公众号进行登录授权流程中,必须从本域名内网页跳转到登录授权页,才可完成登录授权。授权成功后会回调授权时提供的URI,公众平台会检查URI,必须保证URI所属域名与服务申请时提供的授权域名保持一致。请注意,域名不需带有“http://”等协议内容,也不能在域名末尾附加详细目录,严格按照类似www.qq.com的写法。

授权测试公众号列表:在全网发布之前,仅该列表内公众号才可进行授权,以便测试。请填写公众号的原始ID(可在公众平台网站的公众号设置页找到),最多10个,以英文“;”隔开。请至少要填写这一个:gh_ea3c04785154,这是全网发布时必须用到的。

授权事件接收URL:用于接收取消授权通知、授权成功通知、授权更新通知,也用于接收ticket,ticket是验证平台方的重要凭据,服务方在获取component_access_token时需要提供最新推送的ticket以供验证身份合法性。此ticket作为验证服务方的重要凭据,请妥善保存。

公众号消息校验Token: 开发者在代替公众号接收到消息时,用此Token来校验消息。用法与普通公众号token一致

公众号消息加解密Key: 在代替公众号收发消息过程中使用。必须是长度为43位的字符串,只能是字母和数字。用法与普通公众号symmetric_key一致

公众号消息与事件接收URL:该URL用于接收已授权公众号的消息和事件,消息内容、消息格式、签名方式、加密方式与普通公众号接收的一致,唯一区别在于签名token和加密symmetric_key使用的是服务方申请时所填写的信息。由于消息具体内容不会变更,故根据消息内容里的ToUserName,服务方是可以区分出具体消息所属的公众号

白名单IP地址列表:仅当开发者IP地址在该列表中时,才被允许调用相关接口。最多填写100个IP地址,以英文“;”隔开。后续有出口IP变更时一定要先在申请资料里填写并覆盖现网,否则会被拦截。

1,获取第三方平台access_token

http请求方式: POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/component/api_component_token

POST数据示例:

{"component_appid":"appid_value" ,"component_appsecret": "appsecret_value", "component_verify_ticket": "ticket_value" }

请求参数说明

参数说明component_appid第三方平台appidcomponent_appsecret第三方平台appsecretcomponent_verify_ticket微信后台推送的ticket,此ticket会定时推送,具体请见本页末尾的推送说明

返回结果示例

{"component_access_token":"61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA", "expires_in":7200}

结果参数说明

参数说明component_access_token第三方平台access_tokenexpires_in有效期

上述中的参数前两个在平台中都可以找到,component_verify_ticke这个参数需要去获取。

获取方法:

上述是你自己的第三方的开发平台的详情,其中的授权事件接受URl就是获取component_verify_ticket的关键。

在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密。所以在授权的方法中,需要去接受微信推送的post数据,然后解密获得参数:

官方给出了个java的例子,可以看着例子进行讲述:

public static void main(String[] args) throws Exception { // // 第三方回复公众平台 // // 需要加密的明文 String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; String token = "pamtest"; String timestamp = "1409304348"; String nonce = "xxxxxx"; String appId = "wxb11529c136998cb6"; String replyMsg = " 中文<xml><ToUserName><![CDATA[oia2TjjewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]></MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>"; WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId); String mingwen = pc.encryptMsg(replyMsg, timestamp, nonce); System.out.println("加密后: " mingwen); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); StringReader sr = new StringReader(mingwen); InputSource is = new InputSource(sr); Document document = db.parse(is); Element root = document.getDocumentElement(); NodeList nodelist1 = root.getElementsByTagName("Encrypt"); NodeList nodelist2 = root.getElementsByTagName("MsgSignature"); String encrypt = nodelist1.item(0).getTextContent(); String msgSignature = nodelist2.item(0).getTextContent(); String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>"; String fromXML = String.format(format, encrypt); // // 公众平台发送消息给第三方,第三方处理 // // 第三方收到公众号平台发送的消息 String result2 = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML); System.out.println("解密后明文: " result2); //pc.verifyUrl(null, null, null, null); }

怎么获取公众号用户openid(公众号第三方平台开发)(3)

这个是给出例子的加解密的代码,而我们在授权的方法中获取的就是微信加密后的xml文件,所以我们要做的就是解密其中的文件,我们可以修改上述代码,下面是我解析推送的数据:

public void auth_webhook() { logger.info("微信服务推送请求。"); Context context = getContext(); HttpServletrequest request = context.getReq(); HttpServletResponse response = context.getResp(); logger.info("处理请求数据"); PrintWriter out = null; StringBuffer json = new StringBuffer(); try { request.setCharacterEncoding("utf-8"); out = response.getWriter(); BufferedReader reader = request.getReader(); String line = null; while ((line = reader.readLine()) != null) { json.append(line); } } catch (Exception e) { logger.error(e.toString(), e); return; } logger.info("json:==" json); logger.info("json.toString:==" json.toString()); processAuthorizeEvent(request,json.toString()); // output(response, "success"); // 直接返回success。 } /** * 处理授权事件的推送 * @param request * @throws AesException * @throws IOException */ public void processAuthorizeEvent(HttpServletRequest request,String xml){ logger.info("开始处理请求数据"); String nonce = request.getParameter("nonce"); String timestamp = request.getParameter("timestamp"); String signature = request.getParameter("signature"); String msgSignature = request.getParameter("msg_signature"); String token="你平台的token"; String encodingAesKey="你的key"; String appId="你的id"; logger.info("noce:{},timestamp:{}", nonce, timestamp); logger.info("signature:{},msgSignature:{}", signature, msgSignature); try { WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId); xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml); logger.info("解密后的数据:" xml); } catch (AesException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

怎么获取公众号用户openid(公众号第三方平台开发)(4)

上面中的xml就是解密后我们要的数据,我们可以根据这个数据在进行解析获得我们要的那个字段,具体参照http://blog.csdn.net/jackren_developer/article/details/78882408

2,获取预授权码

http请求方式: POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=xxx

POST数据示例:

{"component_appid":"appid_value" }

请求参数说明

参数说明component_appid第三方平台方appid

返回结果示例

{"pre_auth_code":"Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw","expires_in":600}

结果参数说明

参数说明pre_auth_code预授权码expires_in有效期,为20分钟

拿到了预授权码后,紧接着我们就要启动授权页,可以在自己的界面加上一个按钮调起微信的授权页

3,引导进入授权页面

在任何一个html或者jsp页面,加一个按钮,按钮的响应地址为:

https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx该网址中第三方平台方需要提供第三方平台方appid、预授权码和回调URI

其中在redirect_uri这个URL中需要获取扫码用户的授权码,当公众号用户扫过后,会回调上述的URI,将用户的授权码返回给你,你只需要接受保存

4,授权后回调URI,得到授权码和过期时间

授权流程完成后,会进入回调URI,并在URL参数中返回授权码和过期时间(redirect_url?auth_code=xxx&expires_in=600)

5,使用授权码换取公众号的授权信息

接口调用请求说明

http请求方式: POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=xxxx

POST数据示例:

{"component_appid":"appid_value" ," authorization_code": "auth_code_value"}

请求参数说明

参数说明component_appid第三方平台appidauthorization_code授权code,会在授权成功时返回给第三方平台,详见第三方平台授权流程说明

返回结果示例

{ "authorization_info": {"authorizer_appid": "wxf8b4f85f3a794e77", "authorizer_access_token": "QXjUqNqfYVH0yBE1iI_7vuN_9gQbpjfK7hYwJ3P7xOa88a89-Aga5x1NMYJyB8G2yKt1KCl0nPC3W9GJzw0Zzq_dBxc8pxIGUNi_bFes0qM", "expires_in": 7200, "authorizer_refresh_token": "dTo-YCXPL4llX-u1W1pPpnp8Hgm4wpJtlR6iV0doKdY", "func_info": [{"funcscope_category": {"id": 1}}, {"funcscope_category": {"id": 2}}, {"funcscope_category": {"id": 3}}]}

结果参数说明

参数说明authorization_info授权信息authorizer_appid授权方appidauthorizer_access_token授权方令牌(在授权的公众号具备API权限时,才有此返回值)expires_in有效期(在授权的公众号具备API权限时,才有此返回值)authorizer_refresh_token刷新令牌(在授权的公众号具备API权限时,才有此返回值),刷新令牌主要用于公众号第三方平台获取和刷新已授权用户的access_token,只会在授权时刻提供,请妥善保存。 一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌func_info公众号授权给开发者的权限集列表(请注意,当出现用户已经将消息与菜单权限集授权给了某个第三方,再授权给另一个第三方时,由于该权限集是互斥的,后一个第三方的授权将去除此权限集,开发者可以在返回的func_info信息中验证这一点,避免信息遗漏),1到8分别代表:消息与菜单权限集用户管理权限集帐号管理权限集网页授权权限集微信小店权限集多客服权限集业务通知权限集微信卡券权限集

最后拿到上述的authorizer_appid去获取用户的信息:

http请求方式: POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=xxxx

POST数据示例:

{"component_appid":"appid_value" ,"authorizer_appid": "auth_appid_value" }

请求参数说明

参数说明component_appid服务appidauthorizer_appid授权方appid

返回结果示例

{"authorizer_info": {"nick_name": "微信SDK Demo Special", "head_img": "http://wx.qlogo.cn/mmopen/GPy", "service_type_info": { "id": 2 }, "verify_type_info": { "id": 0 },"user_name":"gh_eb5e3a772040",

"principal_name":"腾讯计算机系统有限公司",

"business_info": {"open_store": 0, "open_scan": 0, "open_pay": 0, "open_card": 0, "open_shake": 0},

"alias":"paytest01"

"qrcode_url":"URL",

},

"authorization_info": {

"appid": "wxf8b4f85f3a794e77", "func_info": [{ "funcscope_category": { "id": 1 } }, { "funcscope_category": { "id": 2 } }, { "funcscope_category": { "id": 3 } }]}}

结果参数说明

参数说明nick_name授权方昵称head_img授权方头像service_type_info授权方公众号类型,0代表订阅号,1代表由历史老帐号升级后的订阅号,2代表服务号verify_type_info授权方认证类型,-1代表未认证,0代表微信认证,1代表新浪微博认证,2代表腾讯微博认证,3代表已资质认证通过但还未通过名称认证,4代表已资质认证通过、还未通过名称认证,但通过了新浪微博认证,5代表已资质认证通过、还未通过名称认证,但通过了腾讯微博认证user_name授权方公众号的原始IDprincipal_name公众号的主体名称alias授权方公众号所设置的微信号,可能为空 business_info

用以了解以下功能的开通状况(0代表未开通,1代表已开通):

open_store:是否开通微信门店功能

open_scan:是否开通微信扫商品功能

open_pay:是否开通微信支付功能

open_card:是否开通微信卡券功能

open_shake:是否开通微信摇一摇功能

qrcode_url 二维码图片的URL,开发者最好自行也进行保存authorization_info授权信息appid授权方appidfunc_info公众号授权给开发者的权限集列表,ID为1到15时分别代表:消息管理权限用户管理权限帐号服务权限网页服务权限微信小店权限微信多客服权限群发与通知权限微信卡券权限

微信扫一扫权限

微信连WIFI权限

素材管理权限

微信摇周边权限

微信门店权限

微信支付权限

自定义菜单权限

请注意:1)该字段的返回不会考虑公众号是否具备该权限集的权限(因为可能部分具备),请根据公众号的帐号类型和认证情况,来判断公众号的接口权限。

若有疑问关注公众号留言:

怎么获取公众号用户openid(公众号第三方平台开发)(5)

怎么获取公众号用户openid(公众号第三方平台开发)(6)

,