第三方开放平台的网址是:https://open.weixin.qq.com
公众号第三方平台的申请资料说明
![b1f4112eb3189bd3f266da9e5db7e6bd.png](https://i-blog.csdnimg.cn/blog_migrate/43af96d6c081e60d7ec76e97eb8155bb.jpeg)
![4062be06116463d7e130a5041f44e439.gif](https://i-blog.csdnimg.cn/blog_migrate/2bc449397534554b385ec98acd3899c9.gif)
授权发起页域名:指公众号在登录授权给第三方平台方时的授权回调域名,在公众号进行登录授权流程中,必须从本域名内网页跳转到登录授权页,才可完成登录授权。授权成功后会回调授权时提供的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 = " 中文1407743423";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 = "";String fromXML = String.format(format, encrypt); 公众平台发送消息给第三方,第三方处理 第三方收到公众号平台发送的消息String result2 = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);System.out.println("解密后明文: " + result2);//pc.verifyUrl(null, null, null, null);}
![4062be06116463d7e130a5041f44e439.gif](https://i-blog.csdnimg.cn/blog_migrate/2bc449397534554b385ec98acd3899c9.gif)
这个是给出例子的加解密的代码,而我们在授权的方法中获取的就是微信加密后的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 blocke.printStackTrace();}}
![4062be06116463d7e130a5041f44e439.gif](https://i-blog.csdnimg.cn/blog_migrate/2bc449397534554b385ec98acd3899c9.gif)
上面中的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)该字段的返回不会考虑公众号是否具备该权限集的权限(因为可能部分具备),请根据公众号的帐号类型和认证情况,来判断公众号的接口权限。
若有疑问关注公众号留言:
![2ac67f639d5d1e03b3bd36452cabe354.png](https://i-blog.csdnimg.cn/blog_migrate/9a458019eb726a1ee27125ad92753cf2.jpeg)
![4062be06116463d7e130a5041f44e439.gif](https://i-blog.csdnimg.cn/blog_migrate/2bc449397534554b385ec98acd3899c9.gif)