我的项目使用了这项技术,
后端:spring + springMVC + ibetis;原本采用的是最常规的架构controller、service、dao、pojo结构,但是为了以后的维护,改为与主系统controller、model、业务命令和数据库命令相同的架构,dao、pojo,其中controller是主要负责像平常的controller一样的页面逻辑,模型相当于serice,继承pojo,调用业务命令,业务命令调用数据库命令
前端:html5、css3、bootstrap、jquery;
DB:Mysql;
第三方接口:微信公众号网页授权接口、微信公众号网页支付接口、支付宝手机网站支付接口;阿里巴巴短信接口、快递100物流接口;
开发工具:idea、eclipse、sublim、navicat、dbvisualizer、beyond Compare、Filezilla、Git、notepad++、微信网页开发者工具、花生壳、chrome、firefox、网易云音乐;
测试环境:阿里云服务器(linux)+jdk+tomcat8.0+mysql;
实用网站:图标素材http://www.iconfont.cn
引导手册http://v3.bootcss.com/components
微信公众平台https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-loginlang=zh_CN
微信公众平台wiki https://mp.weixin.qq.com/wiki
微信开放平台https://open.weixin.qq.com/
微信商户平台https://pay.weixin.qq.com/index.php/core/home /login?return_url=%2Findex.php%2Fcore%2Fhome
微信服务商平台https://pay.weixin.qq.com/index.php/partner/public/home
微信公众平台支付接口调试工具https://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index
微信公众号接口测试http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
支付宝商户https://b.alipay.com/order/signManage.htm
支付宝开放平台https://www.ant-open.com/platform/home.htm
对应服务器新浪sae http://www.sinacloud.com/?from=baidu_web
阿历达语http://www.alidayu.com/
快递100 http://www.kuaidi100.com/
以上网址将在后续文章中陆续出现。关于接口的调用,腾讯有一个很长的文档,看起来很复杂。说得更清楚一点,就是将接口需要的参数拼接成接口需要的格式,发送http请求。发送前对您的参数进行MD5加密,生成所需的签名后,将请求连同签名和参数一起发送到目标地址。原理很简单,但是处理细节的时候可能一不小心就会跳坑,所以一定要阅读官方文档。
言归正传,我们先从Web授权开始吧……
一、 申请微信公众号
申请地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=indexlang=zh_CN
根据您的需求选择合适的账户类型
我正在做的项目类似于微商城,所以我选择了服务号。申请时,我需要上传公司营业执照等公司信息。个人只能申请普通订阅账户。这种账号类型没有高级的接口功能,比如读取用户信息、支付等等,所以我只是想学习或者测试一下接口或者申请一个测试账号(http://mp.weixin.qq.com/debug/cgi -bin/沙箱?t=沙箱/登录)。
二、申请开放平台
成功申请公众号后,不用再担心打码的问题了。首先查找接口文档。俗话说,不耐烦阅读文档的程序员不是好的测试人员。登录公众平台-界面权限-Web服务-Web授权-Web授权获取用户基本信息(https://mp.weixin.qq.com/wiki)
为什么需要获取用户信息了?
当用户通过微信进入指定系统(我们这里称我们的系统系统A)时,系统A需要唯一标识访问者。以前的系统允许访客注册。既然客户端是微信,那么我们就使用微信的第三方认证方式,但是微信把这个唯一的身份交给了openId和unionId来保护用户信息。 openId/unionId在我们项目中的使用如下:
什么是openId?
openId是为公众号开发的。该用户在该公众账号中是唯一的。用户的openId在不同的公众账号中是不同的;
什么是unionId?
unionId是同一公司下多个公众账号之间用户账号互通的机制;也就是说,同一个用户在同一个开放平台下的公众账号是唯一的,但在不同的开放平台下当然会有所不同。
开放平台又是什么?
如图所示
开放平台申请地址(http://open.weixin.qq.com/),流程简单,费用300元。
我们项目的场景是这样的。用户在微信上操作的数据需要传递给App。刚才的图告诉我们,app和微信的交互并不是通过公众平台,而是通过开放平台。这时候我们就需要获取unionId。你刚刚准备的公众号已经不够用了。仍需将所申请的公共平台与所申请的开放平台进行绑定;
绑定公众号到开放平台
点击顶部“管理中心”,选择“公众号”,然后点击“绑定公众号”
三、获取openId和unionId
网页授权类型:snsapi_base和snsapi_userinfo
snsapi_base:静默授权,无用户感知。 (是否需要用户关注公众号获取openId?网上有各种版本,腾讯没有明确说明,经测试不需要)
snsapi_userinfo:需要用户手动同意。既然用户已同意,则无需遵循,授权后即可获取用户的基本信息。对于关注过公众号的用户来说,如果用户从公众号的会话或者自定义菜单进入这个公众号网页的授权页面,即使作用域是snsapi_userinfo,也是静默授权,用户不知情它的。提示用户同意授权的窗口如下图:
网页授权回调
微信授权成功后,下一步就是输入您设置的回调地址。其目的是授权成功后跳转到页面。会话在此地址有效,并且可以通过该地址的请求进行检索。代码的价值。该地址需要先在公众平台上设置:
开发-接口权限-Web服务-Web帐号-Web授权获取用户基本信息
单击“修改”,填写回调地址的域名。本来想突出重点,却发现每一项都是重点。
如果您没有域名,可以申请新浪云(http://www.sinacloud.com/?from=baidu_web)并在上面部署您的系统。最低配置是免费的。
除了图片上的要求外,还需要注意回调域名:
1、域名(是字符串),不是URL,所以请不要添加http://等协议头;
2、授权回调域名配置规范为完整域名。例如,需要网页授权的域名为:www.qq.com。配置完成后,该域名下的页面为http://www.qq.com/music.html和http://www.qq.com/login。 html可以进行OAuth2.0认证。但http://pay.qq.com、http://music.qq.com、http://qq.com无法进行OAuth2.0认证。
3、如果公众号登录授权交给第三方开发者管理,则无需进行任何设置。第三方可以替代公众号实现网页授权。
授权步骤
网页授权过程分为四个步骤。流程在文档里写得很清楚了。我将对每个步骤进行编码。
1.引导用户进入授权页面同意授权并获取代码。
常数定义如下:
应用程序ID=XXX
应用程序秘密=XXX
REDIRECT_URI=http://XXX/common/wechat_auth.html
GET_CODE_URL=https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPIDredirect_uri=REDIRECT_URIresponse_type=codescope=SCOPEstate=STATE#wechat_redirect
GET_OPENID_URL=https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPIDsecret=APPSECRETcode=CODEgrant_type=authorization_code
GET_ACCESSTOKEN_URL=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credentialappid=APPIDsecret=APPSECRET
GET_UNIONID_URL=https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKENopenid=OPENID
范围=snsapi_base
在您的操作中生成访问的url
String getCodeUrl=Constants.GET_CODE_URL;
getCodeUrl=getCodeUrl.replace("APPID", Constants.APPID);
getCodeUrl=getCodeUrl.replace("REDIRECT_URI", java.net.URLEncoder.encode(Constants.REDIRECT_URI,"utf-8"));
getCodeUrl=getCodeUrl.replace("SCOPE", Constants.SCOPE);
getCodeUrl=getCodeUrl.replace("STATE", entanceType);
getCodeUrl生成成功
2、兑换网页授权access_token的code(与基础支持中的access_token不同)
这时候你可以通过请求的方式从你设置的回调地址中取回code。
@RequestMapping("wechat_auth.html")
公共ModelAndView wechatOauth2( HttpServletRequest 请求) {
String code=request.getParameter("code");获取的code
String state=request.getParameter("state");
这个状态是用来做什么的?它用于传递自定义参数。如果回去看到获取code的地址里有传入的state,那么返回code的时候就会原样返回state。
3、如有需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
/**
* 根据代码获取openId和unionId
* @参数代码
* @return 返回openId 和unionId
*/
公共静态字符串[] getOpenId(字符串代码){
字符串参数[]=新字符串[2];
//获取openid
字符串oauth2URL=Constants.GET_OPENID_URL;
oauth2URL=oauth2URL.replace("APPID", Constants.APPID);
oauth2URL=oauth2URL.replace("APPSECRET", Constants.APPSECRET);
oauth2URL=oauth2URL.replace("代码", 代码);
System.out.println("oauth2URL:" + oauth2URL);
字符串authResponseJsonStr=HttpUtils.getUrl(oauth2URL);
System.out.println("authResponseJsonStr:" + authResponseJsonStr);
JSONObject responseJsonObject=JSONObject.parseObject(authResponseJsonStr);
args[0]=responseJsonObject.getString("openid");
//获取令牌
String tokenUrl2=Constants.GET_ACCESSTOKEN_URL;
tokenUrl2=tokenUrl2.replace("APPID", Constants.APPID);
tokenUrl2=tokenUrl2.replace("APPSECRET", Constants.APPSECRET);
字符串tokenResponseJsonStr2=HttpUtils.getUrl(tokenUrl2);
System.out.println("tokenResponseJsonStr2:" + tokenResponseJsonStr2);
JSONObject tokenResponseJsonObject2=JSONObject.parseObject(tokenResponseJsonStr2);
String accessToken=tokenResponseJsonObject2.getString("access_token");
//根据openid和token获取unionid
String unionidUrl=Constants.GET_UNIONID_URL;
unionidUrl=unionidUrl.replace("ACCESS_TOKEN",accessToken);
unionidUrl=unionidUrl.replace("OPENID",args[0]);
字符串unionidResponseJsonStr=HttpUtils.getUrl(unionidUrl);
System.out.println("unionidResponseJsonStr:" + unionidResponseJsonStr);
JSONObject unionidresponseJsonObject=JSONObject.parseObject(unionidResponseJsonStr);
args[1]=unionidresponseJsonObject.getString("unionid");
return args;
}
将得到的数组system.out.print打印出来,就可以去喝点水了。
成功返回的json字符串如下所示:
{ "openid":" OPENID",
"昵称": 昵称,
"性别":"1",
"省":"省"
"城市":"城市",
"国家":"国家",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
4eMsv84eavHiaiceqxibJxCfHe/46",
"特权":[ "特权1" "特权2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
这是snsapi_userinfo类型的返回。如果是snsapi_base,则不会有昵称等个人信息字段。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【微信公众号网页授权Summer版本详细解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
听起来很强大啊,想试试能不能用它加强下我的公众号功能。
有14位网友表示赞同!
这款"Summer版"有什么新功能呢?老版本已经挺好用的了。
有18位网友表示赞同!
终于有更新啦!以前那个网页授权机制有时候挺麻烦的
有7位网友表示赞同!
这篇文章讲的是微信公众号怎么样实现网页授权登录吧?很实用啊
有20位网友表示赞同!
我一直在想怎么让用户更方便访问我的公众号内容,这个“Summer版”或许能帮到忙。
有17位网友表示赞同!
感觉"summer版"对粉丝管理应该有很大的帮助,可以更好地了解用户的喜好吗?
有9位网友表示赞同!
有没有详细的教程或代码示例,我想学习下这方面的知识
有11位网友表示赞同!
这个网页授权在推广文章的时候用起来会不会更方便些?
有5位网友表示赞同!
我现在正在做公众号开发,这个"summer版"是个好消息,可以提升使用体验吧!
有12位网友表示赞同!
我对这方面不太了解,不过觉得微信公众号的更新总是让人期待一下。
有7位网友表示赞同!
之前我用的授权方式有些复杂,不知道新版本会不会更简单?
有11位网友表示赞同!
这个“summer版”对运营官来说有什么特别便利的地方呢?
有13位网友表示赞同!
我想了解下“Summer版”的安全性和用户隐私保护措施
有16位网友表示赞同!
最近在研究公众号营销方面,这篇文章正好对我很有帮助!
有8位网友表示赞同!
希望有更多关于"summer版"的详细介绍和实际案例分享
有15位网友表示赞同!
可以提升用户体验是一定的,但我更关注它对我的运营效果。
有8位网友表示赞同!
听起来这个“Summer版”的功能相当强大,我需要好好研究一下!
有6位网友表示赞同!
终于不用手动处理用户登录信息了,效率提高了!
有9位网友表示赞同!
期待这次更新能为公众号内容传播带来更多可能性!
有5位网友表示赞同!