微信公众号授权给别人(公众号第三方平台开发,获取授权公众号用户信息)

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


微信官方账号第三方平台申请材料说明






授权发起页面域名:是指对第三方平台方进行登录授权时,微信官方账号的授权回调域名。在微信官方账号登录授权的过程中,只有从该域名中的网页跳转到登录授权页面才能完成登录授权。授权成功后,授权时提供的URI将被回调。公众平台会检查URI,必须保证URI所属的域名与服务申请时提供的授权域名一致。请注意,域名不需要包含“http://”等协议内容,也不能在域名末尾附上详细的目录,严格按照类似www.qq.com的方法编写。

授权测试微信官方账号列表:在全网发布之前,只能对该列表中的微信官方账号进行授权测试。请填写微信官方账号原ID(可在公众平台网站微信官方账号设置页面找到),最多10个英文“;”分开。请至少填写这一条:gh_ea3c04785154,全网发布需要。

授权事件接收URL: 用于接收授权取消通知、授权成功通知、授权更新通知、车票。票证是认证平台的重要凭证,服务器在获取component_access_token时需要提供最新推送的票证来验证身份合法性。此票证是身份验证服务提供商的重要凭证。请妥善保管。


微信官方账号消息检查令牌:当开发者收到消息而不是微信官方账号收到消息时,用这个令牌来检查消息。用法与普通微信官方账号token一致。

微信官方账号消息加解密密钥:代替微信官方账号在消息收发过程中使用。必须是43位字符串,只能是字母和数字。用法与普通微信官方账号symmetric_key一致。

微信官方账号消息和事件接收网址:该网址用于接收微信官方账号中授权的消息和事件。消息内容、消息格式、签名方式、加密方式与普通微信官方账号接收的相同。唯一的区别是签名令牌和加密symmetric_key使用服务提供者申请时填写的信息。由于消息的具体内容不会改变,服务器可以根据消息内容中的ToUserName来区分具体消息所属的微信官方账号。


IP地址白名单:只有当开发者的IP地址在列表中时,才允许调用相关接口。用英文填写最多100个IP地址“;”分开。如有后续出口IP变更,必须先填写申请材料,覆盖现网,否则会被拦截。


1,获取第三方平台access_token

Http请求方式:POST(请使用https协议)https://api.weixin.qq.com/CGI-bin/component/API _组件_令牌

示例发布数据:

{
& # 34;component _ appid & # 34:"appid _ value & # 34,
& # 34;component _ appsecret & # 34: "appsecret _ value & # 34,
& # 34;component _ verify _ ticket & # 34: "门票_价值& # 34;
}

请求参数描述

参数描述component_appid第三方平台appidcomponent_appsecret第三方平台appecretcomponent _ verify _ ticket后台微信推送的车票会定时推送。详情请参考本页末的推送说明。

样本返回结果

{
& # 34;组件访问令牌& # 34;:"61 w 3 mepu 66027 wgnz _ mhghnqdhnfatkda 9-2 llqrmbjuwxrsnpbvsmmyd-yq 8 wzetso e 5 nqgecigdrshkptiya & # 34;,
& # 34;expires _ in & # 34:7200
}

结果的参数描述

参数描述component_access_token第三方平台access_tokenexpires_in有效期

上述前两个参数可以在平台中找到,需要获取component _ verify _ tick参数。

获取方法:


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

第三方平台创建通过审核后,微信服务器会每隔10分钟定时推送component_verify_ticket到其“授权事件接收URL”。第三方平台收到票推后也需要解密。所以在授权方式上,我们需要接受微信推送的帖子数据,然后解密得到参数:

官方举了一个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); }


public void main(String[]args)throws exception { / //第三方回复公共平台 / 需要加密的明文 字符串编码abcdefghijklmnopqrstuvwxyz 0123456789 abcdefg & # 34;; String token = & # 34;pamtest & # 34; 字符串时间戳= & # 34;1409304348"; String nonce = & # 34;xxxxxx & # 34; String appId = & # 34;wxb 11529 c 136998 cb6 & # 34;; String reply msg = & # 34;中国人

这是给出例子的加解密代码,而我们在授权方法中得到的是微信加密的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(); } }


public void auth _ web hook(){ logger . info(& # 34;微信服务推送请求。"); Context上下文= get Context(); http servlet request request = context . getreq(); http servlet response response = context . get resp(); logger . info(& # 34;处理数据& # 34;); PrintWriter out = null; string buffer JSON = new string buffer(); try { request . setcharacterencoding(& # 34;utf-8 & # 34;); out = response . get writer(); buffered reader reader = request . getreader(); String line = null; while((line = reader . readline())!= null){ JSON . append(line); } } catch(Exception e){ logger . error(e . tostring(),e); 返回; } logger . info(& # 34;JSON:= = & # 34;+JSON); logger . info(& # 34;JSON . tostring:= = & # 34;+JSON . tostring()); processAuthorizeEvent(request,JSON . tostring()); //输出(响应,& # 34;成功& # 34;);//直接返回成功。 } /** *处理授权事件的推送 * @ param request * @ Throwsaesexception */[public void processAuthorizeEvent(http servlet request,String XML){ logger . info(& # 34;开始处理请求数据& # 34;); String nonce = request . getparameter(& # 34;nonce & # 34); String timestamp = request . getparameter(& # 34;时间戳& # 34;); String signature = request . getparameter(& # 34;签名& # 34;); String msg signature = request . getparameter(& # 34;msg _ signature & # 34); String token = & # 34;您平台的标志& # 34;; String encoding AES key = & # 34;你的钥匙& # 34;; String appId = & # 34;你的身份证& # 34;; logger . info(& # 34;noce:{},时间戳:{ } & # 34;随机数、时间戳); logger . info(& # 34;签名:{},消息签名:{ } & # 34;,签名,msg signature); try { WXBizMsgCrypt PC = new WXBizMsgCrypt(token,encodingAesKey,appId); XML = PC . decryptmsg(msg signature,timestamp,nonce,XML); logger . info(& # 34;解密数据:& # 34;+XML); } catch(AES exception e){ //TODO自动生成的catch块 e . printstacktrace(); } }

上面的xml就是我们解密后想要的数据,解析这个数据就可以得到我们想要的字段。详情请参考http://blog.csdn.net/jackren _开发者/文章/详情/7882408。


2,获取预授权码


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

https://API . weixin . QQ . com/CGI-bin/component/API _ create _ preauthcode?组件访问令牌=xxx

示例发布数据:

{"component _ appid & # 34:"appid _ value & # 34}

请求参数描述

参数描述component_appid第三方平台appid

样本返回结果

{
& # 34;pre _ auth _ code & # 34:"CX _ dk 6 qibe 0 DMX 4 emlt 3 orfarpvwsq-oa3NL _ FWHM 7 VI 08 r 52 wazozx 2 rhpz 1 dew & # 34;,
& # 34;expires _ in & # 34:600
}

结果的参数描述

参数表示pre_auth_code预授权码expires_in的有效期,为20分钟。

拿到预授权码后,我们会启动授权页面,我们可以在自己的界面上添加一个按钮,调出微信的授权页面。


3,引导进入授权页面


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

https://mp.weixin.qq.com/cgi-bin/componentloginpage?组件_ appid = xxxx &预验证代码= xxxxx &重定向_ URI = xxxx。本网站第三方平台需要提供第三方平台的appid、预授权码和回调uri。


在URL redirect_URI中,需要获取扫描用户的授权码。微信官方账号用户扫描时,上面的uri会被回调,用户的授权码会返回给你。你只需要接受并保存它。


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

授权过程完成后,会进入回调URI,返回授权码和到期时间(redirect_url?auth_code=xxx&expires_in=600)


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


接口调用请求描述


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

https://api.weixin.qq.com/cgi-bin/component/api_query_auth?组件访问令牌=xxxx

示例发布数据:

{
& # 34;component _ appid & # 34:"appid _ value & # 34,
& # 34;授权_代码& # 34;: "auth _ code _ value & # 34
}

请求参数描述

参数说明component_appid第三方平台appidauthorization_code授权成功时会向第三方平台返回授权码。详见第三方平台授权流程描述。

样本返回结果

{
& # 34;authorization _ info & # 34:{
& # 34;授权人_ appid & # 34: "wxf 8 B4 f 85 F3 a 794 e 77 & # 34;,
& # 34;授权人_访问_令牌& # 34;: "qxjuqn qfyvh 0 ybe 1 ii _ 7 vun _ 9 gqbpjfk 7 hy wj 3 p 7 OA 88 a 89-aga 5 x1 nmyjyb 8g 2 ykt 1 KCl 0 NPC 3 w 9 gjzw 0 zzq _ db xc 8 PXI guni _ bfes 0 QM & # 34;,
& # 34;expires _ in & # 34:7200,
& # 34;授权人_刷新_令牌& # 34;: "dTo-ycx pl 4 LX-u 1 w1 pppnp 8 HGM 4 wpjtlr 6 iv 0 dokdy & # 34;,
& # 34;func _ info & # 34:[
{
& # 34;funcscope _ category & # 34:{
& # 34;id & # 34:1
}
},
{
& # 34;funcscope _ category & # 34:{
& # 34;id & # 34:2
}
},
{
& # 34;funcscope _ category & # 34:{
& # 34;id & # 34:3
}
}
]
}

结果的参数描述

参数描述authorization_info授权信息authorizer _ appid authorizer _ access _ token授权者token(该返回值仅在被授权的微信官方账号有API权限时可用)expires_in有效期(被授权的微信官方账号有API权限时,)authorizer_refresh_token刷新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 _授权者_ info?组件访问令牌=xxxx

示例发布数据:

{
& # 34;component _ appid & # 34:"appid _ value & # 34,
& # 34;授权人_ appid & # 34: "auth _ appid _ value & # 34
}

请求参数描述

参数描述component _ appid service appid authorizer _ appid authorizer 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",{"授权人_信息& # 34;: {"昵称& # 34;: "微信SDK演示专场& # 34;, "head _ img & # 34: "http://wx.qlogo.cn/mmopen/GPy",& # 34;service _ type _ info & # 34: { "id & # 34: 2 }, "verify _ type _ info & # 34: { "id & # 34: 0 },"用户名& # 34;:"GH _ EB 5 E3 a 772040 & # 34;,

"principal _ name & # 34:"腾讯计算机系统有限公司& # 34;,

"business _ info & # 34: {"open _ store & # 34: 0, "open _ scan & # 34: 0, "open _ pay & # 34: 0, "open _ card & # 34: 0, "open _ shake & # 34: 0},

"别名& # 34;:"工资测试01 & # 34;

"qrcode _ url & # 34:"网址& # 34;,

},

微信公众号授权

"authorization _ info & # 34: {

"appid & # 34: "wxf 8 B4 f 85 F3 a 794 e 77 & # 34;, "func _ info & # 34: [{ "funcscope _ category & # 34: { "id & # 34: 1 } }, { "funcscope _ category & # 34: { "id & # 34: 2 } }, { "funcscope _ category & # 34: { "id & # 34: 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参数描述nick_name许可方昵称head_img许可方头像service_type_info许可方微信官方账号类型,0代表订阅号,1代表历史旧账号升级的订阅号,2代表服务号verify_type_info许可方认证类型,-1代表未认证,0代表微信认证,1代表新浪微博认证,2代表腾讯微博认证。3表示已通过资格认证但未通过名称认证4表示已通过资格认证但未通过名称认证但已通过新浪微博认证5表示已通过资格认证但未通过名称认证但已通过腾讯微博认证用户名许可方微信官方账号的原IDprincipal_name微信官方账号的委托人姓名微信官方账号的微信号可能是空 business_info。

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

Open_store:是否开启微信商店功能?

Open_scan:微信的商品扫描功能是否开启?

Open_pay:是否开通了微信支付功能?

Open_card:微信卡券功能启用了吗?

Open_shake:微信摇一摇功能启用了吗?

QR _ URL二维码图片的网址,开发者最好保存authorization_info授权信息appid许可方appidfunc_info微信官方账号的权限集列表给开发者。ID 1到15分别代表:
消息管理权限
用户管理权限
账号服务权限
web服务权限
微信店铺权限
微信多客户服务权限
群发通知权限
微信卡券权限。

微信扫权限。

甚至微信WIFI权限

材料管理权限

微信摇外设权限

微信店铺权限

微信支付权限

自定义菜单权限


请注意:
1)该字段的返回不会考虑微信官方账号是否有该权限集的权限(因为可能部分有)。请根据微信官方账号的账号类型和认证情况判断微信官方账号的接口权限。

如有疑问,关注微信官方账号的留言:





您可以还会对下面的文章感兴趣

使用微信扫描二维码后

点击右上角发送给好友